15 Commits
Author SHA1 Message Date
araharah-executor 95399aec8a fix(08): WR-02 — CPU3 demands the ladder only when the gitignored binary is present
- the graph binary is NOT committed: routing/data/.gitignore ignores
  *.bin (git check-ignore verified) — forks rebuild their own
  (docs/ROAD-GRAPH.md), so the old assertion message was factually false
- CPU3 now mirrors CPU4's law: absent binary -> honest SKIP (not a
  failure); the run-the-ladder assertions fire only when it is present
- reason text aligned with reality: 'gitignored fork-rebuildable artifact'
2026-10-25 22:35:41 +08:00
araharah-executor 79a302caf5 fix(08-05): route-cpu gate law re-anchored to the post-ALT measured truth (escalation record — no retirement)
Task 3, re-scoped per the plan's honest-FAIL branch: the CPU verdict FAILED
(the ladder ran to its documented stop), so the c3 class is NOT retired —
the record instead carries the executed-and-measured ALT truth.

- budget-gates.mjs: the verdict law documents the Phase-8 outcome (ALT
  EXECUTED, optimality green, CPU verdict FAIL 152.788/185.692 ms quoted
  with date; L=32 probe measured worse) — the stale 'next-milestone item'
  wording is gone; ROUTE_CPU_DRIFT_GUARD_MS re-anchored 200 → 400 (the
  post-ALT documented band outgrew the old guard; ≈2x the worst shipped-
  config run 185.692 ms); the guard stays a regression trip-wire, the 8 ms
  budget stays and its FAIL still prints every run
- budget-audit.test.mjs: CPU3 pins the new law (evidence must name the
  EXECUTED-in-Phase-8 verdict and must NEVER say 'next-milestone');
  19/19 vectors ok (the count holds — no vector dropped)
- docs/BUDGETS.md: route-cpu row carries the Phase-8 measured numbers +
  date; the c3 section is the honest post-ALT record (what changed, the
  quoted gate lines, the one-directional-Lipschitz wall, the open
  escalation) — staged as selective hunks; the tree's pre-existing
  doc-sync edits in other sections remain uncommitted, untouched

grep law: zero 'next-milestone' hits in budget-gates.mjs + BUDGETS.md;
ROUTE_CPU_DRIFT_GUARD_MS still exported and used.
2026-10-25 20:06:57 +08:00
araharah-executor 36679468c8 feat(07-06): --live probes read Cloudflare credentials from bot/.dev.vars (gitignored, D-15) as fallback to env 2026-10-25 11:37:03 +08:00
araharah-executor 2489cca8ec fix(07-06): the /help doc pointer is a documented static-text class — privacy audit green again
- source-side runtime-hosts gate gains DOC_POINTER_STATIC_TEXT_HOSTS (the
  MapLibre-attribution precedent): the published repo origin may appear
  ONLY as a bare URL literal in bot copy (D-08/D-09), never fetched
- class is NARROW and pinned by SA6: a fetch( target naming the same
  host is still a violation
- Rule 1 (found by SA6's RED): the fetch( handler's declaration
  heuristic misclassified any quoted absolute URL as a TS declaration —
  quoted strings are targets; they now reach the host check
- docs/PRIVACY-AUDIT.md: adjudication documented + dated re-run addendum
- deferred-items.md #1 closed: npm run privacy-audit exits 0 again
  (PRIVACY AUDIT CLEAN — 5 gate(s) passed, 0 violations; suite 13/13)
2026-10-25 05:18:47 +08:00
araharah-executor b06c64d5fc test(07-06): RED — SA6 doc-pointer static-text class vector (URL literals only; fetch targets to the same host still fail) 2026-10-25 05:15:57 +08:00
araharah-executor 7a1206d5c8 fix(07-03): fold the follow-up fixes described in 07-03-SUMMARY
- asset-header probe reads HTTP status BEFORE interpreting headers — a
  non-2xx is deployment drift (the notRun exit-2 class), never a cache
  violation; the violations.length count bug fixed
- XHTML namespace URI joins the SVG spec-identifier adjudication
- probeUnavailable carries the reason only (the CLI prints NOT RUN)
- CP2/AU1 suite vectors updated to the corrected contracts

Residue note: these edits were on the tree during 07-03/07-04 execution
but escaped those plans' commits (07-04-SUMMARY residue caution).
2026-10-25 05:15:38 +08:00
araharah-executor 349e34e9e6 fix(07-04): golden-corpus treats an npm-root-less cwd as environment drift (notRun, exit 2) + the AU1 placeholder regex pin
- a missing package.json in the audit root is T-07-22's environment-drift class,
  not a corpus failure — the corpora cannot even be spawned there
- AU1's flag-skip assertion matches the printed 'NOT RUN — (pass --live)' shape
2026-10-25 05:08:02 +08:00
araharah-executor bbf003fa5d feat(07-04): the budget-audit CLI + the root npm script — orchestration, free-tier comparison table, 0/1/2 exit codes
- npm run budget-audit: 5 required gates + the --live cache-header probe; one evidence line per gate
- the FREE-TIER COMPARISON table: every documented Cloudflare free-plan ceiling beside the
  current value where measured, `not measured` where not — the console form of docs/BUDGETS.md
- exit 0 CLEAN / 1 FAILED / 2 NOT RUN — a skip is never a pass (T-07-22)
- no secret, no coordinate in the output (D-14's category-only law, applied to budgets)
2026-10-25 05:05:04 +08:00
araharah-executor 8378337578 test(07-04): RED — the CLI vectors: per-gate evidence lines, the free-tier comparison table, CLEAN exit 0, --live contract, environment-drift exit 2 2026-10-25 05:03:00 +08:00
araharah-executor 9efb6e2832 feat(07-04): the budget-gates library — six measurement gates (T-07-18/19/20/22/23b)
- route-cpu: RE-RUNS routing/scripts/measure-route-cpu.mjs as a child process; p95 printed
  against the 8 ms product budget + 10 ms free ceiling; the child's GATE FAIL line carried
  verbatim; the accepted c3 band has a 200 ms drift guard — uncharted regression fails
- bundle-budget: BA9 route-payload gz sum + whole-app bundle ceiling (500000 gz bytes);
  Worker bundle honest NOT MEASURED when bot/dist is absent (never zero)
- kv-writes: 4 write sites inventoried by family, every write TTL-named (PG1); the cron
  zero-write law is source-proven — runGuidanceCronTick's body must contain no .put(/.delete(
- subrequests: per-request-class external-subrequest inventory derived from the route table;
  uninventoried classes FAIL; source-derived honesty sentence verbatim; never a fabricated zero
- cache-headers: reuses cloudflare-probes' runAssetHeaderProbe (imported, never forked)
- golden-corpus: RE-RUNS routing:corpus + search:corpus as child processes (SC4.a/SC4.b)
2026-10-25 04:59:27 +08:00
araharah-executor 160a173010 test(07-04): RED — the budget-gates TDD suite (15 vectors: CPU ladder re-run, bundle bytes, KV cron zero-write law, subrequest inventory, cache-header reuse, golden corpora)
- every gate must print its measurement and carry its contract id
- every gate must be able to FAIL on a synthetic violation (fixture injection)
- a skip is never a pass (notRun class; T-07-22)
2026-10-25 04:55:55 +08:00
araharah-executor 9c55e9a879 feat(07-03): the privacy-audit CLI + root npm script — orchestration, evidence report, 0/1/2 exit codes
- runs the five static gates in Pattern-4 order; --live adds the KV-expiry
  and asset-header probes; the no-flag skip prints '(pass --live)' and is
  never silently green
- exit 0 CLEAN / 1 FAILED (violations counted across gates) / 2 NOT RUN
  (credentials or build or deployment drift — never mistaken for a pass)
- header states the maintainer-time-tool law, the GPL fork-reuse contract,
  and D-02's zero-telemetry prove-the-absence posture
- AU1-3 CLI vectors green: CLEAN exit 0 on this tree, FAILED exit 1 via the
  PRIVACY_AUDIT_ROOT fixture, NOT RUN exit 2 for --live without credentials
2026-10-25 04:39:07 +08:00
araharah-executor b959e23eda feat(07-03): bundle-gates + cloudflare-probes — the shipped-bundle scan and the live probes (T-07-04, T-07-16)
- runBundleTelemetryGate: PRODUCTION web/dist ONLY (dist-harness forbidden,
  BA5); analytics/beacon token set (sendBeacon explicit form); positive
  host allowlist with the host inventory printed, never assumed (A4);
  deep-link crypto (D-11) and storage tokens JS-assets-only; a missing
  build is notRun, never a silent pass
- runKvExpiryProbe: npx wrangler kv key list (current syntax, deprecated
  colon form forbidden), namespace id read from bot/wrangler.jsonc at
  runtime; parses name/expiration/metadata + list_complete/cursor and
  follows the cursor; unexpected families REPORTED (A5); oldest/newest
  expiry reported; raw key names never printed (category-only evidence)
- runAssetHeaderProbe: curl -sSI cache-control/cf-cache-status reported
  VERBATIM (probabilistic — printed, never interpreted)
- documented adjudications: MapLibre static-text hosts, W3C namespace
  identifiers, bare-array = CLI's internally-paginated complete set
2026-10-25 04:36:59 +08:00
araharah-executor 430993b881 feat(07-03): source-gates library — storage/TTL/log-vocab/runtime-host gates over ALL five src trees (D-01, T-07-01..03)
- runStorageGate: the canonical comment-stripped BANNED-persistence +
  service-worker scan, extended repo-wide (web/bot/routing/search/theme src)
- runKvTtlGate: PG1's same-line expirationTtl law with the named-constant
  ^[A-Z_]{2,}$ requirement, repo-wide (T-07-01)
- runLogVocabularyGate: the D-14 category-only law machine-verified —
  bracketed surface tokens, carrier ban (chat_id/user_id whole-word),
  web state-token vocabulary, JSON.stringify-in-log forbidden (T-07-03)
- runRuntimeHostGate: POSITIVE host allowlist; inventory printed, never
  assumed (A4); cwd-independent root + documented SVG-namespace adjudication
2026-10-25 04:34:32 +08:00
araharah-executor 87fcb2833e test(07-03): privacy-audit gate suite — SA/BG/CP/AU vectors, RED before the gates exist
- SA1-5: each source gate returns {id, pass, evidence}, passes the current
  tree, and FAILS a synthetic violation via injected fixture roots
- BG1-2: production web/dist only; missing build is notRun (never a pass)
- CP1-2: probeUnavailable exact shape + credentials-absent degradation
- AU1-3: CLI exit 0/1/2 — CLEAN on this tree, FAILED on a fixture root
  (PRIVACY_AUDIT_ROOT), NOT RUN for --live without credentials
2026-10-25 04:33:12 +08:00