AbramsOS

repo: ~/Projects/AbramsOS · 117 commits · 0 in last 24h, 0 in last 7d ·

Search the build

117 commits indexed

  1. dbe3376 2026-09-11 reviews: arm launcher (sets REVIEWS_EXECUTORS_LIVE + openclaw path)
  2. 2822732 2026-09-11 reviews: native Amazon review + seller thank-you feature over AbramsOS purchases
  3. 144d126 2026-09-01 chore: lint, refactor, v0.6.0 (session close) — nav-bar chat feature
  4. cf095c7 2026-09-01 chat: guard registry+chat fetch against creds-in-URL (resolve vs location.origin) — fixes empty pickers on user:pass@host bookmarks (TK-11084)
  5. ee61b91 2026-09-01 chat: move Model/Agent pickers to a centered top-middle nav bar; panel drops from it (was a corner bubble) (TK-11084)
  6. 8205414 2026-09-01 chat: drop dead Gemini models from picker (Google prepay $0); adapter kept for easy re-enable (TK-11084)
  7. a0e1b82 2026-09-01 chat: default lane = GPT-5.2 (funded external) instead of ollama-qwen3 (TK-11084)
  8. fe14679 2026-09-01 chat: add funded OpenAI GPT-5.2 external lane (Responses API) through the redact+NER boundary (TK-11084)
  9. 9098e9c 2026-09-01 chat: guard nav-bar chat behind authed userId (hide on unauth pages) — DTD verdict A, TK-11084
  10. 4acae37 2026-09-01 chat: local-Ollama NER scrub as 2nd layer on external lanes (fail-closed) — closes free-text PII gap (TK-11084)
  11. 7fca2fd 2026-09-01 Harden nav-bar chat PII redaction boundary (TK-11084)
  12. d683961 2026-09-01 Add nav-bar chat: model+agent pickers, grounded RAG, PII-redacted external lanes
  13. b5d614e 2026-09-01 auto-data-snapshot: 2026-09-01T14:52:01 (2 data files) — views/partials/chat.ejs views/partials/footer.ejs
  14. b998091 2026-08-25 abramsos: watch loads .env so launchd corpus-refresh has GEORGE_URL (TK-10506)
  15. f55aae8 2026-08-25 auto-data-snapshot: 2026-08-25T12:44:18 (4 data files) — data/claim-fill-queue/claim_01kzvyhm9k5hjmkhvyjbdg0xsg.json data/claim-fill-queue/claim_01kzvyhm9m9h86b92zqg40fbjj.json data/claim-fill-queue/claim_01m0x5ww33ct24tkakjexqtc21.json data/claim-fill-queue/claim_01m0x5ww3cghqycd6prtvm03zj.json
  16. 801e623 2026-08-25 abramsos: make Mode claims watch autonomous via George-corpus path (TK-10506)
  17. c1f4023 2026-08-25 abramsos: fix test suite — disable app Basic Auth + single-user autologin in test env
  18. d5366d1 2026-08-19 auto-data-snapshot: 2026-08-19T23:16:54 (1 data files) — backups/medications-backup-20260712-232800.sql
  19. 3db1e3c 2026-08-19 abramsos: skip-medical guard in mode-claims ingest so purged medical/pharmacy settlement claims are never re-seeded (TK-10723)
  20. 8aca6e8 2026-08-19 abramsos: add app-level defense-in-depth Basic Auth (401 without creds, 200 with admin:DW2024!)
  21. fca604e 2026-08-19 abramsos: CNCP parking-lot fallback fires only when George unavailable
  22. 6f0e9fc 2026-08-19 abramsos: fix claims-autopilot scheduler — separate alert error from fill error
  23. 00f2109 2026-08-18 auto-data-snapshot: 2026-08-18T16:40:41 (2 data files) — public/claim-shots/claim_01kzvyhm96rdqm58r3g4w00m5k.png public/claim-shots/claim_01kzvyhm9qb454383b6q0rsfqz.png
  24. 451cbcf 2026-08-18 claims: George-backed backup-doc finder (home-sale/closing paperwork, receipts, breach notices) + /docs endpoint + surfaced in prep panel amber lane
  25. 9676eb8 2026-08-18 claim-fill: combined First/Middle/Last name field -> full name
  26. c5337bf 2026-08-18 claim-fill: positional last-name + Mode->official->form navigation + save discovered admin_url for re-runs
  27. b3c0e91 2026-08-18 settlements: live openclaw auto-fill runner (dedicated tab, gateway click-through, proximity+single-use matcher, state-select) + /run endpoint + Go button triggers zero-click fill w/ screenshot; paste-card fallback
  28. 61ad5f4 2026-08-18 auto-data-snapshot: 2026-08-18T16:08:33 (8 data files) — data/claim-fill-queue/claim_01kzvyd76483jpdh3pd86ak9c0.json data/claim-fill-queue/claim_01kzvyhm9k5hjmkhvyjbdg0xsg.json package-lock.json package.json public/claim-shots/demo-kellerwilliams.png
  29. b3ececa 2026-08-18 AbramsOS sidebar: group nav into Money&Claims / Health / Home&Life / System sections (labels hidden in mobile row layout)
  30. 889a18c 2026-08-18 AbramsOS nav: move 18 top tabs into a left sidebar panel + add missing Settlements link
  31. ae4ebab 2026-08-18 settlements: remove duplicate claim-and-go (keep the payment+fieldMap version)
  32. 103c476 2026-08-18 settlements: 3 views (grid/list/table sortable) + one-click Claim it & Go (marks eligible + stages openclaw prefill + opens portal + prep card w/ identity+PayPal values); payment default PayPal->steveabramsdesigns
  33. f450f59 2026-08-18 amazon-orders: 30-min Gmail poller (George bridge) → purchase + reorder_item, word-order-safe dedup; wired into scheduler
  34. b2fd5b1 2026-08-18 deploy: abramsos vhost with fleet Basic Auth (admin/DW2024!) + SSL + ACME exemption
  35. 6106895 2026-08-18 deploy: serve ACME challenge locally in abramsos vhost (proxy was swallowing it → certbot fail)
  36. 6e958d9 2026-08-18 deploy: nginx vhost for abramsos.agentabrams.com (Kamatera reverse-proxy to tailnet AbramsOS :9774; app self-auths)
  37. ad64537 2026-08-18 Add priority ranking + per-item ratings view to settlement-claims dashboard
  38. 68dc94c 2026-08-18 claims-alert: fix daysTo — pg returns DATE as Date obj (was NaN, urgency never fired); compare calendar days
  39. b757b9f 2026-08-18 AbramsOS: settlement-claim autopilot — auto-fill every open claim + deadline alert (never lapse); wired into in-process scheduler; never submits
  40. 5cf00ea 2026-08-12 chore: lint ✓, refactor ✓ (no code changes), v0.5.0 (session close)
  41. 6fb5271 2026-08-12 AbramsOS claims: apply migration 0016, fix parser (Estimated/embedded-$/no-claim headings), id kind, George-path corpus ingester; ingest Aug 8-12 Dan mailers (42 claims/22 open); stage 5 no-proof breach fill-not-submit briefs
  42. 7ff4ec3 2026-08-07 AbramsOS: class-action settlement claim-filler (Mode feed → openclaw fill-not-submit)
  43. e62bbd3 2026-08-07 auto-data-snapshot: 2026-08-07T19:03:19 (2 data files) — data/mode-claims-backfill.json db/migrations/0016_settlement_claims.sql
  44. 4f346d9 2026-08-03 chore: v0.4.0 (session close — claims tracker + auth hardening)
  45. 254e60d 2026-07-31 Rate-limit auth endpoints + fix audit-log IP integrity
  46. 8c7f239 2026-07-31 Stop unauth info-disclosure on public surface (/healthz + error handler)
  47. d08f146 2026-07-31 Harden auth cookies for public HTTPS surface + record claims subdomain deploy
  48. 69b613c 2026-07-31 auto-save: 2026-07-31T14:58:42 (1 files) — deploy/claims.abramsos.agentabrams.com.nginx.conf
  49. 2f71185 2026-07-31 Add California unclaimed-property tracker to claims dashboard
  50. fc3c624 2026-07-13 chore: lint (node --check 21/21) + version bump v0.3.0 (session close)
  51. 5671885 2026-07-13 withings: device-vitals auto-sync connector (OAuth2 → weight/BP/HR/SpO2 into Health)
  52. ba2e47d 2026-07-13 assets: RentCast home-value estimate wiring (one-key-from-working) + all 37 Amazon totals collected
  53. 957c215 2026-07-13 docs: savings track done; overnight run complete, loop stopped
  54. 5387c7d 2026-07-13 savings: subscription/bill audit + reorder-timing nudges
  55. a0f0e6a 2026-07-13 auto-save: 2026-07-13T01:52:00 (1 files) — lib/bill-audit.js
  56. 4c949de 2026-07-13 docs: roadmap — health track done; Assets/Neighborhood/Biometrics shipped; savings track next
  57. 5ab1c97 2026-07-13 biometrics: per-person ID/emergency profile for kids + adults (child-ID record + growth BMI)
  58. a4f7803 2026-07-13 auto-save: 2026-07-13T01:21:52 (4 files) — lib/ids.js db/migrations/0014_biometrics.sql lib/biometrics.js routes/biometrics.js
  59. 42d431f 2026-07-13 neighborhood: Neighborhood Watch — address+radius, Leaflet map, Ring cameras + Neighbors, Nextdoor/Citizen/crime maps/registries
  60. a78d4ae 2026-07-13 assets: net-worth tracker — enter home by address + current value, finance category, details/notes
  61. 8598287 2026-07-13 health: lapsed-habit BP reading reminders (only nudges prior loggers, never new users)
  62. 355389e 2026-07-13 health: BP-medication context — show active meds that raise/lower blood pressure alongside the trend
  63. 8f58fa2 2026-07-13 health: vitals trends + insights (weight/RHR sparklines, local-LLM 'what changed this month', gentle Stage-2 recheck flag)
  64. 4a02cce 2026-07-13 purchases: collect 38 real Amazon orders from info@ (via George) into purchase table
  65. ded692c 2026-07-13 connectors: no-signup bank import — Wells Fargo CSV upload (headerless + negative-debit aware)
  66. a71abd4 2026-07-13 docs: roadmap — banking (Plaid) track shipped; real-bank keys gated to Steve
  67. 954cc77 2026-07-13 connectors: Plaid 'Connect a bank' UI (Wells Fargo etc.) + incremental/idempotent sync
  68. f4e4da6 2026-07-13 docs: roadmap adds health track (vitals trends, BP↔meds, reminders) as co-priority
  69. 2d8848c 2026-07-13 health: Vitals module — BP history + Apple Watch/device readings + sync
  70. 0256450 2026-07-13 savings: nightly advisor runner + launchd plist (draft, Steve bootstraps)
  71. 3e9efe5 2026-07-13 docs: life-optimizer roadmap (overnight)
  72. a121be0 2026-07-13 savings: home dashboard tile + honest merchant-savings leads
  73. db2fd48 2026-07-13 savings: life-optimizer module — cheaper/better substitutes from what you buy (local gemma3:12b, $0)
  74. 367d888 2026-07-12 auto-save: 2026-07-12T23:51:20 (1 files) — backups/
  75. ef35bef 2026-07-11 claims: add California Unclaimed Property (claimit.ca.gov) resource card with per-household-name copy-to-search
  76. 1192d3c 2026-07-09 chore: lint (node --check ✓), untrack runtime state, v0.2.0 (session close)
  77. 4ccbda5 2026-07-08 recall-watch: apply contrarian FIX-FIRST — E-known+in-date=>POSSIBLE regardless of FDA publish date (fix false-clear); assess ALL recalls per NDC (worst class never hidden); EXP-anchored expiry parser (no MFG/ref-date mis-parse); local notification on new alerts; per-NDC worst-status UI + N-of-M affected fills
  78. 362c884 2026-07-08 recall-watch.js: nightly-ready FDA recall watcher with PROGRAMMATIC lot/date relevance (per-fill), new-alert detection + state baseline; caught fluticasone D-0326-2024 overlapping a 2026 fill
  79. a1038a6 2026-07-08 Recall lot/date check: mark all 4 NDC recalls CLEARED (recalled lots expired before your fills); green Clear badges + plain-English assessment on Recalls + Rx tabs
  80. 2caebba 2026-07-08 Recalls: add curated article/FDA links per NDC-recalled product (Read-about-it column)
  81. b02722e 2026-07-08 NDC-precise FDA recall match: flag fills whose actual dispensed product is recalled
  82. 78b80e6 2026-07-08 FDA recall cross-reference: clean drug names, derive generics, openFDA match into Recalls tab
  83. 542a632 2026-07-08 Import Shangoo Pharmacy tax profile: prescription_fill table + 277 fills + 83 meds + /prescriptions viewer
  84. 6589647 2026-07-08 auto-save: 2026-07-08T14:36:14 (5 files) — lib/ids.js db/migrations/0009_prescription_fills.sql routes/prescriptions.js scripts/load-abrams-rx.js views/prescriptions.ejs
  85. 63d53f9 2026-07-07 feat(health): Household (people/spouse) + Medications with FDA recall check
  86. ab337c2 2026-07-07 fix(tests): isolate suite to abrams_os_test DB
  87. 3a31291 2026-07-07 feat(digest): suppress zero-deadline days
  88. 8cf03df 2026-07-07 feat(digest): opt-in daily deadline digest email via George
  89. 61b2dca 2026-07-07 feat(warranties): manual Warranties page + Deadlines coverage
  90. 43aea4b 2026-07-07 feat(ui): Bills, Reorders, and unified Deadlines pages
  91. 5693d23 2026-07-07 feat(schema): bill + reorder_item tables, recurrence lib, reminder-engine wiring
  92. 7db85d7 2026-07-07 chore: move dev port 9931 -> 9774 (9931 held by japan-enrich/viewer-local) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
  93. 2e0044d 2026-05-31 Add per-site favicon (kills /favicon.ico 404)
  94. 551b5ea 2026-05-19 ignore + 404-guard backup/snapshot files
  95. 20f8f36 2026-05-19 add noreferrer to target=_blank external links
  96. 3458fe1 2026-05-10 tick 18: receipt extractor regression fixtures + heuristic fixes (item 19)
  97. fe7ffca 2026-05-10 tick 17: manual CSV upload route (backlog item 15)
  98. 1666967 2026-05-10 tick 16: Compliance Guardian (URL allowlist + injection scan + PII redact)
  99. a5da75e 2026-05-10 tick 15: auto-parse Drive PDFs on sync (backlog item 17)
  100. 8adb083 2026-05-10 tick 14: unit tests for lib/crypto.js + lib/ids.js (backlog item 16)
  101. 3877b56 2026-05-10 tick 13: /recalls dashboard UI (read-only viewer for recall_match)
  102. 00b6568 2026-05-10 tick 12: service_commitment + merchant policy extractor
  103. fffc3d8 2026-05-10 tick 11: rights_rule_snapshot + 8-rule starter corpus + cited drafts
  104. ee6a1eb 2026-05-10 tick 10: /audit page (read-only viewer for audit_log + auth_event)
  105. d34f2f6 2026-05-10 tick 9: in-process cron for reminders + CPSC refresh
  106. 1f31901 2026-05-10 tick 8: CSRF protection on HTML POST forms
  107. 1f60c67 2026-05-10 tick 7: /claims dashboard UI + claim detail with draft preview
  108. 7294ca3 2026-05-10 tick 6: claim_case + action_queue + claim strategist (drafts only)
  109. b6f84e0 2026-05-10 tick 5: calendar_reminder table + reminder engine
  110. d95d5e5 2026-05-10 tick 4: PDF parsing for receipt attachments (tier-3)
  111. 600c717 2026-05-10 tick 3 (scaffold): CPSC recall_event + recall_match tables + matcher + fetcher
  112. 9e812a4 2026-05-10 tick 2: Google Drive sync (receipt-shaped PDFs/images)
  113. 323f8a8 2026-05-10 tick 1: receipt extractor tier-2 LLM fallback (Mac1 qwen3:14b)
  114. 2113e8d 2026-05-10 feat: 'Import all receipts' button + 2FA gate + Plaid sandbox
  115. 434eca9 2026-05-09 rename OwnershipOS → AbramsOS (per Steve): pkg/db/pm2/env/brand/sessions/localStorage all swept; tests + live server still green on :9931
  116. ef35e84 2026-05-09 smoke green: PG via /tmp socket (peer auth), test glob fix, pool.end on test exit
  117. 3606684 2026-05-09 initial scaffold: OwnershipOS v0.1 — Express+PG shell, Gmail OAuth + receipt extractor, 8-table schema, liquid-glass UI, full canonical spec under docs/

Authors

Agents used

  • none detected

Skills used

  • /claims12
  • /chat8
  • /migrations8
  • /recalls8
  • /audit7
  • /claim-fill-queue6
  • /assets6
  • /vitals6
  • /savings5
  • /biometrics5
  • /neighborhood5
  • /health5
  • /connectors5
  • /prescriptions5
  • /reviews4
  • /withings4
  • /ids4
  • /documents4
  • /phone3
  • /partials3
  • /claim-shots3
  • /yoloforever3
  • /reminders3
  • /bill-audit3
  • /receipt-extractor3
  • /run2
  • /settlements2
  • /signin2
  • /step-up2
  • /healthz2

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

2822732 · 2026-09-11 · reviews: native Amazon review + seller thank-you feature over AbramsOS purchases
- migration 0017 review_draft (keyed to purchase, additive, UNIQUE(purchase,target))
- lib/reviews/{drafts,model,executors}: draft generation (short product names, variety, deslop) from purchase.raw_extract, DB-backed, content-seal on approve
- routes/reviews.js + views/reviews.ejs: /reviews batch-review page (read all, select, approve-in-one-pass), paced per-item gated posting (no bulk fire, no auto-approve)
- gated edge: openclaw resolves product by search (email receipts carry no ASIN) -> needs_verify (human submits); George sends approved seller emails; REVIEWS_EXECUTORS_LIVE + approve + seal + confirm required
- nav link, review id prefix
- 74 drafts generated from 37 real Amazon purchases; posted:0; executors OFF by default

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QA2Se1HgCv8KSZbUQD6w2p
7fca2fd · 2026-09-01 · Harden nav-bar chat PII redaction boundary (TK-11084)
1. grounding: extract person-names uniformly for every scope + merge household
   roster; grounded payees/providers/merchants/reminder titles now redacted
   on external lanes (was vitals-only).
2. redact: whitespace/separator/case normalization before name pass; broadened
   address (apt/city/ST/ZIP, PO Box, short/hyphenated), SSN (spaces+labeled),
   intl phone, odd-grouped card, unlabeled+extra-labeled IDs. Benign order#/
   merchant/product still survive.
3. routes/chat.js: fail CLOSED — no req.userId -> 401; removed DEV_USER_ID.
4. claude-cli: wrap user/context in <user_input> delimiters + neutralize forged
   role-label lines so injected turns are inert (Gemini unaffected).
5. claude-cli: spawn with minimal allowlist env instead of full-inherit-then-
   delete; DB_/AWS_/OPENAI secrets no longer leak to the child.
6. chat.js: persistent 'informational only' disclaimer on every assistant bubble
   + interstitial confirm before first external-model send on the vitals agent.

11 new golden regression tests; npm test 126/126 (1 pre-existing skip).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d683961 · 2026-09-01 · Add nav-bar chat: model+agent pickers, grounded RAG, PII-redacted external lanes
- lib/chat-registry.js: single source of truth for models (Gemini 2.5 Flash/Pro,
  Ollama qwen3/hermes3, Claude CLI) + 7 agent personas with data-scopes
- lib/chat-redact.js: PII redaction boundary (email/phone/SSN/card/NDC/MRN/
  address/named-people) applied to every external-lane prompt
- lib/chat-grounding.js: read-only per-agent record grounding via lib/db.js
- lib/chat-providers/*: gemini (Generative Language API), ollama (local, graceful
  degrade), claude-cli (spawn with ANTHROPIC keys stripped, no shell injection)
- routes/chat.js: POST /api/chat + GET /api/chat/registry, one audit_log row per
  call, read/answer only (no state-changing or external actions)
- views/partials/chat.ejs + footer wiring: chat inherits on every page
- public/js/chat.js + app.css: pickers, spec cards, lane badge, session history
- tests/chat.test.js: redaction golden fixture + registry + route auth-gate

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
b998091 · 2026-08-25 · abramsos: watch loads .env so launchd corpus-refresh has GEORGE_URL (TK-10506)
The launchd plist injects only PG_*; without GEORGE_URL/GEORGE_BASIC_AUTH the
corpus refresh skipped as 'GEORGE_URL unset' even after a token reconnect.
Loading .env (WorkingDirectory=repo root) gives the headless watch the George
creds; dotenv never overrides the plist-set PG_* vars.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
801e623 · 2026-08-25 · abramsos: make Mode claims watch autonomous via George-corpus path (TK-10506)
Removes the watch's hard dependency on a connected Gmail OAuth *connector*
row (connector_account has 0 rows), which made it SKIP silently and never
ingest. New autonomous design:
- lib/mode-corpus.js: best-effort refresh of the local Mode corpus from Gmail
  via the George HTTP bridge; NON-BREAKING (George down / stale bridge auth /
  steve-personal invalid_grant all return {ok:false,reason} + surface a gated
  reconnect signal, never throw).
- mode-claims-watch.js: refresh -> ALWAYS run the corpus ingester (idempotent)
  -> stage fill-not-submit briefs for eligible claims. No OAuth required.
- ingest-mode-claims-corpus.js: glob every data/mode-emails-*.js shard so
  George-refreshed mailers are picked up without editing the script.
- Fixes the person.address bug: query selected a non-existent 'address'
  column (silently caught -> empty profile, so briefs lost name/email/phone
  too). Now reads metadata_jsonb->>'address'. Never submits; never fabricates.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
c1f4023 · 2026-08-25 · abramsos: fix test suite — disable app Basic Auth + single-user autologin in test env
Commit 8aca6e8 (app-level Basic Auth) intercepted the session-auth/CSRF
smoke tests with 401 before route logic, and .env's SINGLE_USER_AUTOLOGIN
auto-logged-in the owner so the 'auth-gated' tests saw 200 instead of 302.
Both are production/fleet concerns, not what these tests validate. Overriding
APP_BASIC_AUTH=0 + SINGLE_USER_AUTOLOGIN= in the test script restores the
suite to green (110/111 pass, 1 pre-existing pdf-fixture skip). Production
keeps Basic Auth (NODE_ENV=production) + nginx + autologin unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fca604e · 2026-08-19 · abramsos: CNCP parking-lot fallback fires only when George unavailable
Cody catch: unconditional post 4x/day would flood the parking-lot board.
Also replace global fetch() with http.request() for Node 18 compat.
6f0e9fc · 2026-08-19 · abramsos: fix claims-autopilot scheduler — separate alert error from fill error
- George 401 (missing GEORGE_BASIC_AUTH) no longer masks fill as 'FAILED'
- Alert failures log as WARN so fill success is visible
- Add CNCP parking-lot fallback: urgent claims (deadline ≤7d) posted to
  http://localhost:3333 automatically, no George cred needed
889a18c · 2026-08-18 · AbramsOS nav: move 18 top tabs into a left sidebar panel + add missing Settlements link
- header.ejs: topbar -> sticky left .sidebar (vertical scroll nav, brand top, sign-out+theme bottom); adds /settlements (+ Claims) to the nav; client-side active-link highlight
- footer.ejs: close the new content-wrap/applayout wrappers
- app.css: .applayout flex + .sidebar/.sidenav rules + <=860px row-wrap fallback
ad64537 · 2026-08-18 · Add priority ranking + per-item ratings view to settlement-claims dashboard
Mirror the :9801 approvals scoreGate engine on the AbramsOS settlements page:
per-claim 0-5 ratings (value/urgency/ease/win-likelihood), composite priority
(value*2.4 + urgency*2.4 + ease*1.0 + win*0.4), high/med/low tier. Rank open
claims priority-first with rank badge, tier chip, rating bars, $/deadline/proof
pills; show recently-expired separately. New lib/settlement-score.js (pure/
deterministic); scores computed server-side in the route, passed to the EJS view.
Eligibility controls + fill-not-submit staging button unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7ff4ec3 · 2026-08-07 · AbramsOS: class-action settlement claim-filler (Mode feed → openclaw fill-not-submit)
- lib/mode-claims.js: deterministic parser for the Mode Class Actions newsletter
  (handles Mode's swapped-URL quirk via slug↔name token matching)
- 0016_settlement_claims.sql: settlement_claim + settlement_fill_job tables
- ingest-mode-claims.js: native Gmail-connector ingester (idempotent, $0)
- openclaw-claim-filler.js: builds a portal-driver brief that PREFILLS and STOPS
  at the perjury attestation/submit; only for eligibility_state='eligible'
- mode-claims-watch.js + launchd (15m): 'as soon as email lands' trigger
- /settlements dashboard: eligibility toggle + gated 'Prefill via openclaw'
- 6-month Dan backfill artifact: 19 distinct settlements, 12 open

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
254e60d · 2026-07-31 · Rate-limit auth endpoints + fix audit-log IP integrity
- middleware/rate-limit.js: hand-rolled in-memory limiter (no dep), 12/15min/IP,
  429+Retry-After. Applied to POST /signin, /signup, /step-up. Verified: 12 ok then 429.
- clientMeta now logs req.ip (trust-proxy-resolved real client) not the raw leftmost
  X-Forwarded-For (attacker-controllable) — audit-log IP integrity.
/yoloforever cycle 3. Cody's 'XFF-spoof bypasses the limiter' CRITICAL was DISPROVEN
empirically (spoofed XFF still 429 — nginx appends real peer right; trust proxy:1 picks
it); only the audit-log (leftmost-XFF) read was the real issue. HSTS already sent by helmet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8c7f239 · 2026-07-31 · Stop unauth info-disclosure on public surface (/healthz + error handler)
- /healthz returns {ok} only (drop pid + err.message); full error logged server-side.
- Global error handler renders a generic client message; internal err.message no
  longer leaks (Postgres schema etc.) to the internet. Full detail still logged.
Keepalive still gets 200. /yoloforever cycle 2; verified healthz+auth intact.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d08f146 · 2026-07-31 · Harden auth cookies for public HTTPS surface + record claims subdomain deploy
- trust proxy=1 (behind Kamatera nginx) so req.secure reflects X-Forwarded-Proto.
- Session + CSRF cookies now secure:req.secure — Secure over HTTPS subdomain,
  plain over direct tailnet http (no lockout). Closes cookie-in-transit leak on
  the now-public claims.abramsos.agentabrams.com PII surface.
- Records the deployed nginx vhost (45.61.58.125:80/443 -> 100.82.17.107:9774).
Found by /yoloforever cycle-1 contrarian gate; verified Secure-on-https / plain-on-http.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2f71185 · 2026-07-31 · Add California unclaimed-property tracker to claims dashboard
- New unclaimed_property table (migration 0015) + seed of 5 CA properties
  found for Steve on claimit.ca.gov ($131.55, status=staged). Public data
  only, no SSN.
- /claims now renders a Tracked Properties table (amount/holder/address/
  property-id drill hrefs, found date+time chip, per-row status select).
- API: GET /api/unclaimed, POST /api/unclaimed/:id/status (session-scoped
  write, audited, CSRF-exempt like other /api routes).
- server.js: claims.abramsos.agentabrams.com/ -> /claims host redirect.
- DNS + live deploy left gated (memo in pending-approval).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fc3c624 · 2026-07-13 · chore: lint (node --check 21/21) + version bump v0.3.0 (session close)
Overnight life-optimizer build: health (vitals/insights/BP-meds/reminders), savings
(advisor/coupons/bill-audit/reorder-timing), Assets+RentCast, Neighborhood Watch,
Biometrics, Plaid+CSV banking, Withings device sync, 38 real Amazon purchases ($8,966.66).
5671885 · 2026-07-13 · withings: device-vitals auto-sync connector (OAuth2 → weight/BP/HR/SpO2 into Health)
- lib/withings-client.js: Withings Health API OAuth (authUrl/exchange/refresh) + getMeasures mapping (type 1=weight kg→lb, 9/10=BP pair, 11=HR, 54=SpO2); handles refresh-token rotation; graceful no-creds
- routes/withings.js: /auth/withings → consent → /api/withings/callback stores encrypted token in connector_account (provider=withings) + initial sync; /api/withings/sync re-syncs (dedup via health_reading external_id); reuses vitals.insertReadings; audited medical
- connectors.ejs: 'Health devices' section — Connect Withings / Sync now / setup-needed
- server.js wiring + .env WITHINGS_* (gated). One-set-of-creds-from-working
ba2e47d · 2026-07-13 · assets: RentCast home-value estimate wiring (one-key-from-working) + all 37 Amazon totals collected
- lib/home-value.js: RentCast AVM lookup by address; graceful no-key/no-address (never fabricates a value); Zillow API retired so RentCast is the free option
- routes/assets.js: POST /api/assets/:id/estimate → fills current_value + value_source='estimate' + range; valuationConfigured flag
- views/assets.ejs: 'Estimate' button on property cards (prompts for key if absent)
- .env: RENTCAST_API_KEY= (gated)
- DATA: opened remaining 17 older Amazon orders via George → all 37 now have real totals; complete all-time spend $8,966.66 (2022-2026)
5387c7d · 2026-07-13 · savings: subscription/bill audit + reorder-timing nudges
- lib/bill-audit.js: category-aware — NEVER flags essentials (tax/rent/utility/loan); insurance/phone/internet get 'shop your rate'; discretionary/subscriptions ALWAYS surface with annual cost ('still using this?'), LLM (gemma3:12b) refines cancel/downgrade/overpriced; rule-based duplicate detector
- lib/reorder-timing.js: deterministic 'reorder soon' nudges from cadence + last_ordered (Paper towels due-now verified)
- wired both into /api/savings/run + nightly runner; kind='bill-audit'/'reorder-timing' surface on /savings
- honest: est_savings only for cancel/downgrade, never for 'review'; verified on synthetic sub then wiped
5ab1c97 · 2026-07-13 · biometrics: per-person ID/emergency profile for kids + adults (child-ID record + growth BMI)
- 0014_biometrics.sql: person_biometric (1:1 per person) — DOB, sex, height, weight, blood type, eye/hair, marks, allergies, conditions, emergency contact, prints-on-file (child-ID)
- lib/biometrics.js: exact age + BMI; adult CDC BMI category; kids link to CDC percentile calculator (NO fabricated percentile)
- routes/biometrics.js upsert-per-person + views/biometrics.ejs profile cards w/ inline edit, child badges
- nav + wiring. Sensitive PII, audited; works for whole household
42d431f · 2026-07-13 · neighborhood: Neighborhood Watch — address+radius, Leaflet map, Ring cameras + Neighbors, Nextdoor/Citizen/crime maps/registries
- lib/neighborhood.js: free OSM Nominatim geocoder (no key) + categorized real deep-link builder (Your Ring first: cameras live-view + Neighbors feed), geo-aware SpotCrime/OSM links
- routes/neighborhood.js: /neighborhood resolves address from ?asset/?address/first property; /api/neighborhood/geocode
- views/neighborhood.ejs: address+radius controls, Leaflet map w/ radius circle, property picker, link cards
- nav + wiring; links to Assets property addresses
a78d4ae · 2026-07-13 · assets: net-worth tracker — enter home by address + current value, finance category, details/notes
- 0013_assets.sql: asset table (property/vehicle/account/valuable) w/ address, current_value, category, details, notes, geocode
- routes/assets.js + views/assets.ejs: /assets dashboard (net worth total + by-category stat row, add form, created date+time chips, per-property 'Watch' link to neighborhood)
- nav + wiring. Values user-entered (auto-valuation API is a later gated add). Feeds upcoming neighborhood-watch via property address
8598287 · 2026-07-13 · health: lapsed-habit BP reading reminders (only nudges prior loggers, never new users)
- lib/vitals-reminders.js: fires 'time for a BP check' only if a person logged BP before but not in 14d; deduped via reminder engine
- reminder-engine.generateForUser hooks it in alongside returns/warranty/recall reminders
- verified: lapsed(20d)=fire, recent(2d)=skip, never-logged=skip
355389e · 2026-07-13 · health: BP-medication context — show active meds that raise/lower blood pressure alongside the trend
- lib/bp-meds.js: deterministic classifier (curated generic stems + names -> effect/class; never LLM-guessed) — ACE/ARB/beta-blocker/CCB/diuretic (lowers) + NSAID/decongestant/steroid/stimulant (raises)
- routes/vitals.js: read-only join to medication table, bpRelevant() into /health
- views/vitals.ejs: 'Medications that affect blood pressure' panel (color-coded lowers/raises), informational-not-advice
- works when med list is populated (currently empty)
8f58fa2 · 2026-07-13 · health: vitals trends + insights (weight/RHR sparklines, local-LLM 'what changed this month', gentle Stage-2 recheck flag)
- lib/vitals-insights.js: computeTrends (this-30d vs prior-30d avgs), recheckFlag (deterministic rule, gentle), summarize (gemma3:12b narrates ONLY computed deltas — never invents readings; no medical advice)
- routes/vitals.js: fast trends+recheck on /health load; /api/health/insights for async LLM narrative
- views/vitals.ejs: 'This month' panel (trend chips + delta arrows + recheck banner + async narrative) + weight/RHR sparklines
- verified end-to-end on synthetic data then wiped; empty-state safe (no fabricated readings)
4a02cce · 2026-07-13 · purchases: collect 38 real Amazon orders from info@ (via George) into purchase table
- scripts/collect-amazon-orders.js: parsed order confirmations 2022-2026, dedup on order#, total NULL (not fabricated — needs body enrichment)
- validates savings seeds: Nespresso Vertuo = top recurring buy (4x), shipping labels (2x)
- feeds home purchase count + /purchases + savings advisor with REAL data
ded692c · 2026-07-13 · connectors: no-signup bank import — Wells Fargo CSV upload (headerless + negative-debit aware)
- csv-parser: headerless fallback (WF/Quicken export: date,amount,*,,description) + signMode — WF debits are negative=spend, so normalize to positive + drop deposits; header CSVs unchanged
- upload.js: dedup key (csv:date:amount:merchant) + ON CONFLICT so re-uploading overlapping statements doesn't double
- connectors.ejs: 'Import CSV' upload form with WF download instructions — zero third-party signup path
- answers Steve: Plaid needs a free web signup (no CLI); CSV upload needs nothing
954cc77 · 2026-07-13 · connectors: Plaid 'Connect a bank' UI (Wells Fargo etc.) + incremental/idempotent sync
- views/connectors.ejs: Plaid Link flow — connect button, secure login (Plaid handles bank creds), exchange, per-bank sync; graceful 'setup needed' state when keys absent
- routes/plaid.js: GET /api/plaid/status; sync now resumes from persisted cursor + ON CONFLICT dedup (was re-pulling everything each sync -> dup purchases)
- lib/plaid-client.js: isConfigured() helper
- 0012_plaid_sync_cursor.sql: connector_account.sync_cursor + unique(user_id,order_number) on purchase
- Plaid (not Stripe) is correct for reading a bank; sandbox works now, real Wells Fargo needs Steve's prod keys
2d8848c · 2026-07-13 · health: Vitals module — BP history + Apple Watch/device readings + sync
- 0011_health_readings.sql: health_reading (BP pairs, HR, weight, SpO2, glucose...) w/ dedup index
- lib/health-metrics.js: AHA BP categorization + Apple Health export.xml streaming parser (pairs systolic/diastolic by timestamp; scales SpO2)
- routes/vitals.js + views/vitals.ejs: /health dashboard w/ inline SVG BP chart, AHA color categories, per-person filter, manual add, delete; /api/health/readings JSON ingest for the Health Auto Export app
- scripts/import-apple-health.js: one-command import of an Apple Health export
- nav + wiring. NO fabricated readings — table ships empty w/ 3 real sync paths. Verified end-to-end on synthetic data then wiped.
0256450 · 2026-07-13 · savings: nightly advisor runner + launchd plist (draft, Steve bootstraps)
- scripts/run-savings-advisor.js: dotenv-loaded, dedup-safe regen (local, $0)
- deploy/com.steve.abramsos-savings.plist: daily 6:05am, RunAtLoad off; bootstrap surfaced in header comment
a121be0 · 2026-07-13 · savings: home dashboard tile + honest merchant-savings leads
- home: 'Savings ideas' stat tile (open count + est $ total) linking to /savings
- seeded 3 real verifiable savings mechanisms (Amazon Subscribe & Save, camelcamelcamel price alerts, Costco coupon book) — real URLs, no fabricated codes
db2fd48 · 2026-07-13 · savings: life-optimizer module — cheaper/better substitutes from what you buy (local gemma3:12b, $0)
- 0010_savings.sql: savings_suggestion + merchant_coupon tables
- lib/savings-advisor.js: grounded strategy suggestions (no hallucinated SKUs/prices)
- routes/savings.js + views/savings.ejs: dashboard w/ created date+time chips, sort+density, save/dismiss
- seeded reorder items from real Amazon email history; 4 suggestions generated
- switched local model qwen3:14b->gemma3:12b (qwen3 thinking-mode returns empty under format:json)
b02722e · 2026-07-08 · NDC-precise FDA recall match: flag fills whose actual dispensed product is recalled
- scripts/ndc-recall-check.js: match each fill's 11-digit package NDC to openFDA product NDC
  (leading-zero-normalized labeler|product, exact-confirmed); 4/46 NDCs on a recall list, 40 fills
- recalls tab: prominent 'Your actual products on an FDA recall list' NDC section (headline signal)
- Rx tab: red RECALL badge on flagged fills (CREON, Fluticasone, Nystatin, Atorvastatin)
78b80e6 · 2026-07-08 · FDA recall cross-reference: clean drug names, derive generics, openFDA match into Recalls tab
- scripts/check-fda-recalls.js: cleans OCR junk from fill drug names (95 fixed), rebuilds
  deduped medication list (83->36 real meds) with generic names, cross-references each vs
  openFDA drug-enforcement (free); 33/36 matched, 300 recall records into medication_recall
- routes/recalls.js + views/recalls.ejs: new 'Medication recalls (FDA)' section, grouped per
  med, Class I/II/III severity badges, worst-first; labeled advisory (ingredient-level match)
542a632 · 2026-07-08 · Import Shangoo Pharmacy tax profile: prescription_fill table + 277 fills + 83 meds + /prescriptions viewer
- 0009_prescription_fills.sql: fill-history table (date/drug/rx/qty/days/doctor/plan/plan-paid, raw OCR audit)
- scripts/load-abrams-rx.js: OCR-parsed loader, reconciled to doc totals (Natalia 220 fills / $136,254.86 of $136,328.74)
- creates person Steve (self) + Natalia (spouse); dedupes 83 medications into medication table
- routes/prescriptions.js + views/prescriptions.ejs: read-only viewer w/ per-person totals + filter; nav 'Rx'
63d53f9 · 2026-07-07 · feat(health): Household (people/spouse) + Medications with FDA recall check
- migration 0008: person, medication, medication_recall
- /household — add spouse/dependents (records + meds attach to them)
- /medications — self-entered meds per person; every write audit-logged with a medical-consent marker (AGENTS.md gate)
- lib/fda-fetcher.js — openFDA drug-enforcement lookup; per-med + "check all" recall scan stores matches, surfaced on the card
- nav links, recall styling

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ab337c2 · 2026-07-07 · fix(tests): isolate suite to abrams_os_test DB
pretest builds/migrates/seeds a throwaway abrams_os_test (schema + all migrations
+ seed.sql + rights-rules); test script pins PG_DATABASE=abrams_os_test. Stops the
auth-e2e test from wiping the real owner account on every `npm test` (AGENTS.md rule).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3a31291 · 2026-07-07 · feat(digest): suppress zero-deadline days
sendDigest short-circuits when there are no upcoming deadlines, so empty days
don't put a "nothing due" email in the inbox.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8cf03df · 2026-07-07 · feat(digest): opt-in daily deadline digest email via George
- lib/digest.js builds an HTML digest (overdue / this week / coming up) and self-sends to Steve's own inbox via George /api/send (internal recipient, no external-send token)
- scheduler cron 08:00 America/Los_Angeles is DOUBLE-GATED: off unless DIGEST_ENABLED=1 AND GEORGE_BASIC_AUTH set; committed code is dormant and never auto-sends on its own
- .env.example documents all digest keys (default DIGEST_ENABLED=0)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
61b2dca · 2026-07-07 · feat(warranties): manual Warranties page + Deadlines coverage
- /warranties + /api/warranties CRUD (audit-logged) writing to service_commitment (source='manual')
- reminder-engine scans service_commitment.refund_window_ends_at -> 'coverage_window_closing' deadlines
- nav link, warranty id prefix

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
43aea4b · 2026-07-07 · feat(ui): Bills, Reorders, and unified Deadlines pages
- /bills, /reorders CRUD (audit-logged) + /deadlines over the reminder engine
- add-forms, mark-paid/ordered (rolls due date forward + refreshes deadline), created date+time chip on every admin card
- generalized sort-density.js to any [data-grid]; nav links; liquid-glass styles

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5693d23 · 2026-07-07 · feat(schema): bill + reorder_item tables, recurrence lib, reminder-engine wiring
- 0007 migration: bill (Bills to Pay incl. tax/government/CRA via category) + reorder_item (frequently-ordered + best-price savings)
- lib/recurrence.js: pure cadence date math (+ 5 passing unit tests)
- reminder-engine emits calendar_reminder rows for upcoming bill due-dates and reorder points (unified Deadlines)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
551b5ea · 2026-05-19 · ignore + 404-guard backup/snapshot files
.gitignore now excludes *.bak, *.bak.*, *.pre-*, *.orig, *~ so editor
swap files and pre-edit snapshots can't be accidentally committed and
end up served from /public. Backstop in server.js: any GET whose path
matches those patterns short-circuits to 404 before express.static,
so even a stray on-disk *.bak.html can never leak.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
20f8f36 · 2026-05-19 · add noreferrer to target=_blank external links
CPSC notice + cited-rule source links now use rel="noopener noreferrer"
instead of bare rel="noopener" so we don't leak Referer to upstream pages.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3458fe1 · 2026-05-10 · tick 18: receipt extractor regression fixtures + heuristic fixes (item 19)
- 7 new golden-file fixtures in tests/fixtures/receipts/ (Amazon, Best Buy,
  DoorDash, Apple, Etsy, Uber, Walmart, plus a non-receipt newsletter)
- tests/extractor-regression.test.js auto-discovers fixtures and asserts
  merchant + total + orderNumber + minConfidence per file
- lib/receipt-extractor.js: 2 surgical heuristic fixes uncovered by fixtures
  · extractTotal now picks the highest-rank label ("order total" >
    "grand total" > "total charged" > plain "total"); allows up to 40 chars
    between label and $amount (handles "Total charged to Visa ••1234: $18.42");
    rejects "subtotal" via 3-char lookbehind
  · extractOrderNumber adds Best-Buy-style "Order #: BBY01-806589123456"
    (alpha prefix + digits) and a tighter Amazon-only pattern
- 15/15 tests across the regression + base extractor suites
fe7ffca · 2026-05-10 · tick 17: manual CSV upload route (backlog item 15)
- npm install multer
- lib/csv-parser.js: parses statement-style CSVs
  · auto-detects date / amount / merchant columns (case-insensitive)
  · handles quoted fields with embedded commas, dollar signs, parens-as-negative
  · skips refunds (negative amounts) and bad rows; reports first 5 errors
- routes/upload.js: POST /api/upload/csv (multer in-memory, 10 MB cap)
  → parser → INSERT purchase rows + audit_log entries
- 10/10 csv-parser tests
1666967 · 2026-05-10 · tick 16: Compliance Guardian (URL allowlist + injection scan + PII redact)
- lib/compliance-guardian.js: 4 layered defenses
  · isAllowedDestination(url) — outbound HTTP allowlist (gov, NIH/FDA,
    Plaid, Google APIs, local LLM endpoints; subdomain-confusion safe)
  · detectPromptInjection(txt) — 16 patterns (ignore-prior-instructions,
    chatml fragments, role injection, exfiltration phrasing, code-eval)
  · redactPii(text) — masks card #, SSN, phone, email local-part, ZIP,
    Stripe/OpenAI-style API keys; keeps domain hints
  · guardForLlm(text) — one-shot redact+scan combiner
- lib/receipt-extractor.js: enrichWithLlm now runs guardForLlm() on body+from+
  subject before sending to Ollama; refuses enrichment if injection detected
  (returns heuristic with llmError='compliance_guardian_blocked')
- tests/compliance-guardian.test.js: 19/19 across allowlist (6), injection (4),
  redactor (6), one-shot guard (3)
a5da75e · 2026-05-10 · tick 15: auto-parse Drive PDFs on sync (backlog item 17)
- routes/connectors.js syncDrive(): after a Drive PDF lands in document table,
  immediately calls pdf.parseFile() + receipt-extractor (heuristic + LLM).
  Inserts a purchase row when extractor returns a draft.
- Images skipped (OCR is a later tick); failed parses flip parsed_status='failed'
- audit_log gets document_parsed + purchase_extracted (source: 'drive_pdf')
- 34/35 tests still green
8adb083 · 2026-05-10 · tick 14: unit tests for lib/crypto.js + lib/ids.js (backlog item 16)
- tests/crypto.test.js (7): AES-256-GCM round-trip, IV uniqueness, tamper
  detection on ciphertext + auth tag, unicode, empty-string, env-var validation
- tests/ids.test.js (6): prefix per kind, unknown-kind throws, distinctness,
  ULID monotonic-over-time, lowercase invariant
- 13/13 green; pure unit tests, no PG, no server
3877b56 · 2026-05-10 · tick 13: /recalls dashboard UI (read-only viewer for recall_match)
- routes/recalls.js: GET /recalls (HTML), GET /api/recalls (JSON)
  · joins recall_match × recall_event × purchase
  · status filter (pending_review/confirmed/dismissed) with chip-counts
- views/recalls.ejs: confidence-coded cards (red ≥85%, amber otherwise)
  with CPSC source link
- nav: /recalls added between /claims and /audit
- 2 new tests (auth-gate + API-gate)

File tree

237 files tracked. Click any to browse the source at HEAD.

Other build journals

← AbramsEgo  ·  all 4 projects  ·  AgentAbrams →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 2ms