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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +79 -63
- package/CHANGELOG.md +32 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/README.md +76 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/a-reviews-b.md +191 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/b-reviews-a.md +100 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/baseline-probes.log +47 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/bom-red.log +85 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/bom-transition.txt +25 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/coordinator-probes.txt +84 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/cross-suite.txt +18 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-bom.log +3 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-consistency.log.gz +0 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-core.log +198 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-probes.log +27 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-producer.log +83 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-review.md +89 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/final-transitions.log +5 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/implementation-a.md +166 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/implementation-b.md +264 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/logs.sha256 +15 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/peer-a-probe.log +62 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/peer-a-probe.txt +313 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/peer-b-probe.log +51 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/peer-b-probe.txt +94 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/semantic-transitions.txt +25 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/source.sha256 +9 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/tests-a-on-b-core.log +201 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/tests-a-on-b-producer.log +82 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/tests-b-on-a-core.log +197 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/tests-b-on-a-producer.log +82 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/verify-all.log.gz +0 -0
- package/benchmarks/results/reviews/pr353-r6-2026-10-22/verify-gate-summary.json +22 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2a/harness.js +489 -0
- package/ci/fixtures/doc-obligations/reconciliation-s2a/vectors.json +617 -0
- package/ci/mechanism-325-3b-s2a-core.test.js +840 -0
- package/ci/mechanism-325-3b-s2a-producer.test.js +564 -0
- package/code-review/SKILL.md +3 -3
- package/code-review/references/review-playbook.md +4 -0
- package/code-review/templates/finding.template.md +6 -0
- package/docs/doc-workflow-reconciliation.md +357 -0
- package/evals/zoom-out/tasks/negative-first-edge-case-review.yaml +16 -0
- package/evals/zoom-out/tasks/positive-repair-loop.yaml +15 -0
- package/harness-everything/SKILL.md +1 -1
- package/harness-everything/scripts/project-docs-resolver.js +42 -8
- package/harness-everything/scripts/routing-keywords.json +4 -0
- package/hooks/scripts/lib/doc-reconciliation-core.js +280 -0
- package/hooks/scripts/lib/doc-reconciliation-events.js +141 -0
- package/hooks/scripts/lib/doc-reconciliation-producer.js +206 -0
- package/multi-agent-workspace/SKILL.md +1 -1
- package/multi-agent-workspace/scripts/project-docs-resolver.js +42 -8
- package/opencode-plugin/plugin.json +1 -1
- package/package.json +2 -1
- package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-core.js +280 -0
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-events.js +141 -0
- package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-producer.js +206 -0
- package/plugins/harness-everything/plugin.json +1 -1
- package/plugins/harness-everything/skills/code-review/SKILL.md +3 -3
- package/plugins/harness-everything/skills/code-review/references/review-playbook.md +4 -0
- package/plugins/harness-everything/skills/code-review/templates/finding.template.md +6 -0
- package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
- package/plugins/harness-everything/skills/harness-everything/scripts/project-docs-resolver.js +42 -8
- package/plugins/harness-everything/skills/harness-everything/scripts/routing-keywords.json +4 -0
- package/plugins/harness-everything/skills/multi-agent-workspace/SKILL.md +1 -1
- package/plugins/harness-everything/skills/multi-agent-workspace/scripts/project-docs-resolver.js +42 -8
- package/plugins/harness-everything/skills/to-spec/SKILL.md +1 -1
- package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +42 -8
- package/plugins/harness-everything/skills/zoom-out/SKILL.md +4 -3
- package/plugins/harness-everything/skills/zoom-out/references/circuit-breaker.md +7 -0
- package/plugins/harness-everything/skills/zoom-out/templates/zoom-out-report.template.md +4 -2
- package/sbom.cdx.json +7 -7
- package/scripts/errors-sync.js +90 -0
- package/to-spec/SKILL.md +1 -1
- package/to-spec/scripts/project-docs-resolver.js +42 -8
- package/zoom-out/SKILL.md +4 -3
- package/zoom-out/references/circuit-breaker.md +7 -0
- 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,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}
|