Govarbitrage
Search the build
-
51d02ee2026-09-16 chore: v0.5.3 (session close — TK-00046 /agents sort+density runtime guard) -
e8017722026-09-16 TK-00046 test: runtime regression guard for /agents sort + density -
bfb96b12026-09-16 auto-data-snapshot: 2026-09-16T14:34:47 (1 data files) — tsconfig.tsbuildinfo -
9bbed622026-09-16 Add GovArbitrage mobile app, browser extension, and import/digest scripts (with code-review hardening) -
8c048d32026-09-16 auto-data-snapshot: 2026-09-16T11:14:29 (1 data files) — tsconfig.tsbuildinfo -
c32a7a12026-09-13 chore: v0.5.2 (session close — TK-11476 test coverage) -
f4075762026-09-13 auto-data-snapshot: 2026-09-13T00:21:19 (1 data files) — tsconfig.tsbuildinfo -
037818c2026-09-12 TK-11476 test: regression guard for TK-11466 FIX 2 (presentedAdminBasicAuth) -
91c47052026-09-12 auto-data-snapshot: 2026-09-12T13:27:22 (1 data files) — tsconfig.tsbuildinfo -
5c6b0bb2026-09-12 Snapshot: commit staged govarbitrage scaffold (Docker, README, apps/mobile Expo app, extension, docs, 5x report) -
c62e1532026-09-12 TK-11464 fix (re-commit): gate orderBy nulls-ordering to nullable sort columns only -
6531e6f2026-09-12 TK-11464 test: regression guard for sort orderBy nullability classification -
0442a972026-09-11 TK-11466 FIX 2: decouple ADMIN mint from wall-disabled state (presentedAdminBasicAuth) -
e3141d02026-09-11 Deploy approved TK-11249 pricing copy; local source e69a5ea -
d81ee962026-09-11 Snapshot live source before approved TK-11249 pricing release
Authors
- Steve11
- auto-commit-fleet4
Agents used
Skills used
- /claude6
- /code6
- /agents3
- /middleware3
- /credentials3
- /mobile2
- /bundle1
- /search1
- /query1
- /name1
- /reviews1
- /rating1
- /digest1
- /newsletter1
- /hot-deal1
- /no-live-signal1
- /login1
- /dev-only1
- /public-actor-id1
- /listings1
- /pricing1
Creative ideas + design notes
51d02ee · 2026-09-16 · chore: v0.5.3 (session close — TK-00046 /agents sort+density runtime guard)
Lint clean (eslint 0), typecheck clean (tsc 0), unit suite green (vitest 196/196). No product code changed this session — the only addition is the TK-00046 regression guard committed in e801772. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
e801772 · 2026-09-16 · TK-00046 test: runtime regression guard for /agents sort + density
The sort + density fix landed 2026-07-26 but nothing verified it kept working. Source/bundle inspection only proves the code is deployed, not that the controls render and are wired, so this asserts observable behaviour in a real browser instead. Covers: controls render; sort reorders across all four keys; the density slider changes the grid's minmax() track; both prefs survive a reload. Intercepts /api/agents/search with a fixture, so it never calls Google Places and costs $0 (a real search bills ~$0.04/query x 3 lenses x kinds). The fixture is ordered so best/name/reviews/rating each yield a different sequence — a no-op sort cannot pass. Verified negative-capable: with name-sort stubbed to return the list unsorted, exactly the two name-dependent tests go red while the render and density tests stay green. Basic-auth creds come from the same BASIC_AUTH env src/middleware.ts reads (nothing hardcoded); E2E_CHANNEL drives system Chrome when the shared ms-playwright cache is lock-contended by another project. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9bbed62 · 2026-09-16 · Add GovArbitrage mobile app, browser extension, and import/digest scripts (with code-review hardening)
Introduces the Expo mobile app (apps/mobile), the listing-capture browser extension, the auction-source importers, and the digest/newsletter/hot-deal senders, plus test/build configs. Code-review fixes applied to these files before commit: - importers: exit non-zero on empty feed / all-rows-failed (no more false green); govdeals-free isolates each market so one failure can't abort the siblings - liveness-sweep: scope GONE_MARKERS to <title>/no-live-signal so a sidebar "ended" string can't falsely mark a live listing REMOVED; add fetch timeout - mobile auth-headers: UTF-8-safe base64 so a non-Latin1 password no longer throws out of every API call - "Newest" sort now sorts by createdAt end-to-end (backend flattenListing + NATIVE_SORT_COLUMNS + sort test + mobile SortField), which also restores the admin created-date chip + location on the list grid - hot-deal-alert: stamp hotAlertedAt before send with rollback-on-failure to avoid duplicate alerts - send-digest: escapeHtml on scraped location; mkdir logs/ before dry-run write Verified: backend tsc clean, 196 vitest pass, 13 mobile unit tests pass, lint clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014TiE2Px2C8yTX7JJFajxoP
c32a7a1 · 2026-09-13 · chore: v0.5.2 (session close — TK-11476 test coverage)
Lint (eslint) clean on src/middleware.test.ts, no autofixes needed. Refactor pass: file already uses shared req()/basicHeader() helpers, no dead code or duplication found — no changes made. Patch bump for the TK-11476 regression-test addition. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
037818c · 2026-09-12 · TK-11476 test: regression guard for TK-11466 FIX 2 (presentedAdminBasicAuth)
Adds src/middleware.test.ts (8 cases) exercising the wall-OFF scenario that caused the anonymous-ADMIN bypass: with BASIC_AUTH="" an anon caller on a protected page must redirect to /login (307) / 401 JSON on APIs, and must never be minted an ADMIN ga_session cookie -- including regression guards for a bogus Authorization header and for presenting the exact default BASIC_AUTH credential while the wall is off (the precise TK-11466 shape). Wall-ON behavior is asserted unchanged (401 with no creds, ADMIN mint on the correct shared credential, 401 on a wrong one). All 8 pass against the current working-tree middleware.ts (which already carries FIX 2, committed 0442a97 and verified live on Kamatera prod per TK-11466's action log). Full suite: 196/196 pass; tsc --noEmit clean. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SF5S5cw5NwnFQwg5iSbj6T
5c6b0bb · 2026-09-12 · Snapshot: commit staged govarbitrage scaffold (Docker, README, apps/mobile Expo app, extension, docs, 5x report)
Session close-out snapshot of the staged index (local only, no remote). Also tune .gitleaks.toml: allowlist .env.example (pure placeholder template) + the dummy hex/dev-only/DEMO_KEY/public-actor-id values so the generic-api-key rule stops false-positiving on the 64-hex shape. No live secrets involved; all other rules stay active on every other file. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WcVgXtxgFs4DnQDv3fFnLD
c62e153 · 2026-09-12 · TK-11464 fix (re-commit): gate orderBy nulls-ordering to nullable sort columns only
Re-commit — the prior fix commit was lost when this repo's .git was reset by
an external process on the re-populated tree. The working-tree fix was intact.
Sort-by-title (and any required native column) 500'd with PrismaClientValidationError
because the {sort,nulls} orderBy object form was applied to required fields;
Prisma only accepts it on nullable fields. Gate behind NULLABLE_NATIVE_SORT_COLUMNS.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UYTNq3N4J57Gcna8XdPJ18
6531e6f · 2026-09-12 · TK-11464 test: regression guard for sort orderBy nullability classification
DB-free vitest guard (reads Prisma DMMF) asserting a native sort column is
classified nullable iff its schema field is optional — catches the exact
recurrence vector of the title-sort 500 (the {sort,nulls} object form applied
to a required field). Verified: passes on current schema; proven to fail when
a required column (title) is misclassified as nullable. Does not touch
listings.ts (keeps the single-file deploy diff-guard intact).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UYTNq3N4J57Gcna8XdPJ18
0442a97 · 2026-09-11 · TK-11466 FIX 2: decouple ADMIN mint from wall-disabled state (presentedAdminBasicAuth)
Anonymous ADMIN auth-bypass: when BASIC_AUTH="" (wall off) basicAuthOk() returns true for everyone, so the mint branch handed a real ADMIN ga_session to any anonymous visitor -> reached /api/credentials + billing. Add presentedAdminBasicAuth() (false when BASIC_AUTH empty; true only on a real matching Basic-Auth credential) and use it for the ADMIN mint. Wall-on behavior unchanged; wall-off no longer mints anonymous ADMIN. tsc + next build pass. Verified: anon / -> 401, anon /api/credentials -> 401, authed admin -> /api/credentials 200, anon /api/listings + /pricing -> 200. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019UrUfuy6xZtKf7bmWusKco
File tree
- .dockerignore
- .env.example
- .gitignore
- .gitleaks.toml
- 5x/REPORT.md
- Dockerfile
- README.md
- apps/mobile/.claude/settings.json
- apps/mobile/.gitignore
- apps/mobile/.npmrc
- apps/mobile/AGENTS.md
- apps/mobile/APP-STORE-LISTING.md
- apps/mobile/ASC-PASTE-KIT.md
- apps/mobile/CLAUDE.md
- apps/mobile/LICENSE
- apps/mobile/app.json
- apps/mobile/app/(tabs)/_layout.tsx
- apps/mobile/app/(tabs)/index.tsx
- apps/mobile/app/(tabs)/settings.tsx
- apps/mobile/app/_layout.tsx
- apps/mobile/app/listing/[id].tsx
- apps/mobile/assets/android-icon-background.png
- apps/mobile/assets/android-icon-foreground.png
- apps/mobile/assets/android-icon-monochrome.png
- apps/mobile/assets/favicon.png
- apps/mobile/assets/icon.png
- apps/mobile/assets/splash-icon.png
- apps/mobile/components/ErrorBoundary.tsx
- apps/mobile/components/ErrorCard.tsx
- apps/mobile/components/OpportunityCard.tsx
- apps/mobile/components/ScoreBadge.tsx
- apps/mobile/constants/theme.ts
- apps/mobile/device-proof-evidence/.gitignore
- apps/mobile/device-proof-evidence/CAPTURE-RUNBOOK.md
- apps/mobile/device-proof-evidence/CLEAN-stills-2026-09-03T17-31-41Z/1-cold-launch.png
- apps/mobile/device-proof-evidence/CLEAN-stills-2026-09-03T17-31-41Z/2-detail-maxbid.png
- apps/mobile/device-proof-evidence/CLEAN-stills-2026-09-03T17-31-41Z/3-settings.png
- apps/mobile/device-proof-evidence/CLEAN-stills-2026-09-03T17-31-41Z/4-connection-test.png
- apps/mobile/device-proof-evidence/CLEAN-stills-2026-09-03T17-31-41Z/5-siwa.png
- apps/mobile/device-proof-evidence/COMPLETENESS-FINDING.md
- apps/mobile/device-proof-evidence/DDI-UNBLOCK-CHECKLIST.md
- apps/mobile/device-proof-evidence/EVIDENCE-INDEX.md
- apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.pbxproj
- apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/project.xcworkspace/contents.xcworkspacedata
- apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITest.xcodeproj/xcshareddata/xcschemes/GovArbUITests.xcscheme
- apps/mobile/device-proof-evidence/GovArbUITest/GovArbUITests/GovArbUITests.swift
- apps/mobile/device-proof-evidence/GovArbUITest/README.md
- apps/mobile/device-proof-evidence/GovArbUITest/watch-capture.sh
- apps/mobile/device-proof-evidence/SIM-DRYRUN-FINDINGS.md
- apps/mobile/device-proof-evidence/SUBMIT-GATE-CHECKLIST.md
- apps/mobile/device-proof-evidence/_pii-review/pii-scan-contact-sheet-1-of-2-20260903T164350Z.jpg
- apps/mobile/device-proof-evidence/_pii-review/pii-scan-contact-sheet-2-of-2-20260903T164350Z.jpg
- apps/mobile/device-proof-evidence/capture-lib.sh
- apps/mobile/device-proof-evidence/capture-tap-scroll.sh
- apps/mobile/device-proof-evidence/govarbitrage-SIMULATOR-dryrun-2026-09-02T221255Z.mov.DO-NOT-UPLOAD-simulator-fails-2.1
- apps/mobile/device-proof-evidence/privacy-contact-sheet-2026-09-03T16-42-59Z.jpg
- apps/mobile/device-proof-evidence/privacy-scan.sh
- apps/mobile/device-proof-evidence/privacy-sweep-CLEAN-2026-09-03T17-31-41Z.jpg
- apps/mobile/device-proof-evidence/readiness-probe.sh
- apps/mobile/device-proof-evidence/run4-clean-2026-09-03T15-23-26Z/1-cold-launch.png
- apps/mobile/device-proof-evidence/run4-clean-2026-09-03T15-23-26Z/2-detail-maxbid.png
- apps/mobile/device-proof-evidence/run4-clean-2026-09-03T15-23-26Z/3-settings.png
- apps/mobile/device-proof-evidence/run4-clean-2026-09-03T15-23-26Z/4-connection-test.png
- apps/mobile/device-proof-evidence/run4-clean-2026-09-03T15-23-26Z/5-siwa.png
- apps/mobile/device-proof-evidence/run5-frames-2026-09-03T16-42-59Z/1-cold-launch.png
- apps/mobile/device-proof-evidence/run5-frames-2026-09-03T16-42-59Z/2-detail-maxbid.png
- apps/mobile/device-proof-evidence/run5-frames-2026-09-03T16-42-59Z/3-settings.png
- apps/mobile/device-proof-evidence/run5-frames-2026-09-03T16-42-59Z/4-connection-test.png
- apps/mobile/device-proof-evidence/run5-frames-2026-09-03T16-42-59Z/5-siwa.png
- apps/mobile/device-proof-evidence/verify-recording.sh
- apps/mobile/eas.json
- apps/mobile/index.ts
- apps/mobile/lib/api-error.ts
- apps/mobile/lib/api.ts
- apps/mobile/lib/auth-headers.ts
- apps/mobile/lib/auth.ts
- apps/mobile/lib/format.ts
- apps/mobile/lib/pnl.ts
- apps/mobile/lib/settings.ts
- apps/mobile/lib/types.ts
- apps/mobile/lib/validate.ts
- apps/mobile/package-lock.json
- apps/mobile/package.json
- apps/mobile/scripts/lint-financial-format.mjs
- apps/mobile/store-assets/privacy-label.md
- apps/mobile/store-assets/screenshots/01-opportunities-6.9.png
- apps/mobile/store-assets/screenshots/02-settings-6.9.png
- apps/mobile/store-assets/screenshots/03-listing-detail-6.9.png
- apps/mobile/store-assets/screenshots/framed-01-opportunities-6.9.png
- apps/mobile/store-assets/screenshots/framed-02-listing-detail-6.9.png
- apps/mobile/store-assets/screenshots/framed-03-settings-6.9.png
- apps/mobile/store-assets/screenshots/ipad-13/01-opportunities-13.png
- apps/mobile/store-assets/screenshots/ipad-13/02-listing-detail-13.png
- apps/mobile/store-assets/screenshots/ipad-13/03-settings-13.png
- apps/mobile/store-assets/screenshots/iphone-6.5/01-opportunities-6.5.png
- apps/mobile/store-assets/screenshots/iphone-6.5/02-listing-detail-6.5.png
- apps/mobile/store-assets/screenshots/iphone-6.5/03-settings-6.5.png
- apps/mobile/tests/auth-headers.test.mjs
- apps/mobile/tests/format.test.mjs
- apps/mobile/tsconfig.json
- docker-compose.yml
- docs/API.md
- docs/ARCHITECTURE.md
- eslint.config.mjs
- extension/README.md
- extension/background.js
- extension/content.js
- extension/manifest.json
- extension/popup.html
- extension/popup.js
- next.config.ts
- package-lock.json
- package.json
- playwright.config.ts
- postcss.config.mjs
- prisma/schema.prisma
- prisma/seed.ts
- public/.gitkeep
- scripts/deploy-auctions.sh
- scripts/george-env.py
- scripts/george-env.sh
- scripts/hot-deal-alert.ts
- scripts/import-apify-govdeals.ts
- scripts/import-govdeals-free.ts
- scripts/import-govplanet-free.ts
- scripts/import-grays.ts
- scripts/import-gsa.ts
- scripts/import-municibid-free.ts
- scripts/import-publicsurplus-free.ts
- scripts/liveness-sweep.ts
- scripts/probe-govdeals.ts
- scripts/run-digest.sh
- scripts/run-govdeals-free.sh
- scripts/run-govplanet-free.sh
- scripts/run-gsa-import.sh
- scripts/run-hot-deals.sh
- scripts/run-liveness.sh
- scripts/run-municibid-free.sh
- scripts/run-newsletter-digest.sh
- scripts/run-newsletter-server.sh
- scripts/run-publicsurplus-free.sh
- scripts/seed-digest-snapshots.ts
- scripts/send-digest.ts
- scripts/send-newsletter-digest.ts
- scripts/set-admin.ts
- src/agents/appraiser.ts
- src/agents/framework.ts
- src/agents/run.ts
- src/agents/scout.ts
- src/agents/skeptic-rules.test.ts
- src/agents/skeptic-rules.ts
- src/agents/skeptic.ts
- src/app/agent-ops/page.tsx
- src/app/agents/page.tsx
- src/app/api/agents/search/route.ts
- src/app/api/auth/apple/route.ts
- src/app/api/auth/login/route.ts
- src/app/api/auth/logout/route.ts
- src/app/api/auth/me/route.ts
- src/app/api/billing/checkout/route.ts
- src/app/api/billing/webhook/route.ts
- src/app/api/import/apify-govdeals/route.ts
- src/app/api/import/csv/route.ts
- src/app/api/import/extension/route.ts
- src/app/api/import/gsa/route.ts
- src/app/api/import/url/route.ts
- src/app/api/listings/[id]/buyer-lead/route.ts
- src/app/api/listings/[id]/buyer-page/route.ts
- src/app/api/listings/[id]/route.ts
- src/app/api/listings/route.ts
- src/app/api/newsletter/confirm/route.ts
- src/app/api/newsletter/result-page.ts
- src/app/api/newsletter/subscribe/route.ts
- src/app/api/newsletter/unsubscribe/route.ts
- src/app/b/[slug]/page.tsx
- src/app/billing/success/page.tsx
- src/app/deals/[date]/page.tsx
- src/app/deals/page.tsx
- src/app/globals.css
- src/app/layout.tsx
- src/app/listings/[id]/page.tsx
- src/app/login/page.tsx
- src/app/newsletter/SubscribeForm.tsx
- src/app/newsletter/page.tsx
- src/app/page.tsx
- src/app/pricing/UpgradeButton.tsx
- src/app/pricing/page.tsx
- src/app/privacy/page.tsx
- src/app/reports/page.tsx
- src/app/robots.ts
- src/app/selling-avenues/page.tsx
- src/app/sitemap.ts
- src/components/agent-finder.tsx
- src/components/dashboard-cards.tsx
- src/components/listings-table.tsx
- src/components/logout-button.tsx
- src/components/offer-form.tsx
- src/components/ui/badge.tsx
- src/components/ui/button.tsx
- src/components/ui/card.tsx
- src/components/ui/input.tsx
- src/engines/constants.ts
- src/engines/costs.test.ts
- src/engines/costs.ts
- src/engines/demand.ts
- src/engines/freight.ts
- src/engines/scoring.test.ts
- src/engines/scoring.ts
- src/engines/types.ts
- src/engines/valuation.test.ts
- src/engines/valuation.ts
- src/importers/apify-govdeals.ts
- src/importers/csv.ts
- src/importers/govdeals-free.ts
- src/importers/govplanet-free.ts
- src/importers/grays-free.ts
- src/importers/gsa.ts
- src/importers/ingest.ts
- src/importers/municibid-free.ts
- src/importers/publicsurplus-free.ts
- src/importers/scrape.ts
- src/lib/ai.ts
- src/lib/auth.test.ts
- src/lib/auth.ts
- src/lib/billing.ts
- src/lib/crypto.test.ts
- src/lib/crypto.ts
- src/lib/current-user.ts
- src/lib/dashboard.ts
- src/lib/db.ts
- src/lib/digest-snapshot.ts
- src/lib/digest-top.ts
- src/lib/fleet-sso.ts
- src/lib/hot-deals.ts
- src/lib/listing-detail.test.ts
- src/lib/listing-detail.ts
- src/lib/listings-sort.test.ts
- src/lib/listings.ts
- src/lib/marketplace-links.test.ts
- src/lib/marketplace-links.ts
- src/lib/money-math-visibility.test.ts
- src/lib/newsletter.ts
- src/lib/password.ts
- src/lib/places.test.ts
- src/lib/places.ts
- src/lib/rate-limit.test.ts
- src/lib/rate-limit.ts
- src/lib/reports.ts
- src/lib/selling-avenues.ts
- src/lib/send-digest.ts
- src/lib/session.ts
- src/lib/site.ts
- src/lib/ssrf-guard.ts
- src/lib/tiers.ts
- src/lib/utils.ts
- src/middleware.test.ts
- src/middleware.ts
- src/pipeline/research.ts
- src/worker/index.ts
- store-assets/app-store-listing.md
- tests/e2e/agents-sort-density.spec.ts
- tests/e2e/smoke.spec.ts
- tsconfig.json
- tsconfig.tsbuildinfo
- vitest.config.ts