harness-everything 0.36.2 → 0.36.4
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/CHANGELOG.md +17 -0
- package/ci/fixtures/doc-obligations/read-boundary/boundary-controls.json +211 -0
- package/ci/fixtures/doc-obligations/read-boundary/boundary-policy.json +325 -0
- package/ci/fixtures/doc-obligations/read-boundary/cases.json +14058 -0
- package/ci/fixtures/doc-obligations/read-boundary/expected.json +1 -0
- package/ci/fixtures/doc-obligations/read-boundary/identity-cases.json +119 -0
- package/ci/fixtures/doc-obligations/read-boundary/identity-expected.json +1 -0
- package/ci/fixtures/doc-obligations/read-boundary/scope-cases.json +208 -0
- package/ci/fixtures/doc-obligations/read-boundary/scope-expected.json +1 -0
- package/ci/fixtures/doc-obligations/reconciliation-prep/cases.json +2751 -0
- package/ci/fixtures/doc-obligations/reconciliation-prep/flood-entrypoint.js +5 -0
- package/ci/fixtures/doc-obligations/reconciliation-prep/hang-entrypoint.js +5 -0
- package/ci/fixtures/doc-obligations/reconciliation-prep/pending-red.json +648 -0
- package/ci/fixtures/doc-obligations/reconciliation-prep/provider-contract.json +100 -0
- package/ci/fixtures/doc-obligations/reconciliation-prep/trust-contract.json +188 -0
- package/ci/lib/doc-evidence-boundary-check.js +1240 -0
- package/ci/lib/doc-evidence-fixtures.js +459 -0
- package/ci/lib/doc-evidence-trace.js +171 -0
- package/ci/lib/doc-reconciliation-prep-fixtures.js +502 -0
- package/ci/lib/snapshot-stdin.js +27 -0
- package/ci/mechanism-2aw-project-docs-config.test.js +450 -10
- package/ci/mechanism-325-3b-preparation.test.js +382 -0
- package/ci/mechanism-341-boundary-enforcement.test.js +660 -0
- package/ci/mechanism-341-capture-module.test.js +357 -0
- package/ci/mechanism-341-mutation-runner.test.js +413 -0
- package/ci/mechanism-341-read-boundary.test.js +388 -0
- package/ci/mechanism-341-snapshot-stdin.test.js +40 -0
- package/ci/mutation-check.js +805 -45
- package/ci/mutation-loader.js +544 -57
- package/ci/prep/doc-reconciliation-red.js +407 -0
- package/ci/stress-341-boundary-control.js +85 -0
- package/docs/doc-evidence-baseline-binding.md +105 -19
- package/docs/doc-evidence-boundary.md +135 -0
- package/docs/doc-workflow-reconciliation.md +224 -0
- package/docs/document-lifecycle.md +67 -8
- package/harness-everything/SKILL.md +1 -1
- package/harness-everything/scripts/doc-evidence-capture.js +331 -0
- package/harness-everything/scripts/doc-evidence.js +72 -223
- package/harness-everything/scripts/project-docs-resolver.js +30 -13
- package/multi-agent-workspace/SKILL.md +1 -1
- package/multi-agent-workspace/scripts/project-docs-resolver.js +30 -13
- package/opencode-plugin/plugin.json +1 -1
- package/package.json +5 -3
- package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
- package/plugins/harness-everything/plugin.json +1 -1
- package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
- package/plugins/harness-everything/skills/harness-everything/scripts/doc-evidence-capture.js +331 -0
- package/plugins/harness-everything/skills/harness-everything/scripts/doc-evidence.js +72 -223
- package/plugins/harness-everything/skills/harness-everything/scripts/project-docs-resolver.js +30 -13
- 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 +30 -13
- package/plugins/harness-everything/skills/to-spec/SKILL.md +1 -1
- package/plugins/harness-everything/skills/to-spec/scripts/check-project-docs.js +136 -4
- package/plugins/harness-everything/skills/to-spec/scripts/project-docs-resolver.js +30 -13
- package/sbom.cdx.json +43 -7
- package/to-spec/SKILL.md +1 -1
- package/to-spec/scripts/check-project-docs.js +136 -4
- package/to-spec/scripts/project-docs-resolver.js +30 -13
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"kind": "doc-provider-preparation-contract",
|
|
4
|
+
"status": "design-only",
|
|
5
|
+
"runtimeImplemented": false,
|
|
6
|
+
"fixtureAlignment": {
|
|
7
|
+
"caseInventory": "ci/fixtures/doc-obligations/reconciliation-prep/cases.json",
|
|
8
|
+
"caseFamilies": ["P01", "P02", "P03", "P04", "P05", "P06", "P07", "P08"],
|
|
9
|
+
"caseIds": [
|
|
10
|
+
"P01", "P04", "P06", "P02a", "P02b", "P02c", "P02g", "P02d",
|
|
11
|
+
"P02e", "P02f", "P03", "P05", "P07-fable-staged", "P07-fable-parallel",
|
|
12
|
+
"P07-fable-multi-agent-workspace", "P07u"
|
|
13
|
+
],
|
|
14
|
+
"providerExamplesAreReplayCases": false,
|
|
15
|
+
"note": "Provider metadata examples describe the advisory interface only; the H2 replay cases do not invoke a production provider implementation. P08 is suite-level source/package parity, not a cases.json record."
|
|
16
|
+
},
|
|
17
|
+
"interface": "suggestDocProviders",
|
|
18
|
+
"input": {
|
|
19
|
+
"required": ["activeStep", "neededCapabilities", "availableProviderMetadata", "hostCapabilities"],
|
|
20
|
+
"fields": {
|
|
21
|
+
"activeStep": "object with nonempty id and stepType; the current authorized active step",
|
|
22
|
+
"neededCapabilities": "array of distinct capability strings applicable to this active step",
|
|
23
|
+
"availableProviderMetadata": "array of provider metadata objects; no skill content",
|
|
24
|
+
"hostCapabilities": "array of distinct supported host capability strings"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"providerMetadata": {
|
|
28
|
+
"required": ["providerId", "capabilities", "stepTypes", "requiresHostCapabilities", "locator"],
|
|
29
|
+
"fields": {
|
|
30
|
+
"providerId": "nonempty stable string",
|
|
31
|
+
"capabilities": "array of distinct declared document capability strings",
|
|
32
|
+
"stepTypes": "array of step types for which this metadata is relevant",
|
|
33
|
+
"requiresHostCapabilities": "array of host capability strings; empty means none",
|
|
34
|
+
"locator": "object with kind binding or tool and nonempty id; lookup only, never an executable command"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"output": {
|
|
38
|
+
"required": ["suggestions", "unavailable"],
|
|
39
|
+
"suggestionRequired": ["capability", "providerId", "availability", "reason"],
|
|
40
|
+
"unavailableRequired": ["capability", "reason"],
|
|
41
|
+
"availabilityValues": ["available", "unavailable", "unknown"],
|
|
42
|
+
"fieldTypes": {
|
|
43
|
+
"capability": "nonempty string",
|
|
44
|
+
"providerId": "nonempty string",
|
|
45
|
+
"availability": "one of availabilityValues",
|
|
46
|
+
"reason": "nonempty string"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"invariants": [
|
|
50
|
+
"Suggestions are optional candidates, never required bindings or authorization.",
|
|
51
|
+
"Expose only needed capabilities and provider metadata relevant to activeStep.",
|
|
52
|
+
"Do not read SKILL.md content, execute tools or generators, or expose future-step candidates.",
|
|
53
|
+
"Swapping or omitting candidates leaves expected obligations unchanged.",
|
|
54
|
+
"No suitable available provider retains an unavailable capability and reason; its MUST is not removed.",
|
|
55
|
+
"A chosen binding uses existing binding resolution and host authorization.",
|
|
56
|
+
"Independent qualifying evidence can satisfy a MUST without a suggested provider.",
|
|
57
|
+
"Examples specify planned behavior only; no production provider implementation is shipped."
|
|
58
|
+
],
|
|
59
|
+
"examples": [
|
|
60
|
+
{
|
|
61
|
+
"id": "active-verification-alternative-providers",
|
|
62
|
+
"input": {
|
|
63
|
+
"activeStep": { "id": "verify-docs", "stepType": "verification" },
|
|
64
|
+
"neededCapabilities": ["doc-lint"],
|
|
65
|
+
"availableProviderMetadata": [
|
|
66
|
+
{ "providerId": "fixture-lint-a", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": ["execution-events"], "locator": { "kind": "tool", "id": "fixture-lint-a" } },
|
|
67
|
+
{ "providerId": "fixture-lint-b", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": ["execution-events"], "locator": { "kind": "tool", "id": "fixture-lint-b" } },
|
|
68
|
+
{ "providerId": "fixture-future-outline", "capabilities": ["outline-confirmation"], "stepTypes": ["doc-change"], "requiresHostCapabilities": [], "locator": { "kind": "binding", "id": "to-spec" } }
|
|
69
|
+
],
|
|
70
|
+
"hostCapabilities": ["execution-events"]
|
|
71
|
+
},
|
|
72
|
+
"expected": {
|
|
73
|
+
"suggestions": [
|
|
74
|
+
{ "capability": "doc-lint", "providerId": "fixture-lint-a", "availability": "available", "reason": "active-step capability and host requirements match" },
|
|
75
|
+
{ "capability": "doc-lint", "providerId": "fixture-lint-b", "availability": "available", "reason": "active-step capability and host requirements match" }
|
|
76
|
+
],
|
|
77
|
+
"unavailable": []
|
|
78
|
+
},
|
|
79
|
+
"comparison": "Compare candidate sets; this contract does not impose provider ranking. Reasons are explanatory, not authorization tokens."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": "provider-omitted",
|
|
83
|
+
"input": { "activeStep": { "id": "verify-docs", "stepType": "verification" }, "neededCapabilities": ["doc-lint"], "availableProviderMetadata": [], "hostCapabilities": [] },
|
|
84
|
+
"expected": { "suggestions": [], "unavailable": [{ "capability": "doc-lint", "reason": "no available provider metadata for the active-step capability" }] }
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "host-capability-unavailable",
|
|
88
|
+
"input": {
|
|
89
|
+
"activeStep": { "id": "verify-docs", "stepType": "verification" },
|
|
90
|
+
"neededCapabilities": ["quality-review"],
|
|
91
|
+
"availableProviderMetadata": [{ "providerId": "fixture-review", "capabilities": ["quality-review"], "stepTypes": ["verification"], "requiresHostCapabilities": ["independent-review-events"], "locator": { "kind": "tool", "id": "fixture-review" } }],
|
|
92
|
+
"hostCapabilities": []
|
|
93
|
+
},
|
|
94
|
+
"expected": {
|
|
95
|
+
"suggestions": [{ "capability": "quality-review", "providerId": "fixture-review", "availability": "unavailable", "reason": "host lacks independent-review-events" }],
|
|
96
|
+
"unavailable": [{ "capability": "quality-review", "reason": "host lacks independent-review-events" }]
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"kind": "doc-trust-preparation-contract",
|
|
4
|
+
"status": "design-only",
|
|
5
|
+
"runtimeImplemented": false,
|
|
6
|
+
"provenance": "simulated-fixture-only",
|
|
7
|
+
"baselineSha": "dba470813cb383945d405686cc6a65bd969b57ec",
|
|
8
|
+
"pilotSwitch": { "name": "HARNESS_DOC_RECONCILIATION_PILOT", "enabledValue": "1", "default": "off", "otherValues": "off", "productionReaderShipped": false },
|
|
9
|
+
"identityContract": {
|
|
10
|
+
"required": ["workspaceId", "sessionId", "workflowId", "workflowRevision", "taskId", "taskScopeDigest", "baselineDigest", "candidateDigest", "configDigest", "prdRoot"],
|
|
11
|
+
"fieldTypes": {
|
|
12
|
+
"workspaceId": "nonempty string established from host workspace identity",
|
|
13
|
+
"sessionId": "nonempty string correlated to host session",
|
|
14
|
+
"workflowId": "nonempty string from persisted workflow",
|
|
15
|
+
"workflowRevision": "nonnegative integer from persisted workflow",
|
|
16
|
+
"taskId": "nonempty string identifying active task",
|
|
17
|
+
"taskScopeDigest": "nonempty digest of effective task scope and relevant plan/diff coverage",
|
|
18
|
+
"baselineDigest": "nonempty whole-baseline identity from recorded baseline tree",
|
|
19
|
+
"candidateDigest": "nonempty whole-candidate identity including complete changed/new/deleted path inventory",
|
|
20
|
+
"configDigest": "nonempty digest bound to exact selected config bytes parsed and validated",
|
|
21
|
+
"prdRoot": "repo-relative PRD root; docs/prd/ is the current supported envelope root"
|
|
22
|
+
},
|
|
23
|
+
"comparison": "Every field must match current independently established context at verification and completion. A fixture-provided value is not production attestation."
|
|
24
|
+
},
|
|
25
|
+
"producerContract": {
|
|
26
|
+
"required": ["producerId", "originRef", "identity", "inventoryComplete", "baselineTreeRef", "candidateTreeRef", "configSources", "authorPrincipalId"],
|
|
27
|
+
"origin": "Host/VCS-derived or independently verified export; no trusted boolean or JSON field can establish this origin.",
|
|
28
|
+
"storedBytes": "Whole-baseline and baseline path SHA256 values originate from the same recorded tree. Candidate export includes untracked/new, modified, deleted and rename paths using repository-stored byte semantics.",
|
|
29
|
+
"configSources": "Nonempty array of selected source path/byte-digest pairs and active-host selection where relevant, correlated to validated parsed config.",
|
|
30
|
+
"unsupported": "Missing/ambiguous origin, incomplete inventory or unsupported custom PRD root yields unknown/unavailable, never PASS."
|
|
31
|
+
},
|
|
32
|
+
"eventContract": {
|
|
33
|
+
"commonRequired": ["eventId", "kind", "producerId", "originRef", "identity", "principalId", "paths", "provenance"],
|
|
34
|
+
"kindValues": ["execution", "verification", "review"],
|
|
35
|
+
"executionRequired": ["command", "exitCode"],
|
|
36
|
+
"reviewRequired": ["verdict", "summary", "reviewedArtifactDigests", "independentOf"],
|
|
37
|
+
"rules": [
|
|
38
|
+
"originRef must resolve through host correlation or independently verified external evidence; prose alone is not origin.",
|
|
39
|
+
"identity has every identityContract field; paths cover the claimed obligation scope.",
|
|
40
|
+
"command and provenance are nonempty strings; exitCode is an integer.",
|
|
41
|
+
"Review approval needs approve verdict, nonempty summary and artifact binding.",
|
|
42
|
+
"Reviewer independence is established by the host, distinct from author and relevant executors; independentOf strings alone are not proof.",
|
|
43
|
+
"Replayed, contradictory, failed, stale or self-reviewed evidence cannot produce credit."
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
"pilotReportContract": {
|
|
47
|
+
"status": "planned-after-E0",
|
|
48
|
+
"required": ["schemaVersion", "pilotStatus", "pilotCredit", "identity", "expectedMustIds", "results", "unsatisfied", "diagnostics"],
|
|
49
|
+
"pilotStatusValues": ["disabled", "unavailable", "unresolved", "verified"],
|
|
50
|
+
"unsatisfiedItemRequired": ["obligationId", "state", "reasonCode"],
|
|
51
|
+
"unsatisfiedStateValues": ["pending", "unknown", "unavailable", "failed"],
|
|
52
|
+
"observationValues": ["observed", "not-observed", "unavailable", "unresolved"],
|
|
53
|
+
"outcomeValues": ["pass", "fail", "none"],
|
|
54
|
+
"creditRule": "Only current producer-bound observed+pass evidence for every expected applicable MUST can earn pilotCredit after E0 integration. Unknown applicability stays unresolved. N/A needs a derivation reason. SHOULD reminders never become gates.",
|
|
55
|
+
"checkerCompatibility": "results contain unchanged checker result objects. This report does not extend or replace checkDocObligations output. identity is null when unavailable; unsupported/disabled state never earns credit."
|
|
56
|
+
},
|
|
57
|
+
"caseContract": {
|
|
58
|
+
"required": ["id", "family", "description", "topology", "requirements", "input", "actions", "expectations"],
|
|
59
|
+
"familyValues": ["P01", "P02", "P03", "P04", "P05", "P06", "P07", "P08"],
|
|
60
|
+
"caseIds": [
|
|
61
|
+
"P01", "P04", "P06", "P02a", "P02b", "P02c", "P02g", "P02d",
|
|
62
|
+
"P02e", "P02f", "P03", "P05", "P07-fable-staged", "P07-fable-parallel",
|
|
63
|
+
"P07-fable-multi-agent-workspace", "P07u"
|
|
64
|
+
],
|
|
65
|
+
"caseIdNote": "P08 is the suite-level source/package parity check across replay cases, not a standalone cases.json record.",
|
|
66
|
+
"topologyValues": ["direct-single", "iterative-single", "fable-staged", "fable-parallel", "fable-multi-agent-workspace", "untyped"],
|
|
67
|
+
"fieldTypes": {
|
|
68
|
+
"id": "unique nonempty stable case string; expanded variants have distinct IDs",
|
|
69
|
+
"family": "one familyValues item",
|
|
70
|
+
"description": "nonempty string",
|
|
71
|
+
"topology": "one topologyValues item; untyped is a fixture classification, not a new runtime strategy",
|
|
72
|
+
"requirements": "array of existing plan requirement objects; empty only for declared untyped/empty-plan compatibility cases",
|
|
73
|
+
"input": "object with baseFiles, candidateFiles, config, task and hostEvents",
|
|
74
|
+
"actions": "ordered action objects with unique id, op and payload",
|
|
75
|
+
"expectations": "object with on and off assertion arrays"
|
|
76
|
+
},
|
|
77
|
+
"inputFields": {
|
|
78
|
+
"baseFiles": "map of repo-relative paths to stored UTF-8 fixture text",
|
|
79
|
+
"candidateFiles": "map of repo-relative paths to stored UTF-8 fixture text; omission represents deletion",
|
|
80
|
+
"config": "project-docs config value; declared negative variants may be invalid",
|
|
81
|
+
"task": "object containing identity and producer fixture data; declared negatives may omit/substitute fields",
|
|
82
|
+
"hostEvents": "array of eventContract recipes; simulated only, including declared malformed/untrusted variants"
|
|
83
|
+
},
|
|
84
|
+
"actionOpValues": ["route", "plan", "start", "binding", "step", "obligation", "stop", "provideEvidence", "mutateIdentity", "timestampHints"],
|
|
85
|
+
"actionRules": "CLI actions use existing argument/payload shapes; provideEvidence and mutateIdentity are test-only fixture operations. No new runtime command or strategy is added."
|
|
86
|
+
},
|
|
87
|
+
"replayReportContract": {
|
|
88
|
+
"required": ["actions", "state", "pilot", "pilotReportOrigin"],
|
|
89
|
+
"fields": {
|
|
90
|
+
"actions": "object keyed by action.id; values contain exitCode, signal, stdout, stderr, json and state",
|
|
91
|
+
"state": "final snapshot object with workflow, obligations and handoff keys; each is the parsed persisted file or null if absent",
|
|
92
|
+
"pilot": "captured actual runtime pilot report, or null when no runtime report exists; never substitute desired output",
|
|
93
|
+
"pilotReportOrigin": "runtime when pilot was actually emitted; harness when null/missing-feature status was synthesized by the test"
|
|
94
|
+
},
|
|
95
|
+
"actionResultFields": {
|
|
96
|
+
"exitCode": "integer process exit code, or null for signal/failure to launch; fixture-only actions use 0 after successful execution",
|
|
97
|
+
"signal": "process signal string or null",
|
|
98
|
+
"stdout": "complete captured string",
|
|
99
|
+
"stderr": "complete captured string",
|
|
100
|
+
"json": "parsed command JSON output when present and valid, otherwise null; expected JSON parse failure is infrastructure failure",
|
|
101
|
+
"state": "snapshot immediately after this action, using the same workflow/obligations/handoff keys as final state"
|
|
102
|
+
},
|
|
103
|
+
"exampleAssertionPath": ["actions", "try-aggregate-verify", "exitCode"],
|
|
104
|
+
"rules": "Absent files are null; a missing property remains absent. Do not normalize away command failures or turn caught exceptions into successful fixture actions. Runtime state is observed evidence of legacy behavior, not trusted document provenance."
|
|
105
|
+
},
|
|
106
|
+
"assertionContract": {
|
|
107
|
+
"required": ["id", "path", "operator", "expected"],
|
|
108
|
+
"operatorValues": ["equals", "notEquals", "includes", "absent"],
|
|
109
|
+
"operatorsUsedByCurrentCases": ["equals", "notEquals", "includes"],
|
|
110
|
+
"fieldTypes": {
|
|
111
|
+
"id": "stable nonempty assertion ID unique within case/mode",
|
|
112
|
+
"path": "array of string keys or nonnegative integer indices into the captured replay report, avoiding ambiguous dotted paths",
|
|
113
|
+
"operator": "equals/notEquals compare complete values; includes checks an expected array item/string segment; absent checks own-key absence",
|
|
114
|
+
"expected": "explicit JSON value; null is required as the unused expected placeholder for absent"
|
|
115
|
+
},
|
|
116
|
+
"rules": "Replay captures actions by ID, complete persisted state, output/diagnostics and reportOrigin. Missing required report data is an explicit assertion gap, never a fabricated runtime report."
|
|
117
|
+
},
|
|
118
|
+
"pendingRedContract": {
|
|
119
|
+
"registryRootRecorded": ["schemaVersion", "phase", "baselineSha", "runtimeFingerprint", "entries"],
|
|
120
|
+
"registryRootValidated": ["schemaVersion", "baselineSha", "runtimeFingerprint", "entries"],
|
|
121
|
+
"baselineShaSemantics": "40-hex capture commit copied to every entry for provenance and internal consistency; it is not compared with the current checkout and does not qualify a gap.",
|
|
122
|
+
"runtimeFingerprintContract": {
|
|
123
|
+
"format": "64 lowercase hexadecimal SHA-256",
|
|
124
|
+
"scope": "Exact bytes of the ordered FINGERPRINT_FILES list in ci/prep/doc-reconciliation-red.js.",
|
|
125
|
+
"currentFiles": [
|
|
126
|
+
"hooks/scripts/lib/workflow-obligations.js",
|
|
127
|
+
"hooks/scripts/workflow-disposition.js",
|
|
128
|
+
"hooks/scripts/workflow-stop-gate.js"
|
|
129
|
+
],
|
|
130
|
+
"algorithm": "For each listed relative path in order, hash the path, a NUL byte, the exact file bytes, and a NUL byte.",
|
|
131
|
+
"qualification": "The registry runtimeFingerprint must equal the runner's current fingerprint. A mismatch fails qualification; no registry values are accepted automatically."
|
|
132
|
+
},
|
|
133
|
+
"entryRequired": ["caseId", "assertionId", "distribution", "baselineSha", "actual", "desired", "blocker", "reasonCode"],
|
|
134
|
+
"entryExactKeys": true,
|
|
135
|
+
"assertionIdFormat": "<caseId>.on.<expectation-id> and must name an ON assertion in the corresponding case",
|
|
136
|
+
"recapture": {
|
|
137
|
+
"command": "node ci/prep/doc-reconciliation-red.js --recapture-candidate ci/fixtures/doc-obligations/reconciliation-prep/pending-red.candidate.json --baseline-sha <40-hex-commit>",
|
|
138
|
+
"review": "The runner writes a separate candidate. Review entries and reason codes before replacing pending-red.json, then delete the candidate; there is no auto-accept."
|
|
139
|
+
},
|
|
140
|
+
"distributionValues": ["source", "packaged"],
|
|
141
|
+
"blocker": "#341 E0",
|
|
142
|
+
"qualification": "Only an executed assertion mismatch at the exact case/assertion/distribution and pinned baseline, with matching actual and desired values, qualifies. Missing actual values use an explicit absent marker, not JSON undefined.",
|
|
143
|
+
"absentMarker": { "kind": "absent" },
|
|
144
|
+
"reject": ["unexpected pass", "unrelated assertion", "uncaught process error", "signal or timeout", "import or syntax error", "missing fixture", "wrong distribution", "unreviewed baseline drift"],
|
|
145
|
+
"rule": "A registry entry is test-only expected RED, never workflow state, evidence credit or a mutation kill."
|
|
146
|
+
},
|
|
147
|
+
"preparationReportContract": {
|
|
148
|
+
"required": ["schemaVersion", "mode", "baselineSha", "runtimeFingerprintMatches", "pilotCredit", "cases"],
|
|
149
|
+
"modeValues": ["strict", "expect-red"],
|
|
150
|
+
"caseRequired": ["caseId", "status", "qualifiedGaps", "parity", "assertions"],
|
|
151
|
+
"caseOptional": ["reason"],
|
|
152
|
+
"statusValues": ["EXPECTED_RED", "CONTROL_PASS", "FAIL"],
|
|
153
|
+
"assertionRequired": ["leg", "mode", "id", "status", "actual"],
|
|
154
|
+
"legValues": ["source", "packaged"],
|
|
155
|
+
"assertionModeValues": ["off", "on"],
|
|
156
|
+
"assertionStatusValues": ["pass", "control-fail", "unexpected-pass", "gap-unqualified", "gap-qualified", "gap-mismatch"],
|
|
157
|
+
"assertionOptional": ["desired", "registered"],
|
|
158
|
+
"pilotCredit": false,
|
|
159
|
+
"rules": [
|
|
160
|
+
"Preparation pilotCredit is always false, even when a future expected value requests true.",
|
|
161
|
+
"runtimeFingerprintMatches reports whether the registry fingerprint equals the current ordered shared-runtime fingerprint.",
|
|
162
|
+
"strict exits nonzero on any unsatisfied desired-contract assertion; known mismatches are FAIL without exemption.",
|
|
163
|
+
"expect-red qualifies only exact registry gaps and requires every control to pass; no blanket nonzero-exit acceptance.",
|
|
164
|
+
"Unexpected PASS, infrastructure failure or missing coverage fails qualification.",
|
|
165
|
+
"Infrastructure or registry errors exit 2 and do not become case or assertion report statuses.",
|
|
166
|
+
"Each mode and source/package leg receives fresh fixture workspace/session data."
|
|
167
|
+
]
|
|
168
|
+
},
|
|
169
|
+
"examples": [
|
|
170
|
+
{
|
|
171
|
+
"id": "simulated-identity-only",
|
|
172
|
+
"provenance": "simulated-fixture-only",
|
|
173
|
+
"identity": {
|
|
174
|
+
"workspaceId": "fixture-workspace-a",
|
|
175
|
+
"sessionId": "fixture-session-a",
|
|
176
|
+
"workflowId": "fixture-workflow-a",
|
|
177
|
+
"workflowRevision": 1,
|
|
178
|
+
"taskId": "fixture-task-a",
|
|
179
|
+
"taskScopeDigest": "fixture-scope-a",
|
|
180
|
+
"baselineDigest": "fixture-baseline-a",
|
|
181
|
+
"candidateDigest": "fixture-candidate-a",
|
|
182
|
+
"configDigest": "fixture-config-a",
|
|
183
|
+
"prdRoot": "docs/prd/"
|
|
184
|
+
},
|
|
185
|
+
"note": "Opaque fixture tokens demonstrate field equality only. Real producers must derive identities and bare per-path SHA256 values from the prescribed origins."
|
|
186
|
+
}
|
|
187
|
+
]
|
|
188
|
+
}
|