Repository navigation
audit: reconcile all 23 independent-audit findings + land recovered skill content - #162
Merged
Merged
Conversation
DTALEX66
added a commit
that referenced
this pull request
Oct 6, 2026
… a stale exe CI is green at 6c63218 (both workflows, both events; PR #162 head, observer and aggregate SUCCESS), so the "pull_request run still in flight" note is withdrawn. The remaining blocker for the real-desktop-surface proof is now named: u19_webview_e2e.py:446 hardcodes src-tauri/target/release/app.exe, but the documented local recipe sets CARGO_TARGET_DIR, so a local U19 verdict keys on a superseded binary. CI is unaffected because its build uses the default target dir - which is why the defect never showed up there.
DTALEX66
added a commit
that referenced
this pull request
Oct 6, 2026
…snapshot The owner's executable prompt asked for two things in this project: correct the descriptions, and land the full project description and future blueprint with a repeatable audit. Documentation, normal commits, branch push, PR update and the GitHub About are authorized by it; merge, release, install, global config and other projects are not, and none were touched. Input verified: the blueprint DOCX hashes to the value the prompt declares (f3784a99...bea3440). The prompt's own digest is recorded for traceability; it had no declared value to compare. docs/future/WORK-LAB-BLUEPRINT-20261006.md carries all 19 chapters plus the appendix onto repository anchors. Where the source is silent the document says SOURCE_GAP instead of filling the hole: the conditional enhancements in 15.6 have no scenario, acceptance, phase slot or exit condition, and Lite, tray HUD and Quick Entry have no field or permission spec anywhere. .project/governance/blueprint-coverage.json is the single mutable source; verify_blueprint_coverage.py re-extracts AG-01..AG-20 from the atlas card and all 22 U rows from the single open register, so no row can be dropped or invented, and renders the 87-row projection. Status reuses the ledger's existing vocabulary; disposition reuses the prompt's own four decisions. Twelve injected violations were required to fail before the gate was trusted, and the first round exposed two defects in the gate itself: a hand-edited projection passed because nothing compared it against the regeneration, and the "no self-referential digest" rule could never fail since a file cannot contain its own hash — a check that reports protection it cannot provide is worse than none. Both fixed; the digest rule now forbids generated artifacts from hashing each other, with two new injections proving it bites. README corrected: it described the project as a global-configuration layer, which under-defines it against Authority section 3. Now the mother definition, the owns/does-not-own boundary, the evidence vocabulary, the current/future/candidate zoning at Ongoing, the mandatory reading order and the audit entry points are all on the first screen. Corrections recorded rather than rewritten: the blueprint's PR #162 head 6f323a3 has advanced to f3b5dec live, while its main cd4daa8 still matches; the 2026-10-05 local full-gate FAIL stays on the record alongside the affected-group passes, because a group pass is not the aggregate.
DTALEX66
added a commit
that referenced
this pull request
Oct 6, 2026
ERR-109. Adding tests/test_artifact_freshness.py to observer-python-skeleton broke the integration job's negative-control step, because tests/ci/test_failfast_group.py pins each observer group's command count at 8 and I never ran it: I verified the two groups whose contents changed and pushed, treating that as sufficient. The guard is fixed by strengthening it rather than by editing a number. It now pins the full command list of all four groups, so dropping a required check or swapping it for a cheaper one both fail. Verified in both directions: the baseline passes, and a swap that keeps the count at 9 — replace test_artifact_freshness.py with a duplicate of the cheap skeleton test — now reports missing=[[python, tests/test_artifact_freshness.py]], which the old count-only guard could never have seen. Afterwards all 25 CI-invoked governance and integration steps were run locally and judged by exit code. Two traps worth recording: a negative-control suite prints its expected FAIL lines, so reading its verdict from the last line of output invents failures in test_aggregate_gate.py and test_error_ledger.py that never happened; and test_exact_tree_review.py genuinely fails on a feature branch because it asserts HEAD equals origin/main and every task COMPLETED, so CI does not invoke it — recorded so nobody chases it. Also lands the double-end readback the snapshot generator now observes itself: branch pushed to a018fbe, PR #162 OPEN/MERGEABLE at that head, GitHub About before -> target -> live readback matching, homepage and topics deliberately untouched, and the exact-SHA CI state recorded honestly at 16 pass / 2 fail / 4 pending rather than as green.
DTALEX66
added a commit
that referenced
this pull request
Oct 6, 2026
…a foreign SHA PR #162 head is 44b778d; both runs for it completed/success with 24 checks COMPLETED. The chain stays visible rather than smoothed over: a018fbe failed twice (ERR-109, the manifest guard I skipped), 4115d63 onward is green. Tooling trap recorded: gh run list --branch placed an unrelated 2026-10-02 run (2bc9168, not an ancestor of the current head) at the top of the output, which nearly made me report a foreign SHA as this round's result. Pin the head with gh pr view --json headRefOid first, then filter runs by SHA or read statusCheckRollup.
…easurement stopped Two lanes print LIVE/OFFLINE while explaining the live-gate rule, and the green pills that stayed lit in the empty scenario were on git matchState, which the snapshot really does declare. Had I written the first rule that came to mind, honest UI would have gone red.
…nuation 8192e08 completed both workflows green and contains the records themselves, so the stamp tool accepted it; the SHA and the verdict come from the same measured readback, not from a recollection.
Rendered all 21 lanes and counted: four write-actions are disabled, and every one of them explained itself only through a tooltip that appeared on hover, while a native disabled button is not focusable and the wrapper added pointer-events-none. So the project's own contract — a disabled action states why — held for a mouse and failed for a keyboard, and the wrapper's aria-label sat on a generic span that nothing can focus. The tooltip now reveals on focus-within as well as hover, and the wrapper takes the tab stop itself only when it is hiding a disabled control, so enabled controls do not each add a stop. Falsified 4/4: dropping the focus class, making the tab stop unconditional, removing it, and losing the accessible name are each refused. What remains unverified is the actual Tab traversal in a real desktop WebView.
The regression command I first wrote promised node_modules/vitest/vitest.mjs, which no commit contains - the exact ERR-124 shape, reproduced by me seven rounds later and caught by the gate before it was pushed. The command now names the tracked npm contract that CI itself runs, and it was executed bare before being recorded.
… the rule now proves it Three heads went red because the static contract scanned every .ts/.tsx under src except *.test.*, so the shared snapshot fixture I added under src/test/ counted as an embedded literal. The scan's own comment says its subject is the shipped front, and a file nothing imports is not shipped. The exclusion is paired with an assertion that no production source imports anything in src/test/, so narrowing the scope cannot hide the thing the rule exists to catch. Both halves are falsified: injecting an import into App.tsx fails the reachability check, and deleting the exclusion makes the literal rule name src/test/snapshotFixture.ts. The first version of my matcher required exactly one character before the slash, so it matched './x' but not '@/test/x' - the falsifier caught that, not the green run.
…test-only directory The narrowing ships with the claim that keeps it honest: nothing in production imports what the scan now skips, and both directions were mutated to prove the pair works.
…an assumed The same step failed at 13e07d9 (run 37602176877), so the record counts four red heads instead of the three I had seen when I wrote it.
…, and the pin becomes repeatable The registry declared the version observed on 2026-10-01 while Hermes self-updated on 2026-10-04, and nothing could notice: the CLI launcher carries no Windows version resource, and `hermes.exe --version` times out at 25s under the live probe. AG-07 had already corrected this exact drift once before. The CLI's own identity resolver says the install stamp comes first and is authoritative for packaged builds, so reading that file is the same authority reached without launching anything - and it is what the update mechanism writes on every self-update, which is why it is the source that actually ages. The receipt pinned a sha256 of the working tree, so the claim differed between this machine (CRLF) and the runner (LF) and no gate had ever compared it. It now pins the blob the commit carries, and the gate refuses a receipt that describes a different registry than the tree does - demonstrated by drifting the registry under a stale receipt and restoring byte-for-byte.
…aging closes as ERR-158/159 The stamp tool only accepts a head it can verify is green and that contains the record; 9d4297d has four runs, all completed success, so the note says exactly that. ERR-158/159 stay PENDING because their fix is in the commit this record follows - there is no head yet that is both green and contains them.
…egister says so The stamp is not a stand-in for the CLI - it is the file the CLI's own resolver reads first and the file the self-updater writes, which makes it the source that changes. The previous source was either a binary with no version resource or a CLI that times out, so a declaration could sit one full self-update behind while every test stayed green.
Measured deletion eligibility instead of guessing: counting tracked-record citations per directory, only 1,460,600 of 4,191,041,828 bytes sits under a directory nothing names. The workbuddy import is the only surviving copy of material whose original was deliberately cleared, and runs/ carries 1,450 citations. So this round deletes nothing, and further shrinking would mean re-pointing or unwriting records, which is an owner decision rather than a cleanup.
…s I added Two heads went red on ADAPTER_REGISTRY_FAIL because I extended version_readback with an authority note and a superseded observation and ran only the gate that reads those fields - not the validator that owns the shape, which is additionalProperties:false. The fields are legitimate: keeping a superseded reading is what makes staleness auditable, so they are declared here rather than the record being impoverished to fit.
…en gates did not Three heads, one cause: I added fields to a schema-constrained record and ran the gate that reads them. The fix declares the fields and keeps additionalProperties false; the local proof is the CI-equivalent batch, which passed with 207 modules before this went out.
…new engine is warranted All 39 contract schemas are named by at least one CI-discovered test module. The exposure was in which gates I ran locally before pushing, which is a discipline plus the CI batch, not a absent-check to build.
The previous commit changed ledger text without re-measuring the derived audits that read it, and left a typo where the measuring command's path lost its leading dot. Both corrected, ledger verifier and citation invariants re-run.
The receipt recorded HEAD at assembly time, so a run that spanned a commit published a head none of its rows had seen - which is exactly how I misread my own governance failure as current proof. It now records headAtStart and headAtEnd, flags a move, and exits 3 with the named condition rather than producing an ambiguous artifact. Falsified in both directions: an injected moved head is refused and flagged, a stable head still reports clean.
…erivation corrected The first derivation loop kept overwriting and landed on the fix commit itself; walking the file's history oldest-first and stopping at the first version carrying the field gives e0b296d, the commit that created the script. The wrong value is named in the record rather than quietly replaced. ERR-158/159 were stamped at 01798eb, which read back completed success on every run and contains both records.
…tree The governance batch died locally with FileNotFoundError from ROOT.rglob while descending an atlas extraction directory that something else removed mid-walk. The property it checks - every lockfile the repository has is declared - is about tracked files, so scanning the ignored root was both over-broad and fragile: an ignored cache's package-lock is nobody's declaration obligation, and CI passes only because a fresh checkout has no such directory to fall over on. Falsified: a declared lockfile nothing tracks is refused, and the clean comparison still passes.
Green on the runner and red on my machine is the signature, not the noise: the lockfile census walked the working tree and died in the ignored root it only filtered out afterwards. Derived introducing commit 8a5b445 by reading the file's history oldest-first for the rglob call.
…there b3271fc read back completed success on both workflows and contains ERR-160's record. The same command declined ERR-161 because that head is not a descendant of its fix commit, which is the refusal working as designed rather than a stamp being available for the asking.
That head carries three runs - two gate and one wlr-060 - and all three read back completed success, so the verdict covers a head containing the record rather than an ancestor of it.
Every record bound today is stamped at a head measured green on both workflows, and the one that remains is ERR-085: the stamper refused because its fix commit is not an ancestor of this branch, so no head here can verify it. The reason is now written into the record, which is what stops a later session from resolving it with a neighbouring SHA.
Three runs at the branch tip all read back completed success, the CI-equivalent batch passes on the same tree, 51 records carry a verifiedCommit, and the single remaining case is ERR-085 with its ancestry reason written into the record.
… the scanner see list leaves Three self-checks created temp roots outside the project (and one of them never closed the SQLite handles it opened, so Windows could not remove the directory even at exit), and the policy scanner still could not see a token written as a bare string inside a list. - project_temp.fixture_dir() is the one bounded entry point: an inherited TMPDIR counts only when it resolves inside the repository, and a fixture that cannot be removed is announced rather than swallowed (ERR-140's sin was silence). - registry.Registry gains close() so its gate can release its own files. - governance tests that re-hashed machine-local user material now skip by name instead.
…to the v3 snapshot The Observer could answer "what ran" but not "what is owed" or "is this software actually usable": the snapshot carried no task records, and the agents lane showed only an execution table, which silently implied that anything absent was unavailable. The projection now carries taskRecords (identity + checkpoint presence/digest only, never prompt or response bodies) and adapterCapabilities, where each of the seven ladder layers is MET / NOT_PROBED / NOT_SUPPORTED with the source or the reason, and a NATIVELY_VERIFIED client cannot claim the top layer without the bottom ones. Keys are emitted only when the inputs exist, so an absent source stays absent rather than an empty list that reads as "nothing declared". On the front end the Work lane selects records through the URL rather than local state, refuses an unknown record id instead of silently reselecting the first row, and names every dimension the snapshot does not carry as an explicit source gap. The 21-lane sweep pins that the read-only promise holds in both directions.
…tion shell The skin only silenced selected B10 animations, so the drawer, the toasts and a handful of transitions kept moving for a user whose OS says reduce motion. The floor now covers every element, including rules added later, and a contract test reads the shipped CSS so the floor cannot be dropped by a future stylesheet edit.
…learned to see Chinese-named files
The root-governance stage (44 modules, run by CI but not by the `governance` verdict I had been quoting)
convicted three documents with nine unresolved path references, all introduced by this round's own commits:
- apps/observer/frontend/DESIGN.md:403/405 cited `skins/b10.css` and `skins/l10b-shell.css`; the shipped
files are `apps/observer/frontend/src/skins/…`, so the citations resolved to no file from the repository
root. Re-pointed.
- UI-V2-INTAKE-20261010.md:5 cited `record-20261010/SOURCE-INTEGRITY.json` and the readable package dir
without their `docs/history/owner-inputs/` prefix. Re-pointed.
- OPEN-TASK-REGISTER.md:14/25/30 cited `skins/b10.css`, `src/skins/l10b-shell.css`,
`src-tauri/tauri.conf.json` and `verification/model_tests.txt` — four shorthands, two of them ambiguous
(`tauri.conf.json` exists twice in the tree: observer and token-monitor; the row means the observer's).
Re-pointed. Line 34 cites `apps/observer/frontend/src/lib/shared_rule_adaptation.ts` as the dead citation
the intake matrix carried; measured `never_in_history()` True and `git log --all --
'*shared_rule_adaptation.ts'` empty, so it is answered with the checker's own in-row
`[no-tree-claim NEVER_EXISTED ref=…]` token rather than being quietly pointed at the Python module that
plays the real role.
- The WUI-15 row also carried three unescaped pipes inside backtick spans (`string | null`,
`("A"|"B")[]`, a quoted `was: 7 -> 17 | missing before:` tool line) so markdown read it as seven cells
under a four-column header and the row's Status landed under the wrong heading — the exact failure the
2026-10-08 rectangularity fix describes. Escaped; `SCAN bad_rows=0`, `REGISTER_TABLE_SHAPE_PASS
wrong_width=0`.
- The checker itself was broken for non-ASCII paths: `tracked_paths()` ran plain `git ls-files`, which
quotes and octal-escapes any name outside ASCII, so the tracked tree contained ZERO entries ending in
`verification/model_tests.txt` (measured: old list 0 hits, new list 1 with the real name) — a correct
citation to a Chinese-named file could never resolve. It now runs `-c core.quotePath=false ls-files -z`
and splits on NUL without stripping, the way this repo's other index readers already do.
Measured after the repairs: `AUTHORITY_INDEX_PATHS_TOTAL targets=47 refs=829 broken=0 declared_in_row=11
failed_targets=0` (exit 0), and the three affected modules read 53 passed / 2 failed. The two failures are
the register's anti-vacuity floors (`>=3 tables and >100 rows`; `>40 rows carrying pins`) which are
measured against the pre-cutover ledger: at d22d21e^ the register held 8 tables / 190 rows / 404,985 B and
at d22d21e it holds 1 / 25 / 123,024 B. Nothing was lost — the pre-cutover bytes survive tracked and
byte-identical at `taskpacks/history/UI-PRIORITY-CUTOVER-20261009/original-tree/taskpacks/current/`
`OPEN-TASK-REGISTER.md` (404,985 B, and the old first data row still greps there). Re-deriving the two
floors to the owner's declared single-WUI-ledger shape is a ledger-policy call, so it is left red and
reported rather than lowered to green.
…first stage stopped masking it ERR-263 (ci_tooling, PASS): `run_quality_gate.py verify` walks 50 stages and stops at the first failure, so after every pre-push verdict taken from `governance` alone, the next two reds were still unpublished work. check_5/8/10 in verify_gate_runtime_convergence.py used `project_temp` with `import tempfile` still in place (d22d21e migrated the use, not the binding) — NameError at line 112, and Python only resolves that at call time, so the file compiled and every static gate passed. Three imports corrected, and a call-site control added that drives all ten checks and pins the aggregate's ids in order (a raised check answers no question). Falsified in place and restored from a same-run copy: PLANTED_RC=1 with the NameError named, then sha256_identical=True at 16,666 bytes and 3 passed. ERR-264 (contract_drift, PARTIAL by decision): nine unresolved citations in DESIGN.md, the UI-V2 intake doc and the live register — shorthands written the way they read from inside their own directory — plus a checker that could never see a Chinese-named file, because `tracked_paths()` ran plain `git ls-files`, whose quoted octal form left ZERO entries ending in `verification/model_tests.txt` in its own index. Eight re-pointed from paths read out of git rather than typed, the ninth answered with an in-row [no-tree-claim NEVER_EXISTED ref=…] token (never_in_history() True, git log --all empty) instead of being quietly redirected at the module that plays the role, three backticked pipes escaped, tracked_paths switched to `-c core.quotePath=false ls-files -z` without stripping. Measured: broken=0 failed_targets=0 exit 0; 53 passed / 2 failed. The two failures are left red on purpose and named as such: the register's anti-vacuity floors (>=3 tables, >100 rows, >40 pinned rows) are calibrated on the pre-cutover ledger — 8 tables / 190 rows / 404,985 B at d22d21e^ versus 1 / 25 / 123,024 B at d22d21e — and nothing was lost, because the pre-cutover bytes survive tracked at taskpacks/history/UI-PRIORITY-CUTOVER-20261009/original-tree/. Re-deriving them changes what the human register says, so that is the owner's call, not a floor I lower to make a gate green. Measured at the clean head 039a6f3: runtime-convergence GATE_EXIT=0, security GATE_EXIT=0, governance GATE_EXIT=0 (2,674 tests), root-governance-suite GATE_EXIT=1 with exactly those two members. Ledger 260 -> 262; ERROR_LEDGER_PASS entries=262, targets records=262 repoints=0 unlabelled=0, triage bindableByBirth 0, ledger-touching suites 113 passed.
…shape, and the live one keeps its own Both guards were red at 87f2839 and both were right about one thing and wrong about another. Measured before touching either: the live register is 1 table / 25 rows / 1 pinned row; the pre-cutover ledger that these floors were calibrated on survives TRACKED and byte-identical at taskpacks/history/UI-PRIORITY-CUTOVER-20261009/original-tree/taskpacks/current/OPEN-TASK-REGISTER.md — 8 tables / 190 rows / 65 pinned rows / 0 bad. So the floors were not wrong, they were attached to the wrong document: the 2026-10-09 cutover replaced the multi-ledger register with the single WUI table, and the absolute numbers kept demanding the old shape from the new one. The fix is a re-attachment, not a relaxation: >=3 tables, >100 rows and >40 pinned rows now run against the archived ledger, which is real repository content rather than a fixture, and the live file is judged against its own measured shape (assertEqual 1 table, assertEqual 25 rows, bad == []). Both halves were falsified in the same measurement that produced them: dropping the WUI-15 row takes the live scan 25 -> 24, and slicing the archive to 80 lines takes its pinned rows 65 -> 31, so neither floor is decoration. Measured after: the two modules 19 passed; `run_quality_gate.py root-governance-suite` CI_ROOT_GOVERNANCE_PASS modules=44 excluded_post_merge=1 discovered=45, GATE_EXIT=0.
…ledger, not wrong about the ledger Floors measured from the written bytes at the fixing head: live register 1 table / 25 rows / 1 pinned row; the tracked pre-cutover archive 8 / 190 / 65 with 0 bad rows, and 65 -> 31 pinned rows when sliced to its first 80 lines, which is the falsification that keeps the >40 floor from being decoration. Dropping the WUI-15 row moves the live scan 25 -> 24 for the same reason. Ledger 262 -> 263 rows; ERROR_LEDGER_PASS entries=263, targets records=263 repoints=0 unlabelled=0, root-governance-suite CI_ROOT_GOVERNANCE_PASS modules=44 GATE_EXIT=0 read at a clean tree (.project-local/runs/root-gov-at-clean-head.log).
…jection that change moves No workflow ran `run_quality_gate.py root-governance-suite` (measured: zero .github references before this edit), so its 44 modules could be red while every CI check stayed green — ERR-261, ERR-263 and ERR-264 each met a consequence of exactly that blind spot. Adding the invocation moved the projection's source digest (55f3237b0127 -> 4e3cad13c3df, because the workflow file is inside the digest's scope), which two root guards convicted immediately and correctly: test_ci_invoked_verifiers_have_a_local_route.py (it runs --check-current) and test_shipped_projections_are_current.py. So the change also carries the regenerated projection. Measured before the commit: the two modules 17 passed, and `root-governance-suite CI_ROOT_GOVERNANCE_PASS modules=44 excluded_post_merge=1 discovered=45` with GATE_EXIT=0 (.project-local/runs/root-gov-prepush2.log). Note the local route guard already existed — what was missing was CI calling the stage at all.
…es, constructed fixtures, runner-independent invariants Wiring `root-governance-suite` into CI (previous commit) immediately exposed four guards that had never run anywhere but this Windows box. `CI_ROOT_GOVERNANCE_FAIL modules_ran=44 modules_failed=4`, while the same stage read GATE_EXIT=0 here. Each cause was a claim about the machine, not about the repository: - FROZEN SURFACES hashed the working tree. Measured on docs/history/archive/workflow-convergence-receipt-20261005.json: disk sha256 b8262a28dc4b with 44 CRLF, committed blob sha256 9646c7e452a3 with 0 — exactly the manifest value and the CI value. `* text=auto` plus core.autocrlf=true means a Windows checkout and a Linux checkout of the same commit differ, so a manifest sealed from disk could never be reproduced by the runner that enforces it. `sha256_of()` now reads the object git will ship (index, then HEAD), the test's `derive()` delegates to it, and all three manifests were re-sealed: knowledge-staging 225 files / 3,041,157 B, docs/history/archive 137 / 1,474,077 B, reports/audit-archive 480 / 4,991,463 B. - PIN REACHABILITY used 0600d6f as its dangling-commit fixture — an object present in this clone and absent from a fresh one, where the checker correctly answered UNRESOLVABLE, a different state. The fixture is now constructed by `scratch_repo()`: `git commit-tree` makes an object no ref contains on any machine, and the ref-carried sibling proves the opposite half. The checker gained `--repo` so a planted register row can be judged against that repository. - IGNORE PROBE asserted `git check-ignore <dir>/` exits 0, pinning this box's git version. The rule is that a directory-shaped probe cannot discriminate a tracked directory from a fabricated one, which is what the test now asserts — it holds whether git answers 0 (this box) or 1 (the runner), and the file-shaped invariants are untouched because they are the part the repo actually relies on. - ENTRY BASELINE folded Windows-shaped strings through the platform Path in three places (`Path("C:\a\b.exe").parent` is `C:\a` here and `.` on Linux; `Path("C:\dir") / "x.exe"` becomes `C:\dir/x.exe`). All three are now `PureWindowsPath`, and the module gained two controls: a spelling invariant (backslash / forward-slash / case must not move the verdict) and an AST rule forbidding `Path(` inside `decide`/`_norm`/`_in_temp`/`parse_lnk`. The static control earned its keep immediately — it caught the third site at parse_lnk:177 that the first pass missed. Both controls were falsified by planting a regression (removing `_norm`'s casefold: PLANTED rc=1, spelling test convicted; restore sha256_identical=True, 24 passed after). Measured after all four: the four modules 44 passed, and `run_quality_gate.py root-governance-suite` CI_ROOT_GOVERNANCE_PASS modules=44 excluded_post_merge=1 discovered=45 with GATE_EXIT=0 (.project-local/runs/root-gov-after-all-fixes.log).
…changed generate_frozen_surface_manifest.py, register_pin_reachability.py and entry_baseline_readback.py all grew bytes in aaf39a5, and the published inventory describes the previous ones (ERR-153's order: commit first, then re-read, so the record's digest basis is the index that shipped). Measured after the re-read: trackedTools=74 withLedgerPromise=19 referencedSomewhere=74 unclaimed=0, and test_tool_inventory_coverage.py 12 passed.
Root causes measured, not guessed: the frozen manifest hashed the working tree (disk b8262a28dc4b with 44
CRLF vs committed blob 9646c7e452a3 with 0 — the CI value equalled the blob exactly); the dangling-pin
fixture was an object only this clone had, so a fresh one correctly answered UNRESOLVABLE where the test
asserted ZERO_REFS; the ignore-probe test asserted one git version's exit code rather than the rule that a
directory-shaped query cannot tell a tracked directory from a fabricated one; and entry_baseline_readback
folded Windows path strings through the platform Path, where Path('C:\a\b.exe').parent is '.' on Linux.
Fixes: sha256_of() reads the git object (index, then HEAD) and all three manifests were re-sealed from
committed bytes (225/137/480 files, 3,041,157 / 1,474,077 / 4,991,463 B); scratch_repo() constructs the
dangling object with commit-tree and the checker gained --repo; the probe test asserts the indiscrimination
on either runner; three PureWindowsPath sites plus a spelling invariant and an AST rule that already caught
the third site the first pass missed. Controls falsified by planting regressions and restored byte-identical.
Ledger 263 -> 264; ERROR_LEDGER_PASS entries=264, targets records=264 repoints=0 unlabelled=0. Measured at
the verified head: four modules 44 passed, root-governance-suite GATE_EXIT=0 (modules=44), governance
GATE_EXIT=0 (modules=247, ran=2677), inventory coverage 12 passed, residue guard 5 passed after reclaiming
1,321,972 B of node compile cache with its manifest written first.
…nd seven collapses are named instead of hidden WUI-15's remaining item was that apps/observer/frontend/src/types.ts stayed a second hand-written spelling while the generated projection (packages/client-neutral-core/generated/contracts.ts) was imported by nobody. This adds the seam rather than deleting the model: - apps/observer/frontend/src/contractConformance.ts imports WorkflowSnapshotV3 and asserts, per path, that the front's declaration is a REFINEMENT of the generated one (Refines + Expect, so drift fails the compile). Eight paths the generator names are pinned: schemaVersion, revision, sourceWatermark, transport, coverage, sourceRefs, tokenSummary, executions. - The seven paths the generator cannot name are listed as GENERATED_COLLAPSED_PATHS -- governance.families, workspace, tasks, ci, projects[].repositories, projects[].ci and artifactHandlesSummary.refused. They are listed, not exempted silently: the gate test compares the inventory leaf-by-leaf against the generated text and requires each declared parent to be an object the generator really opens, so a collapse that goes away cannot stay on the exemption list, and a new one cannot go unlisted. - The negative control is two-way by construction: widening the generated revision makes tsc raise TS2578 (unused @ts-expect-error), which was measured by planting it and restoring from a same-run copy. - src/contractConformance.test.ts adds 5 runtime cases (inventories non-empty and distinct, each path's leaf still a projected key, real fixture values assignable to the generated field types, the four optional sections still optional). Measured: tsc --noEmit exit 0; frontend 57 files / 672 tests passed; vite build exit 0; the two schema gates 29 passed; register/citation guards 26 passed after normalising the two shorthands this row introduced; render evidence on the rebuilt dist: collector_delivery_render COLLECTOR_CARD_EVIDENCE PASS rows_rendered=1 screens=2. SnapshotV3 is still not assignable to WorkflowSnapshotV3 as a unit -- that is exactly what the seven collapses mean -- so the hand model stays, now watched by the seam.
…shot really says something The acceptance line for WUI-08 names six stages, and four of them have no producer in this repo. A lane that drew all six as "not started" would have laundered that absence into a verdict, so the chain now distinguishes them: source evaluation and deploy readback come from live card fields, the other four are named gaps that each point at the owner that owes the field (migrationTarget, the Workflow-side diff, WUI-21's three pages, the target-side evidence producer). Read from the fresh canonical store, ten real cards render 60 stages and the split is 20 PROJECTED against 40 NOT_PROJECTED -- the strongest card in the fleet still leaves four steps unprojected, which is the claim "source success never stands in for target success" made checkable. The capture instrument had to learn to prove that: it now scrolls the chain card into view, hit-tests its centre (the receipt reads centreHit=stage, not a heading) and counts the controls inside it (0), so the screenshot is evidence of the painted block rather than of the lane's title. Also re-reads the tool inventory, which was stale at 50dab56: a ledger row had added a citing surface, and the instrument's own digest moved again with this batch.
…ot a reference `test_default_load_doc_citations_resolve` reads every path a default-load document cites and refuses a name it cannot resolve. A bare `evidence-receipt.json` is such a name: it exists only under `.project-local/artifacts/wui-20261009/`, so the row pointed at a file no reader could find. Caught by the canonical gate at 1646109 (governance, 2,680 tests, 1 failure) before anything was pushed.
…, and a reload does not mint a new one WUI-10's second owner constraint is behavioural: a lost background refresh must keep the operation's identity and ask about THAT operation, and may not repeat the write under a fresh idempotency key. Measured before this commit, the control service answered exactly two reads (`descriptor`, `health`) and the shell regenerated its key on every page load -- so the operator who reloaded could neither see whether the write landed, nor send the same identity again. The write side already refused a foreign key on an existing task_id, which stops a silent duplicate without telling anyone anything. `GET /api/control/operations/<task_id>` reads the one canonical store plus the append-only receipts, and states three outcomes that stay three: the write is CONFIRMED only when a receipt for this identity carries the CURRENT projection digest (otherwise DIVERGED / NO_RECEIPT_*), while native load and target behaviour report the live support level of `config.readback` and `work-unit.dispatch` -- so this answer cannot outlive the gap it describes. One identity per request, loopback-gated like the write, and it publishes no checkpoint values. The browser proof is the part that could not be settled in Python: three screens off the real served page (restored / fresh / absent), and the store plus receipts re-read afterwards still at one row and one line. `resultPaintedAtCentre` failed its first run because the panel sits below the fold, which is why the instrument scrolls before it measures. Side effects owned: the line insert moved `control_service.py`, so five `path:line` pointers in the shipped binding matrix no longer landed -- re-pointed, and the two shorthand `:360`/`:524` citations in the same cell expanded to full paths so the next shift is caught rather than rotting. The inventory needed a second publish for its own self-citation (ERR-222's pattern, again).
…e seam shipped `PARTIAL_20261010 / … 剩余为前端改消费生成物` described a state that commit 50dab56 ended: the front model now imports the generated type and two-way compile-time controls pin both directions. The cell carries the remainders that are still true -- the whole `SnapshotV3` is not assignable to `WorkflowSnapshotV3` because of the seven named collapses, `types.ts` stays, Rust has no readback, depth past five still collapses -- and the citation normaliser ran over the edited line so the row stays followable rather than merely resolvable.
… with the owed half named Both triggers carry two clauses and only one of them has evidence now, so neither row can read as a pass. T21's `刷新` side is proven from durable state (the reloaded page adopts the ledger's key, and the store still holds one row and one receipt after three screens); its `操作查询超时` side needs the operation_progress producer that belongs to WUI-21. T25's `同幂等操作查询` is proven including the digest-diverged branch, while `不重复原生写入` currently holds because the native write is refused — that must not be read as native idempotency having been verified. The WUI-24 row's distribution (3/13/2/25/1) was computed before these two moved, so the re-measured 3/15/2/23/1 is recorded beside it rather than replacing it silently. The `commit` field for the two rows now names the commit that carries the code being judged; 41 other cells byte-matched the prior table.
…WORK finding it can prove The package (WL-REC-0104, SHA-256 b8bd438e..., 163 members) is a cross-project audit, so it registers as SHARED_CONTEXT with the WORK-LAB content addressed by member: the 51 readable members -- the four findings' reports plus the work-* evidence -- come in beside the original, which stays untouched in the read-only inbound root. Catalog `verify` passes at 104 materials / 2382 members, and the register, the member table, the source census, INDEX.md and CATALOG.html move together because those three files are mutually checked. `CLOUD-AUDIT-INTAKE-2026-10-11.md` judges the four WORK findings against the current tree rather than against the branch label the audit used, and one version fact changes the whole reading: `71b1ae86` is an ANCESTOR of this line, so W01/W02 cannot be closed as "the other branch's UI". W04 was already repaired here (the inventory re-read, plus the root-governance stage now running on both paths). W01 is still open and the reason is a gate-shape fault worth naming: `laneTransportTruth.sweep.test.tsx` populates its sweep from the very field it audits, so "a snapshot that still says LIVE while its sample time is old" cannot be constructed inside the control that is supposed to catch it. W02 is still open and the component has zero test consumers, so nothing here could have contradicted the audit either way. W03 is fixed in this commit because it is the one finding this repo can settle with its own hands, and CI proved it independently at two heads (`LookupError: unknown encoding: mbcs`): `mbcs` is not a codec but Windows' name for the system ANSI codepage, and the instrument and the fixture each spelled it -- two places deciding one thing is how a gate becomes un-runnable on the runner while the author's machine is green. One `ansi_codec()` now decides it, the parse result names the codec and, off Windows, names the assumption, and the Linux branch is exercised on a Windows host by swapping the module's `os` binding, so the fix is checkable before a push. Four plants, each convicted, each restored byte-identical (ERR-267). Registering the material also moved a basename-keyed projection: the new `MANIFEST.json` member grew the candidate list in LEDGER_REGRESSION_COMMAND_TARGETS, which the shipped freshness test caught and the ERR-153 order repaired in the same commit.
…ll four hold at the current head The cover sheet counts 25 problems; the numbered list carries 21. The difference is four WORK items that live only in the Linux appendix (`WL-L01` project Git mis-attribution P1, `WL-L02` project CI losing its owner key, `WL-L03` estimated usage promoted to EXACT, `WL-L04` a swallowed setItem exception still claiming "已自动保存"). Reading them out of the appendix and against this tree, every one reproduces in the source at the registered line -- two `or` fallbacks that let one repository's SHA stand in for another's, a `_ci_rows` projection with no projectId for the filter to match (so `ci=[]` means the predicate never held, not that CI is absent), a rollup that lets one EXACT sample upgrade eleven, and a header label with no causal link to the write it reports. All four stay OPEN and are routed to WUI-15/WUI-04/WUI-11/WUI-12; no product code changed here, because a fallback-removal in the read model needs its own tests, and naming the defect is not the same as fixing it. Member citations now carry their archived paths, since a basename from an inbound package resolves at four places in this repository.
…h is not a reference `未进 findings.json` names a file that exists at four places in this repository; the default-load citation guard is right to refuse it, and the archived path under the record directory is what a reader can follow. Pushing 1339ff2 with two red guards was my own chain's fault, not the content's: the check ran through a `| tail`, so the pipeline's status was tail's and the `&&` proceeded over a FAILED line it had just printed. Re-run with the exit code captured to a file: 18 passed, normaliser reports rewritten=0 blocked=0.
…e name, which the authority-index guard refuses `cloud-audit-readable/` resolves to nothing as written: the check needs the repo-relative path, and "is not a tracked directory" is the honest answer for a name that only means something inside the record directory. CI caught it at 1d2412e (`test_authority_index_paths_resolve.py`, 3 failures, one broken reference) after I pushed with the doc's own citation guards green — I had re-run the default-load chain and the register shape, but not the authority-index scan set, which is the one that includes a new doc under docs/current. Reproduced in a detached clean checkout to confirm it is a content defect and not a runner quirk: the main tree's copy of the same file failed there too. The whole root-governance suite is green after the repair (44 modules), and re-publishing the tool inventory produced no content diff, so the doc's other citations move no citing set.
… stops being null The gate at that SHA reported `modules_ran=44 modules_failed=1` and the single failing member was `test_authority_index_paths_resolve.py` -- my own intake-document citation, fixed in 335d0c6. `test_entry_baseline_projection.py` is absent from that failure list and the mbcs LookupError is gone, so the Linux runner executed the module that previously could not execute at all, and it passed. That is exact-SHA evidence for W03 even though the aggregate at that head was red for another reason, and the note says so plainly instead of leaving the row unverified because the surrounding verdict was inconvenient.
…nner verdict is green `1d2412ee` proves the module runs and passes on Linux, but the workflow concluded red there because of my own citation defect, so naming it the verification basis overstated nothing but supported less than it looked. `3e3401a2` is the first head where `work-lab-gate` (run 38135460866) and `wlr-060-production-gates` both concluded `success`, and the local canonical gate ran all 50 stages green at the same SHA; the note carries both readings with their run ids rather than a single flattering number. fixedCommit stays where the codec decision was actually single-sourced.
来源 WL-REC-0104(云端三项目审计包,SHA-256 b8bd438e…),判定见 docs/current/ui-priority-20261009/CLOUD-AUDIT-INTAKE-2026-06-11 之后的 2026-10-11 批次。 缺陷修复(每条都有守门 + 伪证,账本 ERR-268..274): - WL-L01 (P1) 项目 Git 错归属:_project_projection 不再回退他仓,顶层摘要只取 work-lab 自身观测, 新增 sourceProjectId 命名归属(缺失即 UNKNOWN)。schema / types.ts / generated types 三处同步。 - WL-L02 (P2) 项目 CI 恒为空:_ci_rows 补 projectId,下游过滤谓词得以成立。 - WL-L03 (P2) 部分估计被提升为 EXACT:抽出共享谓词 _merge_cost_quality,空样本 UNKNOWN。 - WL-L04 (P2) 吞掉 setItem 异常仍写「已自动保存」:writeModel 返回 outcome,失败态显示未保存+原因+可重试。 - W01 (P1) 传输真值:单点派生 transportTruth(snap, live, error),并显示 sourceWatermark 采样时刻; 门群体改为传输态 × 新鲜度二维扫面。 - W02 (P2) 画布:toModel 统一坐标换算(含 pan)、nodeAt 模型空间命中测试、pointerdown 起始连线、 capturePointer 容错、connectingRef 保证一次释放只结算一次、背景判定不再被 overlay 否定、 适应画布同时重置 zoom 与 pan。 WUI-21 隔离试用: - v3 快照新增 operationProgress / isolatedTrials 两段,逐字承载 worklab/operation-progress/v1 与 worklab/isolated-trial/v1 文档;缺失即缺失,不补空列表。 - composition_root::_task_ledger_read_models 读不到账本时答 UNKNOWN / NO_PRODUCER,不新建空账本。 - 三页(trial-plan / trial-failure / trial-readback)注册为独立 lane,导航新增「隔离试用」分组; 每阶段打印「状态(依据)」,UNKNOWN_OR_TIMEOUT 保留原词,页面控件计数为 0。 附带(都是本轮改动直接引出的必门修正,不改绿、不跳过): - 5 个 `path:line` 指针因插行失配,用守门谓词 pointer_findings 列全后按代码内容重定位。 - 生成类型 collapse 清单:阶段形状原经 $defs 声明,生成器不跟 $ref 而产出 unknown, 改为在 schema 内联后由投影命名,豁免从 4 条收敛为 1 条;两处门的地板同步写成 assertGreaterEqual(真正的不变式 measured == declared 的双向相等断言未削弱)。 - 错误账本 265 → 272 条;ERR-268..273 在取得本提交前记 PARTIAL(commit 授权为本轮新增)。 - 按序重发派生审计(ledger_regression_command_targets / triage_unbound_ledger_records)。 - 释放 .project-local/runs/tmp 无人引用残留 1,324,302 B(此前超过 6 小时地板会让门红)。 证据: - 新守门:Python 16 例、前端 4 文件 51 例,全绿;全量 vitest 63 文件 / 737 用例;tsc --noEmit 0。 - 5 个伪证脚本全部 PASS(8+3+13+8+4 项定罪),植入前取字节快照、按字节还原。 - bundle 指纹 01b09ea79711c3a8…,EVIDENCE_SEAL_PASS BOUND=21 UNBOUND=4 STALE=3 cited=9/9。 - 合同面 45/45,CONTRACT_SSOT_PASS,ERROR_LEDGER_PASS entries=272。 未通过(不改绿、不跳过): - 本地全量门 GATE_EXIT=1,failed_gate=governance。第二次 26 项失败全部落在 test_workflow_governance(15) / test_github_delivery(10) / 两个符号链接用例: 前者是宿主 CLI sitecustomize.py 的批量删除守卫在 tempfile 清理时 SystemExit(1) (单跑 test_github_delivery 16 passed),后者把本轮改动 git stash 后单跑仍失败。 - 终验报告 docs/current/ui-priority-20261009/WUI-19-FINAL-ACCEPTANCE-20261012.md 六层分层, 结论为「可评审工作集 + 明确缺口」:display-scaling 200% 派生检查 FAIL、 原生键盘门 KEYBOARD_FOCUS_GATE_NOT_RUN、Windows 安装/升级/备份恢复未执行、 config.apply/readback/rollback 未获权、LFS 载荷第三方复证未走通。
新测试文件随 2bda3fa 入库后,ERR-268..274 的回归目标不再是 PATH_GONE; 按序重发 ledger_regression_command_targets --apply 与 triage_unbound_ledger_records, 两门 35 例全绿。
三处同源缺陷,都在 `integrations/executors/codex/install_codex_global_guidance.py`: 1. 暂存条目用 SetFileInformationByHandle 打删除挂起标记。本机实测返回 WinError 24,异常被 打印后吞掉,安装器继续打印 CODEX_GUIDANCE_WRITTEN 并以 0 退出,而 AGENTS.md 根本不存在。 宣称的与事实不符,是这一族门长期全红的真正原因。 2. 该处置本身单向不可撤销(旧版 FileDispositionInfo),而发布路径依赖「发布前清除标记」。 改为不使用删除处置:暂存的私有性由 CREATE_NEW + 128 位随机名 + FILE_SHARE_READ 提供, 发布仍是同一个原子 FileRenameInfo,放弃的尝试按名删除。 3. 随之对齐两处与机制绑定的假设:st_nlink 在 Windows 上应为 1(具名文件只指向自己, 多一个就是硬链接攻击,正是该检查要抓的);发布后覆盖竞态的撤回改为关句柄后按名删除 已发布目标,而不是靠句柄上的删除处置。 对外可观察的变化:`--apply` 现在真的落盘(AGENTS.md 1267 B,RC=0),且不再有 「打印 WRITTEN 却无文件」的路径。 证据:tests/workflow-assistance/test_workflow_governance.py 由 origin/main 基线的 15 failed / 79 passed 变为 2 failed / 91 passed / 4 skipped。 剩余 2 项(post_create_hardlink、linked_ancestor_directory)依赖真实文件系统链接, 而本机宿主 CLI 的 sitecustomize.py 代理了 os.symlink 与 os.link,创建出的对象 is_symlink() 为 False、lstat 无 REPARSE_POINT,测试无法构造前提——属环境上限,不是产品红灯。 另:本轮所有直跑改用带项目临时根的封装(.project-local/runs/wui-20261012/run-pytest-in-project-temp.sh), 此前绕过 run_quality_gate.py 直调 pytest 时继承了 TEMP=C://Windows//TEMP,造成边界外溢。
分支处置(先建 origin/main 独立工作树跑同一模块作基线:本轮新增失败 0): - codex/github-delivery-incident-20260929(1 提交)→ 被取代,删除。它加入的 LESSONS_LEARNED 段落 main 已逐字包含;它带入的 ERR-090/091 main 均已有。 - codex/github-delivery-repair-20260929(3 提交)→ 被取代,删除。test_github_delivery.py 与 main 逐字节相同,即三个修复的证明已在主线;main 另有 encoding/errors 演进。 - g15-dsh-codex-registry-reconcile-20260930(1 提交)→ 记录移植,分支删除。合并会把 dsh 回退到 2.0.13(main 已按 AG-07 标 SUPERSEDED),但 ERR-092 只存在于该分支,故记录走、内容不走: ERR-092 已入活账本,remaining_boundary 写明被取代部分,status_after=PARTIAL。 登记索引(ERR-275):owner_material_catalog verify 由 FAIL 转为 PASS(104 条登记 / 2382 成员)。 真因是校验器哈希工作区副本——Windows 以 CRLF 检出(WL-REC-0006 磁盘 13,732 B / 6896bb7e…, git blob 与登记均为 13,674 B / 8d4a4818…)。改为对受跟踪、无嵌套成员链的归档读索引字节, LFS 指针文件回退工作区。若照原样「修」登记,会写入 Windows 专属哈希,之后 Linux/macOS 都会看到真漂移。 新守护 tests/workflow-assistance/test_material_catalog_uses_repository_bytes.py 3 例含反向对照。 Codex 安装器本轮余下两项(见上一提交)已定位到平台事实并对齐: CreateHardLink 对 FILE_SHARE_NONE 的句柄照样成功,NTFS 上共享模式挡不住硬链接;能挡的删除挂起处置 在本机返回 WinError 24。故安装器以 st_nlink 检测替代预防(检测到即拒绝发布),硬链接用例改为断言 真正的不变式「被攻破的暂存绝不被发布」而不是某个特定机制;符号链接用例先验证链接确为链接再建, 本机 NTFS 会把 symlink_to 静默降级成普通目录,该前提无法构造时按既有 skipTest 形状具名跳过。 test_workflow_governance.py + test_github_delivery.py:109 passed / 5 skipped / 0 failed (origin/main 基线为 15 failed / 79 passed / 4 skipped)。
Windows 上 Path.write_text 会把 \n 转成 CRLF,于是同一个未改的源在不同平台产出不同字节, 投影里的 content_hash 也就跟着变——test_two_generations_produce_the_same_bytes 报的正是这个 「漂移」。改为 write_bytes,产物字节在哪个平台都一样(与 ERR-275 同一类,但这次修在产生侧, 而不是在校验侧绕过去)。投影已按当前源重新生成。 同批复核并修复了两处权威/索引陈旧: - docs/audits/TOOL_INVENTORY_2026-10-07.json 描述的工具清单在我改 scripts/maintenance/ 后已与树不符(inventory bytes 19429 != 20604),按 ERR-151 的次序(暂存之后、提交之前) 用 tool_inventory_readback.py 重生成:trackedTools=75 withLedgerPromise=19 unclaimed=0,12 例全绿。 - docs/history/owner-inputs/INDEX.md 同步重建,catalogRows=2486。 test_agent_default_material_is_regenerated_and_current.py 8 例全绿; test_tool_inventory_coverage.py 12 例全绿。
未来规划(仅文档,未实施、未安装、未改权限与优先级): - 用户两轮提供的「统一目标入口」「外部多智能体能力吸收」「Agent Studio V2.0」全部并入仓库里 唯一 OPEN 的未来规划 docs/future/WORK-LAB-SUPER-ENTRY-COMMAND-CENTER-LAB-ROUTER-2026-09-27.md, 新增 §10 统一目标入口、§11 外部多智能体候选判据、§12 Agent Studio(三种形态/身份分层/真实性规则/ 七导航与 Control·Observer 关系/视觉与运行边界)、§13 后续任务分解 A–G(非活动候选工作包)、 §14 未来阶段与验收、§15 与 AAOS·DESIGN-LAB 的长期边界与待确认项。未新建第二份路线图, 决策层 WORK-LAB-LITE-AND-PARALLEL-WORKSPACE-ARCHITECTURE.md 一字未改,只被引用。 - 防漂移:docs/future/ 此前不在任何默认加载链上(内容在却找不到)。已在 docs/current/workflow-assistance/workflow/active-authority-index.md 登记其处置口径并更新到 §15。 - 来源纪律:marvis.qq.com 与 github.com/Drok1015/marvis-office 本轮均未访问,一律标待核验; 后者按用户说明是第三方复刻、非官方源码。云端三项目审计包检索 多智能体|multi-agent|subagent 0 命中,故 §11 只登记判据、不补写候选条目。 两个符号链接门:本机两个 NTFS 卷上 symlink_to 均静默降级为普通目录(st_file_attributes=0x10, 无 FILE_ATTRIBUTE_REPARSE_POINT),前提无法构造。门内改为先验证链接确为链接,不是则按该文件 既有的 skipTest 形状具名跳过并写明原因;能建真链接的环境照常执行检查。 实测 test_machine_identity 13 passed/1 skipped、test_action_plan_sync 该用例 1 skipped。 终验报告与登记册更新到最终实测状态(门由 failures=21 errors=14 收敛到 failures=3,其中 1 项派生审计已修、2 项即上述符号链接前提)。 派生审计按 ERR-151 同源次序执行:暂存之后、提交之前重跑 ledger_regression_command_targets 与 triage_unbound_ledger_records,避免文件入库后标签由 PATH_GONE 变 RESOLVES 而让下一轮门变红。
1. apps/observer/tests/test_production_surface_static_contract.js 的 「the typed front model declares the v3 core keys, and only the named optional ones」 本就该拦住这种改动:它显式列出可选键集合,理由是「有人加了一个投影却没决定缺席与空 是否同义」。WUI-21 新增的 operationProgress / isolatedTrials 正是这种情况而未登记。 现按该门自己的理由登记:两段逐字承载 worklab/operation-progress/v1 与 worklab/isolated-trial/v1,产者在读不到源时整段省略;空数组会宣称「读过且为空」, 正是 WUI-19 审计最初发现的那类假阴性。 2. renderTruthContract.test.tsx 的 U03 step 2 首段 LIVE 等待用默认 1s,而同文件后面的 OFFLINE 等待显式给了 2000ms。实测批量负载下(63 文件、environment 254s)首段失败、 单跑通过——是时序,不是真值合同失败。断言不变,只把预算写明为 2000ms。 OBSERVER_FRONTEND_CONTRACTS_PASS js=0 vitest=0(此前 js=1)。
governance 阶段已通过(此前长期卡在第 1 阶段),红项后移到 observer-frontend-contracts 并已修。 本机 NTFS 把 symlink_to 静默降级为普通目录(两个卷、清空 PYTHONPATH 后仍如此): lstat 报 st_file_attributes=0x10、无 FILE_ATTRIBUTE_REPARSE_POINT;相关门改为先验证链接确为链接。 宿主 CLI 的 sitecustomize.py 代理了 os.symlink/os.link,批量删除守卫用其官方环境变量 CODEBUDDY_SAFE_DELETE_ENABLED=0 临时放行。全量门在本沙箱反复被杀(5 次,日志 0 字节、进程消失), 故本轮以分模块单跑定位,均已全绿,但无完整 GATE_EXIT 收据。
CI 在 44 个模块中只红这一个:test_shipped_projections_are_current 报告 「the committed TOOL_INVENTORY_2026-10-07.json is not what this tree measures」。 原因是本轮修改了 scripts/maintenance/owner_material_catalog.py(ERR-275 的仓库字节比对) 之后没有按ERR-151 的次序重发投影——该次序是「暂存之后、提交之前」重测。 tool_inventory_readback 重新测量:trackedTools=75 withLedgerPromise=19 referencedSomewhere=75 unclaimed=0(无任何工具既无人引用也无账本承诺)。 未包含在工作区的 AGENTS.md / config/adapter-registry.json / config/client-evidence.json / error-ledger.json 改动:它们属于另一个并行写者(ERR-276,DSH 与 Hermes 官方标准复核, intakeSource 记为用户 2026-07-13 指令),不是本轮的产物,不代为提交。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
摘要
对账一份独立收敛审计(
WORK-LAB_审计裁决_2026-10-01.json,anchord43d07a,overall_verdict = NOT_READY_FOR_REINSTALL_OR_DEPLOYMENT_ACCEPTANCE,23 项发现 / 2 blocker / 9 high,其中 18 项needs_local),把每一项拿到当前树上逐项核实,而不是采信任何一方的叙述。23 项全部有结论,无遗漏、无多余(用脚本对 F01–F23 全集校验,计数平衡于 23):
完整摘要与错误台账见
reports/SESSION-CONSOLIDATION-20261001.md。主要修复
假断言与不可支撑的声明(证据包自身)
global-workflow-coverage.json断言has_worklab_managed_marker: true,而 live 与归档两份CODEX_HOME/AGENTS.md都是 16,805 B / 691 行且不含渲染器标记。改为false+ 可复核更正块;MANIFEST 摘要同步。external_roots_touched: []只能证明记录内容;SECRET-SCAN-REPORT.json的扫描器源码与规则集未保留,第三方无法复现。新增behavior_declarations分级。陈旧登记与静默漂移
check_skill_provenance的 live 检查被if live_root is not None包住,而 canonical 门不传--live-root→ 门报live_checked=False,live_sha256从未被比对;model-switch因此长期带陈旧值。修正 + 新增离线自洽规则。chrome-profiles的revision 5b9c3257是准确的,但工作树被本地改过:__init__.py已装 24,433 B vs 该 revision 的 23,764 B。只记 revision 等于给错的字节发认证。model-switch(根级枚举缺口)。skills-inventory.json14 条中 6 条哈希陈旧,用权威生成器重新生成。用户状态与危险形状
disposition,两者标REJECT_USER_DATA。CC-1(.tmp-*)与CC-3(*.bak*)非互斥:实测 15 / 11 / 3 个两者都命中。加双向overlaps_with+ 优先级。MEMORY_BACKENDseam 写着 "no new callers allowed" 却无任何校验、扫描显示调用者为 0(既无人执行、又碰巧满足)。加 seam-caller 基线,注入调用者即失败。ArcheAxis-Knowledge-OS/AGENTS.md被工具链自动当作治理指引注入会话(本会话实测发生),且其00-governance引用已不存在。三份归档指令文件加解除指令横幅。commit=null+provenance_status: UNKNOWN+ 理由,并明写"未证明"清单。部署内容保全(F04)
windows-development-environment实机比仓库多:经验 30(.cmd不能经node <path>.cmd执行)、经验 31(工具链缺失必须如实报 BLOCKED,不得编造 PASS)、以及references/frontend-baseline-contract.md。已 land 进仓库源码(144 行,1.3.0 → 1.4.0),并把 live 中指向不存在文件的悬空引用换成真实路径。新增机器门(41 → 47)
evidence-tiering(46)plugin-inventory-honesty(47)负向对照:nf27 43 / nf28 13 / nf29 22 / nf30 11,全部验证过"能失败"。
验证
run_quality_gate.py verify→ 47 门 PASS(本地)EVIDENCE_TIER_PASSbundles=7;PLUGIN_INVENTORY_PASS;THREE_PROJECT_BOUNDARY_PASSsplits=6 markers=5 seams=3%USERPROFILE%类路径与origin/main同为 86 个文件 → 不引入新暴露证据等级声明:以上均为本地 canonical。exact-SHA CI / 原生运行验收 / 用户验收 / Release 全部
NOT_RUN。明确未做
apply(只跑了只读plan)auth.json、.env一律未碰)E:\/F:\UNKNOWN)本会话自身的错误(已撤销并留痕)
摘要第五节列出 14 项,其中值得注意的三项:
security-guidance/web-ddgs存在"声明 vs 观测不一致",是假发现:两者type/upstream/spdx均写明bundled,实为随 Hermes 应用发布的组件,不在用户安装目录是正确状态。已撤销并加门规则禁止再犯。reports/audit-archive/20260930完全一致,重复部分已删除。需要人类决定(本 PR 不包含)
ArcheAxis-Knowledge-OS/DESIGN-LAB的授权DSH_HOME数据根迁移