Cover the v3-to-launcher upgrade fix (triage E8) recorded from the engine binary and hand-reviewed: - context-stale-hook-manifest: a .claude/settings.local.json naming the retired `node .../hook.mjs` script under the claude-code provider emits MANUAL_DETECTOR_REQUIRED, because the stale marker no longer counts as an active hook (its script is gone after the update). - context-launcher-hook-active: the same manifest in the launcher form still suppresses MANUAL_DETECTOR_REQUIRED, confirming the launcher marker is recognized as active. The only difference between the two goldens is the MANUAL_DETECTOR_REQUIRED block. No existing golden moved: every other context case runs under the source provider, whose hook-manifest list is empty, so none of them scan a manifest. Also null IMPECCABLE_PROVIDER_ID in the case BASE_ENV so a recording machine's value cannot leak. DELTAS.md records the intentional divergence from JS parity. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WaJv2c4oN8wS7Ttq4XRqyx
10 KiB
Accepted deltas
Cases listed here differ from their JS golden on purpose. Each entry names the case id, what differs, and why it is an improvement. Nothing gets on this list without review.
Format: - \`: ()`
Recorded 2026-08-17: the engine names its own commands
The JS scripts printed their own file names in usage lines, directives, and
the hook manifests they wrote. The binary prints the verb (impeccable doctor)
or the launcher path ("<scripts>/impeccable" hook). Each case below was
re-recorded from the engine after a line-level review confirmed the only change
is that wording; behavior, exit codes, and every other byte are unchanged.
doctor-help,doctor-help-short:Usage: node doctor.mjs …is nowUsage: impeccable doctor [--json] [--fix] [--target <path>].doctor-legacy-text: the closing hint readsRun \doctor --fix``.pin-usage-no-args,pin-usage-one-arg:Usage: impeccable pin <pin|unpin> <command>.surface-brief-usage,surface-brief-unknown,surface-brief-write-usage: usage lines nameimpeccable surface-brief.critique-usage,critique-unknown: usage lines nameimpeccable critique-storage.context-monorepo-target-missing: MONOREPO_TARGET_REQUIRED saysimpeccable context ran without --target.hadmin-on,hadmin-on-twice,hadmin-off-then-status,hadmin-on-repairs-existing-manifest,hadmin-on-malformed-manifest-backup:hooks onwrites manifests that run the launcher ("<scripts>/impeccable" hook, Cursorhook-before-edit) instead ofnode "<scripts>/hook.mjs".hook-session-fresh-then-pending-then-stop,hook-session-two-sessions,hbe-denial-downgrade-after-6: the short footer namesimpeccable hooks ignore-value.live-help,live-accept-help,live-inject-help,live-insert-help,live-server-help,live-resume-help,live-commit-help,live-discard-help,live-complete-help,live-complete-no-id: usage text namesimpeccable live*verbs.live-server-already-running,live-daemon-server-status-poll-complete,live-status-empty,live-status-generating,live-status-many-sessions,live-status-stale-server-json,live-status-legacy-sessions-dir,live-status-from-subdir,live-status-manual-apply,live-resume-manual-apply,live-status-mount-failed,live-resume-mount-failed,live-resume-generating,live-resume-by-id,live-resume-first-active-sorted,live-resume-accept-requested,live-resume-carbonize-required: recovery hints and next-command lines spell<self> live-poll/live-server/live-complete/live-commit-manual-editsinstead of the.mjsnames.
Recorded 2026-08-17: live-inject adds 'wasm-unsafe-eval' to a CSP meta script-src
The detector the live overlay loads from the helper origin is a WebAssembly
module in the engine (its docs/WASM-BUNDLE.md); a script-src that names the
origin but not 'wasm-unsafe-eval' still refuses to compile it. The JS
patchCspMeta predates the wasm bundle and appended only the origin.
live-inject-csp-meta-no-connect-src: the patched<meta http-equiv="Content-Security-Policy">readsscript-src 'self' http://localhost:8412 'wasm-unsafe-eval'(wasscript-src 'self' http://localhost:8412). Thedata-impeccable-csp-originalmarker, theconnect-srcandimg-srcadditions, idempotence, and the revert on unpatch are unchanged.live-inject-vite-csp-metaandlive-inject-next-jsxcarry meta tags the patch does not touch, so their goldens did not move.
Recorded 2026-08-31: detector-engine ports landed, gap goldens restored
The section previously here pinned the gap between main's post-freeze detector
fixes and the engine. Those fixes are now ported (engine repo commits:
c0aa75f oklch in visual-contrast/neon-text, upstream 1b7da15b #592;
5cdeec8 color-mix nested hex, upstream 54440319 #578; the 1D grid fix,
upstream a236137b #615, rode along in 9046e8f via a concurrent staging race;
6d36231 comment stripping for regex matchers, upstream 067665cc #589 +
ddb60993 + ba873f75 + 9a7d0fbc; 33aef88 root-relative linked stylesheets,
upstream 2b88aa52 #652 + daae1d41; 6d0ecf1 URL userinfo redaction with
origin-scoped basic auth, upstream d5873ff8 + d690349d #657; 09f8ae7 inert
exact ignore-value refusal, upstream be87f5eb #662; 20c8347 the
comp-fidelity rules organic-clip-path and buried-raster, upstream 58561610).
The affected goldens were re-recorded from the fixed engine and each json
fixture golden was byte-verified against the last JS engine state in history
(db1462b9^, which carries both main's drift and the comp-fidelity rules):
- Moved to post-fix behavior:
detect-fixture-json-codex-grid-1d-pass-html,detect-fixture-text-codex-grid-1d-pass-html(no finding, exit 0),detect-fixture-json-organic-clip-path-html,detect-fixture-text-organic-clip-path-html,detect-fixture-json-buried-raster-html,detect-fixture-text-buried-raster-html(the new rules fire),detect-fixture-json-glow-html,detect-fixture-text-glow-html(glow's.photo-opaque-gradcolumn now carries its intended buried-raster finding), and the sweepsdetect-dir-json-all-fixtures,detect-dir-text-all-fixtures,detect-dir-quiet-all-fixtures,detect-no-advisory-json,detect-no-advisory-text. - Unchanged on re-record (already matched the fixed JS in the static engine):
detect-fixture-json-color-html,detect-fixture-text-color-html,detect-fixture-json-oklch-neon-text-html,detect-fixture-text-oklch-neon-text-html(the oklch and color-mix fixes observably change the browser-side visual-contrast path, which these static scans do not exercise),detect-scope-type,detect-scope-both.
The frozen call vectors for checkHtmlPatterns
(tests/oracle/vectors/calls/rules.checks/checkHtmlPatterns.jsonl) were
re-recorded the same way: args untouched, results replayed through the
db1462b9^ JS (14 of 101 moved: the comp-fidelity scans and the
comment-stripping/inline-fragment fixes to enclosingCssSelector). No case in
this section is an accepted delta any more; the engine matches the final JS.
Recorded 2026-08-31: main's Aug 17-31 verb fixes ported to the engine, goldens re-recorded
The goldens below froze pre-fix behavior. Each fix landed on main in JS and was ported to the engine; the cases were re-recorded from the binary and reviewed line by line, so they now pin the fixed behavior.
hook-session-fresh-then-pending-then-stop,hook-session-two-sessions: the Stop deep pass syncs the remembered set to the live scan, including findings the per-edit pass already surfaced, so a second Stop with nothing new is silent and a fixed-then-reintroduced finding fires again (upstream3c442af7).hadmin-on,hadmin-on-twice,hadmin-off-then-status,hadmin-on-repairs-existing-manifest,hadmin-on-malformed-manifest-backup: the Claude manifestshooks onwrites match onEdit|Writeand the description names the current tools; Claude Code folded multi-edit behavior into Edit (upstream7d5c60d2).live-commit-mock-unreported-file-change: the rollback-failure results share one constructor, which movedunreportedFilesandnotesafterpageUrlin the emitted JSON (upstream1f2c3f9d).
Recorded 2026-08-31: main's Sep-1 verb fixes ported after the rust-swap rebase
Five more fixes landed on main in JS between the swap branch and its rebase. Each was ported to the engine and the affected goldens re-recorded from the binary after a line-level review; the engine's output was also diffed byte-for-byte against the upstream JS on the same inputs before recording.
critique-usage,critique-unknown: the usage line now lists the newclosesubcommand (upstream5211bdf4, #660).critique-latest-existing:latestapplies the #660 identity/freshness path: a legacy snapshot carrying no fingerprint for a concrete local target is closed andlatestexits 2 instead of printing the stale body (upstream5211bdf4, #660).critique-write-then-read:writestampstarget_identity/target_fingerprint/target_path, uses a fixed-width~NNNNcollision suffix when two snapshots share a UTC second,latestfreshness-closes the read snapshot, andtrendnow surfaces theclosedflag and identity fields (upstream5211bdf4, #660).critique-write-monorepo-child:writestamps the resolvedtarget_identity, and alatestrun from a sibling app resolves to a different identity so it exits 2 rather than returning the neighbor's backlog (upstream5211bdf4, #660).detect-fixture-json-overused-font-html,detect-fixture-text-overused-font-html: new fixture added on the swap branch; overused-font primary selection now skips only the CSS generics, so a system stack keeps its system face as primary and later web-font fallbacks like Roboto no longer flag (upstream2cfd6076, #678).detect-dir-json-all-fixtures,detect-dir-text-all-fixtures,detect-dir-quiet-all-fixtures,detect-scope-type,detect-scope-both,detect-no-advisory-json,detect-no-advisory-text: the directory sweep picks up the new overused-font fixture and the #678 primary-face change (upstream2cfd6076, #678).
Recorded 2026-08-31: E8 hook-manifest self-heal on upgrade
Two new cases pin the fix for triage E8 (the v3-to-launcher upgrade path). The
JS automaticHookMode counted any hook command naming the skill as an active
hook, including the JS-era node .../hook.mjs form. After a skill update the
.mjs script no longer exists, so that manifest points at a dead command yet
still suppressed MANUAL_DETECTOR_REQUIRED, leaving the detector dark. The
engine now treats a manifest that names ONLY the .mjs form as not an active
launcher hook, so the manual detector fallback fires until install/update
repairs the manifest to the launcher form. The launcher form still counts as
active exactly as before. No existing golden moved: every other context case
runs under the source provider, whose manifest list is empty, so none of them
scan a hook manifest.
context-stale-hook-manifest: a.claude/settings.local.jsonnamingnode "${CLAUDE_PROJECT_DIR}/.claude/skills/impeccable/scripts/hook.mjs"under theclaude-codeprovider emitsMANUAL_DETECTOR_REQUIRED(the stale marker no longer counts as active).context-launcher-hook-active: the same manifest in the launcher form ("…/impeccable" hook) suppressesMANUAL_DETECTOR_REQUIRED, confirming the launcher marker is still recognized as active.