harness-everything 0.38.0 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/AGENTS.md +79 -63
  4. package/CHANGELOG.md +32 -0
  5. package/benchmarks/results/reviews/pr353-r6-2026-10-22/README.md +76 -0
  6. package/benchmarks/results/reviews/pr353-r6-2026-10-22/a-reviews-b.md +191 -0
  7. package/benchmarks/results/reviews/pr353-r6-2026-10-22/b-reviews-a.md +100 -0
  8. package/benchmarks/results/reviews/pr353-r6-2026-10-22/baseline-probes.log +47 -0
  9. package/benchmarks/results/reviews/pr353-r6-2026-10-22/bom-red.log +85 -0
  10. package/benchmarks/results/reviews/pr353-r6-2026-10-22/bom-transition.txt +25 -0
  11. package/benchmarks/results/reviews/pr353-r6-2026-10-22/coordinator-probes.txt +84 -0
  12. package/benchmarks/results/reviews/pr353-r6-2026-10-22/cross-suite.txt +18 -0
  13. package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-bom.log +3 -0
  14. package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-consistency.log.gz +0 -0
  15. package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-core.log +198 -0
  16. package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-probes.log +27 -0
  17. package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-producer.log +83 -0
  18. package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-review.md +89 -0
  19. package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-transitions.log +5 -0
  20. package/benchmarks/results/reviews/pr353-r6-2026-10-22/implementation-a.md +166 -0
  21. package/benchmarks/results/reviews/pr353-r6-2026-10-22/implementation-b.md +264 -0
  22. package/benchmarks/results/reviews/pr353-r6-2026-10-22/logs.sha256 +15 -0
  23. package/benchmarks/results/reviews/pr353-r6-2026-10-22/peer-a-probe.log +62 -0
  24. package/benchmarks/results/reviews/pr353-r6-2026-10-22/peer-a-probe.txt +313 -0
  25. package/benchmarks/results/reviews/pr353-r6-2026-10-22/peer-b-probe.log +51 -0
  26. package/benchmarks/results/reviews/pr353-r6-2026-10-22/peer-b-probe.txt +94 -0
  27. package/benchmarks/results/reviews/pr353-r6-2026-10-22/semantic-transitions.txt +25 -0
  28. package/benchmarks/results/reviews/pr353-r6-2026-10-22/source.sha256 +9 -0
  29. package/benchmarks/results/reviews/pr353-r6-2026-10-22/tests-a-on-b-core.log +201 -0
  30. package/benchmarks/results/reviews/pr353-r6-2026-10-22/tests-a-on-b-producer.log +82 -0
  31. package/benchmarks/results/reviews/pr353-r6-2026-10-22/tests-b-on-a-core.log +197 -0
  32. package/benchmarks/results/reviews/pr353-r6-2026-10-22/tests-b-on-a-producer.log +82 -0
  33. package/benchmarks/results/reviews/pr353-r6-2026-10-22/verify-all.log.gz +0 -0
  34. package/benchmarks/results/reviews/pr353-r6-2026-10-22/verify-gate-summary.json +22 -0
  35. package/ci/fixtures/doc-obligations/reconciliation-s2a/harness.js +489 -0
  36. package/ci/fixtures/doc-obligations/reconciliation-s2a/vectors.json +617 -0
  37. package/ci/mechanism-325-3b-s2a-core.test.js +840 -0
  38. package/ci/mechanism-325-3b-s2a-producer.test.js +564 -0
  39. package/code-review/SKILL.md +3 -3
  40. package/code-review/references/review-playbook.md +4 -0
  41. package/code-review/templates/finding.template.md +6 -0
  42. package/docs/doc-workflow-reconciliation.md +357 -0
  43. package/evals/zoom-out/tasks/negative-first-edge-case-review.yaml +16 -0
  44. package/evals/zoom-out/tasks/positive-repair-loop.yaml +15 -0
  45. package/harness-everything/SKILL.md +1 -1
  46. package/harness-everything/scripts/project-docs-resolver.js +42 -8
  47. package/harness-everything/scripts/routing-keywords.json +4 -0
  48. package/hooks/scripts/lib/doc-reconciliation-core.js +280 -0
  49. package/hooks/scripts/lib/doc-reconciliation-events.js +141 -0
  50. package/hooks/scripts/lib/doc-reconciliation-producer.js +206 -0
  51. package/multi-agent-workspace/SKILL.md +1 -1
  52. package/multi-agent-workspace/scripts/project-docs-resolver.js +42 -8
  53. package/opencode-plugin/plugin.json +1 -1
  54. package/package.json +2 -1
  55. package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
  56. package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-core.js +280 -0
  57. package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-events.js +141 -0
  58. package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-producer.js +206 -0
  59. package/plugins/harness-everything/plugin.json +1 -1
  60. package/plugins/harness-everything/skills/code-review/SKILL.md +3 -3
  61. package/plugins/harness-everything/skills/code-review/references/review-playbook.md +4 -0
  62. package/plugins/harness-everything/skills/code-review/templates/finding.template.md +6 -0
  63. package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
  64. package/plugins/harness-everything/skills/harness-everything/scripts/project-docs-resolver.js +42 -8
  65. package/plugins/harness-everything/skills/harness-everything/scripts/routing-keywords.json +4 -0
  66. package/plugins/harness-everything/skills/multi-agent-workspace/SKILL.md +1 -1
  67. package/plugins/harness-everything/skills/multi-agent-workspace/scripts/project-docs-resolver.js +42 -8
  68. package/plugins/harness-everything/skills/to-spec/SKILL.md +1 -1
  69. package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +42 -8
  70. package/plugins/harness-everything/skills/zoom-out/SKILL.md +4 -3
  71. package/plugins/harness-everything/skills/zoom-out/references/circuit-breaker.md +7 -0
  72. package/plugins/harness-everything/skills/zoom-out/templates/zoom-out-report.template.md +4 -2
  73. package/sbom.cdx.json +7 -7
  74. package/scripts/errors-sync.js +90 -0
  75. package/to-spec/SKILL.md +1 -1
  76. package/to-spec/scripts/project-docs-resolver.js +42 -8
  77. package/zoom-out/SKILL.md +4 -3
  78. package/zoom-out/references/circuit-breaker.md +7 -0
  79. package/zoom-out/templates/zoom-out-report.template.md +4 -2
@@ -0,0 +1,100 @@
1
+ # Cross-review — PR #353 leg A (reviewer: leg B)
2
+
3
+ Reviewer role: **read-only** reviewer of peer A at `/Users/daniel.chang/Desktop/Skills/Harness-everything/.worktrees/353-r6-a`.
4
+ Nothing in either worktree was edited; no git/gh writes; no full suites run.
5
+
6
+ Inputs read: `/tmp/harness-353-r6-a/REPORT.md`, A's `git diff 59421f4` (production files, tests, fixture,
7
+ docs, CHANGELOG), the unchanged derive contract `harness-everything/scripts/doc-obligations.js` and
8
+ `doc-lifecycle.js`, and the S2a contract text.
9
+
10
+ Probes executed (read-only, both implementations): my consolidated probe
11
+ `/tmp/harness-353-r6-b/probe/cross-review-probe.js` (8 cases × both legs) and the coordinator's
12
+ `semantic-transitions.js` (4 cases) against A. Logs: `logs/CROSS-probe-A.log`, `logs/CROSS-probe-B.log`,
13
+ `logs/CROSS-coordinator-transitions-A.log`.
14
+
15
+ ## Verdict
16
+
17
+ **ACCEPT peer A.** No blocker found. One executed behavioural difference against leg B, where A is the
18
+ stricter and packet-compliant side. Three non-blocking follow-ups for the owner.
19
+
20
+ ## Review by dimension
21
+
22
+ | Dimension | Finding | Label |
23
+ | --- | --- | --- |
24
+ | Origin tuple ↔ identity | A binds all five origin-correlated fields (`workspaceId`, `sessionId`, `workflowId`, `workflowRevision`, `taskId`) of `originContext` to `identity` (`originBound`), so the provider↔captured-context half and the event-identity↔identity half are connected. The joint substitution is rejected in verification, review and the cached-acceptance path. | executed (coordinator probe 26/26 for A, per A's report) + source-traced (A's `originBound`, core line 149ff) |
25
+ | Plan ↔ identity | A checks the captured plan explicitly (`workflow.workflowId/workflowRevision/sessionId`, `task.taskId`, `prdRoot`, `configDigest`) against the identity. B relies on `taskScopeDigest` for the same links, so A's plan check is the more legible of the two; A's `plan.configDigest ↔ identity.configDigest` link has no counterpart in B. | source-traced |
26
+ | Config ↔ inventory | A adds `configBytesBound`: the captured config source bytes must equal the captured inventory bytes for the same path (`config-capture-mismatch` otherwise). The producer already enforced this at capture; the core did not. **A closes a represented link that B does not.** | source-traced + A's own non-vacuity probe (`legA/logs/red-config-link-3.log`) |
27
+ | Host binding | `originContext.activeHost` vs `config.capture.activeHost`, skipped only when neither side represents a host — same rule as B, both absent-tolerant. | source-traced |
28
+ | Binary bytes intact | Every stored byte stays in the identity framing; A ships a test asserting the per-record digest equals SHA-256 of the stored bytes and that a changed asset changes `candidateDigest` while the MUST set is unchanged. My probe's `irrelevant-asset-control` → `ready` on both legs. | executed |
29
+ | Relevant undecodable content cannot disappear | The coordinator's defect class (candidate bytes carrying `role: prd` or a REQ-citing test while the baseline record is nonsemantic) **fails closed in A** (`semantic-transitions.js` 4/4 → `unavailable`), and my probe reproduces the same two shapes → `unavailable` in both A and B. A additionally fails closed for every governed/legacy/derived/code/**test** path. | executed |
30
+ | Divergence A vs B | `undecodable-test-path-no-req` (an undecodable record at `tests/plain.dat`, no REQ id): **A → `inventory-unsupported`**, **B → `ready` (the test input is silently omitted)**. The packet says "Do not silently drop code/test/governed/derived inputs"; B drops a test input, A does not. `undecodable-code-path-no-req` → both fail closed. | executed |
31
+ | Producer/core parity | Both legs share one helper (`U.deriveFiles` in A, `deriveCapturedFacts` in B). A's producer is non-strict and its core strict, which preserves the base code's asymmetry; B makes both strict (a superset). Neither diverges on the semantic handling. | source-traced |
32
+ | Malformed inputs | A's core catch maps the message `invalid-input`/`inventory-incomplete`/`inventory-unsupported`; because the shared `bytes()` helper throws a plain `Error('inventory-unsupported')` for a malformed `storedBytes`, **A now reports `inventory-unsupported` where the base reported `invalid-input`**. Credit is withheld either way; B preserves the base diagnostic. One-line mapping fix available. | source-traced |
33
+ | Purity | A's new core code is pure (no `fs`, no `child_process`, no network); the core's no-I/O assertion still holds. | source-traced |
34
+ | Scope / API regressions | Only the write-set is touched: S2a core + producer (+ generated copies), the two S2a suites, the S2a fixture, the S2a contract text, `CHANGELOG.md`. No public derive/checker API, identity/digest schema, S1 runtime, workflow wiring, version or dependency change; `doc-reconciliation-events.js` untouched (it inherits the P1 binding through `validateSnapshot`). A added two `[Unreleased]` entries instead of one — trivial deviation from the packet's "topmost entry" wording, consistent with the repo's existing multi-entry `[Unreleased]` convention. | source-traced + executed (`git status`/`git diff --stat` read-only) |
35
+
36
+ ## Comparison of the two approaches
37
+
38
+ **A — static relevance surface.** Relevance = the derive contract's own path classes (governed/legacy
39
+ globs, derived output/source globs, `CODE_EXTENSION`, `TEST_PATH`) plus "the record opens a frontmatter
40
+ block"; anything else is omitted. Fail closed for everything else that cannot be decoded.
41
+
42
+ **B — derivation-probe relevance.** Relevance = the unchanged derivation changes its obligations when the
43
+ record's own bytes are probed under the actual, addition and deletion transitions; otherwise omit.
44
+
45
+ | | A | B |
46
+ |---|---|---|
47
+ | Packet clause "do not drop code/test/governed/derived inputs" | **satisfied** (executed: test path fails closed) | **deviates** on the test class (executed: test path silently omitted) |
48
+ | Candidate-side semantics of an undecodable record | caught (frontmatter rule) and, for classified paths, by path class | caught (actual-transition probe) |
49
+ | Duplication of the derive contract | **duplicates** `CODE_EXTENSION`, `TEST_PATH`, glob semantics (A's own risk #1) | none |
50
+ | Extra derivation passes per capture with binaries | 0 | up to 3 |
51
+ | Additional represented links closed | config bytes ↔ inventory; plan.configDigest ↔ identity.configDigest | none |
52
+ | Residual gap | the mirrored surface is not provably complete; a future derive-contract change can silently narrow it (maintenance risk, no current defect) | the witness is a synthetic lossy-text probe; it is not a proof about the true bytes of an undecodable file (documented in both reports) |
53
+ | Shipped coverage of the coordinator's defect class | **unpinned** — the `opensFrontmatter` branch is exercised by no shipped test (A's binary paths are `assets/logo.png`, `docs/prd/binary.md`, `docs/roadmap/index.md`, `src/app.js`, `tests/app.test.js`; none opens a frontmatter) | pinned by `R2h-P2:*` (frontmatter + REQ-citing test) |
54
+ | Diagnostic fidelity for malformed records | drifts to `inventory-unsupported` | preserves `invalid-input` |
55
+
56
+ ## Recommendation
57
+
58
+ **Take A**, optionally plus one small B-derived addition.
59
+
60
+ Reasons, in order of weight:
61
+
62
+ 1. **A satisfies the packet's explicit drop clause; B does not.** The only executed behavioural difference
63
+ is an undecodable REQ-test record: A fails closed, B omits it. The packet names test inputs explicitly,
64
+ so A's behaviour is the compliant one.
65
+ 2. **A closes two represented links B leaves open** (config source bytes ↔ captured inventory bytes;
66
+ plan `configDigest` ↔ identity `configDigest`). Both are in the same class the packet asked to be closed
67
+ coherently.
68
+ 3. **A is simpler and cheaper**: one shared conversion helper, no extra derivation passes, and a
69
+ readability advantage (explicit plan/host checks instead of digest-implied ones).
70
+ 4. A's weaknesses are maintenance-level (mirrored path rules, an unpinned heuristic branch, a diagnostic
71
+ drift), while B's weakness is a behavioural deviation from the written requirement.
72
+
73
+ Optional minimal combination, if the owner wants B's guarantee that the *candidate's own bytes* are always
74
+ consulted: keep A's static classification **and** add B's actual-transition witness as an additional
75
+ fail-closed trigger (the union). That closes A's "surface not provably complete" residual at the cost of
76
+ A's duplication plus B's extra derivation passes. It is **not** required for acceptance.
77
+
78
+ ## Non-blocking follow-ups for peer A (owner decides)
79
+
80
+ 1. **Pin the `opensFrontmatter` branch** with the coordinator's two transition shapes (a candidate record
81
+ whose bytes open a `role: prd` frontmatter at a path no glob classifies; a candidate record whose bytes
82
+ are a REQ-citing test). Today that branch carries the defect class and no shipped test reaches it.
83
+ 2. **Preserve the base diagnostic** for a malformed record: map only the explicitly coded
84
+ `inventory-unsupported` to itself and keep `invalid-input` for everything else (one line in the catch).
85
+ 3. **Guard the mirrored path rules** (optional): a check that fails when `doc-obligations.js`'s
86
+ `CODE_EXTENSION`/`TEST_PATH`/glob semantics change, so the duplication cannot silently narrow the
87
+ relevance surface; otherwise keep the drift risk recorded as A does.
88
+
89
+ ## Scope and limits of this review
90
+
91
+ - **Not executed**: A's and B's full S2a suites (the coordinator is running the common probes and the
92
+ swapped suites), `npm test`, `verify:all`, the mechanism runner; the Windows and Node 22 lanes.
93
+ - **Not assessed**: live-host provenance, S1 runtime behaviour, workflow wiring, E1 readiness — all outside
94
+ S2a. Every origin in these probes is the explicit test fake.
95
+ - **Inconclusive**: whether A's mirrored relevance surface is complete for every future derive-contract
96
+ change; and whether B's witness omission of a test input could ever coincide with an applicability
97
+ change not visible in the derived obligations (no such case was found in the eight probed shapes).
98
+ - No PR readiness is declared here; the owner decides.
99
+
100
+ STATUS: DONE
@@ -0,0 +1,47 @@
1
+ FAIL source:joint-workspaceId: event acceptance must reject corrupted identity
2
+ FAIL source:joint-sessionId: event acceptance must reject corrupted identity
3
+ FAIL source:joint-workflowId: event acceptance must reject corrupted identity
4
+ FAIL source:joint-workflowRevision: event acceptance must reject corrupted identity
5
+ FAIL source:joint-taskId: event acceptance must reject corrupted identity
6
+ FAIL source:joint-activeHost: event acceptance must reject corrupted identity
7
+ FAIL source:png-stays-hashed-and-reconciles: [{"code":"inventory-unsupported","message":"inventory unsupported"}]
8
+ + actual - expected
9
+
10
+ + 'unavailable'
11
+ - 'ready'
12
+
13
+ FAIL source:binary-only-is-legacy: Expected values to be strictly equal:
14
+ + actual - expected
15
+
16
+ + 'unavailable'
17
+ - 'ready'
18
+
19
+ PASS source:undecodable-relevant-src/invalid.js
20
+ PASS source:undecodable-relevant-tests/invalid.dat
21
+ PASS source:undecodable-relevant-docs/prd/invalid.md
22
+ PASS source:undecodable-relevant-docs/roadmap/index.md
23
+ PASS source:undecodable-derived-source
24
+ FAIL packaged:joint-workspaceId: event acceptance must reject corrupted identity
25
+ FAIL packaged:joint-sessionId: event acceptance must reject corrupted identity
26
+ FAIL packaged:joint-workflowId: event acceptance must reject corrupted identity
27
+ FAIL packaged:joint-workflowRevision: event acceptance must reject corrupted identity
28
+ FAIL packaged:joint-taskId: event acceptance must reject corrupted identity
29
+ FAIL packaged:joint-activeHost: event acceptance must reject corrupted identity
30
+ FAIL packaged:png-stays-hashed-and-reconciles: [{"code":"inventory-unsupported","message":"inventory unsupported"}]
31
+ + actual - expected
32
+
33
+ + 'unavailable'
34
+ - 'ready'
35
+
36
+ FAIL packaged:binary-only-is-legacy: Expected values to be strictly equal:
37
+ + actual - expected
38
+
39
+ + 'unavailable'
40
+ - 'ready'
41
+
42
+ PASS packaged:undecodable-relevant-src/invalid.js
43
+ PASS packaged:undecodable-relevant-tests/invalid.dat
44
+ PASS packaged:undecodable-relevant-docs/prd/invalid.md
45
+ PASS packaged:undecodable-relevant-docs/roadmap/index.md
46
+ PASS packaged:undecodable-derived-source
47
+ {"passed":10,"failed":16}
@@ -0,0 +1,85 @@
1
+ PASS snapshot:required-fields-present [source]
2
+ PASS snapshot:required-fields-present [packaged]
3
+ PASS snapshot:identity-tuple-types-and-digest-equalities [source]
4
+ PASS snapshot:identity-tuple-types-and-digest-equalities [packaged]
5
+ PASS snapshot:obligations-equal-unchanged-derive-api-on-captured-bytes [source]
6
+ PASS snapshot:obligations-equal-unchanged-derive-api-on-captured-bytes [packaged]
7
+ PASS snapshot:derivation-reasons-cover-every-obligation [source]
8
+ PASS snapshot:derivation-reasons-cover-every-obligation [packaged]
9
+ PASS A04:docs-prd-root-positive-produces-ready-snapshot [source]
10
+ PASS A04:docs-prd-root-positive-produces-ready-snapshot [packaged]
11
+ PASS A04:custom-prd-root-unavailable-with-no-fallback [source]
12
+ PASS A04:custom-prd-root-unavailable-with-no-fallback [packaged]
13
+ PASS A05:whole-candidate-identity-is-not-the-prd-set-digest [source]
14
+ PASS A05:whole-candidate-identity-is-not-the-prd-set-digest [packaged]
15
+ PASS A05:deletion-and-rename-endpoints-are-both-bound [source]
16
+ PASS A05:deletion-and-rename-endpoints-are-both-bound [packaged]
17
+ PASS A05:deleted-tombstones-omitted-from-checker-artifacts [source]
18
+ PASS A05:deleted-tombstones-omitted-from-checker-artifacts [packaged]
19
+ PASS A05:deleted-path-differs-from-empty-file-in-candidate-digest [source]
20
+ PASS A05:deleted-path-differs-from-empty-file-in-candidate-digest [packaged]
21
+ PASS framing:path-boundary-concatenation-does-not-collide [source]
22
+ PASS framing:path-boundary-concatenation-does-not-collide [packaged]
23
+ PASS framing:mode-drift-changes-candidate-digest [source]
24
+ PASS framing:mode-drift-changes-candidate-digest [packaged]
25
+ PASS A09:pinned-baseline-remains-after-fixture-commit [source]
26
+ PASS A09:pinned-baseline-remains-after-fixture-commit [packaged]
27
+ PASS A09:head-anchored-capture-has-a-different-baseline-identity [source]
28
+ PASS A09:head-anchored-capture-has-a-different-baseline-identity [packaged]
29
+ PASS A09:rename-endpoints-stable-across-repeated-captures [source]
30
+ PASS A09:rename-endpoints-stable-across-repeated-captures [packaged]
31
+ PASS R2d-P1:reference-only-provider-context-is-baseline-unavailable [source]
32
+ PASS R2d-P1:reference-only-provider-context-is-baseline-unavailable [packaged]
33
+ PASS R2d-P1:input-baseline-re-anchored-to-moved-head-is-never-ready [source]
34
+ PASS R2d-P1:input-baseline-re-anchored-to-moved-head-is-never-ready [packaged]
35
+ PASS R2d-P1:input-baseline-equal-to-the-provider-pin-stays-ready-after-head-moved [source]
36
+ PASS R2d-P1:input-baseline-equal-to-the-provider-pin-stays-ready-after-head-moved [packaged]
37
+ PASS R2d-P2a:nested-scope-policy-status-is-a-semantic-change [source]
38
+ PASS R2d-P2a:nested-scope-policy-status-is-a-semantic-change [packaged]
39
+ PASS R2d-P2a:nested-requirement-and-binding-semantics-change-the-digest [source]
40
+ PASS R2d-P2a:nested-requirement-and-binding-semantics-change-the-digest [packaged]
41
+ PASS A10:missing-baseline-commit-yields-baseline-unavailable [source]
42
+ PASS A10:missing-baseline-commit-yields-baseline-unavailable [packaged]
43
+ PASS A10:non-repository-baseline-root-yields-baseline-unavailable [source]
44
+ PASS A10:non-repository-baseline-root-yields-baseline-unavailable [packaged]
45
+ PASS A10:normal-git-capture-succeeds [source]
46
+ PASS A10:normal-git-capture-succeeds [packaged]
47
+ PASS A11:ignored-governed-path-included-or-unavailable-never-silent [source]
48
+ PASS A11:ignored-governed-path-included-or-unavailable-never-silent [packaged]
49
+ PASS A11:index-removed-ignored-file-included-or-unavailable [source]
50
+ PASS A11:index-removed-ignored-file-included-or-unavailable [packaged]
51
+ PASS A11:ignored-irrelevant-control-has-no-new-must-and-a-justified-exclusion [source]
52
+ PASS A11:ignored-irrelevant-control-has-no-new-must-and-a-justified-exclusion [packaged]
53
+ PASS A03:captured-resolution-equals-existing-resolver-project-config [source]
54
+ PASS A03:captured-resolution-equals-existing-resolver-project-config [packaged]
55
+ PASS A03:project-overrides-host-positive-equals-existing-resolver [source]
56
+ PASS A03:project-overrides-host-positive-equals-existing-resolver [packaged]
57
+ PASS A03:equal-host-positive-equals-existing-resolver [source]
58
+ PASS A03:equal-host-positive-equals-existing-resolver [packaged]
59
+ PASS A03:capture-binds-exact-config-bytes-and-selection [source]
60
+ PASS A03:capture-binds-exact-config-bytes-and-selection [packaged]
61
+ PASS A03:absent-project-config-yields-config-unavailable [source]
62
+ PASS A03:absent-project-config-yields-config-unavailable [packaged]
63
+ PASS purity:producer-capture-writes-nothing-spawns-only-git [source]
64
+ PASS purity:producer-capture-writes-nothing-spawns-only-git [packaged]
65
+ PASS R3-P2:unchanged-binary-asset-captures-without-changing-applicability [source]
66
+ PASS R3-P2:unchanged-binary-asset-captures-without-changing-applicability [packaged]
67
+ PASS R3-P2:changed-binary-asset-changes-the-candidate-digest-without-changing-applicability [source]
68
+ PASS R3-P2:changed-binary-asset-changes-the-candidate-digest-without-changing-applicability [packaged]
69
+ PASS R3-P2:undecodable-governed-document-record-fails-closed [source]
70
+ PASS R3-P2:undecodable-governed-document-record-fails-closed [packaged]
71
+ PASS R3-P2:undecodable-derived-output-record-fails-closed [source]
72
+ PASS R3-P2:undecodable-derived-output-record-fails-closed [packaged]
73
+ PASS R3-P2:undecodable-code-input-record-fails-closed [source]
74
+ PASS R3-P2:undecodable-code-input-record-fails-closed [packaged]
75
+ PASS R3-P2:undecodable-test-input-record-fails-closed [source]
76
+ PASS R3-P2:undecodable-test-input-record-fails-closed [packaged]
77
+ PASS R3-P2:undecodable-frontmatter-plain-fails-closed [source]
78
+ PASS R3-P2:undecodable-frontmatter-plain-fails-closed [packaged]
79
+ FAIL R3-P2:undecodable-frontmatter-bom-fails-closed [source] — undecodable frontmatter must not disappear from semantic inputs
80
+ FAIL R3-P2:undecodable-frontmatter-bom-fails-closed [packaged] — undecodable frontmatter must not disappear from semantic inputs
81
+
82
+ S2a producer summary: 78 PASS, 2 FAIL, 0 INFRA across 80 assertion-legs
83
+ FAIL reason classes:
84
+ 2 × undecodable frontmatter must not disappear from semantic inputs
85
+ S2a producer suite: assertion FAIL present (expected on the RED base; GREEN must clear every FAIL).
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+ const fs=require('fs'),path=require('path'),assert=require('assert/strict');
3
+ const root=path.resolve(process.argv[2]);
4
+ const H=require(path.join(root,'ci/fixtures/doc-obligations/reconciliation-s2a/harness.js'));
5
+ const binary=Buffer.from([0x89,0,0xff]);let passed=0,failed=0;
6
+ for(const leg of H.LEGS) for(const vector of ['frontmatter']) {
7
+ const P=require(path.join(leg.lib,'doc-reconciliation-producer.js'));
8
+ const files=H.vectorFiles('normative');const name=vector==='frontmatter'?'assets/role.dat':'tests/fixture.dat';
9
+ const repo=H.makeRepo({...files.base,[name]:binary});
10
+ try {
11
+ H.writeFiles(repo.root,files.candidate);
12
+ const content=vector==='frontmatter'?'---\nrole: prd\nid: PRD-GRPH-999\nrevision: 1\nstatus: draft\n---\n### REQ-GRPH-999\n\nThe binary candidate carries a requirement.\n\nAcceptance: evaluate this requirement.\n':'// REQ-GRPH-001\nit("requires the rule", () => { expect(true).toBe(true); });\n';
13
+ fs.writeFileSync(path.join(repo.root,name),Buffer.concat([Buffer.from('\ufeff'+content),binary]));
14
+ const provider=new H.FakeOrigin({context:H.fakeContext({},repo)});
15
+ const produced=P.produceDocSnapshot(H.producerInput(repo),{originProvider:provider});
16
+ if(produced.state==='ready') {
17
+ const obligations=produced.snapshot.obligations;
18
+ const relevant=vector==='frontmatter'?obligations.some(o=>o.strength==='MUST'&&o.applicability!=='N/A'&&o.scope.paths.includes(name)):obligations.some(o=>o.capability==='requirement-sync'&&o.applicability!=='N/A');
19
+ assert(relevant,'candidate semantic content was omitted after probing only baseline bytes');
20
+ }
21
+ passed++;console.log('PASS',leg.name,vector,produced.state);
22
+ } catch(e) { failed++; console.error('FAIL',leg.name,vector,e.message); }
23
+ finally{H.removeRepo(repo.root);}
24
+ }
25
+ console.log(JSON.stringify({passed,failed}));process.exitCode=failed?1:0;
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+ const assert = require('assert/strict');
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const root = path.resolve(process.argv[2]);
6
+ const H = require(path.join(root, 'ci/fixtures/doc-obligations/reconciliation-s2a/harness.js'));
7
+ let passed = 0, failed = 0;
8
+ function test(name, fn) { try { fn(); passed++; console.log('PASS ' + name); } catch (e) { failed++; console.error('FAIL ' + name + ': ' + e.message); } }
9
+ const binary = Buffer.from([0x89,0x50,0x4e,0x47,0,0xff,0x80]);
10
+ for (const leg of H.LEGS) {
11
+ const P = require(path.join(leg.lib, 'doc-reconciliation-producer.js'));
12
+ const E = require(path.join(leg.lib, 'doc-reconciliation-events.js'));
13
+ const C = require(path.join(leg.lib, 'doc-reconciliation-core.js'));
14
+ function setup(fn, extraBase = {}, key = 'normative') {
15
+ const files = H.vectorFiles(key), repo = H.makeRepo({...files.base,...extraBase});
16
+ try {
17
+ H.writeFiles(repo.root, files.candidate);
18
+ const origin = new H.FakeOrigin({context:H.fakeContext({},repo)});
19
+ const input = H.producerInput(repo);
20
+ const flow = () => {
21
+ const produced = P.produceDocSnapshot(input,{originProvider:origin});
22
+ if (produced.state !== 'ready') return {produced};
23
+ const snapshot=produced.snapshot, events=H.buildEvents(snapshot,repo,H.VECTORS.vectors[key]);
24
+ for(const [ref,event] of Object.entries(events)) origin.issueEvent(ref,event);
25
+ const accepted=E.acceptDocEvents({snapshot,eventRefs:Object.keys(events)},{originProvider:origin});
26
+ return {produced,snapshot,events,accepted,decision:C.checkAcceptedDocEvidence({snapshot,accepted})};
27
+ };
28
+ fn({repo,origin,input,flow});
29
+ } finally { H.removeRepo(repo.root); }
30
+ }
31
+ const label = s => leg.name + ':' + s;
32
+ for (const field of ['workspaceId','sessionId','workflowId','workflowRevision','taskId','activeHost']) {
33
+ test(label('joint-'+field),()=>setup(({origin,flow})=>{
34
+ const b=flow(); assert.equal(b.decision?.eligible,true,'positive control');
35
+ const snapshot=H.clone(b.snapshot);
36
+ const value=field==='workflowRevision'?snapshot.originContext[field]+1:field==='activeHost'?{hostId:'other-host'}:snapshot.originContext[field]+'-other';
37
+ snapshot.originContext[field]=value; origin.context[field]=value;
38
+ const accepted=E.acceptDocEvents({snapshot,eventRefs:Object.keys(b.events)},{originProvider:origin});
39
+ assert.notEqual(accepted.state,'ready','event acceptance must reject corrupted identity');
40
+ for(const mode of ['verification','review']) {
41
+ const fresh=C.checkAcceptedDocEvidence({snapshot,accepted,mode});
42
+ assert.equal(fresh.eligible,false,'fresh '+mode);
43
+ const cached=H.clone(b.accepted); cached.originContext=H.clone(snapshot.originContext);
44
+ const replay=C.checkAcceptedDocEvidence({snapshot,accepted:cached,mode});
45
+ assert.equal(replay.eligible,false,'cached '+mode);
46
+ }
47
+ }));
48
+ }
49
+ test(label('png-stays-hashed-and-reconciles'),()=>setup(({repo,flow})=>{
50
+ const first=flow();assert.equal(first.produced.state,'ready',JSON.stringify(first.produced.diagnostics));assert.equal(first.decision.eligible,true);
51
+ assert.deepEqual(Buffer.from(first.snapshot.candidate.records.find(x=>x.path==='assets/logo.png').storedBytes),binary);
52
+ fs.writeFileSync(path.join(repo.root,'assets/logo.png'),Buffer.concat([binary,Buffer.from([1])]));
53
+ const changed=flow();assert.equal(changed.produced.state,'ready');assert.equal(changed.decision.eligible,true);
54
+ assert.notEqual(changed.snapshot.identity.candidateDigest,first.snapshot.identity.candidateDigest);
55
+ assert.equal(changed.snapshot.identity.baselineDigest,first.snapshot.identity.baselineDigest);
56
+ assert.deepEqual(changed.snapshot.obligations,first.snapshot.obligations);
57
+ },{'assets/logo.png':binary}));
58
+ test(label('binary-only-is-legacy'),()=>setup(({repo,flow})=>{
59
+ fs.writeFileSync(path.join(repo.root,'assets/logo.png'),Buffer.concat([binary,Buffer.from([1])]));
60
+ const b=flow();assert.equal(b.produced.state,'ready');assert.equal(b.decision.decision,'legacy');assert.equal(b.decision.eligible,false);
61
+ },{'assets/logo.png':binary},'nondocument'));
62
+ for (const relevant of ['src/invalid.js','tests/invalid.dat','docs/prd/invalid.md','docs/roadmap/index.md']) {
63
+ test(label('undecodable-relevant-'+relevant),()=>setup(({repo,flow})=>{
64
+ fs.writeFileSync(path.join(repo.root,relevant),binary);
65
+ const b=flow();
66
+ if(b.produced.state==='ready') {
67
+ assert.equal(b.decision.eligible,false,'undecodable semantic input cannot silently earn complete credit');
68
+ if(relevant.startsWith('src/')) assert.equal(b.snapshot.facts.codeChanged,true,'changed binary source must retain code trigger');
69
+ }
70
+ },{[relevant]:'// REQ-GRPH-001\noriginal text\n'}));
71
+ }
72
+ test(label('undecodable-derived-source'),()=>setup(({repo,flow})=>{
73
+ const config=JSON.parse(fs.readFileSync(path.join(repo.root,H.CONFIG_REL),'utf8'));
74
+ config.derived[0].source='assets/logo.png';
75
+ fs.writeFileSync(path.join(repo.root,H.CONFIG_REL),JSON.stringify(config)+'\n');
76
+ fs.writeFileSync(path.join(repo.root,'assets/logo.png'),Buffer.concat([binary,Buffer.from([1])]));
77
+ const b=flow();
78
+ if(b.produced.state==='ready') {
79
+ assert.equal(b.snapshot.facts.derivedAffected,true,'changed derived binary input retains regeneration trigger');
80
+ assert(b.snapshot.obligations.some(o=>o.capability==='derived-regenerate' && o.applicability!=='N/A'),'derived binary source MUST survives');
81
+ }
82
+ },{'assets/logo.png':binary}));
83
+ }
84
+ console.log(JSON.stringify({passed,failed}));process.exitCode=failed?1:0;
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const Module = require('module');
5
+ const peerRoot = path.resolve(process.argv[2]);
6
+ const targetRoot = path.resolve(process.argv[3]);
7
+ const suite = process.argv[4];
8
+ const fixture = path.join(peerRoot,'ci/fixtures/doc-obligations/reconciliation-s2a/harness.js');
9
+ const H = require(fixture);
10
+ for (const leg of H.LEGS) {
11
+ leg.lib = path.join(targetRoot,path.relative(peerRoot,leg.lib));
12
+ leg.scripts = path.join(targetRoot,path.relative(peerRoot,leg.scripts));
13
+ }
14
+ const file = path.join(peerRoot,'ci',suite);
15
+ console.log('Peer tests:',file,'implementation:',targetRoot);
16
+ const m = new Module(file,module);
17
+ m.filename=file;m.paths=Module._nodeModulePaths(path.dirname(file));
18
+ m._compile(fs.readFileSync(file,'utf8'),file);
@@ -0,0 +1,3 @@
1
+ PASS source frontmatter unavailable
2
+ PASS packaged frontmatter unavailable
3
+ {"passed":2,"failed":0}
@@ -0,0 +1,198 @@
1
+ PASS A01:normative-complete-vector-eligible-with-exact-expected-set [source]
2
+ PASS A01:normative-complete-vector-eligible-with-exact-expected-set [packaged]
3
+ PASS A01:normative-checker-results-unchanged-from-direct-checker-call [source]
4
+ PASS A01:normative-checker-results-unchanged-from-direct-checker-call [packaged]
5
+ PASS A01:nonnormative-positive-is-eligible-and-review-not-forced [source]
6
+ PASS A01:nonnormative-positive-is-eligible-and-review-not-forced [packaged]
7
+ PASS A02:same-bytes-same-task-positive-control [source]
8
+ PASS A02:same-bytes-same-task-positive-control [packaged]
9
+ PASS A03:parse-A-then-replace-with-B-same-value-rejected [source]
10
+ PASS A03:parse-A-then-replace-with-B-same-value-rejected [packaged]
11
+ PASS A03:active-host-selection-change-rejected [source]
12
+ PASS A03:active-host-selection-change-rejected [packaged]
13
+ PASS A06:independent-review-eligible-in-review-mode-before-any-verifier [source]
14
+ PASS A06:independent-review-eligible-in-review-mode-before-any-verifier [packaged]
15
+ PASS A06:verification-stays-unresolved-with-review-only-evidence [source]
16
+ PASS A06:verification-stays-unresolved-with-review-only-evidence [packaged]
17
+ PASS A06:later-accepted-execution-makes-verification-retry-eligible [source]
18
+ PASS A06:later-accepted-execution-makes-verification-retry-eligible [packaged]
19
+ PASS A06:self-review-rejected-even-when-summary-claims-independence [source]
20
+ PASS A06:self-review-rejected-even-when-summary-claims-independence [packaged]
21
+ PASS A06:unknown-independent-provenance-rejected [source]
22
+ PASS A06:unknown-independent-provenance-rejected [packaged]
23
+ PASS A07:with-and-without-authored-doc-change-derive-the-same-musts [source]
24
+ PASS A07:with-and-without-authored-doc-change-derive-the-same-musts [packaged]
25
+ PASS A07:omit-one-result-quality-review-loses-eligibility-even-when-returned-results-pass [source]
26
+ PASS A07:omit-one-result-quality-review-loses-eligibility-even-when-returned-results-pass [packaged]
27
+ PASS A07:omit-all-results-loses-eligibility-even-when-returned-results-pass [source]
28
+ PASS A07:omit-all-results-loses-eligibility-even-when-returned-results-pass [packaged]
29
+ PASS A07:subset-results-only-lint-and-link-loses-eligibility-even-when-returned-results-pass [source]
30
+ PASS A07:subset-results-only-lint-and-link-loses-eligibility-even-when-returned-results-pass [packaged]
31
+ PASS A08:previously-nondocument-snapshot-is-legacy-never-verified [source]
32
+ PASS A08:previously-nondocument-snapshot-is-legacy-never-verified [packaged]
33
+ PASS A08:new-governed-scope-rejects-old-legacy-tuple-and-produces-current-musts [source]
34
+ PASS A08:new-governed-scope-rejects-old-legacy-tuple-and-produces-current-musts [packaged]
35
+ PASS A12:copied-journal-without-current-acceptance-rejected [source]
36
+ PASS A12:copied-journal-without-current-acceptance-rejected [packaged]
37
+ PASS A12:missing-origin-yields-origin-unavailable [source]
38
+ PASS A12:missing-origin-yields-origin-unavailable [packaged]
39
+ PASS A12:expired-origin-yields-origin-unavailable [source]
40
+ PASS A12:expired-origin-yields-origin-unavailable [packaged]
41
+ PASS A13:unknown-must-stays-unresolved [source]
42
+ PASS A13:unknown-must-stays-unresolved [packaged]
43
+ PASS A13:na-without-trusted-derivation-reason-is-unresolved [source]
44
+ PASS A13:na-without-trusted-derivation-reason-is-unresolved [packaged]
45
+ PASS A13:should-outcome-never-gates-a-complete-normative-vector [source]
46
+ PASS A13:should-outcome-never-gates-a-complete-normative-vector [packaged]
47
+ PASS R2d-P2b:rejected-should-never-gates-a-complete-must-set [source]
48
+ PASS R2d-P2b:rejected-should-never-gates-a-complete-must-set [packaged]
49
+ PASS R2d-P2b:rejected-na-obligation-event-never-gates-a-complete-must-set [source]
50
+ PASS R2d-P2b:rejected-na-obligation-event-never-gates-a-complete-must-set [packaged]
51
+ PASS R2d-P2b:rejected-applicable-must-still-blocks-eligibility [source]
52
+ PASS R2d-P2b:rejected-applicable-must-still-blocks-eligibility [packaged]
53
+ PASS R2e-P1:changed-provider-pin-commit-rejected-at-event-acceptance [source]
54
+ PASS R2e-P1:changed-provider-pin-commit-rejected-at-event-acceptance [packaged]
55
+ PASS R2e-P1:changed-provider-pin-root-rejected-at-event-acceptance [source]
56
+ PASS R2e-P1:changed-provider-pin-root-rejected-at-event-acceptance [packaged]
57
+ PASS R2e-P1:unchanged-provider-context-stays-eligible-control [source]
58
+ PASS R2e-P1:unchanged-provider-context-stays-eligible-control [packaged]
59
+ PASS R2f-P1:joint-origin-and-snapshot-pin-commit-tampering-rejected [source]
60
+ PASS R2f-P1:joint-origin-and-snapshot-pin-commit-tampering-rejected [packaged]
61
+ PASS R2f-P1:joint-origin-and-snapshot-pin-root-tampering-rejected [source]
62
+ PASS R2f-P1:joint-origin-and-snapshot-pin-root-tampering-rejected [packaged]
63
+ PASS R2f-P1:joint-origin-and-snapshot-pin-missing-pin-tampering-rejected [source]
64
+ PASS R2f-P1:joint-origin-and-snapshot-pin-missing-pin-tampering-rejected [packaged]
65
+ PASS R2f-P1:equivalent-provider-root-is-canonicalized-control [source]
66
+ PASS R2f-P1:equivalent-provider-root-is-canonicalized-control [packaged]
67
+ PASS R3-P1:joint-origin-and-identity-workspaceId-substitution-rejected [source]
68
+ PASS R3-P1:joint-origin-and-identity-workspaceId-substitution-rejected [packaged]
69
+ PASS R3-P1:joint-origin-and-identity-sessionId-substitution-rejected [source]
70
+ PASS R3-P1:joint-origin-and-identity-sessionId-substitution-rejected [packaged]
71
+ PASS R3-P1:joint-origin-and-identity-workflowId-substitution-rejected [source]
72
+ PASS R3-P1:joint-origin-and-identity-workflowId-substitution-rejected [packaged]
73
+ PASS R3-P1:joint-origin-and-identity-workflowRevision-substitution-rejected [source]
74
+ PASS R3-P1:joint-origin-and-identity-workflowRevision-substitution-rejected [packaged]
75
+ PASS R3-P1:joint-origin-and-identity-taskId-substitution-rejected [source]
76
+ PASS R3-P1:joint-origin-and-identity-taskId-substitution-rejected [packaged]
77
+ PASS R3-P1:joint-origin-and-active-host-substitution-rejected [source]
78
+ PASS R3-P1:joint-origin-and-active-host-substitution-rejected [packaged]
79
+ PASS R3-P1:joint-plan-and-identity-substitution-rejected [source]
80
+ PASS R3-P1:joint-plan-and-identity-substitution-rejected [packaged]
81
+ PASS R3-P1:unchanged-origin-identity-stays-eligible-control [source]
82
+ PASS R3-P1:unchanged-origin-identity-stays-eligible-control [packaged]
83
+ PASS R3-P1:config-capture-bytes-must-match-the-captured-inventory [source]
84
+ PASS R3-P1:config-capture-bytes-must-match-the-captured-inventory [packaged]
85
+ PASS R3-P2:irrelevant-binary-record-captures-and-reconciles [source]
86
+ PASS R3-P2:irrelevant-binary-record-captures-and-reconciles [packaged]
87
+ PASS R3-P2:core-fails-closed-on-a-relevant-undecodable-record [source]
88
+ PASS R3-P2:core-fails-closed-on-a-relevant-undecodable-record [packaged]
89
+ PASS A14:unchanged-repository-captures-identically [source]
90
+ PASS A14:unchanged-repository-captures-identically [packaged]
91
+ PASS A14:context-advancing-during-capture-rejected-as-snapshot-changed [source]
92
+ PASS A14:context-advancing-during-capture-rejected-as-snapshot-changed [packaged]
93
+ PASS A14:status-only-workflow-progress-does-not-stale-the-task-scope [source]
94
+ PASS A14:status-only-workflow-progress-does-not-stale-the-task-scope [packaged]
95
+ PASS flip:tuple-workspaceId [source]
96
+ PASS flip:tuple-workspaceId [packaged]
97
+ PASS flip:tuple-sessionId [source]
98
+ PASS flip:tuple-sessionId [packaged]
99
+ PASS flip:tuple-workflowId [source]
100
+ PASS flip:tuple-workflowId [packaged]
101
+ PASS flip:tuple-workflowRevision [source]
102
+ PASS flip:tuple-workflowRevision [packaged]
103
+ PASS flip:tuple-taskId [source]
104
+ PASS flip:tuple-taskId [packaged]
105
+ PASS flip:tuple-taskScopeDigest [source]
106
+ PASS flip:tuple-taskScopeDigest [packaged]
107
+ PASS flip:tuple-baselineDigest [source]
108
+ PASS flip:tuple-baselineDigest [packaged]
109
+ PASS flip:tuple-candidateDigest [source]
110
+ PASS flip:tuple-candidateDigest [packaged]
111
+ PASS flip:tuple-configDigest [source]
112
+ PASS flip:tuple-configDigest [packaged]
113
+ PASS flip:tuple-prdRoot [source]
114
+ PASS flip:tuple-prdRoot [packaged]
115
+ PASS flip:tuple-prdSetDigestSubstituted [source]
116
+ PASS flip:tuple-prdSetDigestSubstituted [packaged]
117
+ PASS flip:recapture-task-requirements-narrowed [source]
118
+ PASS flip:recapture-task-requirements-narrowed [packaged]
119
+ PASS flip:recapture-task-acceptance-changed [source]
120
+ PASS flip:recapture-task-acceptance-changed [packaged]
121
+ PASS flip:recapture-task-binding-changed [source]
122
+ PASS flip:recapture-task-binding-changed [packaged]
123
+ PASS flip:recapture-task-id-changed [source]
124
+ PASS flip:recapture-task-id-changed [packaged]
125
+ PASS flip:recapture-workflow-revision [source]
126
+ PASS flip:recapture-workflow-revision [packaged]
127
+ PASS flip:source-config-bytes [source]
128
+ PASS flip:source-config-bytes [packaged]
129
+ PASS flip:active-host-selection [source]
130
+ PASS flip:active-host-selection [packaged]
131
+ PASS flip:author-is-reviewer [source]
132
+ PASS flip:author-is-reviewer [packaged]
133
+ PASS flip:executor-is-reviewer [source]
134
+ PASS flip:executor-is-reviewer [packaged]
135
+ PASS flip:independence-unknown [source]
136
+ PASS flip:independence-unknown [packaged]
137
+ PASS flip:exit-null [source]
138
+ PASS flip:exit-null [packaged]
139
+ PASS flip:exit-noninteger [source]
140
+ PASS flip:exit-noninteger [packaged]
141
+ PASS flip:exit-nonzero [source]
142
+ PASS flip:exit-nonzero [packaged]
143
+ PASS flip:exit-signal [source]
144
+ PASS flip:exit-signal [packaged]
145
+ PASS flip:capability-unrelated-command [source]
146
+ PASS flip:capability-unrelated-command [packaged]
147
+ PASS flip:path-coverage-narrowed [source]
148
+ PASS flip:path-coverage-narrowed [packaged]
149
+ PASS flip:baseline-artifact-digest [source]
150
+ PASS flip:baseline-artifact-digest [packaged]
151
+ PASS flip:destination-digest-wrong [source]
152
+ PASS flip:destination-digest-wrong [packaged]
153
+ PASS flip:rename-other-tree-bytes [source]
154
+ PASS flip:rename-other-tree-bytes [packaged]
155
+ PASS flip:deleted-path-as-empty-file [source]
156
+ PASS flip:deleted-path-as-empty-file [packaged]
157
+ PASS flip:mode-drift [source]
158
+ PASS flip:mode-drift [packaged]
159
+ PASS flip:approve-verdict-rejected [source]
160
+ PASS flip:approve-verdict-rejected [packaged]
161
+ PASS flip:approve-summary-empty [source]
162
+ PASS flip:approve-summary-empty [packaged]
163
+ PASS flip:duplicate-event [source]
164
+ PASS flip:duplicate-event [packaged]
165
+ PASS flip:conflicting-event [source]
166
+ PASS flip:conflicting-event [packaged]
167
+ PASS flip:duplicate-result [source]
168
+ PASS flip:duplicate-result [packaged]
169
+ PASS flip:stale-review [source]
170
+ PASS flip:stale-review [packaged]
171
+ PASS flip:origin-expired [source]
172
+ PASS flip:origin-expired [packaged]
173
+ PASS flip:origin-missing [source]
174
+ PASS flip:origin-missing [packaged]
175
+ PASS flip:forged-copied-journal [source]
176
+ PASS flip:forged-copied-journal [packaged]
177
+ PASS flip:omitted-must [source]
178
+ PASS flip:omitted-must [packaged]
179
+ PASS regression:derive-and-checker-pins-normative [source]
180
+ PASS regression:derive-and-checker-pins-normative [packaged]
181
+ PASS regression:derive-and-checker-pins-nonnormative [source]
182
+ PASS regression:derive-and-checker-pins-nonnormative [packaged]
183
+ PASS regression:derive-and-checker-pins-code-only [source]
184
+ PASS regression:derive-and-checker-pins-code-only [packaged]
185
+ PASS regression:derive-and-checker-pins-nondocument [source]
186
+ PASS regression:derive-and-checker-pins-nondocument [packaged]
187
+ PASS regression:exported-signatures-unchanged [source]
188
+ PASS regression:exported-signatures-unchanged [packaged]
189
+ PASS purity:core-decisions-perform-no-io [source]
190
+ PASS purity:core-decisions-perform-no-io [packaged]
191
+ PASS parity:doc-reconciliation-producer.js-byte-identical [both]
192
+ PASS parity:doc-reconciliation-events.js-byte-identical [both]
193
+ PASS parity:doc-reconciliation-core.js-byte-identical [both]
194
+ PASS resolver:captured-export-and-copies-synchronized [source]
195
+ PASS resolver:captured-export-and-copies-synchronized [packaged]
196
+
197
+ S2a core summary: 195 PASS, 0 FAIL, 0 INFRA across 195 assertion-legs
198
+ S2a core suite: all assertions PASS.
@@ -0,0 +1,27 @@
1
+ PASS source:joint-workspaceId
2
+ PASS source:joint-sessionId
3
+ PASS source:joint-workflowId
4
+ PASS source:joint-workflowRevision
5
+ PASS source:joint-taskId
6
+ PASS source:joint-activeHost
7
+ PASS source:png-stays-hashed-and-reconciles
8
+ PASS source:binary-only-is-legacy
9
+ PASS source:undecodable-relevant-src/invalid.js
10
+ PASS source:undecodable-relevant-tests/invalid.dat
11
+ PASS source:undecodable-relevant-docs/prd/invalid.md
12
+ PASS source:undecodable-relevant-docs/roadmap/index.md
13
+ PASS source:undecodable-derived-source
14
+ PASS packaged:joint-workspaceId
15
+ PASS packaged:joint-sessionId
16
+ PASS packaged:joint-workflowId
17
+ PASS packaged:joint-workflowRevision
18
+ PASS packaged:joint-taskId
19
+ PASS packaged:joint-activeHost
20
+ PASS packaged:png-stays-hashed-and-reconciles
21
+ PASS packaged:binary-only-is-legacy
22
+ PASS packaged:undecodable-relevant-src/invalid.js
23
+ PASS packaged:undecodable-relevant-tests/invalid.dat
24
+ PASS packaged:undecodable-relevant-docs/prd/invalid.md
25
+ PASS packaged:undecodable-relevant-docs/roadmap/index.md
26
+ PASS packaged:undecodable-derived-source
27
+ {"passed":26,"failed":0}