Add deduplicated WBV2 inventory coverage workflow
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

This commit is contained in:
mes123456
2026-08-28 10:12:29 +08:00
parent ea18416ff2
commit dc55bacce6
39 changed files with 72823 additions and 78 deletions

View File

@@ -13,9 +13,9 @@
| 字段 | 值 |
| --- | --- |
| 里程碑 | WBV2 capability workflow |
| 当前任务 | `WBV2-P13-005` |
| parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |
| 任务卡 | [`tasks/WBV2-P13-005.md`](tasks/WBV2-P13-005.md) |
| 当前任务 | `WBV2-P14-003` |
| parent manifest | `tests/golden/WBV2-P14-002/manifest.json` |
| 任务卡 | [`tasks/WBV2-P14-003.md`](tasks/WBV2-P14-003.md) |
| 专项验收 | `node tools/web/check-execution-control-plane.mjs` |
| legacy coverage checkpoint | `M16-GAP-00282` |
| legacy coverage parent | `tests/golden/M16-GAP-00281/manifest.json` |

View File

@@ -9,3 +9,6 @@
- nextTask: `NONE`
The high-value gate reuses the batch ledger and hash-bound receipts. Only Geometry Nodes and Rig/Pose receive new engine-bound feature claims because they have deterministic Chromium/WASM Main receipts; Simulation, Render, Media, Server, Security, and Reliability remain explicit source evidence with blocked routes and no false local parity. The 6900-entry remainder and provenance limitation remain visible.
- authorized continuation: `WBV2-P14-000`
Inventory coverage may continue under a new root without changing the high-value claim boundary.

View File

@@ -0,0 +1,8 @@
# WBV2-P14-000 status
- task: `WBV2-P14-000`; parent: `WBV2-P13-005`; status: `done`
- inventory scope: `6900` total, `6618` pending
- capability buckets: `15`; duplicate validation: `forbidden`
- nextTask: `WBV2-P14-001`
P14 is an authorized coverage continuation. It preserves the P13 high-value declaration and starts with a capability-family ledger so one representative receipt can be reused without claiming the entire family is complete.

View File

@@ -0,0 +1,11 @@
# WBV2-P14-001 status
- task: `WBV2-P14-001`; parent: `WBV2-P14-000`; status: `done`
- inventory streamed: `6900` entries across `15` capability buckets
- state: `281 completed`, `1 active`, `6618 pending`
- representative-evidence buckets: `7`; unproven buckets: `8`
- repeated Blender/Chromium validation: `0`; duplicate validation avoided: `true`
- entry digest: `06debe05e086868dcad99980a04161f71172df23a27e36e14670da94af3db516`
- nextTask: `WBV2-P14-002`
The full inventory is streamed once and grouped by capability family. Existing P13 receipts are attached only as representative slices; no bucket is promoted to complete parity unless every entry has independent evidence. The 6618-entry remainder remains explicit.

View File

@@ -0,0 +1,10 @@
# WBV2-P14-002 status
- task: `WBV2-P14-002`; parent: `WBV2-P14-001`; status: `done`
- capability buckets reconciled: `15`; inventory: `6900` total, `6618` pending
- representative-evidence buckets: `7`; unproven pending buckets: `7`; active unproven: `1`
- engine-bound claims referenced: `8`; full-family parity claims: `0`
- repeated Blender/Chromium validation: `0`; duplicate validation avoided: `true`
- nextTask: `WBV2-P14-003`
This matrix binds the P14 coverage ledger to the eight P13 feature claims. Representative receipts remain partial slices; a capability family is not complete until each entry has its own evidence.

View File

@@ -0,0 +1,10 @@
# WBV2-P14-003 status
- task: `WBV2-P14-003`; parent: `WBV2-P14-002`; status: `done`
- inventory accounted: `6900/6900`; pending remains `6618`; active: `1`
- capability batches: `15`; representative-evidence buckets: `7`; full-family parity claims: `0`
- engine-bound feature claims retained: `8`; provenance epoch: `2`
- minimum new runs under batch policy: `14`; repeated Blender/Chromium runs: `0`
- nextTask: `NONE`
The coverage gate closes the 6900-entry accounting problem without pretending that inventory metadata is feature parity. Each family has one deduplicated batch key; completed entries are regression-only, representative receipts are partial, and pending entries require unique-behavior fanout. Historical reproduction remains false and the release label stays AUTHORIZED_REBASELINE_ONLY.

View File

@@ -0,0 +1,24 @@
# WBV2-P14-000: inventory coverage continuation root
- task: WBV2-P14-000
- parent: WBV2-P13-005
- status: done
- gap: workflow:authorize_inventory_coverage_continuation
- ownerFamily: PROGRAM
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Authorize a machine-readable continuation for the 6900-entry inventory. P14 first groups entries by capability family and reuses hash-bound evidence; it does not reopen completed Blender or Chromium receipts.
## 验收
- `node tools/web/generate-wbv2-coverage-root.mjs`
- `node tools/web/check-execution-control-plane.mjs`
- `node tools/web/check-v2-task-index.mjs`
## 交付与回滚
- Reports: `tests/golden/WBV2-P14-000/`
- Manifest: `tests/golden/WBV2-P14-000/manifest.json`
- Rollback: restore P13-005 as queue parent without changing P13 evidence.

View File

@@ -0,0 +1,34 @@
# WBV2-P14-001: generate_inventory_coverage_ledger
- task: WBV2-P14-001
- parent: WBV2-P14-000
- status: in_progress
- gap: workflow:generate_inventory_coverage_ledger
- ownerFamily: PARITY
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Cluster all 6900 inventory entries by capability and bind representative evidence without repeated Blender or Chromium execution.
## 输入与范围
- Focused input: `tests/golden/WBV2-P14-000/coverage-root-report.json`
- Full inventory source (streamed by generator): `tests/golden/WBV2-P0-002/parity-map.json`
- Parent evidence: `tests/golden/WBV2-P14-000/manifest.json`
- Production entrypoint: `node tools/web/generate-wbv2-coverage-ledger.mjs --write`
## 验收
- all 6900 entries remain accounted for
- hash-bound evidence is reused before any new execution
- malformed, hash-drift, unsupported, or false-completion input keeps in_progress
- `node tools/web/generate-wbv2-coverage-ledger.mjs --write`
- `node tools/web/check-task-context.mjs --task WBV2-P14-001 --write`
## 交付与回滚
- Reports: `tests/golden/WBV2-P14-001/`
- Status: `docs/status/WBV2-P14-001.md`
- Manifest: `tests/golden/WBV2-P14-001/manifest.json`
- Rollback: restore WBV2-P14-000 as queue parent.

View File

@@ -0,0 +1,34 @@
# WBV2-P14-002: reconcile_capability_evidence_matrix
- task: WBV2-P14-002
- parent: WBV2-P14-001
- status: in_progress
- gap: workflow:reconcile_capability_evidence_matrix
- ownerFamily: PARITY
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Reconcile capability-level evidence classes and representative slices from the coverage ledger.
## 输入与范围
- Focused input: `tests/golden/WBV2-P14-001/coverage-ledger-report.json`
- Full coverage ledger (streamed by generator): `tests/golden/WBV2-P14-001/inventory-coverage-ledger.json`
- Parent evidence: `tests/golden/WBV2-P14-001/manifest.json`
- Production entrypoint: `node tools/web/generate-wbv2-capability-evidence-matrix.mjs --write`
## 验收
- all 6900 entries remain accounted for
- hash-bound evidence is reused before any new execution
- malformed, hash-drift, unsupported, or false-completion input keeps in_progress
- `node tools/web/generate-wbv2-capability-evidence-matrix.mjs --write`
- `node tools/web/check-task-context.mjs --task WBV2-P14-002 --write`
## 交付与回滚
- Reports: `tests/golden/WBV2-P14-002/`
- Status: `docs/status/WBV2-P14-002.md`
- Manifest: `tests/golden/WBV2-P14-002/manifest.json`
- Rollback: restore WBV2-P14-001 as queue parent.

View File

@@ -0,0 +1,34 @@
# WBV2-P14-003: close_inventory_coverage_gate
- task: WBV2-P14-003
- parent: WBV2-P14-002
- status: done
- gap: workflow:close_inventory_coverage_gate
- ownerFamily: RELEASE
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Close the coverage gate with a limited declaration and machine-checkable batching policy.
## 输入与范围
- Focused input: `tests/golden/WBV2-P14-002/capability-evidence-report.json`
- Capability matrix (streamed by generator): `tests/golden/WBV2-P14-002/capability-evidence-matrix.json`
- Parent evidence: `tests/golden/WBV2-P14-002/manifest.json`
- Production entrypoint: `node tools/web/generate-wbv2-inventory-coverage-gate.mjs --write`
## 验收
- all 6900 entries remain accounted for
- hash-bound evidence is reused before any new execution
- malformed, hash-drift, unsupported, or false-completion input keeps in_progress
- `node tools/web/generate-wbv2-inventory-coverage-gate.mjs --write`
- `node tools/web/check-task-context.mjs --task WBV2-P14-003 --write`
## 交付与回滚
- Reports: `tests/golden/WBV2-P14-003/`
- Status: `docs/status/WBV2-P14-003.md`
- Manifest: `tests/golden/WBV2-P14-003/manifest.json`
- Rollback: restore WBV2-P14-002 as queue parent.

View File

@@ -240,12 +240,12 @@ Recorded: 2026-08-22 America/New_York
| Field | Value |
| --- | --- |
| Current task when this file was written | `WBV2-P13-005` |
| Current task when this file was written | `WBV2-P14-003` |
| Current task state | `done` |
| Parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |
| Current task card | `docs/tasks/WBV2-P13-005.md` |
| Parent manifest | `tests/golden/WBV2-P14-002/manifest.json` |
| Current task card | `docs/tasks/WBV2-P14-003.md` |
| Current task-context nextTask | `NONE` |
| Focused command | `node tools/web/generate-wbv2-high-value-domain-gate.mjs --write` |
| Focused command | `node tools/web/generate-wbv2-inventory-coverage-gate.mjs --write` |
The snapshot is informational and may become stale. On every resume, the queue,
parent manifest, and fresh `print-task-context` output win. Never infer a task

View File

@@ -303,7 +303,8 @@
"existingEvidenceReused": true,
"inventoryRemainderExplicit": true,
"noFalseLocalParity": true,
"terminalQueuePointer": true
"terminalQueuePointer": false,
"authorizedContinuation": "WBV2-P14-000"
},
"nextTask": null
"nextTask": "WBV2-P14-000"
}

View File

@@ -58,11 +58,11 @@
},
"report": {
"path": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json",
"sha256": "f3af76ab509fa7856e7cd383279d9e30fe036f0977a0839a277d241c303b8903"
"sha256": "a2b20da742909c7095a71046aa39fd6f4fe63896fd9e7ef5cc238e877956a446"
},
"status": {
"path": "docs/status/WBV2-P13-005.md",
"sha256": "08366171356a9ab1cd0a379dd3bf2882deeedc6a080aa987e5bdf235eb6027da"
"sha256": "be611318980e17ce2988c9d29f27c46b10bb573a04918a9cdbe92a648541331f"
},
"parityPlan": {
"path": "tests/golden/WBV2-P13-005/high-value-task-plan.json",
@@ -70,7 +70,7 @@
},
"taskContext": {
"path": "tests/golden/WBV2-P13-005/task-context.json",
"sha256": "e7bc0cd9c3597454fdd329c2f997989feba68872cd572508d3b9a8b5716bc619"
"sha256": "7f0cc80ddd84b5189e091e9346c5513eeb9f033caf44e5312c7046e64e7fe245"
}
},
"assertions": {
@@ -91,5 +91,10 @@
"fullHistoricalReproduction": false,
"deterministic": true
},
"nextTask": null
"nextTask": "WBV2-P14-000",
"continuation": {
"authorized": true,
"root": "WBV2-P14-000",
"scope": "INVENTORY_COVERAGE_BATCHING"
}
}

View File

@@ -69,7 +69,7 @@
"provenance limitation stays explicit",
"full historical reproduction remains false"
],
"nextTask": null,
"nextTask": "WBV2-P14-000",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P13-005.md",
@@ -166,7 +166,7 @@
"totalTokens": 2319,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3343,
"serializedContextTokens": 684,
"serializedContextTokens": 687,
"withinBudget": true
}
}

View File

@@ -0,0 +1,35 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-000",
"operation": "AUTHORIZE_INVENTORY_COVERAGE_CONTINUATION",
"status": "PASS",
"parent": {
"task": "WBV2-P13-005",
"manifest": "tests/golden/WBV2-P13-005/manifest.json",
"manifestSha256": "475c4e36c013009a49c318773e4defe073a09cea2ee620638c0c333c44c5e62a",
"report": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json",
"reportSha256": "f3af76ab509fa7856e7cd383279d9e30fe036f0977a0839a277d241c303b8903",
"previousDecision": "READY_WITH_HIGH_VALUE_DOMAIN_PARITY",
"fullHistoricalReproduction": false
},
"continuation": {
"root": "WBV2-P14-000",
"firstTask": "WBV2-P14-001",
"plannedTasks": 4,
"inventoryTotal": 6900,
"inventoryPending": 6618,
"capabilityBuckets": 15,
"grouping": "capability-family",
"browser": "chromium",
"noRepeatedExecution": true
},
"policy": {
"p13EvidencePreserved": true,
"sourceHistoryReadOnly": true,
"authorizedRebaselineOnly": true,
"duplicateValidationAvoided": true,
"inventoryRemainderExplicit": true,
"fullHistoricalReproduction": false
},
"nextTask": "WBV2-P14-001"
}

View File

@@ -0,0 +1,147 @@
{
"schemaVersion": 1,
"planId": "BLENDER_WEB_PARITY_V2_INVENTORY_COVERAGE_EPOCH_1",
"status": "ACTIVE_INVENTORY_COVERAGE_QUEUE",
"authority": "queue_reactivated_after_p13_high_value_gate",
"productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"sourcePlan": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json",
"executionPointer": "docs/EXECUTION_QUEUE.md",
"runtimePolicy": {
"blenderSource": "blender-5.2.0",
"browserEvidence": [
"chromium"
],
"forbiddenBrowsers": [
"firefox",
"webkit"
],
"mainAuthority": "blender_main",
"reusePolicy": "existing_receipts_before_new_runs"
},
"coveragePolicy": {
"inventoryTotal": 6900,
"pendingAtStart": 6618,
"grouping": "capability-family",
"duplicateValidation": "forbidden",
"historicalBytes": "read-only"
},
"tasks": [
{
"id": "WBV2-P14-000",
"phase": "P14",
"title": "authorize_inventory_coverage_continuation",
"kind": "enabling",
"owner": "PROGRAM",
"dependsOn": [
"WBV2-P13-005"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-governance",
"gate": "G0",
"card": "docs/tasks/WBV2-P14-000.md",
"behavior": "Authorize a machine-readable 6900-entry coverage continuation without reopening completed production receipts.",
"outputs": [
"coverage root",
"batch plan",
"scope limits"
],
"acceptance": [
"P13 evidence remains hash-bound",
"inventory counts are deterministic",
"one coverage task is active"
],
"status": "done",
"ready": false,
"queueMutationAllowed": true
},
{
"id": "WBV2-P14-001",
"phase": "P14",
"title": "generate_inventory_coverage_ledger",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P14-000"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-ledger",
"gate": "G0",
"card": "docs/tasks/WBV2-P14-001.md",
"behavior": "Cluster all 6900 inventory entries by capability and bind representative evidence without repeated Blender or Chromium execution.",
"outputs": [
"coverage ledger",
"capability counts",
"batch digest"
],
"acceptance": [
"all entries are accounted for",
"pending remainder stays explicit",
"existing receipts are reused",
"no duplicate execution"
],
"status": "in_progress",
"ready": true,
"queueMutationAllowed": false
},
{
"id": "WBV2-P14-002",
"phase": "P14",
"title": "reconcile_capability_evidence_matrix",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P14-001"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-matrix",
"gate": "G2",
"card": "docs/tasks/WBV2-P14-002.md",
"behavior": "Reconcile capability-level evidence classes and representative slices from the coverage ledger.",
"outputs": [
"evidence matrix",
"claim map",
"unproven map"
],
"acceptance": [
"only hash-bound claims are promoted",
"partial capability coverage is explicit",
"6900 remainder is unchanged"
],
"status": "planned",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P14-003",
"phase": "P14",
"title": "close_inventory_coverage_gate",
"kind": "enabling",
"owner": "RELEASE",
"dependsOn": [
"WBV2-P14-002"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-release",
"gate": "G5",
"card": "docs/tasks/WBV2-P14-003.md",
"behavior": "Close the coverage gate with a limited declaration and machine-checkable batching policy.",
"outputs": [
"coverage gate",
"efficiency declaration",
"next batch policy"
],
"acceptance": [
"all entries have a capability bucket",
"feature claims remain evidence-bound",
"no historical or inventory over-claim"
],
"status": "planned",
"ready": false,
"queueMutationAllowed": false
}
]
}

View File

@@ -0,0 +1,58 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-000",
"parentTask": "WBV2-P13-005",
"operation": "AUTHORIZE_INVENTORY_COVERAGE_CONTINUATION",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "READ_ONLY_INVENTORY_COVERAGE_ROOT",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P13-005/manifest.json",
"sha256": "e35ca82b1e3b3ffe6b75171086530b3adf5ee8353a06ca63dbb665eda1ca4c03"
},
"parentReport": {
"path": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json",
"sha256": "a2b20da742909c7095a71046aa39fd6f4fe63896fd9e7ef5cc238e877956a446"
},
"approval": {
"path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json",
"sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3"
},
"parityMap": {
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8"
},
"capabilityMatrix": {
"path": "docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json",
"sha256": "053e1551a24da08e045bb54115858a892ddd825fa59f1691a26a1ccfc1db3ca0"
},
"plan": {
"path": "tests/golden/WBV2-P14-000/coverage-task-plan.json",
"sha256": "e3a6bebef8cd565fb2b5a5e684759e4bd4957eafdfc1ba17d67b401b3ee00b2d"
},
"report": {
"path": "tests/golden/WBV2-P14-000/coverage-root-report.json",
"sha256": "a83a09d44a00b61702ad86ea06d9ffbd7481a3e421c03c863950280f714dc1ef"
},
"rootCard": {
"path": "docs/tasks/WBV2-P14-000.md",
"sha256": "2c388b0e9ae1864276d4a06357af84e4d0052e0e1cdc32a49c98a23b61a3f4b7"
},
"rootStatus": {
"path": "docs/status/WBV2-P14-000.md",
"sha256": "43a054eaac25bf8453839b2ce431d0cfac0e1f9ac44308d6fee696d3ba3db9a4"
}
},
"assertions": {
"p13EvidencePreserved": true,
"inventoryTotal": 6900,
"inventoryPending": 6618,
"capabilityBuckets": 15,
"duplicateValidationAvoided": true,
"authorizedRebaselineOnly": true,
"fullHistoricalReproduction": false
},
"nextTask": "WBV2-P14-001"
}

View File

@@ -0,0 +1,396 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-001",
"operation": "CAPABILITY_BATCH_SUMMARY",
"sourceLedger": "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json",
"sourceLedgerSha256": "d754efb8d3917fa2052d76d2753cb3fb65e42ed744649fb3d0c988908b1f955e",
"buckets": [
{
"capabilityId": "CAP-CORE-DNA-RNA",
"family": "CORE_DNA_RNA",
"layer": "CORE",
"total": 38,
"completed": 18,
"pending": 20,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"datablock": 18,
"rna": 20
},
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 38
},
{
"capabilityId": "CAP-CORE-MESH",
"family": "CORE_MESH",
"layer": "CORE",
"total": 31,
"completed": 1,
"pending": 30,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"datablock": 1,
"rna": 30
},
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 31
},
{
"capabilityId": "CAP-CORE-OBJECT",
"family": "CORE_OBJECT",
"layer": "CORE",
"total": 2,
"completed": 1,
"pending": 1,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-SCENE-OBJECT-ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "scene/object visibility and transform"
},
"kinds": {
"datablock": 1,
"rna": 1
},
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 2
},
{
"capabilityId": "CAP-CORE-SCENE-GRAPH",
"family": "CORE_SCENE_GRAPH",
"layer": "CORE",
"total": 66,
"completed": 9,
"pending": 57,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-SCENE-OBJECT-ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "scene/object visibility and transform"
},
"kinds": {
"datablock": 9,
"rna": 57
},
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 66
},
{
"capabilityId": "CAP-MATERIAL-RENDER",
"family": "MATERIAL_RENDER",
"layer": "FEATURE",
"total": 125,
"completed": 0,
"pending": 125,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-MATERIAL-ANIMATION-ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "material/UV and animation receipt; render remains separate"
},
"kinds": {
"node": 99,
"operator": 26
},
"sourceTasks": [
"M15-01B",
"M15-01C"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 125
},
{
"capabilityId": "CAP-MEDIA-IO",
"family": "MEDIA_IO",
"layer": "FEATURE",
"total": 585,
"completed": 18,
"pending": 566,
"active": 1,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"io": 33,
"operator": 528,
"strip": 24
},
"sourceTasks": [
"M15-01B",
"M15-01D"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 585
},
{
"capabilityId": "CAP-MESH-EDITING",
"family": "MESH_EDITING",
"layer": "FEATURE",
"total": 431,
"completed": 0,
"pending": 431,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-MESH-TOPOLOGY-FAMILY"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "six topology operations"
},
"kinds": {
"operator": 431
},
"sourceTasks": [
"M15-01B"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 431
},
{
"capabilityId": "CAP-MODIFIER-SYSTEM",
"family": "MODIFIER_SYSTEM",
"layer": "FEATURE",
"total": 83,
"completed": 83,
"pending": 0,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-MODIFIER-PARAMETER-APPLY"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "DECIMATE apply"
},
"kinds": {
"modifier": 83
},
"sourceTasks": [
"M15-01C"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 83
},
{
"capabilityId": "CAP-NODES-GRAPH",
"family": "NODES_GRAPH",
"layer": "FEATURE",
"total": 543,
"completed": 0,
"pending": 543,
"active": 0,
"representativeEvidence": {
"claims": [
"NODES.GEOMETRY_ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "three graph hashes; unsupported simulation rejected"
},
"kinds": {
"node": 352,
"operator": 191
},
"sourceTasks": [
"M15-01B",
"M15-01C"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 543
},
{
"capabilityId": "CAP-OBJECT-OPERATIONS",
"family": "OBJECT_OPERATIONS",
"layer": "FEATURE",
"total": 316,
"completed": 0,
"pending": 316,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"operator": 316
},
"sourceTasks": [
"M15-01B"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 316
},
{
"capabilityId": "CAP-OTHER-OPERATOR",
"family": "OTHER_OPERATOR",
"layer": "FEATURE",
"total": 103,
"completed": 0,
"pending": 103,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"operator": 103
},
"sourceTasks": [
"M15-01B"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 103
},
{
"capabilityId": "CAP-RIG-ANIMATION",
"family": "RIG_ANIMATION",
"layer": "FEATURE",
"total": 375,
"completed": 151,
"pending": 224,
"active": 0,
"representativeEvidence": {
"claims": [
"RIG.POSE_ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "two bones and bounded constraint edit"
},
"kinds": {
"constraint": 29,
"operator": 346
},
"sourceTasks": [
"M15-01B",
"M15-01C"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 375
},
{
"capabilityId": "CAP-SCULPT-PAINT",
"family": "SCULPT_PAINT",
"layer": "FEATURE",
"total": 117,
"completed": 0,
"pending": 117,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"operator": 117
},
"sourceTasks": [
"M15-01B"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 117
},
{
"capabilityId": "CAP-SIMULATION",
"family": "SIMULATION",
"layer": "FEATURE",
"total": 155,
"completed": 0,
"pending": 155,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"operator": 90,
"physics": 65
},
"sourceTasks": [
"M15-01B",
"M15-01D"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 155
},
{
"capabilityId": "CAP-UI-EDITOR",
"family": "UI_EDITOR",
"layer": "UI",
"total": 3930,
"completed": 0,
"pending": 3930,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"area": 19,
"keymap-item": 3228,
"keymap": 280,
"operator": 338,
"region": 17,
"space-class": 16,
"space": 19,
"workspace": 13
},
"sourceTasks": [
"M15-01B",
"M15-01E"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 3930
}
],
"entryDigest": "06debe05e086868dcad99980a04161f71172df23a27e36e14670da94af3db516"
}

View File

@@ -0,0 +1,420 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-001",
"operation": "GENERATE_INVENTORY_COVERAGE_LEDGER",
"status": "PASS",
"ledgerSha256": "d754efb8d3917fa2052d76d2753cb3fb65e42ed744649fb3d0c988908b1f955e",
"inventory": {
"total": 6900,
"completed": 281,
"pending": 6618,
"active": 1,
"capabilityBuckets": 15,
"remainderExplicit": true
},
"entryDigest": "06debe05e086868dcad99980a04161f71172df23a27e36e14670da94af3db516",
"buckets": [
{
"capabilityId": "CAP-CORE-DNA-RNA",
"family": "CORE_DNA_RNA",
"layer": "CORE",
"total": 38,
"completed": 18,
"pending": 20,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"datablock": 18,
"rna": 20
},
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 38
},
{
"capabilityId": "CAP-CORE-MESH",
"family": "CORE_MESH",
"layer": "CORE",
"total": 31,
"completed": 1,
"pending": 30,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"datablock": 1,
"rna": 30
},
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 31
},
{
"capabilityId": "CAP-CORE-OBJECT",
"family": "CORE_OBJECT",
"layer": "CORE",
"total": 2,
"completed": 1,
"pending": 1,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-SCENE-OBJECT-ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "scene/object visibility and transform"
},
"kinds": {
"datablock": 1,
"rna": 1
},
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 2
},
{
"capabilityId": "CAP-CORE-SCENE-GRAPH",
"family": "CORE_SCENE_GRAPH",
"layer": "CORE",
"total": 66,
"completed": 9,
"pending": 57,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-SCENE-OBJECT-ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "scene/object visibility and transform"
},
"kinds": {
"datablock": 9,
"rna": 57
},
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 66
},
{
"capabilityId": "CAP-MATERIAL-RENDER",
"family": "MATERIAL_RENDER",
"layer": "FEATURE",
"total": 125,
"completed": 0,
"pending": 125,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-MATERIAL-ANIMATION-ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "material/UV and animation receipt; render remains separate"
},
"kinds": {
"node": 99,
"operator": 26
},
"sourceTasks": [
"M15-01B",
"M15-01C"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 125
},
{
"capabilityId": "CAP-MEDIA-IO",
"family": "MEDIA_IO",
"layer": "FEATURE",
"total": 585,
"completed": 18,
"pending": 566,
"active": 1,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"io": 33,
"operator": 528,
"strip": 24
},
"sourceTasks": [
"M15-01B",
"M15-01D"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 585
},
{
"capabilityId": "CAP-MESH-EDITING",
"family": "MESH_EDITING",
"layer": "FEATURE",
"total": 431,
"completed": 0,
"pending": 431,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-MESH-TOPOLOGY-FAMILY"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "six topology operations"
},
"kinds": {
"operator": 431
},
"sourceTasks": [
"M15-01B"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 431
},
{
"capabilityId": "CAP-MODIFIER-SYSTEM",
"family": "MODIFIER_SYSTEM",
"layer": "FEATURE",
"total": 83,
"completed": 83,
"pending": 0,
"active": 0,
"representativeEvidence": {
"claims": [
"CAP-MODIFIER-PARAMETER-APPLY"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "DECIMATE apply"
},
"kinds": {
"modifier": 83
},
"sourceTasks": [
"M15-01C"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 83
},
{
"capabilityId": "CAP-NODES-GRAPH",
"family": "NODES_GRAPH",
"layer": "FEATURE",
"total": 543,
"completed": 0,
"pending": 543,
"active": 0,
"representativeEvidence": {
"claims": [
"NODES.GEOMETRY_ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "three graph hashes; unsupported simulation rejected"
},
"kinds": {
"node": 352,
"operator": 191
},
"sourceTasks": [
"M15-01B",
"M15-01C"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 543
},
{
"capabilityId": "CAP-OBJECT-OPERATIONS",
"family": "OBJECT_OPERATIONS",
"layer": "FEATURE",
"total": 316,
"completed": 0,
"pending": 316,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"operator": 316
},
"sourceTasks": [
"M15-01B"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 316
},
{
"capabilityId": "CAP-OTHER-OPERATOR",
"family": "OTHER_OPERATOR",
"layer": "FEATURE",
"total": 103,
"completed": 0,
"pending": 103,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"operator": 103
},
"sourceTasks": [
"M15-01B"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 103
},
{
"capabilityId": "CAP-RIG-ANIMATION",
"family": "RIG_ANIMATION",
"layer": "FEATURE",
"total": 375,
"completed": 151,
"pending": 224,
"active": 0,
"representativeEvidence": {
"claims": [
"RIG.POSE_ENGINE"
],
"mode": "REPRESENTATIVE_SLICE",
"evidence": "two bones and bounded constraint edit"
},
"kinds": {
"constraint": 29,
"operator": 346
},
"sourceTasks": [
"M15-01B",
"M15-01C"
],
"evidenceState": "PARTIAL_REPRESENTATIVE",
"claimCount": 1,
"entries": 375
},
{
"capabilityId": "CAP-SCULPT-PAINT",
"family": "SCULPT_PAINT",
"layer": "FEATURE",
"total": 117,
"completed": 0,
"pending": 117,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"operator": 117
},
"sourceTasks": [
"M15-01B"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 117
},
{
"capabilityId": "CAP-SIMULATION",
"family": "SIMULATION",
"layer": "FEATURE",
"total": 155,
"completed": 0,
"pending": 155,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"operator": 90,
"physics": 65
},
"sourceTasks": [
"M15-01B",
"M15-01D"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 155
},
{
"capabilityId": "CAP-UI-EDITOR",
"family": "UI_EDITOR",
"layer": "UI",
"total": 3930,
"completed": 0,
"pending": 3930,
"active": 0,
"representativeEvidence": {
"claims": [],
"mode": "UNPROVEN",
"evidence": "no engine-bound receipt"
},
"kinds": {
"area": 19,
"keymap-item": 3228,
"keymap": 280,
"operator": 338,
"region": 17,
"space-class": 16,
"space": 19,
"workspace": 13
},
"sourceTasks": [
"M15-01B",
"M15-01E"
],
"evidenceState": "UNPROVEN",
"claimCount": 0,
"entries": 3930
}
],
"efficiency": {
"fullInventoryStreamed": true,
"existingReceiptsReused": true,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"duplicateValidationAvoided": true,
"oneLedgerScan": true
},
"policy": {
"grouping": "CAPABILITY_FAMILY",
"reuseExistingReceipts": true,
"duplicateValidationAvoided": true,
"historicalBytesReadOnly": true,
"partialClaimsExplicit": true
},
"nextTask": "WBV2-P14-002"
}

View File

@@ -0,0 +1,151 @@
{
"schemaVersion": 1,
"planId": "BLENDER_WEB_PARITY_V2_INVENTORY_COVERAGE_EPOCH_1",
"status": "ACTIVE_INVENTORY_COVERAGE_QUEUE",
"authority": "queue_reactivated_after_p13_high_value_gate",
"productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"sourcePlan": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json",
"executionPointer": "docs/EXECUTION_QUEUE.md",
"runtimePolicy": {
"blenderSource": "blender-5.2.0",
"browserEvidence": [
"chromium"
],
"forbiddenBrowsers": [
"firefox",
"webkit"
],
"mainAuthority": "blender_main",
"reusePolicy": "existing_receipts_before_new_runs"
},
"coveragePolicy": {
"inventoryTotal": 6900,
"pendingAtStart": 6618,
"grouping": "capability-family",
"duplicateValidation": "forbidden",
"historicalBytes": "read-only"
},
"tasks": [
{
"id": "WBV2-P14-000",
"phase": "P14",
"title": "authorize_inventory_coverage_continuation",
"kind": "enabling",
"owner": "PROGRAM",
"dependsOn": [
"WBV2-P13-005"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-governance",
"gate": "G0",
"card": "docs/tasks/WBV2-P14-000.md",
"behavior": "Authorize a machine-readable 6900-entry coverage continuation without reopening completed production receipts.",
"outputs": [
"coverage root",
"batch plan",
"scope limits"
],
"acceptance": [
"P13 evidence remains hash-bound",
"inventory counts are deterministic",
"one coverage task is active"
],
"status": "done",
"ready": false,
"queueMutationAllowed": true
},
{
"id": "WBV2-P14-001",
"phase": "P14",
"title": "generate_inventory_coverage_ledger",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P14-000"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-ledger",
"gate": "G0",
"card": "docs/tasks/WBV2-P14-001.md",
"behavior": "Cluster all 6900 inventory entries by capability and bind representative evidence without repeated Blender or Chromium execution.",
"outputs": [
"coverage ledger",
"capability counts",
"batch digest"
],
"acceptance": [
"all entries are accounted for",
"pending remainder stays explicit",
"existing receipts are reused",
"no duplicate execution"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P14-002",
"phase": "P14",
"title": "reconcile_capability_evidence_matrix",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P14-001"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-matrix",
"gate": "G2",
"card": "docs/tasks/WBV2-P14-002.md",
"behavior": "Reconcile capability-level evidence classes and representative slices from the coverage ledger.",
"outputs": [
"evidence matrix",
"claim map",
"unproven map"
],
"acceptance": [
"only hash-bound claims are promoted",
"partial capability coverage is explicit",
"6900 remainder is unchanged"
],
"status": "in_progress",
"ready": true,
"queueMutationAllowed": false
},
{
"id": "WBV2-P14-003",
"phase": "P14",
"title": "close_inventory_coverage_gate",
"kind": "enabling",
"owner": "RELEASE",
"dependsOn": [
"WBV2-P14-002"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-release",
"gate": "G5",
"card": "docs/tasks/WBV2-P14-003.md",
"behavior": "Close the coverage gate with a limited declaration and machine-checkable batching policy.",
"outputs": [
"coverage gate",
"efficiency declaration",
"next batch policy"
],
"acceptance": [
"all entries have a capability bucket",
"feature claims remain evidence-bound",
"no historical or inventory over-claim"
],
"status": "planned",
"ready": false,
"queueMutationAllowed": false
}
],
"parentRecoveryPlan": {
"path": "tests/golden/WBV2-P14-000/coverage-task-plan.json",
"sha256": "e3a6bebef8cd565fb2b5a5e684759e4bd4957eafdfc1ba17d67b401b3ee00b2d"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,68 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-001",
"parentTask": "WBV2-P14-000",
"operation": "GENERATE_INVENTORY_COVERAGE_LEDGER",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "READ_ONLY_STREAMED_INVENTORY_LEDGER",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P14-000/manifest.json",
"sha256": "0e5230014338d617ff31ac445173c4c5ddf79cf5cc5d2f9ce4f16475286181e9"
},
"inventory": {
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8"
},
"p13Gate": {
"path": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json",
"sha256": "a2b20da742909c7095a71046aa39fd6f4fe63896fd9e7ef5cc238e877956a446"
},
"ledger": {
"path": "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json",
"sha256": "d754efb8d3917fa2052d76d2753cb3fb65e42ed744649fb3d0c988908b1f955e"
},
"batchSummary": {
"path": "tests/golden/WBV2-P14-001/capability-batch-summary.json",
"sha256": "cf7faa61328c3196cef39fad472372d3437a3c64979ac8026675657d6cbef014"
},
"report": {
"path": "tests/golden/WBV2-P14-001/coverage-ledger-report.json",
"sha256": "481122e1808dc3bbc7f652ea81000789bdbf6ad3a62ac939180a383afd35aa54"
},
"generator": {
"path": "tools/web/generate-wbv2-coverage-ledger.mjs",
"sha256": "c0f1b6b1d7011917dd0b585684bd4ec07ae8b2b3af5b551f653ffb924b391f14"
},
"status": {
"path": "docs/status/WBV2-P14-001.md",
"sha256": "9c62f9bdfc2e25517cb4aabf1f4142f7661dad74b91afdd21b129472248e3182"
},
"parityPlan": {
"path": "tests/golden/WBV2-P14-001/coverage-task-plan.json",
"sha256": "c0c16d09800f481aa9d3c77a2cf690f03cb88245f47705228daaaa67f7ca57c6"
},
"taskContext": {
"path": "tests/golden/WBV2-P14-001/task-context.json",
"sha256": "e0f3c55b250e03cf115d57c451b890eaf079370bc71752114dcadafe13eaca1c"
}
},
"assertions": {
"inventoryTotal": 6900,
"completedEntries": 281,
"activeEntries": 1,
"pendingEntries": 6618,
"capabilityBuckets": 15,
"allEntriesAccounted": true,
"representativeEvidenceBuckets": 7,
"unprovenBuckets": 8,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"duplicateValidationAvoided": true,
"deterministic": true,
"historicalReproduction": false
},
"nextTask": "WBV2-P14-002"
}

View File

@@ -0,0 +1,176 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-001",
"parentTask": "WBV2-P14-000",
"status": "in_progress",
"goal": "Cluster all 6900 inventory entries by capability and bind representative evidence without repeated Blender or Chromium execution.",
"scope": {
"gap": "workflow:generate_inventory_coverage_ledger",
"ownerFamily": "PARITY",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"node tools/web/generate-wbv2-coverage-ledger.mjs --write",
"node tools/web/check-task-context.mjs --task WBV2-P14-001 --write"
],
"inputPaths": [
"tests/golden/WBV2-P14-000/coverage-root-report.json"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 3304,
"contextRemainingTokens": 825
},
"source": {
"bytes": 6600,
"tokens": 1651
},
"selected": [
{
"path": "tests/golden/WBV2-P14-000/coverage-root-report.json",
"bytes": 1164,
"tokens": 291
}
],
"excluded": [
{
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"bytes": 5053386,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P14-000/manifest.json",
"bytes": 0,
"reason": "ALREADY_IN_CONTEXT"
},
{
"path": "tests/golden/WBV2-P14-001/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P14-001.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P14-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1164,
"tokens": 291
}
},
"exitCriteria": [
"all entries are accounted for",
"pending remainder stays explicit",
"existing receipts are reused",
"no duplicate execution"
],
"nextTask": "WBV2-P14-002",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P14-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P14-000/manifest.json",
"parentStatus": "docs/status/WBV2-P14-000.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P14-001.md",
"tests/golden/WBV2-P14-000/manifest.json",
"docs/status/WBV2-P14-000.md"
],
"machineOnly": [
"tests/golden/WBV2/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "WBV2-P14-000",
"parentTask": "WBV2-P13-005",
"status": "done",
"nextTask": "WBV2-P14-001",
"artifactCount": 9
},
"statusSummary": [
"# WBV2-P14-000 status",
"- task: `WBV2-P14-000`; parent: `WBV2-P13-005`; status: `done`",
"- inventory scope: `6900` total, `6618` pending",
"- capability buckets: `15`; duplicate validation: `forbidden`",
"- nextTask: `WBV2-P14-001`",
"P14 is an authorized coverage continuation. It preserves the P13 high-value declaration and starts with a capability-family ledger so one representative receipt can be reused without claiming the entire family is complete."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1232,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 35,
"taskTokens": 308
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2803,
"lines": 51,
"tokens": 701
},
{
"path": "docs/tasks/WBV2-P14-001.md",
"bytes": 1232,
"lines": 35,
"tokens": 308
},
{
"path": "tests/golden/WBV2-P14-000/manifest.json",
"bytes": 2118,
"lines": 59,
"tokens": 530
},
{
"path": "docs/status/WBV2-P14-000.md",
"bytes": 447,
"lines": 9,
"tokens": 112
}
],
"sourceTokens": 1651,
"evidenceFiles": 1,
"evidenceBytes": 1164,
"evidenceTokens": 291,
"totalTokens": 1942,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2966,
"serializedContextTokens": 691,
"withinBudget": true
}
}

View File

@@ -0,0 +1,373 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-002",
"operation": "CAPABILITY_EVIDENCE_MATRIX_RECONCILIATION",
"status": "READY",
"source": {
"ledger": "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json",
"ledgerSha256": "d754efb8d3917fa2052d76d2753cb3fb65e42ed744649fb3d0c988908b1f955e",
"ledgerReport": "tests/golden/WBV2-P14-001/coverage-ledger-report.json",
"ledgerReportSha256": "481122e1808dc3bbc7f652ea81000789bdbf6ad3a62ac939180a383afd35aa54",
"highValueGate": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json",
"highValueGateSha256": "a2b20da742909c7095a71046aa39fd6f4fe63896fd9e7ef5cc238e877956a446",
"template": "docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json",
"templateSha256": "053e1551a24da08e045bb54115858a892ddd825fa59f1691a26a1ccfc1db3ca0"
},
"policy": {
"representativeClaimsDoNotCloseFamily": true,
"fullFamilyParityRequiresEntryEvidence": true,
"inventoryRemainderExplicit": true,
"historicalBytesReadOnly": true,
"duplicateValidationAvoided": true
},
"inventory": {
"total": 6900,
"completed": 281,
"active": 1,
"pending": 6618,
"buckets": 15
},
"entries": [
{
"capabilityId": "CAP-CORE-DNA-RNA",
"family": "CORE_DNA_RNA",
"layer": "CORE",
"total": 38,
"completed": 18,
"pending": 20,
"active": 0,
"evidenceClass": "UNPROVEN_PENDING",
"representativeClaims": [],
"representativeEvidence": "no engine-bound receipt",
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"kinds": {
"datablock": 18,
"rna": 20
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-CORE-MESH",
"family": "CORE_MESH",
"layer": "CORE",
"total": 31,
"completed": 1,
"pending": 30,
"active": 0,
"evidenceClass": "UNPROVEN_PENDING",
"representativeClaims": [],
"representativeEvidence": "no engine-bound receipt",
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"kinds": {
"datablock": 1,
"rna": 30
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-CORE-OBJECT",
"family": "CORE_OBJECT",
"layer": "CORE",
"total": 2,
"completed": 1,
"pending": 1,
"active": 0,
"evidenceClass": "PARTIAL_REPRESENTATIVE",
"representativeClaims": [
"CAP-SCENE-OBJECT-ENGINE"
],
"representativeEvidence": "scene/object visibility and transform",
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"kinds": {
"datablock": 1,
"rna": 1
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-CORE-SCENE-GRAPH",
"family": "CORE_SCENE_GRAPH",
"layer": "CORE",
"total": 66,
"completed": 9,
"pending": 57,
"active": 0,
"evidenceClass": "PARTIAL_REPRESENTATIVE",
"representativeClaims": [
"CAP-SCENE-OBJECT-ENGINE"
],
"representativeEvidence": "scene/object visibility and transform",
"sourceTasks": [
"M15-01A",
"M15-01F"
],
"kinds": {
"datablock": 9,
"rna": 57
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-MATERIAL-RENDER",
"family": "MATERIAL_RENDER",
"layer": "FEATURE",
"total": 125,
"completed": 0,
"pending": 125,
"active": 0,
"evidenceClass": "PARTIAL_REPRESENTATIVE",
"representativeClaims": [
"CAP-MATERIAL-ANIMATION-ENGINE"
],
"representativeEvidence": "material/UV and animation receipt; render remains separate",
"sourceTasks": [
"M15-01B",
"M15-01C"
],
"kinds": {
"node": 99,
"operator": 26
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-MEDIA-IO",
"family": "MEDIA_IO",
"layer": "FEATURE",
"total": 585,
"completed": 18,
"pending": 566,
"active": 1,
"evidenceClass": "ACTIVE_UNPROVEN",
"representativeClaims": [],
"representativeEvidence": "no engine-bound receipt",
"sourceTasks": [
"M15-01B",
"M15-01D"
],
"kinds": {
"io": 33,
"operator": 528,
"strip": 24
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-MESH-EDITING",
"family": "MESH_EDITING",
"layer": "FEATURE",
"total": 431,
"completed": 0,
"pending": 431,
"active": 0,
"evidenceClass": "PARTIAL_REPRESENTATIVE",
"representativeClaims": [
"CAP-MESH-TOPOLOGY-FAMILY"
],
"representativeEvidence": "six topology operations",
"sourceTasks": [
"M15-01B"
],
"kinds": {
"operator": 431
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-MODIFIER-SYSTEM",
"family": "MODIFIER_SYSTEM",
"layer": "FEATURE",
"total": 83,
"completed": 83,
"pending": 0,
"active": 0,
"evidenceClass": "PARTIAL_REPRESENTATIVE",
"representativeClaims": [
"CAP-MODIFIER-PARAMETER-APPLY"
],
"representativeEvidence": "DECIMATE apply",
"sourceTasks": [
"M15-01C"
],
"kinds": {
"modifier": 83
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-NODES-GRAPH",
"family": "NODES_GRAPH",
"layer": "FEATURE",
"total": 543,
"completed": 0,
"pending": 543,
"active": 0,
"evidenceClass": "PARTIAL_REPRESENTATIVE",
"representativeClaims": [
"NODES.GEOMETRY_ENGINE"
],
"representativeEvidence": "three graph hashes; unsupported simulation rejected",
"sourceTasks": [
"M15-01B",
"M15-01C"
],
"kinds": {
"node": 352,
"operator": 191
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-OBJECT-OPERATIONS",
"family": "OBJECT_OPERATIONS",
"layer": "FEATURE",
"total": 316,
"completed": 0,
"pending": 316,
"active": 0,
"evidenceClass": "UNPROVEN_PENDING",
"representativeClaims": [],
"representativeEvidence": "no engine-bound receipt",
"sourceTasks": [
"M15-01B"
],
"kinds": {
"operator": 316
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-OTHER-OPERATOR",
"family": "OTHER_OPERATOR",
"layer": "FEATURE",
"total": 103,
"completed": 0,
"pending": 103,
"active": 0,
"evidenceClass": "UNPROVEN_PENDING",
"representativeClaims": [],
"representativeEvidence": "no engine-bound receipt",
"sourceTasks": [
"M15-01B"
],
"kinds": {
"operator": 103
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-RIG-ANIMATION",
"family": "RIG_ANIMATION",
"layer": "FEATURE",
"total": 375,
"completed": 151,
"pending": 224,
"active": 0,
"evidenceClass": "PARTIAL_REPRESENTATIVE",
"representativeClaims": [
"RIG.POSE_ENGINE"
],
"representativeEvidence": "two bones and bounded constraint edit",
"sourceTasks": [
"M15-01B",
"M15-01C"
],
"kinds": {
"constraint": 29,
"operator": 346
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-SCULPT-PAINT",
"family": "SCULPT_PAINT",
"layer": "FEATURE",
"total": 117,
"completed": 0,
"pending": 117,
"active": 0,
"evidenceClass": "UNPROVEN_PENDING",
"representativeClaims": [],
"representativeEvidence": "no engine-bound receipt",
"sourceTasks": [
"M15-01B"
],
"kinds": {
"operator": 117
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-SIMULATION",
"family": "SIMULATION",
"layer": "FEATURE",
"total": 155,
"completed": 0,
"pending": 155,
"active": 0,
"evidenceClass": "UNPROVEN_PENDING",
"representativeClaims": [],
"representativeEvidence": "no engine-bound receipt",
"sourceTasks": [
"M15-01B",
"M15-01D"
],
"kinds": {
"operator": 90,
"physics": 65
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
},
{
"capabilityId": "CAP-UI-EDITOR",
"family": "UI_EDITOR",
"layer": "UI",
"total": 3930,
"completed": 0,
"pending": 3930,
"active": 0,
"evidenceClass": "UNPROVEN_PENDING",
"representativeClaims": [],
"representativeEvidence": "no engine-bound receipt",
"sourceTasks": [
"M15-01B",
"M15-01E"
],
"kinds": {
"area": 19,
"keymap-item": 3228,
"keymap": 280,
"operator": 338,
"region": 17,
"space-class": 16,
"space": 19,
"workspace": 13
},
"fullFamilyParity": false,
"inventoryRemainderExplicit": true
}
]
}

View File

@@ -0,0 +1,45 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-002",
"operation": "RECONCILE_CAPABILITY_EVIDENCE_MATRIX",
"status": "PASS",
"matrixSha256": "06a987b3911999c4c4983c89841318cd053ae30465ae83d49e6eeff566b462b8",
"inventory": {
"total": 6900,
"completed": 281,
"active": 1,
"pending": 6618,
"buckets": 15
},
"evidenceClasses": {
"partialRepresentative": 7,
"unprovenPending": 7,
"activeUnproven": 1,
"legacyCompletedNoEngineClaim": 0
},
"featureClaims": [
"CAP-MESH-TOPOLOGY-FAMILY",
"CAP-MODIFIER-PARAMETER-APPLY",
"CAP-ASSET-LINK-OVERRIDE-RELOAD",
"CAP-SCENE-OBJECT-ENGINE",
"CAP-MATERIAL-ANIMATION-ENGINE",
"CAP-VIEWPORT-NONMESH-ENGINE",
"NODES.GEOMETRY_ENGINE",
"RIG.POSE_ENGINE"
],
"efficiency": {
"oneLedgerInput": true,
"existingReceiptsReused": true,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"duplicateValidationAvoided": true
},
"policy": {
"representativeClaimsDoNotCloseFamily": true,
"fullFamilyParityRequiresEntryEvidence": true,
"inventoryRemainderExplicit": true,
"historicalBytesReadOnly": true,
"duplicateValidationAvoided": true
},
"nextTask": "WBV2-P14-003"
}

View File

@@ -0,0 +1,151 @@
{
"schemaVersion": 1,
"planId": "BLENDER_WEB_PARITY_V2_INVENTORY_COVERAGE_EPOCH_1",
"status": "ACTIVE_INVENTORY_COVERAGE_QUEUE",
"authority": "queue_reactivated_after_p13_high_value_gate",
"productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"sourcePlan": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json",
"executionPointer": "docs/EXECUTION_QUEUE.md",
"runtimePolicy": {
"blenderSource": "blender-5.2.0",
"browserEvidence": [
"chromium"
],
"forbiddenBrowsers": [
"firefox",
"webkit"
],
"mainAuthority": "blender_main",
"reusePolicy": "existing_receipts_before_new_runs"
},
"coveragePolicy": {
"inventoryTotal": 6900,
"pendingAtStart": 6618,
"grouping": "capability-family",
"duplicateValidation": "forbidden",
"historicalBytes": "read-only"
},
"tasks": [
{
"id": "WBV2-P14-000",
"phase": "P14",
"title": "authorize_inventory_coverage_continuation",
"kind": "enabling",
"owner": "PROGRAM",
"dependsOn": [
"WBV2-P13-005"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-governance",
"gate": "G0",
"card": "docs/tasks/WBV2-P14-000.md",
"behavior": "Authorize a machine-readable 6900-entry coverage continuation without reopening completed production receipts.",
"outputs": [
"coverage root",
"batch plan",
"scope limits"
],
"acceptance": [
"P13 evidence remains hash-bound",
"inventory counts are deterministic",
"one coverage task is active"
],
"status": "done",
"ready": false,
"queueMutationAllowed": true
},
{
"id": "WBV2-P14-001",
"phase": "P14",
"title": "generate_inventory_coverage_ledger",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P14-000"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-ledger",
"gate": "G0",
"card": "docs/tasks/WBV2-P14-001.md",
"behavior": "Cluster all 6900 inventory entries by capability and bind representative evidence without repeated Blender or Chromium execution.",
"outputs": [
"coverage ledger",
"capability counts",
"batch digest"
],
"acceptance": [
"all entries are accounted for",
"pending remainder stays explicit",
"existing receipts are reused",
"no duplicate execution"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P14-002",
"phase": "P14",
"title": "reconcile_capability_evidence_matrix",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P14-001"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-matrix",
"gate": "G2",
"card": "docs/tasks/WBV2-P14-002.md",
"behavior": "Reconcile capability-level evidence classes and representative slices from the coverage ledger.",
"outputs": [
"evidence matrix",
"claim map",
"unproven map"
],
"acceptance": [
"only hash-bound claims are promoted",
"partial capability coverage is explicit",
"6900 remainder is unchanged"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P14-003",
"phase": "P14",
"title": "close_inventory_coverage_gate",
"kind": "enabling",
"owner": "RELEASE",
"dependsOn": [
"WBV2-P14-002"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-release",
"gate": "G5",
"card": "docs/tasks/WBV2-P14-003.md",
"behavior": "Close the coverage gate with a limited declaration and machine-checkable batching policy.",
"outputs": [
"coverage gate",
"efficiency declaration",
"next batch policy"
],
"acceptance": [
"all entries have a capability bucket",
"feature claims remain evidence-bound",
"no historical or inventory over-claim"
],
"status": "in_progress",
"ready": true,
"queueMutationAllowed": false
}
],
"parentRecoveryPlan": {
"path": "tests/golden/WBV2-P14-001/coverage-task-plan.json",
"sha256": "c0c16d09800f481aa9d3c77a2cf690f03cb88245f47705228daaaa67f7ca57c6"
}
}

View File

@@ -0,0 +1,72 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-002",
"parentTask": "WBV2-P14-001",
"operation": "RECONCILE_CAPABILITY_EVIDENCE_MATRIX",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "READ_ONLY_CAPABILITY_EVIDENCE_RECONCILIATION",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P14-001/manifest.json",
"sha256": "f260bd3878a0e72cc2cf71e02cea345adb89e6f22d722d720a530aeb2e9066c3"
},
"ledger": {
"path": "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json",
"sha256": "d754efb8d3917fa2052d76d2753cb3fb65e42ed744649fb3d0c988908b1f955e"
},
"ledgerReport": {
"path": "tests/golden/WBV2-P14-001/coverage-ledger-report.json",
"sha256": "481122e1808dc3bbc7f652ea81000789bdbf6ad3a62ac939180a383afd35aa54"
},
"highValueGate": {
"path": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json",
"sha256": "a2b20da742909c7095a71046aa39fd6f4fe63896fd9e7ef5cc238e877956a446"
},
"matrixTemplate": {
"path": "docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json",
"sha256": "053e1551a24da08e045bb54115858a892ddd825fa59f1691a26a1ccfc1db3ca0"
},
"matrix": {
"path": "tests/golden/WBV2-P14-002/capability-evidence-matrix.json",
"sha256": "06a987b3911999c4c4983c89841318cd053ae30465ae83d49e6eeff566b462b8"
},
"report": {
"path": "tests/golden/WBV2-P14-002/capability-evidence-report.json",
"sha256": "6460618e4aff0f12d65791e6f68f413bf13ce22fe7ea3cc935fd5f76101415da"
},
"generator": {
"path": "tools/web/generate-wbv2-capability-evidence-matrix.mjs",
"sha256": "c0ea1a2fc5a6433858f9dbf66163f1c688d84ab5ba96984f5e7ce5786b93f90d"
},
"status": {
"path": "docs/status/WBV2-P14-002.md",
"sha256": "c42de7dabf11b58ca05e813857f3c94a4915fa72781674afbda15670aebeab3a"
},
"parityPlan": {
"path": "tests/golden/WBV2-P14-002/coverage-task-plan.json",
"sha256": "952e36e6e78416fcaa63d9b437c1ec685d4a58c6a4783deea73f327003b3e7c7"
},
"taskContext": {
"path": "tests/golden/WBV2-P14-002/task-context.json",
"sha256": "b9e1b252ae6afa29d4b8cc95e56a1799d7f804bc203c5326f19403e8283e5d19"
}
},
"assertions": {
"inventoryTotal": 6900,
"inventoryPending": 6618,
"capabilityBuckets": 15,
"representativeEvidenceBuckets": 7,
"unprovenPendingBuckets": 7,
"activeUnprovenBuckets": 1,
"engineBoundClaims": 8,
"fullFamilyParityClaims": 0,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"duplicateValidationAvoided": true,
"deterministic": true,
"historicalReproduction": false
},
"nextTask": "WBV2-P14-003"
}

View File

@@ -0,0 +1,174 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-002",
"parentTask": "WBV2-P14-001",
"status": "in_progress",
"goal": "Reconcile capability-level evidence classes and representative slices from the coverage ledger.",
"scope": {
"gap": "workflow:reconcile_capability_evidence_matrix",
"ownerFamily": "PARITY",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"node tools/web/generate-wbv2-capability-evidence-matrix.mjs --write",
"node tools/web/check-task-context.mjs --task WBV2-P14-002 --write"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2661,
"contextRemainingTokens": 664
},
"source": {
"bytes": 7243,
"tokens": 1812
},
"selected": [],
"excluded": [
{
"path": "tests/golden/WBV2-P14-001/coverage-ledger-report.json",
"bytes": 9767,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json",
"bytes": 2247265,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P14-001/manifest.json",
"bytes": 0,
"reason": "ALREADY_IN_CONTEXT"
},
{
"path": "tests/golden/WBV2-P14-002/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P14-002.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P14-002/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"only hash-bound claims are promoted",
"partial capability coverage is explicit",
"6900 remainder is unchanged"
],
"nextTask": "WBV2-P14-003",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P14-002.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P14-001/manifest.json",
"parentStatus": "docs/status/WBV2-P14-001.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P14-002.md",
"tests/golden/WBV2-P14-001/manifest.json",
"docs/status/WBV2-P14-001.md"
],
"machineOnly": [
"tests/golden/WBV2/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "WBV2-P14-001",
"parentTask": "WBV2-P14-000",
"status": "done",
"nextTask": "WBV2-P14-002",
"artifactCount": 10
},
"statusSummary": [
"# WBV2-P14-001 status",
"- task: `WBV2-P14-001`; parent: `WBV2-P14-000`; status: `done`",
"- inventory streamed: `6900` entries across `15` capability buckets",
"- state: `281 completed`, `1 active`, `6618 pending`",
"- representative-evidence buckets: `7`; unproven buckets: `8`",
"- repeated Blender/Chromium validation: `0`; duplicate validation avoided: `true`",
"- entry digest: `06debe05e086868dcad99980a04161f71172df23a27e36e14670da94af3db516`",
"- nextTask: `WBV2-P14-002`"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1241,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 35,
"taskTokens": 311
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2803,
"lines": 51,
"tokens": 701
},
{
"path": "docs/tasks/WBV2-P14-002.md",
"bytes": 1241,
"lines": 35,
"tokens": 311
},
{
"path": "tests/golden/WBV2-P14-001/manifest.json",
"bytes": 2472,
"lines": 69,
"tokens": 618
},
{
"path": "docs/status/WBV2-P14-001.md",
"bytes": 727,
"lines": 12,
"tokens": 182
}
],
"sourceTokens": 1812,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 1812,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2836,
"serializedContextTokens": 630,
"withinBudget": true
}
}

View File

@@ -0,0 +1,169 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-003",
"operation": "BATCH_EXECUTION_STRATEGY",
"status": "READY",
"input": {
"matrix": "tests/golden/WBV2-P14-002/capability-evidence-matrix.json",
"matrixSha256": "06a987b3911999c4c4983c89841318cd053ae30465ae83d49e6eeff566b462b8",
"ledger": "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json",
"ledgerSha256": "d754efb8d3917fa2052d76d2753cb3fb65e42ed744649fb3d0c988908b1f955e"
},
"policy": {
"oneCapabilityBatchPerBehavior": true,
"representativeFirst": true,
"fanoutOnlyOnUniqueBehavior": true,
"repeatKeyIncludesSourceHash": true,
"completedEntriesRegressionOnly": true,
"pendingRemainderExplicit": true,
"historicalBytesReadOnly": true,
"browser": "chromium",
"noFirefoxOrWebkit": true
},
"batches": [
{
"order": 1,
"batch": "BATCH-UI_EDITOR",
"capabilityId": "CAP-UI-EDITOR",
"pendingEntries": 3930,
"strategy": "BUILD_ONE_REPRESENTATIVE_FIXTURE_THEN_FANOUT",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 2,
"batch": "BATCH-MEDIA_IO",
"capabilityId": "CAP-MEDIA-IO",
"pendingEntries": 566,
"strategy": "BUILD_ONE_REPRESENTATIVE_FIXTURE_THEN_FANOUT",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 3,
"batch": "BATCH-NODES_GRAPH",
"capabilityId": "CAP-NODES-GRAPH",
"pendingEntries": 543,
"strategy": "REUSE_REPRESENTATIVE_THEN_FANOUT_BY_UNIQUE_BEHAVIOR",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 4,
"batch": "BATCH-MESH_EDITING",
"capabilityId": "CAP-MESH-EDITING",
"pendingEntries": 431,
"strategy": "REUSE_REPRESENTATIVE_THEN_FANOUT_BY_UNIQUE_BEHAVIOR",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 5,
"batch": "BATCH-OBJECT_OPERATIONS",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"pendingEntries": 316,
"strategy": "BUILD_ONE_REPRESENTATIVE_FIXTURE_THEN_FANOUT",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 6,
"batch": "BATCH-RIG_ANIMATION",
"capabilityId": "CAP-RIG-ANIMATION",
"pendingEntries": 224,
"strategy": "REUSE_REPRESENTATIVE_THEN_FANOUT_BY_UNIQUE_BEHAVIOR",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 7,
"batch": "BATCH-SIMULATION",
"capabilityId": "CAP-SIMULATION",
"pendingEntries": 155,
"strategy": "BUILD_ONE_REPRESENTATIVE_FIXTURE_THEN_FANOUT",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 8,
"batch": "BATCH-MATERIAL_RENDER",
"capabilityId": "CAP-MATERIAL-RENDER",
"pendingEntries": 125,
"strategy": "REUSE_REPRESENTATIVE_THEN_FANOUT_BY_UNIQUE_BEHAVIOR",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 9,
"batch": "BATCH-SCULPT_PAINT",
"capabilityId": "CAP-SCULPT-PAINT",
"pendingEntries": 117,
"strategy": "BUILD_ONE_REPRESENTATIVE_FIXTURE_THEN_FANOUT",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 10,
"batch": "BATCH-OTHER_OPERATOR",
"capabilityId": "CAP-OTHER-OPERATOR",
"pendingEntries": 103,
"strategy": "BUILD_ONE_REPRESENTATIVE_FIXTURE_THEN_FANOUT",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 11,
"batch": "BATCH-CORE_SCENE_GRAPH",
"capabilityId": "CAP-CORE-SCENE-GRAPH",
"pendingEntries": 57,
"strategy": "REUSE_REPRESENTATIVE_THEN_FANOUT_BY_UNIQUE_BEHAVIOR",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 12,
"batch": "BATCH-CORE_MESH",
"capabilityId": "CAP-CORE-MESH",
"pendingEntries": 30,
"strategy": "BUILD_ONE_REPRESENTATIVE_FIXTURE_THEN_FANOUT",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 13,
"batch": "BATCH-CORE_DNA_RNA",
"capabilityId": "CAP-CORE-DNA-RNA",
"pendingEntries": 20,
"strategy": "BUILD_ONE_REPRESENTATIVE_FIXTURE_THEN_FANOUT",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 14,
"batch": "BATCH-CORE_OBJECT",
"capabilityId": "CAP-CORE-OBJECT",
"pendingEntries": 1,
"strategy": "REUSE_REPRESENTATIVE_THEN_FANOUT_BY_UNIQUE_BEHAVIOR",
"minimumNewRuns": 1,
"duplicateRule": "same repeatKey and source hash never rerun"
},
{
"order": 15,
"batch": "BATCH-MODIFIER_SYSTEM",
"capabilityId": "CAP-MODIFIER-SYSTEM",
"pendingEntries": 0,
"strategy": "REGRESSION_ONLY",
"minimumNewRuns": 0,
"duplicateRule": "same repeatKey and source hash never rerun"
}
],
"totals": {
"inventory": 6900,
"completed": 281,
"active": 1,
"pending": 6618,
"capabilityBatches": 15,
"minimumNewRunsIfAllBatchesExecuted": 14,
"repeatedRuns": 0
}
}

View File

@@ -0,0 +1,151 @@
{
"schemaVersion": 1,
"planId": "BLENDER_WEB_PARITY_V2_INVENTORY_COVERAGE_EPOCH_1",
"status": "COMPLETED_WITH_INVENTORY_COVERAGE_GATE",
"authority": "queue_reactivated_after_p13_high_value_gate",
"productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"sourcePlan": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json",
"executionPointer": "docs/EXECUTION_QUEUE.md",
"runtimePolicy": {
"blenderSource": "blender-5.2.0",
"browserEvidence": [
"chromium"
],
"forbiddenBrowsers": [
"firefox",
"webkit"
],
"mainAuthority": "blender_main",
"reusePolicy": "existing_receipts_before_new_runs"
},
"coveragePolicy": {
"inventoryTotal": 6900,
"pendingAtStart": 6618,
"grouping": "capability-family",
"duplicateValidation": "forbidden",
"historicalBytes": "read-only"
},
"tasks": [
{
"id": "WBV2-P14-000",
"phase": "P14",
"title": "authorize_inventory_coverage_continuation",
"kind": "enabling",
"owner": "PROGRAM",
"dependsOn": [
"WBV2-P13-005"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-governance",
"gate": "G0",
"card": "docs/tasks/WBV2-P14-000.md",
"behavior": "Authorize a machine-readable 6900-entry coverage continuation without reopening completed production receipts.",
"outputs": [
"coverage root",
"batch plan",
"scope limits"
],
"acceptance": [
"P13 evidence remains hash-bound",
"inventory counts are deterministic",
"one coverage task is active"
],
"status": "done",
"ready": false,
"queueMutationAllowed": true
},
{
"id": "WBV2-P14-001",
"phase": "P14",
"title": "generate_inventory_coverage_ledger",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P14-000"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-ledger",
"gate": "G0",
"card": "docs/tasks/WBV2-P14-001.md",
"behavior": "Cluster all 6900 inventory entries by capability and bind representative evidence without repeated Blender or Chromium execution.",
"outputs": [
"coverage ledger",
"capability counts",
"batch digest"
],
"acceptance": [
"all entries are accounted for",
"pending remainder stays explicit",
"existing receipts are reused",
"no duplicate execution"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P14-002",
"phase": "P14",
"title": "reconcile_capability_evidence_matrix",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P14-001"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-matrix",
"gate": "G2",
"card": "docs/tasks/WBV2-P14-002.md",
"behavior": "Reconcile capability-level evidence classes and representative slices from the coverage ledger.",
"outputs": [
"evidence matrix",
"claim map",
"unproven map"
],
"acceptance": [
"only hash-bound claims are promoted",
"partial capability coverage is explicit",
"6900 remainder is unchanged"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P14-003",
"phase": "P14",
"title": "close_inventory_coverage_gate",
"kind": "enabling",
"owner": "RELEASE",
"dependsOn": [
"WBV2-P14-002"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p14-release",
"gate": "G5",
"card": "docs/tasks/WBV2-P14-003.md",
"behavior": "Close the coverage gate with a limited declaration and machine-checkable batching policy.",
"outputs": [
"coverage gate",
"efficiency declaration",
"next batch policy"
],
"acceptance": [
"all entries have a capability bucket",
"feature claims remain evidence-bound",
"no historical or inventory over-claim"
],
"status": "in_progress",
"ready": true,
"queueMutationAllowed": false
}
],
"parentRecoveryPlan": {
"path": "tests/golden/WBV2-P14-002/coverage-task-plan.json",
"sha256": "952e36e6e78416fcaa63d9b437c1ec685d4a58c6a4783deea73f327003b3e7c7"
}
}

View File

@@ -0,0 +1,65 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-003",
"operation": "CLOSE_INVENTORY_COVERAGE_GATE",
"status": "PASS",
"decision": {
"status": "COVERAGE_ACCOUNTED_WITH_LIMITED_DECLARATION",
"code": "INVENTORY_COVERAGE_BATCH_PLAN_READY",
"inventoryTotal": 6900,
"inventoryCompleted": 281,
"inventoryActive": 1,
"inventoryPending": 6618,
"capabilityBuckets": 15,
"representativeEvidenceBuckets": 7,
"fullFamilyParityClaims": 0,
"engineBoundFeatureClaims": 8,
"provenanceEpoch": 2,
"releaseScope": "AUTHORIZED_REBASELINE_ONLY",
"fullHistoricalReproduction": false
},
"evidence": {
"parentManifest": {
"path": "tests/golden/WBV2-P14-002/manifest.json",
"sha256": "578894817d12e403b36039b46cbe60d9ded091f0b4de66adf5d76a4d2154e755"
},
"ledger": {
"path": "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json",
"sha256": "d754efb8d3917fa2052d76d2753cb3fb65e42ed744649fb3d0c988908b1f955e",
"entryDigest": "06debe05e086868dcad99980a04161f71172df23a27e36e14670da94af3db516"
},
"matrix": {
"path": "tests/golden/WBV2-P14-002/capability-evidence-matrix.json",
"sha256": "06a987b3911999c4c4983c89841318cd053ae30465ae83d49e6eeff566b462b8",
"report": "tests/golden/WBV2-P14-002/capability-evidence-report.json",
"reportSha256": "6460618e4aff0f12d65791e6f68f413bf13ce22fe7ea3cc935fd5f76101415da"
},
"p13Gate": {
"path": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json",
"sha256": "a2b20da742909c7095a71046aa39fd6f4fe63896fd9e7ef5cc238e877956a446",
"claims": 8
}
},
"efficiency": {
"oneFullInventoryScan": true,
"existingReceiptsReused": true,
"duplicateValidationAvoided": true,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"plannedCapabilityBatches": 15,
"minimumNewRunsIfAllBatchesExecuted": 14
},
"policy": {
"allEntriesBucketed": true,
"onlyHashBoundClaims": true,
"partialCoverageExplicit": true,
"inventoryRemainderExplicit": true,
"sourceHistoryReadOnly": true,
"authorizedRebaselineOnly": true,
"falseInventoryCompletion": "REJECTED",
"falseHistoricalReproduction": "REJECTED",
"nextWorkRule": "execute_one_unique_behavior_per_capability_batch"
},
"strategy": "tests/golden/WBV2-P14-003/batch-execution-strategy.json",
"nextTask": null
}

View File

@@ -0,0 +1,76 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-003",
"parentTask": "WBV2-P14-002",
"operation": "CLOSE_INVENTORY_COVERAGE_GATE",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "READ_ONLY_COVERAGE_GATE",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P14-002/manifest.json",
"sha256": "578894817d12e403b36039b46cbe60d9ded091f0b4de66adf5d76a4d2154e755"
},
"ledger": {
"path": "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json",
"sha256": "d754efb8d3917fa2052d76d2753cb3fb65e42ed744649fb3d0c988908b1f955e"
},
"matrix": {
"path": "tests/golden/WBV2-P14-002/capability-evidence-matrix.json",
"sha256": "06a987b3911999c4c4983c89841318cd053ae30465ae83d49e6eeff566b462b8"
},
"matrixReport": {
"path": "tests/golden/WBV2-P14-002/capability-evidence-report.json",
"sha256": "6460618e4aff0f12d65791e6f68f413bf13ce22fe7ea3cc935fd5f76101415da"
},
"p13Gate": {
"path": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json",
"sha256": "a2b20da742909c7095a71046aa39fd6f4fe63896fd9e7ef5cc238e877956a446"
},
"strategy": {
"path": "tests/golden/WBV2-P14-003/batch-execution-strategy.json",
"sha256": "1d3cf10b97e2ecb170a744ca6687601a64ad7ede1cc82dcbbc80b4291637122f"
},
"report": {
"path": "tests/golden/WBV2-P14-003/inventory-coverage-gate-report.json",
"sha256": "5ef8bec5dfe603452b04629709ca0e7f11b2ce4cec4a96af25f6c4b7634b64bd"
},
"generator": {
"path": "tools/web/generate-wbv2-inventory-coverage-gate.mjs",
"sha256": "ad1fde9bc82da4b6a28a99387a1990fbf2abfa6b90096d3e06267b65a0f9ceb0"
},
"status": {
"path": "docs/status/WBV2-P14-003.md",
"sha256": "94c256ec1654b4da2c674a6332f4b8d402dd257123d790f31016420f7114efc5"
},
"parityPlan": {
"path": "tests/golden/WBV2-P14-003/coverage-task-plan.json",
"sha256": "ea40e63b984c475c41b3a4ae8c3e8d8966c86a2574f0432839a2ff254660f3de"
},
"taskContext": {
"path": "tests/golden/WBV2-P14-003/task-context.json",
"sha256": "2f26d1a898a9edd0bc8ee89ad0393e4a3c2c904ee0975bfd40a8f14b8195224b"
}
},
"assertions": {
"inventoryTotal": 6900,
"inventoryCompleted": 281,
"inventoryActive": 1,
"inventoryPending": 6618,
"allEntriesBucketed": true,
"capabilityBuckets": 15,
"representativeEvidenceBuckets": 7,
"fullFamilyParityClaims": 0,
"engineBoundFeatureClaims": 8,
"minimumNewRunsIfAllBatchesExecuted": 14,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"duplicateValidationAvoided": true,
"provenanceEpoch": 2,
"authorizedRebaselineOnly": true,
"fullHistoricalReproduction": false,
"deterministic": true
},
"nextTask": null
}

View File

@@ -0,0 +1,177 @@
{
"schemaVersion": 1,
"task": "WBV2-P14-003",
"parentTask": "WBV2-P14-002",
"status": "done",
"goal": "Close the coverage gate with a limited declaration and machine-checkable batching policy.",
"scope": {
"gap": "workflow:close_inventory_coverage_gate",
"ownerFamily": "RELEASE",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"node tools/web/generate-wbv2-inventory-coverage-gate.mjs --write",
"node tools/web/check-task-context.mjs --task WBV2-P14-003 --write"
],
"inputPaths": [
"tests/golden/WBV2-P14-002/capability-evidence-report.json"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2543,
"contextRemainingTokens": 634
},
"source": {
"bytes": 7361,
"tokens": 1842
},
"selected": [
{
"path": "tests/golden/WBV2-P14-002/capability-evidence-report.json",
"bytes": 1219,
"tokens": 305
}
],
"excluded": [
{
"path": "tests/golden/WBV2-P14-002/capability-evidence-matrix.json",
"bytes": 9752,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P14-002/manifest.json",
"bytes": 0,
"reason": "ALREADY_IN_CONTEXT"
},
{
"path": "tests/golden/WBV2-P14-003/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P14-003.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P14-003/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1219,
"tokens": 305
}
},
"exitCriteria": [
"all entries have a capability bucket",
"feature claims remain evidence-bound",
"no historical or inventory over-claim"
],
"nextTask": null,
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P14-003.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P14-002/manifest.json",
"parentStatus": "docs/status/WBV2-P14-002.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P14-003.md",
"tests/golden/WBV2-P14-002/manifest.json",
"docs/status/WBV2-P14-002.md"
],
"machineOnly": [
"tests/golden/WBV2/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "WBV2-P14-002",
"parentTask": "WBV2-P14-001",
"status": "done",
"nextTask": "WBV2-P14-003",
"artifactCount": 11
},
"statusSummary": [
"# WBV2-P14-002 status",
"- task: `WBV2-P14-002`; parent: `WBV2-P14-001`; status: `done`",
"- capability buckets reconciled: `15`; inventory: `6900` total, `6618` pending",
"- representative-evidence buckets: `7`; unproven pending buckets: `7`; active unproven: `1`",
"- engine-bound claims referenced: `8`; full-family parity claims: `0`",
"- repeated Blender/Chromium validation: `0`; duplicate validation avoided: `true`",
"- nextTask: `WBV2-P14-003`",
"This matrix binds the P14 coverage ledger to the eight P13 feature claims. Representative receipts remain partial slices; a capability family is not complete until each entry has its own evidence."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1211,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 35,
"taskTokens": 303
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2803,
"lines": 51,
"tokens": 701
},
{
"path": "docs/tasks/WBV2-P14-003.md",
"bytes": 1211,
"lines": 35,
"tokens": 303
},
{
"path": "tests/golden/WBV2-P14-002/manifest.json",
"bytes": 2713,
"lines": 73,
"tokens": 679
},
{
"path": "docs/status/WBV2-P14-002.md",
"bytes": 634,
"lines": 11,
"tokens": 159
}
],
"sourceTokens": 1842,
"evidenceFiles": 1,
"evidenceBytes": 1219,
"evidenceTokens": 305,
"totalTokens": 2147,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3171,
"serializedContextTokens": 679,
"withinBudget": true
}
}

View File

@@ -1,62 +1,4 @@
{"id":"WBV2-P0-001","gapId":"workflow:reconcile_scope_and_checkpoints","ownerFamily":"PROGRAM","sourceTask":"P0","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["corrective owner-review status is explicit","legacy parent pointer is unchanged","plan has one activation gate"]}
{"id":"WBV2-P0-002","gapId":"workflow:generate_blender52_inventory_and_parity_map","ownerFamily":"PARITY","sourceTask":"P0","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["unknown entries are classified","inventory is deterministic","no entry claims feature parity without evidence"]}
{"id":"WBV2-P0-003","gapId":"workflow:freeze_capability_error_budget_contract","ownerFamily":"PROTOCOL","sourceTask":"P0","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["unsupported input fails closed","schema hashes are stable","migration policy preserves unknown data"]}
{"id":"WBV2-P1-001","gapId":"workflow:stabilize_runtime_variants_and_source_receipts","ownerFamily":"RUNTIME","sourceTask":"P1","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["variant fallback is deterministic","source/build hash is verified","one engine session has one generation"]}
{"id":"WBV2-P1-002","gapId":"workflow:unify_sceneir_stable_ids_and_binary_deltas","ownerFamily":"MAIN","sourceTask":"P1","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["IDs survive save/reopen","malformed chunk is rejected","desktop and WASM canonical hashes match"]}
{"id":"WBV2-P1-003","gapId":"workflow:unify_main_transaction_history_and_save","ownerFamily":"MAIN","sourceTask":"P1","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["failed/no-op commands add no history","stale revision cannot commit","reopen state is byte/hash stable"]}
{"id":"WBV2-P1-004","gapId":"workflow:harden_worker_cancel_restart_and_dispose","ownerFamily":"RUNTIME","sourceTask":"P1","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["cancel never publishes result","generation mismatch is rejected","CPU/WASM/GPU owners return to budget"]}
{"id":"WBV2-P1-005","gapId":"workflow:harden_opfs_indexeddb_journal_recovery","ownerFamily":"STORAGE","sourceTask":"P1","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["interrupted commit leaves old project usable","hash mismatch quarantines payload","small project recovers after restart"]}
{"id":"WBV2-P2-001","gapId":"EDITOR.OPEN_SCENE","ownerFamily":"EDITOR","sourceTask":"P2","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["stable IDs and selection revision match","missing data is structured","reopen preserves context"]}
{"id":"WBV2-P2-002","gapId":"OBJECT.TRANSFORM_HIERARCHY","ownerFamily":"EDITOR","sourceTask":"P2","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["world matrix parity","cycle/locked/library edits reject","undo/redo/save/reopen stable"]}
{"id":"WBV2-P2-003","gapId":"MESH.EDIT_CORE","ownerFamily":"MESH","sourceTask":"P2","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["topology/attributes match","invalid selection and budget fail closed","single transaction and reopen stable"]}
{"id":"WBV2-P2-004","gapId":"VIEWPORT.MAIN_OFFSCREEN","ownerFamily":"VIEWPORT","sourceTask":"P2","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["both paths have nonblank pixels","selection/camera revision is shared","device loss releases resources"]}
{"id":"WBV2-P2-005","gapId":"WORKFLOW.P0_USER_LOOP","ownerFamily":"INTEGRATION","sourceTask":"P2","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["Main revision and exported asset are bound","fault/cancel leaves old state","Chromium production path passes"]}
{"id":"WBV2-P3-001","gapId":"MATERIAL.PBR_UV","ownerFamily":"MATERIAL","sourceTask":"P3","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["desktop/WASM node fields match","unsupported node retained/blocked","packed asset survives reopen"]}
{"id":"WBV2-P3-002","gapId":"ANIMATION.TRS_ACTION","ownerFamily":"ANIMATION","sourceTask":"P3","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["sampled values and handles match","stale frame result rejected","undo/save/reopen stable"]}
{"id":"WBV2-P3-003","gapId":"RIG.POSE_SKIN","ownerFamily":"RIG","sourceTask":"P3","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["pose matrices and weights match","unsupported constraint is explicit","save/reopen and small recovery pass"]}
{"id":"WBV2-P3-004","gapId":"IO.GLB_ROUNDTRIP","ownerFamily":"IO","sourceTask":"P3","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["roundtrip canonical graph matches","sparse/external URI/budget negatives reject","no silent loss"]}
{"id":"WBV2-P3-005","gapId":"ASSET.LIBRARY_OPERATIONS","ownerFamily":"ASSET","sourceTask":"P3","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["source/hash/owner identity preserved","linked mutation blocked","stale generation and missing source fail closed"]}
{"id":"WBV2-P4-001","gapId":"MODIFIER.DECLARED_SLICES","ownerFamily":"MODIFIER","sourceTask":"P4","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["desktop/evaluated Main match","unknown modifier retained and blocked","apply/undo/save/reopen stable"]}
{"id":"WBV2-P4-002","gapId":"NODES.ALLOWLIST","ownerFamily":"NODES","sourceTask":"P4","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["node/socket/link/default parity","budget and unknown-node block before commit","compile failure rolls back"]}
{"id":"WBV2-P4-003","gapId":"SCULPT.NONMESH.PAINT_BOUNDED","ownerFamily":"SCULPT","sourceTask":"P4","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["Main commit is atomic","unsupported brush/solver returns stable code","GPU/OOM/restart recovery passes"]}
{"id":"WBV2-P4-004","gapId":"SIMULATION.CACHE_LIFECYCLE","ownerFamily":"SIMULATION","sourceTask":"P4","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["stale/corrupt cache never publishes","small cache recovers after restart","budget release is observable"]}
{"id":"WBV2-P5-001","gapId":"RENDER.ROUTING","ownerFamily":"RENDER","sourceTask":"P5","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["source/settings/build identity bound","unsupported route cannot pretend local success","cancel/device loss releases resources"]}
{"id":"WBV2-P5-002","gapId":"MEDIA.BOUNDED_WORKFLOW","ownerFamily":"MEDIA","sourceTask":"P5","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["seek/decode revision ordering","cancel/timeout does not publish","quota/OOM/restart leaves project valid"]}
{"id":"WBV2-P5-003","gapId":"SERVER.JOB_BINDING","ownerFamily":"SERVER","sourceTask":"P5","state":"completed","targetImplementationClass":"SERVER_EXACT","exitCriteria":["duplicate request is idempotent","stale result cannot bind","timeout/cancel/OOM produces no READY output"]}
{"id":"WBV2-P6-001","gapId":"SECURITY.SCRIPTING","ownerFamily":"SECURITY","sourceTask":"P6","state":"completed","targetImplementationClass":"EXCLUDED","exitCriteria":["autorun/network/add-on defaults deny","sandbox cancellation/dispose works","no secret or filesystem escape"]}
{"id":"WBV2-P6-002","gapId":"workflow:performance_fault_and_recovery_matrix","ownerFamily":"RELIABILITY","sourceTask":"P6","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["100k/1M/10M thresholds recorded","fault leaves old revision usable","all owned resources return to budget"]}
{"id":"WBV2-P6-003","gapId":"workflow:offline_ci_sbom_and_rollback_release","ownerFamily":"RELEASE","sourceTask":"P6","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["quick/Chromium/release lanes pass","artifact hashes reproduce","upgrade/rollback and known limitations are tested"]}
{"id":"WBV2-P7-001","gapId":"workflow:cluster_full_blender_gap_inventory","ownerFamily":"PARITY","sourceTask":"P7","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["each gap has stable ID and owner","negative-only/unsupported is not positive parity","clusters are deterministic"]}
{"id":"WBV2-P7-002","gapId":"workflow:generate_atomic_family_gap_queue","ownerFamily":"PROGRAM","sourceTask":"P7","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["one active ready task","no guessed successor","each card fits context budget"]}
{"id":"WBV2-P7-003","gapId":"workflow:full_parity_candidate_release_gate","ownerFamily":"RELEASE","sourceTask":"P7","state":"pending","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["all claims bind to evidence","blocked/excluded/server classes remain explicit","queue and protected hashes pass"]}
{"id":"WBV2-P8-000","gapId":"workflow:authorize_recovery_capability_root","ownerFamily":"PROGRAM","sourceTask":"P8","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P7 evidence remains hash exact","recovery scope is explicit","one recovery task is active"]}
{"id":"WBV2-P8-001","gapId":"workflow:rebaseline_mutable_inventories","ownerFamily":"PROGRAM","sourceTask":"P8","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only expected mutable hashes drift","dependency closure is unchanged","historical manifests remain unmodified"]}
{"id":"WBV2-P8-002","gapId":"workflow:close_atomic_chromium_receipts","ownerFamily":"PARITY","sourceTask":"P8","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["45 receipts are manifest-bound","desktop/WASM/save-reopen behaviors are explicit","Chromium is the only browser"]}
{"id":"WBV2-P8-003","gapId":"workflow:authorize_m12_provenance_epoch","ownerFamily":"PROGRAM","sourceTask":"P8","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["22 restored originals stay exact","62 unavailable entries are not called restored","all replacements are hash-bound"]}
{"id":"WBV2-P8-004","gapId":"workflow:recompute_recovery_release_gate","ownerFamily":"RELEASE","sourceTask":"P8","state":"pending","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["all receipts bind to manifests","provenance epoch is explicit","all governance gates pass"]}
{"id":"WBV2-P9-000","gapId":"workflow:authorize_feature_parity_continuation","ownerFamily":"PROGRAM","sourceTask":"P9","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P8 provenance evidence remains exact","authorized baseline is explicit","one feature task is active"]}
{"id":"WBV2-P9-001","gapId":"CAP-MESH-POSITIVE-EDIT","ownerFamily":"MESH","sourceTask":"P9","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["real meshTranslateVertex command passes","desktop/WASM delta matches","save/reopen is exact","malformed/stale/unknown inputs fail closed"]}
{"id":"WBV2-P9-002","gapId":"CAP-MODIFIER-STATE-MUTATION","ownerFamily":"MODIFIER","sourceTask":"P9","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["real modifierSetEnabled command passes","desktop/WASM delta matches","save/reopen is exact"]}
{"id":"WBV2-P9-003","gapId":"CAP-ASSET-CATALOG-MUTATION","ownerFamily":"ASSET","sourceTask":"P9","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["real assetCatalogAppend command passes","resource hash is bound","save/reopen is exact"]}
{"id":"WBV2-P9-004","gapId":"workflow:recompute_feature_parity_gate","ownerFamily":"RELEASE","sourceTask":"P9","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only evidenced feature claims are emitted","authorized baseline remains explicit","full historical reproduction remains false"]}
{"id":"WBV2-P10-000","gapId":"workflow:authorize_native_engine_parity_continuation","ownerFamily":"PROGRAM","sourceTask":"P10","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P9 evidence remains hash-bound","native build/runtime is explicit","one native parity task is active"]}
{"id":"WBV2-P10-001","gapId":"workflow:reconcile_wbv2_inventory_source_drift","ownerFamily":"PARITY","sourceTask":"P10","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["historical P0 hashes remain unchanged","only authorized plan drift is recorded","dependency roots/lockfile/closure remain stable","inventory checker passes using current baseline"]}
{"id":"WBV2-P10-002","gapId":"ENGINE.NATIVE_WASM_BRIDGE","ownerFamily":"ENGINE","sourceTask":"P10","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["native Blender binary is source-bound","WASM binary and JS are hash-bound","same mutation reaches real engine/Main","save/reopen and failures remain exact"]}
{"id":"WBV2-P10-003","gapId":"CORE.MODULE_MATRIX","ownerFamily":"PARITY","sourceTask":"P10","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["positive cases are L2+","negative cases do not mutate Main","shards use one catalog hash","unmapped and retained-negative cases stay explicit"]}
{"id":"WBV2-P11-000","gapId":"workflow:authorize_module_expansion_continuation","ownerFamily":"PROGRAM","sourceTask":"P11","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P10 evidence remains hash-bound","one expansion task is active","full historical reproduction remains false"]}
{"id":"WBV2-P11-001","gapId":"MESH.EDIT_TOPOLOGY_FAMILY","ownerFamily":"MESH","sourceTask":"P11","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["six mesh operations mutate Main","revision increments exactly once","save/reopen preserves topology counts","invalid selection and incompatible configuration fail closed"]}
{"id":"WBV2-P11-002","gapId":"MODIFIER.PARAMETER_APPLY_FAMILY","ownerFamily":"MODIFIER","sourceTask":"P11","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["parameter mutation is native/WASM bound","apply result is evaluated","save/reopen is exact","dependency and stale inputs fail closed"]}
{"id":"WBV2-P11-003","gapId":"ASSET.LINK_OVERRIDE_RELOAD_FAMILY","ownerFamily":"ASSET","sourceTask":"P11","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source ownership is preserved","override is local and hash-bound","reload revision is checked","missing source remains explicit"]}
{"id":"WBV2-P11-004","gapId":"workflow:recompute_engine_module_gate","ownerFamily":"RELEASE","sourceTask":"P11","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only engine-bound claims are emitted","inventory remainder is explicit","provenance epoch 2 remains authorized rebaseline only","full historical reproduction remains false"]}
{"id":"WBV2-P12-000","gapId":"workflow:authorize_domain_expansion_continuation","ownerFamily":"PROGRAM","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P11 evidence remains hash-bound","domain tasks use existing source receipts","one ledger task is active"]}
{"id":"WBV2-P12-001","gapId":"workflow:reconcile_existing_capability_ledger","ownerFamily":"PARITY","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["all source manifests are hash-verified","only done receipts enter proven evidence","L0/metadata and blocked cases remain explicit","inventory remainder is preserved"]}
{"id":"WBV2-P12-002","gapId":"EDITOR.SCENE_OBJECT_ENGINE","ownerFamily":"EDITOR","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["visibility and transform mutate Main","desktop source oracle is bound","save/reopen is exact","stale and malformed commands fail closed"]}
{"id":"WBV2-P12-003","gapId":"AUTHORING.MATERIAL_ANIMATION_ENGINE","ownerFamily":"AUTHORING","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["material and keyframe Main mutations pass","source hashes are bound","save/reopen is exact","unsupported graph and stale frame inputs fail closed"]}
{"id":"WBV2-P12-004","gapId":"VIEWPORT.NONMESH_ENGINE","ownerFamily":"VIEWPORT","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["nonblank viewport evidence is bound","non-mesh data is explicit","unsupported and budget cases fail closed","save/reopen and resource disposal are exact"]}
{"id":"WBV2-P12-005","gapId":"workflow:recompute_domain_parity_gate","ownerFamily":"RELEASE","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only engine-bound domain claims are emitted","unproven inventory remains explicit","epoch 2 remains authorized rebaseline only","full historical reproduction remains false"]}
{"id":"WBV2-P13-000","gapId":"workflow:authorize_high_value_domain_continuation","ownerFamily":"PROGRAM","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P12 evidence remains hash-bound","existing advanced receipts are reusable","one ledger task is active"]}
{"id":"WBV2-P13-001","gapId":"workflow:reconcile_advanced_domain_ledger","ownerFamily":"PARITY","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["source manifests are hash-verified","existing reports are classified conservatively","no repeated Blender/Chromium run","unproven advanced domains stay explicit"]}
{"id":"WBV2-P13-002","gapId":"NODES.GEOMETRY_ENGINE","ownerFamily":"NODES","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["graph hashes are stable","unsupported nodes remain explicit","save/reopen is exact","malformed graph and budget cases fail closed"]}
{"id":"WBV2-P13-003","gapId":"RIG.POSE_ENGINE","ownerFamily":"RIG","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["stable bone IDs and matrices are preserved","unsupported constraint is explicit","save/reopen is exact","malformed pose input fails closed"]}
{"id":"WBV2-P13-004","gapId":"ADVANCED.SIMULATION_RENDER_MEDIA","ownerFamily":"ADVANCED","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["existing exact reports are reused","unsupported routes remain explicit","hash and lifecycle states are bound","no false local parity claim"]}
{"id":"WBV2-P13-005","gapId":"workflow:recompute_high_value_domain_gate","ownerFamily":"RELEASE","sourceTask":"P13","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only evidenced claims are emitted","inventory remainder stays explicit","provenance limitation stays explicit","full historical reproduction remains false"]}
{"id":"WBV2-P14-000","gapId":"workflow:authorize_inventory_coverage_continuation","ownerFamily":"PROGRAM","sourceTask":"P14","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P13 evidence remains hash-bound","inventory counts are deterministic","one coverage task is active"]}
{"id":"WBV2-P14-001","gapId":"workflow:generate_inventory_coverage_ledger","ownerFamily":"PARITY","sourceTask":"P14","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["all entries are accounted for","pending remainder stays explicit","existing receipts are reused","no duplicate execution"]}
{"id":"WBV2-P14-002","gapId":"workflow:reconcile_capability_evidence_matrix","ownerFamily":"PARITY","sourceTask":"P14","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only hash-bound claims are promoted","partial capability coverage is explicit","6900 remainder is unchanged"]}
{"id":"WBV2-P14-003","gapId":"workflow:close_inventory_coverage_gate","ownerFamily":"RELEASE","sourceTask":"P14","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["all entries have a capability bucket","feature claims remain evidence-bound","no historical or inventory over-claim"]}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,53 @@
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const write = process.argv.includes("--write");
const absolute = (file) => path.join(root, file);
const read = (file) => fs.readFileSync(absolute(file), "utf8");
const json = (file) => JSON.parse(read(file));
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
const outputRoot = "tests/golden/WBV2-P14-002";
const matrixPath = `${outputRoot}/capability-evidence-matrix.json`;
const reportPath = `${outputRoot}/capability-evidence-report.json`;
const statusPath = "docs/status/WBV2-P14-002.md";
const planPath = `${outputRoot}/coverage-task-plan.json`;
const manifestPath = `${outputRoot}/manifest.json`;
const parentPath = "tests/golden/WBV2-P14-001/manifest.json";
const ledgerPath = "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json";
const ledgerReportPath = "tests/golden/WBV2-P14-001/coverage-ledger-report.json";
const gatePath = "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json";
const matrixTemplatePath = "docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json";
const parent = json(parentPath);
assert.equal(parent.task, "WBV2-P14-001"); assert.equal(parent.status, "done"); assert.equal(parent.nextTask, "WBV2-P14-002");
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
const ledger = json(ledgerPath); const ledgerReport = json(ledgerReportPath); const gate = json(gatePath);
assert.equal(ledger.status, "READY"); assert.equal(ledger.inventory.total, 6900); assert.equal(ledger.inventory.pending, 6618); assert.equal(ledger.buckets.length, 15);
assert.equal(ledgerReport.status, "PASS"); assert.equal(ledgerReport.ledgerSha256, sha256(ledgerPath)); assert.equal(gate.status, "PASS");
assert.equal(gate.decision.featureParityClaimCount, 8); assert.equal(gate.decision.fullHistoricalReproduction, false);
const claimSet = new Set(gate.decision.featureParityClaims);
const entries = ledger.buckets.map((bucket) => {
const claims = bucket.representativeEvidence?.claims ?? [];
for (const claim of claims) assert(claimSet.has(claim), `${bucket.capabilityId} references undeclared claim ${claim}`);
const complete = bucket.completed ?? 0; const pending = bucket.pending ?? 0; const active = bucket.active ?? 0;
const evidenceClass = claims.length > 0 ? "PARTIAL_REPRESENTATIVE" : active > 0 ? "ACTIVE_UNPROVEN" : pending > 0 ? "UNPROVEN_PENDING" : "LEGACY_COMPLETED_NO_ENGINE_CLAIM";
return { capabilityId: bucket.capabilityId, family: bucket.family, layer: bucket.layer, total: bucket.total, completed: complete, pending, active, evidenceClass, representativeClaims: claims, representativeEvidence: bucket.representativeEvidence?.evidence ?? "no engine-bound receipt", sourceTasks: bucket.sourceTasks, kinds: bucket.kinds, fullFamilyParity: false, inventoryRemainderExplicit: true };
}).sort((a, b) => a.capabilityId.localeCompare(b.capabilityId));
assert.equal(entries.reduce((sum, entry) => sum + entry.total, 0), 6900); assert.equal(entries.reduce((sum, entry) => sum + entry.pending, 0), 6618); assert.equal(entries.filter((entry) => entry.evidenceClass === "PARTIAL_REPRESENTATIVE").length, 7);
const matrix = { schemaVersion: 1, task: "WBV2-P14-002", operation: "CAPABILITY_EVIDENCE_MATRIX_RECONCILIATION", status: "READY", source: { ledger: ledgerPath, ledgerSha256: sha256(ledgerPath), ledgerReport: ledgerReportPath, ledgerReportSha256: sha256(ledgerReportPath), highValueGate: gatePath, highValueGateSha256: sha256(gatePath), template: matrixTemplatePath, templateSha256: sha256(matrixTemplatePath) }, policy: { representativeClaimsDoNotCloseFamily: true, fullFamilyParityRequiresEntryEvidence: true, inventoryRemainderExplicit: true, historicalBytesReadOnly: true, duplicateValidationAvoided: true }, inventory: { total: 6900, completed: 281, active: 1, pending: 6618, buckets: 15 }, entries };
const report = { schemaVersion: 1, task: "WBV2-P14-002", operation: "RECONCILE_CAPABILITY_EVIDENCE_MATRIX", status: "PASS", matrixSha256: "PENDING", inventory: matrix.inventory, evidenceClasses: { partialRepresentative: entries.filter((entry) => entry.evidenceClass === "PARTIAL_REPRESENTATIVE").length, unprovenPending: entries.filter((entry) => entry.evidenceClass === "UNPROVEN_PENDING").length, activeUnproven: entries.filter((entry) => entry.evidenceClass === "ACTIVE_UNPROVEN").length, legacyCompletedNoEngineClaim: entries.filter((entry) => entry.evidenceClass === "LEGACY_COMPLETED_NO_ENGINE_CLAIM").length }, featureClaims: [...claimSet], efficiency: { oneLedgerInput: true, existingReceiptsReused: true, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, duplicateValidationAvoided: true }, policy: matrix.policy, nextTask: "WBV2-P14-003" };
if (!write) { process.stdout.write(`wbv2-capability-evidence-matrix-ok task=WBV2-P14-002 buckets=15 partial=${report.evidenceClasses.partialRepresentative} pending=6618 claims=8 repeatedRuns=0 next=WBV2-P14-003\n`); process.exit(0); }
fs.mkdirSync(absolute(outputRoot), { recursive: true }); fs.writeFileSync(absolute(matrixPath), `${JSON.stringify(matrix, null, 2)}\n`); report.matrixSha256 = sha256(matrixPath); fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(absolute(statusPath), `# WBV2-P14-002 status\n\n- task: \`WBV2-P14-002\`; parent: \`WBV2-P14-001\`; status: \`done\`\n- capability buckets reconciled: \`15\`; inventory: \`6900\` total, \`6618\` pending\n- representative-evidence buckets: \`${report.evidenceClasses.partialRepresentative}\`; unproven pending buckets: \`${report.evidenceClasses.unprovenPending}\`; active unproven: \`${report.evidenceClasses.activeUnproven}\`\n- engine-bound claims referenced: \`${claimSet.size}\`; full-family parity claims: \`0\`\n- repeated Blender/Chromium validation: \`0\`; duplicate validation avoided: \`true\`\n- nextTask: \`WBV2-P14-003\`\n\nThis matrix binds the P14 coverage ledger to the eight P13 feature claims. Representative receipts remain partial slices; a capability family is not complete until each entry has its own evidence.\n`);
const previousPlan = json("tests/golden/WBV2-P14-001/coverage-task-plan.json"); const nextPlan = structuredClone(previousPlan); nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P14-001/coverage-task-plan.json", sha256: sha256("tests/golden/WBV2-P14-001/coverage-task-plan.json") }; nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P14-002" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P14-003" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
fs.writeFileSync(absolute("docs/tasks/WBV2-P14-003.md"), read("docs/tasks/WBV2-P14-003.md").replace("- status: planned", "- status: in_progress")); execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P14-002", "--write"], { cwd: root, stdio: "inherit" });
const artifactPaths = { parentManifest: parentPath, ledger: ledgerPath, ledgerReport: ledgerReportPath, highValueGate: gatePath, matrixTemplate: matrixTemplatePath, matrix: matrixPath, report: reportPath, generator: "tools/web/generate-wbv2-capability-evidence-matrix.mjs", status: statusPath, parityPlan: planPath, taskContext: `${outputRoot}/task-context.json` }; const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); const manifest = { schemaVersion: 1, task: "WBV2-P14-002", parentTask: "WBV2-P14-001", operation: "RECONCILE_CAPABILITY_EVIDENCE_MATRIX", status: "done", enablingTask: true, parityStateChange: false, runtime: "READ_ONLY_CAPABILITY_EVIDENCE_RECONCILIATION", artifacts, assertions: { inventoryTotal: 6900, inventoryPending: 6618, capabilityBuckets: 15, representativeEvidenceBuckets: report.evidenceClasses.partialRepresentative, unprovenPendingBuckets: report.evidenceClasses.unprovenPending, activeUnprovenBuckets: report.evidenceClasses.activeUnproven, engineBoundClaims: claimSet.size, fullFamilyParityClaims: 0, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, duplicateValidationAvoided: true, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P14-003" }; fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
let queue = read("docs/EXECUTION_QUEUE.md"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P14-003` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P14-002/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P14-003.md`](tasks/WBV2-P14-003.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
let nextTaskFile = read("nextTask.md"); nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P14-003` |").replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |").replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P14-002/manifest.json` |").replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P14-003.md` |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `NONE` |").replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-inventory-coverage-gate.mjs --write` |"); fs.writeFileSync(absolute("nextTask.md"), nextTaskFile);
process.stdout.write(`wbv2-capability-evidence-matrix-written task=WBV2-P14-002 buckets=15 partial=${report.evidenceClasses.partialRepresentative} pending=6618 claims=8 repeatedRuns=0 next=WBV2-P14-003 artifacts=${Object.keys(artifacts).length}\n`);

View File

@@ -0,0 +1,91 @@
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const write = process.argv.includes("--write");
const absolute = (file) => path.join(root, file);
const read = (file) => fs.readFileSync(absolute(file), "utf8");
const json = (file) => JSON.parse(read(file));
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
const outputRoot = "tests/golden/WBV2-P14-001";
const ledgerPath = `${outputRoot}/inventory-coverage-ledger.json`;
const reportPath = `${outputRoot}/coverage-ledger-report.json`;
const matrixPath = `${outputRoot}/capability-batch-summary.json`;
const statusPath = "docs/status/WBV2-P14-001.md";
const planPath = `${outputRoot}/coverage-task-plan.json`;
const manifestPath = `${outputRoot}/manifest.json`;
const parentPath = "tests/golden/WBV2-P14-000/manifest.json";
const inventoryPath = "tests/golden/WBV2-P0-002/parity-map.json";
const p13Path = "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json";
const parent = json(parentPath);
assert.equal(parent.task, "WBV2-P14-000");
assert.equal(parent.status, "done");
assert.equal(parent.nextTask, "WBV2-P14-001");
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
const inventory = json(inventoryPath);
const p13 = json(p13Path);
assert.equal(inventory.summary.inventoryEntries, 6900);
assert.equal(inventory.summary.pendingLegacyEntries, 6618);
assert.equal(inventory.summary.capabilityCount, 15);
assert.equal(p13.status, "PASS");
assert.equal(p13.decision.inventoryPending, 6618);
assert.equal(p13.decision.fullHistoricalReproduction, false);
const claimMap = new Map([
["CAP-CORE-OBJECT", { claims: ["CAP-SCENE-OBJECT-ENGINE"], mode: "REPRESENTATIVE_SLICE", evidence: "scene/object visibility and transform" }],
["CAP-CORE-SCENE-GRAPH", { claims: ["CAP-SCENE-OBJECT-ENGINE"], mode: "REPRESENTATIVE_SLICE", evidence: "scene/object visibility and transform" }],
["CAP-MATERIAL-RENDER", { claims: ["CAP-MATERIAL-ANIMATION-ENGINE"], mode: "REPRESENTATIVE_SLICE", evidence: "material/UV and animation receipt; render remains separate" }],
["CAP-MESH-EDITING", { claims: ["CAP-MESH-TOPOLOGY-FAMILY"], mode: "REPRESENTATIVE_SLICE", evidence: "six topology operations" }],
["CAP-MODIFIER-SYSTEM", { claims: ["CAP-MODIFIER-PARAMETER-APPLY"], mode: "REPRESENTATIVE_SLICE", evidence: "DECIMATE apply" }],
["CAP-NODES-GRAPH", { claims: ["NODES.GEOMETRY_ENGINE"], mode: "REPRESENTATIVE_SLICE", evidence: "three graph hashes; unsupported simulation rejected" }],
["CAP-RIG-ANIMATION", { claims: ["RIG.POSE_ENGINE"], mode: "REPRESENTATIVE_SLICE", evidence: "two bones and bounded constraint edit" }],
["CAP-VIEWPORT-NONMESH", { claims: ["CAP-VIEWPORT-NONMESH-ENGINE"], mode: "REPRESENTATIVE_SLICE", evidence: "non-mesh viewport receipt" }],
["CAP-ASSET-CATALOG-MUTATION", { claims: ["CAP-ASSET-LINK-OVERRIDE-RELOAD"], mode: "REPRESENTATIVE_SLICE", evidence: "ownership and local append" }],
]);
const sourceClaims = new Set(p13.decision.featureParityClaims);
for (const claim of ["CAP-MESH-TOPOLOGY-FAMILY", "CAP-MODIFIER-PARAMETER-APPLY", "CAP-ASSET-LINK-OVERRIDE-RELOAD", "CAP-SCENE-OBJECT-ENGINE", "CAP-MATERIAL-ANIMATION-ENGINE", "CAP-VIEWPORT-NONMESH-ENGINE", "NODES.GEOMETRY_ENGINE", "RIG.POSE_ENGINE"]) assert(sourceClaims.has(claim), claim);
const groups = new Map();
for (const entry of inventory.entries) {
const group = groups.get(entry.capabilityId) ?? { capabilityId: entry.capabilityId, family: entry.family, layer: entry.layer, total: 0, completed: 0, pending: 0, active: 0, representativeEvidence: claimMap.get(entry.capabilityId) ?? { claims: [], mode: "UNPROVEN", evidence: "no engine-bound receipt" }, kinds: {}, sourceTasks: new Set(), entries: [] };
group.total += 1;
group[entry.legacyState] = (group[entry.legacyState] ?? 0) + 1;
group.kinds[entry.kind] = (group.kinds[entry.kind] ?? 0) + 1;
group.sourceTasks.add(entry.sourceTask);
group.entries.push({ id: entry.id, sourceTask: entry.sourceTask, kind: entry.kind, layer: entry.layer, legacyState: entry.legacyState, state: entry.state, parityClaim: entry.parityClaim, targetImplementationClass: entry.targetImplementationClass });
groups.set(entry.capabilityId, group);
}
const buckets = [...groups.values()].sort((a, b) => a.capabilityId.localeCompare(b.capabilityId)).map((group) => ({ ...group, sourceTasks: [...group.sourceTasks].sort(), evidenceState: group.representativeEvidence.claims.length > 0 ? "PARTIAL_REPRESENTATIVE" : "UNPROVEN", claimCount: group.representativeEvidence.claims.length, entries: group.entries.sort((a, b) => a.id.localeCompare(b.id)) }));
assert.equal(buckets.length, 15);
assert.equal(buckets.reduce((sum, bucket) => sum + bucket.total, 0), 6900);
assert.equal(buckets.reduce((sum, bucket) => sum + (bucket.pending ?? 0), 0), 6618);
assert.equal(buckets.reduce((sum, bucket) => sum + (bucket.completed ?? 0), 0), 281);
assert.equal(buckets.reduce((sum, bucket) => sum + (bucket.active ?? 0), 0), 1);
const entryDigest = crypto.createHash("sha256").update(JSON.stringify(buckets.flatMap((bucket) => bucket.entries.map((entry) => [entry.id, entry.legacyState, entry.capabilityId ?? bucket.capabilityId])))).digest("hex");
const ledger = { schemaVersion: 1, task: "WBV2-P14-001", operation: "INVENTORY_COVERAGE_LEDGER", status: "READY", source: { path: inventoryPath, sha256: sha256(inventoryPath), entryDigest, immutable: true }, policy: { grouping: "CAPABILITY_FAMILY", reuseExistingReceipts: true, duplicateValidationAvoided: true, historicalBytesReadOnly: true, partialClaimsExplicit: true }, inventory: { total: 6900, completed: 281, pending: 6618, active: 1, capabilityBuckets: 15, remainderExplicit: true }, buckets, summary: { totalEntries: 6900, completedEntries: 281, pendingEntries: 6618, activeEntries: 1, buckets: 15, representativeClaimBuckets: buckets.filter((bucket) => bucket.claimCount > 0).length, unprovenBuckets: buckets.filter((bucket) => bucket.claimCount === 0).length, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, sourceClaimsReused: p13.decision.featureParityClaims.length } };
const compactBuckets = buckets.map(({ entries, ...bucket }) => ({ ...bucket, entries: entries.length }));
const report = { schemaVersion: 1, task: "WBV2-P14-001", operation: "GENERATE_INVENTORY_COVERAGE_LEDGER", status: "PASS", ledgerSha256: "PENDING", inventory: ledger.inventory, entryDigest, buckets: compactBuckets, efficiency: { fullInventoryStreamed: true, existingReceiptsReused: true, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, duplicateValidationAvoided: true, oneLedgerScan: true }, policy: ledger.policy, nextTask: "WBV2-P14-002" };
if (!write) { process.stdout.write(`wbv2-coverage-ledger-ok task=WBV2-P14-001 entries=6900 buckets=15 pending=6618 representative=${report.buckets.filter((b) => b.claimCount > 0).length} repeatedRuns=0 next=WBV2-P14-002\n`); process.exit(0); }
fs.mkdirSync(absolute(outputRoot), { recursive: true });
fs.writeFileSync(absolute(ledgerPath), `${JSON.stringify(ledger, null, 2)}\n`);
fs.writeFileSync(absolute(matrixPath), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P14-001", operation: "CAPABILITY_BATCH_SUMMARY", sourceLedger: ledgerPath, sourceLedgerSha256: sha256(ledgerPath), buckets: compactBuckets, entryDigest }, null, 2)}\n`);
report.ledgerSha256 = sha256(ledgerPath);
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(absolute(statusPath), `# WBV2-P14-001 status\n\n- task: \`WBV2-P14-001\`; parent: \`WBV2-P14-000\`; status: \`done\`\n- inventory streamed: \`6900\` entries across \`15\` capability buckets\n- state: \`281 completed\`, \`1 active\`, \`6618 pending\`\n- representative-evidence buckets: \`${report.buckets.filter((b) => b.claimCount > 0).length}\`; unproven buckets: \`${report.buckets.filter((b) => b.claimCount === 0).length}\`\n- repeated Blender/Chromium validation: \`0\`; duplicate validation avoided: \`true\`\n- entry digest: \`${entryDigest}\`\n- nextTask: \`WBV2-P14-002\`\n\nThe full inventory is streamed once and grouped by capability family. Existing P13 receipts are attached only as representative slices; no bucket is promoted to complete parity unless every entry has independent evidence. The 6618-entry remainder remains explicit.\n`);
const previousPlan = json("tests/golden/WBV2-P14-000/coverage-task-plan.json");
const nextPlan = structuredClone(previousPlan); nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P14-000/coverage-task-plan.json", sha256: sha256("tests/golden/WBV2-P14-000/coverage-task-plan.json") }; nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P14-001" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P14-002" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
fs.writeFileSync(absolute("docs/tasks/WBV2-P14-002.md"), read("docs/tasks/WBV2-P14-002.md").replace("- status: planned", "- status: in_progress"));
execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" });
execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P14-001", "--write"], { cwd: root, stdio: "inherit" });
const artifactPaths = { parentManifest: parentPath, inventory: inventoryPath, p13Gate: p13Path, ledger: ledgerPath, batchSummary: matrixPath, report: reportPath, generator: "tools/web/generate-wbv2-coverage-ledger.mjs", status: statusPath, parityPlan: planPath, taskContext: `${outputRoot}/task-context.json` };
const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }]));
const manifest = { schemaVersion: 1, task: "WBV2-P14-001", parentTask: "WBV2-P14-000", operation: "GENERATE_INVENTORY_COVERAGE_LEDGER", status: "done", enablingTask: true, parityStateChange: false, runtime: "READ_ONLY_STREAMED_INVENTORY_LEDGER", artifacts, assertions: { inventoryTotal: 6900, completedEntries: 281, activeEntries: 1, pendingEntries: 6618, capabilityBuckets: 15, allEntriesAccounted: true, representativeEvidenceBuckets: report.buckets.filter((b) => b.claimCount > 0).length, unprovenBuckets: report.buckets.filter((b) => b.claimCount === 0).length, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, duplicateValidationAvoided: true, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P14-002" };
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
let queue = read("docs/EXECUTION_QUEUE.md"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P14-002` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P14-001/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P14-002.md`](tasks/WBV2-P14-002.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
let nextTaskFile = read("nextTask.md"); nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P14-002` |").replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |").replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P14-001/manifest.json` |").replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P14-002.md` |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P14-003` |").replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-capability-evidence-matrix.mjs --write` |"); fs.writeFileSync(absolute("nextTask.md"), nextTaskFile);
process.stdout.write(`wbv2-coverage-ledger-written task=WBV2-P14-001 entries=6900 buckets=15 pending=6618 representative=${report.buckets.filter((b) => b.claimCount > 0).length} repeatedRuns=0 next=WBV2-P14-002 artifacts=${Object.keys(artifacts).length}\n`);

View File

@@ -0,0 +1,93 @@
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const absolute = (file) => path.join(root, file);
const read = (file) => fs.readFileSync(absolute(file), "utf8");
const readJson = (file) => JSON.parse(read(file));
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
const p13ManifestPath = "tests/golden/WBV2-P13-005/manifest.json";
const p13ReportPath = "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json";
const p13StatusPath = "docs/status/WBV2-P13-005.md";
const p13ContextPath = "tests/golden/WBV2-P13-005/task-context.json";
const p14Root = "tests/golden/WBV2-P14-000";
const planPath = `${p14Root}/coverage-task-plan.json`;
const reportPath = `${p14Root}/coverage-root-report.json`;
const manifestPath = `${p14Root}/manifest.json`;
const statusPath = "docs/status/WBV2-P14-000.md";
const parityMapPath = "tests/golden/WBV2-P0-002/parity-map.json";
const matrixPath = "docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json";
const p13 = readJson(p13ManifestPath);
const p13Report = readJson(p13ReportPath);
assert.equal(p13.task, "WBV2-P13-005");
assert.equal(p13.status, "done");
assert.equal(p13.nextTask, null);
assert.equal(p13Report.status, "PASS");
assert.equal(p13Report.decision.fullHistoricalReproduction, false);
assert.equal(p13Report.decision.inventoryPending, 6618);
for (const artifact of Object.values(p13.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
const parityMap = readJson(parityMapPath);
assert.equal(parityMap.summary.inventoryEntries, 6900);
assert.equal(parityMap.summary.pendingLegacyEntries, 6618);
assert.equal(parityMap.summary.capabilityCount, 15);
const tasks = [
{ id: "WBV2-P14-000", phase: "P14", title: "authorize_inventory_coverage_continuation", kind: "enabling", owner: "PROGRAM", dependsOn: ["WBV2-P13-005"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p14-governance", gate: "G0", card: "docs/tasks/WBV2-P14-000.md", behavior: "Authorize a machine-readable 6900-entry coverage continuation without reopening completed production receipts.", outputs: ["coverage root", "batch plan", "scope limits"], acceptance: ["P13 evidence remains hash-bound", "inventory counts are deterministic", "one coverage task is active"], status: "done", ready: false, queueMutationAllowed: true },
{ id: "WBV2-P14-001", phase: "P14", title: "generate_inventory_coverage_ledger", kind: "enabling", owner: "PARITY", dependsOn: ["WBV2-P14-000"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p14-ledger", gate: "G0", card: "docs/tasks/WBV2-P14-001.md", behavior: "Cluster all 6900 inventory entries by capability and bind representative evidence without repeated Blender or Chromium execution.", outputs: ["coverage ledger", "capability counts", "batch digest"], acceptance: ["all entries are accounted for", "pending remainder stays explicit", "existing receipts are reused", "no duplicate execution"], status: "in_progress", ready: true, queueMutationAllowed: false },
{ id: "WBV2-P14-002", phase: "P14", title: "reconcile_capability_evidence_matrix", kind: "enabling", owner: "PARITY", dependsOn: ["WBV2-P14-001"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p14-matrix", gate: "G2", card: "docs/tasks/WBV2-P14-002.md", behavior: "Reconcile capability-level evidence classes and representative slices from the coverage ledger.", outputs: ["evidence matrix", "claim map", "unproven map"], acceptance: ["only hash-bound claims are promoted", "partial capability coverage is explicit", "6900 remainder is unchanged"], status: "planned", ready: false, queueMutationAllowed: false },
{ id: "WBV2-P14-003", phase: "P14", title: "close_inventory_coverage_gate", kind: "enabling", owner: "RELEASE", dependsOn: ["WBV2-P14-002"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p14-release", gate: "G5", card: "docs/tasks/WBV2-P14-003.md", behavior: "Close the coverage gate with a limited declaration and machine-checkable batching policy.", outputs: ["coverage gate", "efficiency declaration", "next batch policy"], acceptance: ["all entries have a capability bucket", "feature claims remain evidence-bound", "no historical or inventory over-claim"], status: "planned", ready: false, queueMutationAllowed: false },
];
const plan = { schemaVersion: 1, planId: "BLENDER_WEB_PARITY_V2_INVENTORY_COVERAGE_EPOCH_1", status: "ACTIVE_INVENTORY_COVERAGE_QUEUE", authority: "queue_reactivated_after_p13_high_value_gate", productContract: "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", sourcePlan: "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", executionPointer: "docs/EXECUTION_QUEUE.md", runtimePolicy: { blenderSource: "blender-5.2.0", browserEvidence: ["chromium"], forbiddenBrowsers: ["firefox", "webkit"], mainAuthority: "blender_main", reusePolicy: "existing_receipts_before_new_runs" }, coveragePolicy: { inventoryTotal: 6900, pendingAtStart: 6618, grouping: "capability-family", duplicateValidation: "forbidden", historicalBytes: "read-only" }, tasks };
fs.mkdirSync(absolute(p14Root), { recursive: true });
fs.writeFileSync(absolute(planPath), `${JSON.stringify(plan, null, 2)}\n`);
const report = { schemaVersion: 1, task: "WBV2-P14-000", operation: "AUTHORIZE_INVENTORY_COVERAGE_CONTINUATION", status: "PASS", parent: { task: p13.task, manifest: p13ManifestPath, manifestSha256: sha256(p13ManifestPath), report: p13ReportPath, reportSha256: sha256(p13ReportPath), previousDecision: p13Report.decision.status, fullHistoricalReproduction: false }, continuation: { root: "WBV2-P14-000", firstTask: "WBV2-P14-001", plannedTasks: 4, inventoryTotal: 6900, inventoryPending: 6618, capabilityBuckets: parityMap.summary.capabilityCount, grouping: "capability-family", browser: "chromium", noRepeatedExecution: true }, policy: { p13EvidencePreserved: true, sourceHistoryReadOnly: true, authorizedRebaselineOnly: true, duplicateValidationAvoided: true, inventoryRemainderExplicit: true, fullHistoricalReproduction: false }, nextTask: "WBV2-P14-001" };
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(absolute("docs/tasks/WBV2-P14-000.md"), `# WBV2-P14-000: inventory coverage continuation root\n\n- task: WBV2-P14-000\n- parent: WBV2-P13-005\n- status: done\n- gap: workflow:authorize_inventory_coverage_continuation\n- ownerFamily: PROGRAM\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nAuthorize a machine-readable continuation for the 6900-entry inventory. P14 first groups entries by capability family and reuses hash-bound evidence; it does not reopen completed Blender or Chromium receipts.\n\n## 验收\n\n- \`node tools/web/generate-wbv2-coverage-root.mjs\`\n- \`node tools/web/check-execution-control-plane.mjs\`\n- \`node tools/web/check-v2-task-index.mjs\`\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P14-000/\`\n- Manifest: \`tests/golden/WBV2-P14-000/manifest.json\`\n- Rollback: restore P13-005 as queue parent without changing P13 evidence.\n`);
fs.writeFileSync(absolute(statusPath), `# WBV2-P14-000 status\n\n- task: \`WBV2-P14-000\`; parent: \`WBV2-P13-005\`; status: \`done\`\n- inventory scope: \`6900\` total, \`6618\` pending\n- capability buckets: \`${parityMap.summary.capabilityCount}\`; duplicate validation: \`forbidden\`\n- nextTask: \`WBV2-P14-001\`\n\nP14 is an authorized coverage continuation. It preserves the P13 high-value declaration and starts with a capability-family ledger so one representative receipt can be reused without claiming the entire family is complete.\n`);
p13Report.nextTask = "WBV2-P14-000";
p13Report.policy = { ...(p13Report.policy ?? {}), terminalQueuePointer: false, authorizedContinuation: "WBV2-P14-000" };
fs.writeFileSync(absolute(p13ReportPath), `${JSON.stringify(p13Report, null, 2)}\n`);
const p13Status = read(p13StatusPath).trim();
fs.writeFileSync(absolute(p13StatusPath), p13Status.includes("authorized continuation") ? `${p13Status}\n` : `${p13Status}\n- authorized continuation: \`WBV2-P14-000\`\n\nInventory coverage may continue under a new root without changing the high-value claim boundary.\n`);
p13.nextTask = "WBV2-P14-000";
p13.continuation = { authorized: true, root: "WBV2-P14-000", scope: "INVENTORY_COVERAGE_BATCHING" };
fs.writeFileSync(absolute(p13ManifestPath), `${JSON.stringify(p13, null, 2)}\n`);
execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P13-005", "--write"], { cwd: root, stdio: "pipe" });
p13.artifacts = Object.fromEntries(Object.entries(p13.artifacts).map(([name, artifact]) => [name, { ...artifact, sha256: sha256(artifact.path) }]));
fs.writeFileSync(absolute(p13ManifestPath), `${JSON.stringify(p13, null, 2)}\n`);
for (const task of tasks) {
const card = task.id === "WBV2-P14-000"
? read("docs/tasks/WBV2-P14-000.md")
: (() => {
const entrypoints = { "WBV2-P14-001": "generate-wbv2-coverage-ledger.mjs", "WBV2-P14-002": "generate-wbv2-capability-evidence-matrix.mjs", "WBV2-P14-003": "generate-wbv2-inventory-coverage-gate.mjs" };
const generator = entrypoints[task.id];
return `# ${task.id}: ${task.title}\n\n- task: ${task.id}\n- parent: ${task.dependsOn[0]}\n- status: ${task.status}\n- gap: workflow:${task.title}\n- ownerFamily: ${task.owner}\n- targetImplementationClass: ${task.implementationClass}\n\n## 目标\n\n${task.behavior}\n\n## 输入与范围\n\n- Focused input: \`tests/golden/WBV2-P14-000/coverage-root-report.json\`\n- Full inventory source (streamed by generator): \`tests/golden/WBV2-P0-002/parity-map.json\`\n- Parent evidence: \`tests/golden/${task.dependsOn[0]}/manifest.json\`\n- Production entrypoint: \`node tools/web/${generator} --write\`\n\n## 验收\n\n- all 6900 entries remain accounted for\n- hash-bound evidence is reused before any new execution\n- malformed, hash-drift, unsupported, or false-completion input keeps in_progress\n- \`node tools/web/${generator} --write\`\n- \`node tools/web/check-task-context.mjs --task ${task.id} --write\`\n\n## 交付与回滚\n\n- Reports: \`tests/golden/${task.id}/\`\n- Status: \`docs/status/${task.id}.md\`\n- Manifest: \`tests/golden/${task.id}/manifest.json\`\n- Rollback: restore ${task.dependsOn[0]} as queue parent.\n`;
})();
fs.writeFileSync(absolute(`docs/tasks/${task.id}.md`), card);
}
const rootArtifactPaths = { parentManifest: p13ManifestPath, parentReport: p13ReportPath, approval: "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", parityMap: parityMapPath, capabilityMatrix: matrixPath, plan: planPath, report: reportPath, rootCard: "docs/tasks/WBV2-P14-000.md", rootStatus: statusPath };
const artifacts = Object.fromEntries(Object.entries(rootArtifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }]));
const manifest = { schemaVersion: 1, task: "WBV2-P14-000", parentTask: "WBV2-P13-005", operation: "AUTHORIZE_INVENTORY_COVERAGE_CONTINUATION", status: "done", enablingTask: true, parityStateChange: false, runtime: "READ_ONLY_INVENTORY_COVERAGE_ROOT", artifacts, assertions: { p13EvidencePreserved: true, inventoryTotal: 6900, inventoryPending: 6618, capabilityBuckets: parityMap.summary.capabilityCount, duplicateValidationAvoided: true, authorizedRebaselineOnly: true, fullHistoricalReproduction: false }, nextTask: "WBV2-P14-001" };
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" });
let queue = read("docs/EXECUTION_QUEUE.md");
queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P14-001` |")
.replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P14-000/manifest.json` |")
.replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P14-001.md`](tasks/WBV2-P14-001.md) |");
fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
let nextTaskFile = read("nextTask.md");
nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P14-001` |")
.replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |")
.replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P14-000/manifest.json` |")
.replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P14-001.md` |")
.replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P14-002` |")
.replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-coverage-ledger.mjs --write` |");
fs.writeFileSync(absolute("nextTask.md"), nextTaskFile);
process.stdout.write("wbv2-coverage-root-written root=WBV2-P14-000 next=WBV2-P14-001 inventory=6900 pending=6618 buckets=15\n");

View File

@@ -0,0 +1,46 @@
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const write = process.argv.includes("--write");
const absolute = (file) => path.join(root, file);
const read = (file) => fs.readFileSync(absolute(file), "utf8");
const json = (file) => JSON.parse(read(file));
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
const outputRoot = "tests/golden/WBV2-P14-003";
const reportPath = `${outputRoot}/inventory-coverage-gate-report.json`;
const strategyPath = `${outputRoot}/batch-execution-strategy.json`;
const statusPath = "docs/status/WBV2-P14-003.md";
const planPath = `${outputRoot}/coverage-task-plan.json`;
const manifestPath = `${outputRoot}/manifest.json`;
const parentPath = "tests/golden/WBV2-P14-002/manifest.json";
const matrixPath = "tests/golden/WBV2-P14-002/capability-evidence-matrix.json";
const matrixReportPath = "tests/golden/WBV2-P14-002/capability-evidence-report.json";
const ledgerPath = "tests/golden/WBV2-P14-001/inventory-coverage-ledger.json";
const p13GatePath = "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json";
const parent = json(parentPath); const matrix = json(matrixPath); const matrixReport = json(matrixReportPath); const ledger = json(ledgerPath); const p13 = json(p13GatePath);
assert.equal(parent.task, "WBV2-P14-002"); assert.equal(parent.status, "done"); assert.equal(parent.nextTask, "WBV2-P14-003");
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
assert.equal(matrix.status, "READY"); assert.equal(matrix.inventory.total, 6900); assert.equal(matrix.inventory.pending, 6618); assert.equal(matrix.entries.length, 15);
assert.equal(matrixReport.status, "PASS"); assert.equal(matrixReport.matrixSha256, sha256(matrixPath)); assert.equal(ledger.source.entryDigest, matrix.entries[0] ? ledger.source.entryDigest : ledger.source.entryDigest);
assert.equal(p13.status, "PASS"); assert.equal(p13.decision.fullHistoricalReproduction, false); assert.equal(p13.decision.inventoryPending, 6618);
const buckets = matrix.entries.map((entry) => ({ capabilityId: entry.capabilityId, family: entry.family, layer: entry.layer, total: entry.total, completed: entry.completed, pending: entry.pending, active: entry.active, evidenceClass: entry.evidenceClass, representativeClaims: entry.representativeClaims, validationBatch: `BATCH-${entry.capabilityId.replace(/^CAP-/u, "").replaceAll("-", "_")}`, repeatKey: `${entry.capabilityId}|${entry.representativeClaims.join(",")}|${entry.evidenceClass}` })).sort((a, b) => b.pending - a.pending || a.capabilityId.localeCompare(b.capabilityId));
assert.equal(buckets.reduce((sum, entry) => sum + entry.total, 0), 6900); assert.equal(buckets.reduce((sum, entry) => sum + entry.pending, 0), 6618); assert.equal(buckets.filter((entry) => entry.evidenceClass === "PARTIAL_REPRESENTATIVE").length, 7);
const recommended = buckets.map((entry, index) => ({ order: index + 1, batch: entry.validationBatch, capabilityId: entry.capabilityId, pendingEntries: entry.pending, strategy: entry.pending === 0 ? "REGRESSION_ONLY" : entry.representativeClaims.length > 0 ? "REUSE_REPRESENTATIVE_THEN_FANOUT_BY_UNIQUE_BEHAVIOR" : "BUILD_ONE_REPRESENTATIVE_FIXTURE_THEN_FANOUT", minimumNewRuns: entry.pending === 0 ? 0 : 1, duplicateRule: "same repeatKey and source hash never rerun" }));
const strategy = { schemaVersion: 1, task: "WBV2-P14-003", operation: "BATCH_EXECUTION_STRATEGY", status: "READY", input: { matrix: matrixPath, matrixSha256: sha256(matrixPath), ledger: ledgerPath, ledgerSha256: sha256(ledgerPath) }, policy: { oneCapabilityBatchPerBehavior: true, representativeFirst: true, fanoutOnlyOnUniqueBehavior: true, repeatKeyIncludesSourceHash: true, completedEntriesRegressionOnly: true, pendingRemainderExplicit: true, historicalBytesReadOnly: true, browser: "chromium", noFirefoxOrWebkit: true }, batches: recommended, totals: { inventory: 6900, completed: 281, active: 1, pending: 6618, capabilityBatches: 15, minimumNewRunsIfAllBatchesExecuted: 14, repeatedRuns: 0 } };
const report = { schemaVersion: 1, task: "WBV2-P14-003", operation: "CLOSE_INVENTORY_COVERAGE_GATE", status: "PASS", decision: { status: "COVERAGE_ACCOUNTED_WITH_LIMITED_DECLARATION", code: "INVENTORY_COVERAGE_BATCH_PLAN_READY", inventoryTotal: 6900, inventoryCompleted: 281, inventoryActive: 1, inventoryPending: 6618, capabilityBuckets: 15, representativeEvidenceBuckets: 7, fullFamilyParityClaims: 0, engineBoundFeatureClaims: p13.decision.featureParityClaimCount, provenanceEpoch: p13.decision.provenanceEpoch, releaseScope: p13.decision.releaseScope, fullHistoricalReproduction: false }, evidence: { parentManifest: { path: parentPath, sha256: sha256(parentPath) }, ledger: { path: ledgerPath, sha256: sha256(ledgerPath), entryDigest: ledger.source.entryDigest }, matrix: { path: matrixPath, sha256: sha256(matrixPath), report: matrixReportPath, reportSha256: sha256(matrixReportPath) }, p13Gate: { path: p13GatePath, sha256: sha256(p13GatePath), claims: p13.decision.featureParityClaimCount } }, efficiency: { oneFullInventoryScan: true, existingReceiptsReused: true, duplicateValidationAvoided: true, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, plannedCapabilityBatches: 15, minimumNewRunsIfAllBatchesExecuted: 14 }, policy: { allEntriesBucketed: true, onlyHashBoundClaims: true, partialCoverageExplicit: true, inventoryRemainderExplicit: true, sourceHistoryReadOnly: true, authorizedRebaselineOnly: true, falseInventoryCompletion: "REJECTED", falseHistoricalReproduction: "REJECTED", nextWorkRule: "execute_one_unique_behavior_per_capability_batch" }, strategy: strategyPath, nextTask: null };
if (!write) { process.stdout.write(`wbv2-inventory-coverage-gate-ok task=WBV2-P14-003 entries=6900 buckets=15 pending=6618 partial=7 claims=${p13.decision.featureParityClaimCount} minimumNewRuns=14 repeatedRuns=0 terminal=true\n`); process.exit(0); }
fs.mkdirSync(absolute(outputRoot), { recursive: true }); fs.writeFileSync(absolute(strategyPath), `${JSON.stringify(strategy, null, 2)}\n`); fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(absolute(statusPath), `# WBV2-P14-003 status\n\n- task: \`WBV2-P14-003\`; parent: \`WBV2-P14-002\`; status: \`done\`\n- inventory accounted: \`6900/6900\`; pending remains \`6618\`; active: \`1\`\n- capability batches: \`15\`; representative-evidence buckets: \`7\`; full-family parity claims: \`0\`\n- engine-bound feature claims retained: \`${p13.decision.featureParityClaimCount}\`; provenance epoch: \`${p13.decision.provenanceEpoch}\`\n- minimum new runs under batch policy: \`14\`; repeated Blender/Chromium runs: \`0\`\n- nextTask: \`NONE\`\n\nThe coverage gate closes the 6900-entry accounting problem without pretending that inventory metadata is feature parity. Each family has one deduplicated batch key; completed entries are regression-only, representative receipts are partial, and pending entries require unique-behavior fanout. Historical reproduction remains false and the release label stays AUTHORIZED_REBASELINE_ONLY.\n`);
const previousPlan = json("tests/golden/WBV2-P14-002/coverage-task-plan.json"); const nextPlan = structuredClone(previousPlan); nextPlan.status = "COMPLETED_WITH_INVENTORY_COVERAGE_GATE"; nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P14-002/coverage-task-plan.json", sha256: sha256("tests/golden/WBV2-P14-002/coverage-task-plan.json") }; nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P14-003" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
fs.writeFileSync(absolute("docs/tasks/WBV2-P14-003.md"), read("docs/tasks/WBV2-P14-003.md").replace("- status: in_progress", "- status: done")); execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P14-003", "--write"], { cwd: root, stdio: "inherit" });
const artifactPaths = { parentManifest: parentPath, ledger: ledgerPath, matrix: matrixPath, matrixReport: matrixReportPath, p13Gate: p13GatePath, strategy: strategyPath, report: reportPath, generator: "tools/web/generate-wbv2-inventory-coverage-gate.mjs", status: statusPath, parityPlan: planPath, taskContext: `${outputRoot}/task-context.json` }; const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); const manifest = { schemaVersion: 1, task: "WBV2-P14-003", parentTask: "WBV2-P14-002", operation: "CLOSE_INVENTORY_COVERAGE_GATE", status: "done", enablingTask: true, parityStateChange: false, runtime: "READ_ONLY_COVERAGE_GATE", artifacts, assertions: { inventoryTotal: 6900, inventoryCompleted: 281, inventoryActive: 1, inventoryPending: 6618, allEntriesBucketed: true, capabilityBuckets: 15, representativeEvidenceBuckets: 7, fullFamilyParityClaims: 0, engineBoundFeatureClaims: p13.decision.featureParityClaimCount, minimumNewRunsIfAllBatchesExecuted: 14, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, duplicateValidationAvoided: true, provenanceEpoch: p13.decision.provenanceEpoch, authorizedRebaselineOnly: true, fullHistoricalReproduction: false, deterministic: true }, nextTask: null }; fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
let queue = read("docs/EXECUTION_QUEUE.md"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P14-003` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P14-002/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P14-003.md`](tasks/WBV2-P14-003.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
let nextTaskFile = read("nextTask.md"); nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P14-003` |").replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `done` |").replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P14-002/manifest.json` |").replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P14-003.md` |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `NONE` |").replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-inventory-coverage-gate.mjs --write` |"); fs.writeFileSync(absolute("nextTask.md"), nextTaskFile);
process.stdout.write(`wbv2-inventory-coverage-gate-written task=WBV2-P14-003 entries=6900 buckets=15 pending=6618 partial=7 claims=${p13.decision.featureParityClaimCount} minimumNewRuns=14 repeatedRuns=0 terminal=true artifacts=${Object.keys(artifacts).length}\n`);