mirror of
https://github.com/pbakaus/impeccable.git
synced 2026-09-17 16:46:31 +03:00
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
119 lines
10 KiB
Markdown
119 lines
10 KiB
Markdown
# 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: `- \`<case-id>\`: <what differs> (<why>)`
|
|
|
|
## 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 now `Usage: impeccable doctor [--json] [--fix] [--target <path>]`.
|
|
- `doctor-legacy-text`: the closing hint reads `Run \`<self> 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 name `impeccable surface-brief`.
|
|
- `critique-usage`, `critique-unknown`: usage lines name `impeccable critique-storage`.
|
|
- `context-monorepo-target-missing`: MONOREPO_TARGET_REQUIRED says `impeccable context ran without --target`.
|
|
- `hadmin-on`, `hadmin-on-twice`, `hadmin-off-then-status`, `hadmin-on-repairs-existing-manifest`, `hadmin-on-malformed-manifest-backup`: `hooks on` writes manifests that run the launcher (`"<scripts>/impeccable" hook`, Cursor `hook-before-edit`) instead of `node "<scripts>/hook.mjs"`.
|
|
- `hook-session-fresh-then-pending-then-stop`, `hook-session-two-sessions`, `hbe-denial-downgrade-after-6`: the short footer names `impeccable 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 names `impeccable 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-edits` instead of the `.mjs` names.
|
|
|
|
## 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">` reads `script-src 'self' http://localhost:8412 'wasm-unsafe-eval'` (was `script-src 'self' http://localhost:8412`). The `data-impeccable-csp-original` marker, the `connect-src` and `img-src` additions, idempotence, and the revert on unpatch are unchanged. `live-inject-vite-csp-meta` and `live-inject-next-jsx` carry 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-grad` column now carries its intended buried-raster finding),
|
|
and the sweeps `detect-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 (upstream 3c442af7).
|
|
- `hadmin-on`, `hadmin-on-twice`, `hadmin-off-then-status`, `hadmin-on-repairs-existing-manifest`, `hadmin-on-malformed-manifest-backup`: the Claude manifests `hooks on` writes match on `Edit|Write` and the description names the current tools; Claude Code folded multi-edit behavior into Edit (upstream 7d5c60d2).
|
|
- `live-commit-mock-unreported-file-change`: the rollback-failure results share one constructor, which moved `unreportedFiles` and `notes` after `pageUrl` in the emitted JSON (upstream 1f2c3f9d).
|
|
|
|
## 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 new `close` subcommand (upstream 5211bdf4, #660).
|
|
- `critique-latest-existing`: `latest` applies the #660 identity/freshness path: a legacy snapshot carrying no fingerprint for a concrete local target is closed and `latest` exits 2 instead of printing the stale body (upstream 5211bdf4, #660).
|
|
- `critique-write-then-read`: `write` stamps `target_identity`/`target_fingerprint`/`target_path`, uses a fixed-width `~NNNN` collision suffix when two snapshots share a UTC second, `latest` freshness-closes the read snapshot, and `trend` now surfaces the `closed` flag and identity fields (upstream 5211bdf4, #660).
|
|
- `critique-write-monorepo-child`: `write` stamps the resolved `target_identity`, and a `latest` run from a sibling app resolves to a different identity so it exits 2 rather than returning the neighbor's backlog (upstream 5211bdf4, #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 (upstream 2cfd6076, #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 (upstream 2cfd6076, #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.json` naming `node "${CLAUDE_PROJECT_DIR}/.claude/skills/impeccable/scripts/hook.mjs"` under the `claude-code` provider emits `MANUAL_DETECTOR_REQUIRED` (the stale marker no longer counts as active).
|
|
- `context-launcher-hook-active`: the same manifest in the launcher form (`"…/impeccable" hook`) suppresses `MANUAL_DETECTOR_REQUIRED`, confirming the launcher marker is still recognized as active.
|