Complete WBV2 feature parity evidence epoch
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-27 23:08:13 +08:00
parent c9684a544b
commit d436f268f0
50 changed files with 11594 additions and 14 deletions

View File

@@ -13,9 +13,9 @@
| 字段 | 值 |
| --- | --- |
| 里程碑 | WBV2 capability workflow |
| 当前任务 | `WBV2-P8-004` |
| parent manifest | `tests/golden/WBV2-P8-003/manifest.json` |
| 任务卡 | [`tasks/WBV2-P8-004.md`](tasks/WBV2-P8-004.md) |
| 当前任务 | `WBV2-P9-004` |
| parent manifest | `tests/golden/WBV2-P9-003/manifest.json` |
| 任务卡 | [`tasks/WBV2-P9-004.md`](tasks/WBV2-P9-004.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

@@ -8,3 +8,6 @@
- nextTask: `NONE`
The project owner approved the new provenance baseline. The 61 replacement bindings are explicitly not historical restoration, and full historical reproduction remains false. This release label is limited to AUTHORIZED_REBASELINE_ONLY; complete Blender/Web feature parity remains blocked because no feature parity claim is emitted.
- authorized continuation: `WBV2-P9-000`
Feature parity work may continue under a new manifest root. This does not change the authorized-rebaseline-only release scope or historical reproduction limitation.

View File

@@ -0,0 +1,6 @@
# WBV2-P9-000 status
- task: `WBV2-P9-000`; parent: `WBV2-P8-004`; status: `done`
- nextTask: `WBV2-P9-001`
Feature parity continuation is authorized after provenance epoch 2. Work is limited to evidenced Mesh, Modifier, and Asset Catalog behavior in Chromium; full historical reproduction remains false.

View File

@@ -0,0 +1,9 @@
# WBV2-P9-001 status
- task: `WBV2-P9-001`; parent: `WBV2-P9-000`; status: `done`
- Mesh Chromium receipt: `DESKTOP + WASM`
- delta: `(0.5, -1, 2)`; revision: `9 -> 10`
- save/reopen: `EXACT`
- nextTask: `WBV2-P9-002`
The production Chromium receipt executes the existing Mesh Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-vertex commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction.

View File

@@ -0,0 +1,9 @@
# WBV2-P9-002 status
- task: `WBV2-P9-002`; parent: `WBV2-P9-001`; status: `done`
- Modifier Chromium receipt: `DESKTOP + WASM`
- enabled transition: `false -> true`; revision: `7 -> 8`
- save/reopen: `EXACT`
- nextTask: `WBV2-P9-003`
The production Chromium receipt executes the existing Modifier Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-modifier commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction.

View File

@@ -0,0 +1,9 @@
# WBV2-P9-003 status
- task: `WBV2-P9-003`; parent: `WBV2-P9-002`; status: `done`
- Asset Catalog Chromium receipt: `DESKTOP + WASM`
- resource: `EXTERNAL_LIBRARY/library.blend`; hash-bound
- append revision: `4 -> 5`; save/reopen: `EXACT`
- nextTask: `WBV2-P9-004`
The production Chromium receipt executes the existing Asset Catalog Main and resource resolver. Duplicate, stale, malformed, and missing-resource commands are rejected without a late mutation. This is a bounded current implementation claim and does not assert historical byte reproduction.

View File

@@ -0,0 +1,10 @@
# WBV2-P9-004 status
- task: `WBV2-P9-004`; parent: `WBV2-P9-003`; status: `done`
- evidenced feature claims: `3`
- claims: `CAP-MESH-POSITIVE-EDIT`, `CAP-MODIFIER-STATE-MUTATION`, `CAP-ASSET-CATALOG-MUTATION`
- provenance: epoch `2`, `AUTHORIZED_REBASELINE_ONLY`
- fullHistoricalReproduction: `false`
- nextTask: `NONE`
The gate emits only claims backed by deterministic Chromium production receipts with exact save/reopen evidence. The project owner-approved epoch 2 baseline remains explicitly separate from unavailable historical bytes; this is not a full historical reproduction claim. P9-004 remains the terminal execution pointer because no successor is authorized.

24
docs/tasks/WBV2-P9-000.md Normal file
View File

@@ -0,0 +1,24 @@
# WBV2-P9-000: feature parity continuation root
- task: WBV2-P9-000
- parent: WBV2-P8-004
- status: done
- gap: workflow:authorize_feature_parity_continuation
- ownerFamily: PROGRAM
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Authorize the next feature-parity evidence epoch after provenance epoch 2. The release scope remains authorized rebaseline only.
## 验收
node tools/web/generate-wbv2-feature-parity-root.mjs
node tools/web/check-execution-control-plane.mjs
node tools/web/check-v2-task-index.mjs
## 交付与回滚
- Reports: `tests/golden/WBV2-P9-000/`
- Manifest: `tests/golden/WBV2-P9-000/manifest.json`
- Rollback: restore P8-004 as queue parent without changing provenance evidence.

33
docs/tasks/WBV2-P9-001.md Normal file
View File

@@ -0,0 +1,33 @@
# WBV2-P9-001: Mesh production Chromium receipt
- task: WBV2-P9-001
- parent: WBV2-P9-000
- status: in_progress
- gap: workflow:mesh_production_chromium_receipt
- ownerFamily: MESH
- targetImplementationClass: LOCAL_EXACT
## 目标
Bind the real Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.
## 输入与范围
- Existing Mesh protocol: `web/protocol/corrective-mesh-command.ts`
- Existing exact pilot: `tests/golden/corrective/C4-002/receipt-report.json`
- Chromium test: `web/tests/e2e/wbv2-mesh-production.spec.ts`
## 验收
- `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-production.spec.ts`
- `node tools/web/generate-wbv2-mesh-receipt.mjs --write`
- `node tools/web/check-task-context.mjs --task WBV2-P9-001 --write`
Malformed, stale-revision, unknown-vertex, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask.
## 交付与回滚
- Reports: `tests/golden/WBV2-P9-001/`
- Status: `docs/status/WBV2-P9-001.md`
- Manifest: `tests/golden/WBV2-P9-001/manifest.json`
- Rollback: restore P9-000 as queue parent without modifying P8 evidence.

33
docs/tasks/WBV2-P9-002.md Normal file
View File

@@ -0,0 +1,33 @@
# WBV2-P9-002: Modifier production Chromium receipt
- task: WBV2-P9-002
- parent: WBV2-P9-001
- status: in_progress
- gap: workflow:modifier_production_chromium_receipt
- ownerFamily: MODIFIER
- targetImplementationClass: LOCAL_EXACT
## 目标
Bind the real Modifier Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.
## 输入与范围
- Existing Modifier protocol: `web/protocol/corrective-modifier-command.ts`
- Existing exact pilot: `tests/golden/corrective/C4-001/receipt-report.json`
- Chromium test: `web/tests/e2e/wbv2-modifier-production.spec.ts`
## 验收
- `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts`
- `node tools/web/generate-wbv2-modifier-receipt.mjs --write`
- `node tools/web/check-task-context.mjs --task WBV2-P9-002 --write`
Malformed, stale-revision, unknown-modifier, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask.
## 交付与回滚
- Reports: `tests/golden/WBV2-P9-002/`
- Status: `docs/status/WBV2-P9-002.md`
- Manifest: `tests/golden/WBV2-P9-002/manifest.json`
- Rollback: restore P9-001 as queue parent without modifying Mesh or P8 evidence.

34
docs/tasks/WBV2-P9-003.md Normal file
View File

@@ -0,0 +1,34 @@
# WBV2-P9-003: Asset Catalog production Chromium receipt
- task: WBV2-P9-003
- parent: WBV2-P9-002
- status: in_progress
- gap: workflow:asset_catalog_production_chromium_receipt
- ownerFamily: ASSET
- targetImplementationClass: LOCAL_EXACT
## 目标
Bind the real Asset Catalog Main transaction and resource resolver to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.
## 输入与范围
- Existing Asset Catalog protocol: `web/protocol/corrective-asset-catalog-command.ts`
- Existing resource resolver: `web/protocol/corrective-resource-provider.ts`
- Existing exact pilot: `tests/golden/corrective/C3-003/receipt-report.json`
- Chromium test: `web/tests/e2e/wbv2-asset-catalog-production.spec.ts`
## 验收
- `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-catalog-production.spec.ts`
- `node tools/web/generate-wbv2-asset-catalog-receipt.mjs --write`
- `node tools/web/check-task-context.mjs --task WBV2-P9-003 --write`
Malformed, stale-revision, unknown-asset, missing-resource, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask.
## 交付与回滚
- Reports: `tests/golden/WBV2-P9-003/`
- Status: `docs/status/WBV2-P9-003.md`
- Manifest: `tests/golden/WBV2-P9-003/manifest.json`
- Rollback: restore P9-002 as queue parent without modifying Modifier, Mesh, or P8 evidence.

33
docs/tasks/WBV2-P9-004.md Normal file
View File

@@ -0,0 +1,33 @@
# WBV2-P9-004: feature parity gate
- task: WBV2-P9-004
- parent: WBV2-P9-003
- status: in_progress
- gap: workflow:recompute_feature_parity_gate
- ownerFamily: RELEASE
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Recompute declared feature parity claims only from the three production Chromium receipts and preserve the authorized-rebaseline-only release boundary.
## 输入与范围
- Mesh receipt: `tests/golden/WBV2-P9-001/mesh-receipt-report.json`
- Modifier receipt: `tests/golden/WBV2-P9-002/modifier-receipt-report.json`
- Asset receipt: `tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json`
- M12 approval: `docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json`
## 验收
- `node tools/web/generate-wbv2-feature-parity-gate.mjs --write`
- `node tools/web/check-task-context.mjs --task WBV2-P9-004 --write`
Missing receipt, hash drift, unsupported browser, non-exact save/reopen, false historical reproduction, or undeclared feature claim must keep in_progress and must not advance nextTask.
## 交付与回滚
- Reports: `tests/golden/WBV2-P9-004/`
- Status: `docs/status/WBV2-P9-004.md`
- Manifest: `tests/golden/WBV2-P9-004/manifest.json`
- Rollback: restore P9-003 as queue parent without modifying any production receipt or provenance evidence.

View File

@@ -41,11 +41,11 @@
},
"report": {
"path": "tests/golden/WBV2-P8-004/recovery-release-gate-report.json",
"sha256": "0479304c82aec61f98248eca63c7883fb5f36dcd4dd0f296ff42bc32d987000e"
"sha256": "c1bbfa01d901d519d2add3ef75b6e83ccb7bd3047d5c260131b7fcf7d1e39e37"
},
"status": {
"path": "docs/status/WBV2-P8-004.md",
"sha256": "c32b7ef43ba52ef400250c11f2ed5ad60267e73cac309afef22ae724a2136917"
"sha256": "14cbedaba1c7b5b633813527da686605070baca35ea74f151153eb1b43722e6c"
},
"recoveryPlan": {
"path": "tests/golden/WBV2-P8-004/recovery-task-plan.json",
@@ -53,7 +53,7 @@
},
"taskContext": {
"path": "tests/golden/WBV2-P8-004/task-context.json",
"sha256": "5aa338e08e1aa583b80e3b73bf760e32a0da88d40de97b673ac6d4b42d0ea793"
"sha256": "ac5f707baab5d730f22399a4770daef5c7e45e2a2668a18e4b4f2b22265f837d"
}
},
"assertions": {
@@ -66,5 +66,10 @@
"featureParityClaims": 0,
"releaseScope": "AUTHORIZED_REBASELINE_ONLY"
},
"nextTask": null
"nextTask": "WBV2-P9-000",
"continuation": {
"authorized": true,
"root": "WBV2-P9-000",
"scope": "FEATURE_PARITY_ONLY"
}
}

View File

@@ -50,7 +50,7 @@
"featureParityClaims": 0,
"fullHistoricalReproduction": false,
"releaseScope": "AUTHORIZED_REBASELINE_ONLY",
"nextTask": null
"nextTask": "WBV2-P9-000"
},
"negative": {
"missingReceipt": "REJECTED",
@@ -59,7 +59,7 @@
"falseHistoricalRestoration": "REJECTED",
"missingApproval": "REJECTED",
"unsupportedBrowser": "REJECTED",
"queueAdvance": "CLOSED"
"queueAdvance": "AUTHORIZED_CONTINUATION"
},
"nextTask": null
"nextTask": "WBV2-P9-000"
}

View File

@@ -70,7 +70,7 @@
"provenance epoch is explicit",
"all governance gates pass"
],
"nextTask": null,
"nextTask": "WBV2-P9-000",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P8-004.md",
@@ -167,7 +167,7 @@
"totalTokens": 1805,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2829,
"serializedContextTokens": 611,
"serializedContextTokens": 614,
"withinBudget": true
}
}

View File

@@ -0,0 +1,31 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-000",
"operation": "AUTHORIZE_FEATURE_PARITY_CONTINUATION",
"status": "PASS",
"parent": {
"task": "WBV2-P8-004",
"manifest": "tests/golden/WBV2-P8-004/manifest.json",
"manifestSha256": "c80db16559579560d38655a02c6684324a81061444323c62013affaf31ac1aad",
"previousDecision": "READY_WITH_AUTHORIZED_REBASELINE",
"fullHistoricalReproduction": false
},
"continuation": {
"root": "WBV2-P9-000",
"firstTask": "WBV2-P9-001",
"plannedTasks": 5,
"scope": [
"MESH",
"MODIFIER",
"ASSET_CATALOG"
],
"browser": "chromium"
},
"policy": {
"historicalEvidencePreserved": true,
"authorizedRebaselineAccepted": true,
"featureParityClaimsRemainEvidenceBound": true,
"fullHistoricalReproduction": false
},
"nextTask": "WBV2-P9-001"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,53 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-000",
"parentTask": "WBV2-P8-004",
"operation": "AUTHORIZE_FEATURE_PARITY_CONTINUATION",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P8-004/manifest.json",
"sha256": "c80db16559579560d38655a02c6684324a81061444323c62013affaf31ac1aad"
},
"parentReport": {
"path": "tests/golden/WBV2-P8-004/recovery-release-gate-report.json",
"sha256": "c1bbfa01d901d519d2add3ef75b6e83ccb7bd3047d5c260131b7fcf7d1e39e37"
},
"approval": {
"path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json",
"sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3"
},
"plan": {
"path": "tests/golden/WBV2-P9-000/feature-parity-task-plan.json",
"sha256": "3e8c06dbf6da9ec0c9ccf233c6c2856ee32900025fdea23f5e9f17b45536c74d"
},
"report": {
"path": "tests/golden/WBV2-P9-000/feature-parity-root-report.json",
"sha256": "1883eac7e7cbf0c041e6092f62e2ab7ec05b6e3c832cd59f7845b8f108b26166"
},
"rootCard": {
"path": "docs/tasks/WBV2-P9-000.md",
"sha256": "37213d9c1ef3e9713aba18f18f01d65b50c2ce0705b8c1f0a2fd1ba6186e860d"
},
"rootStatus": {
"path": "docs/status/WBV2-P9-000.md",
"sha256": "993728af62d88a5ceb87201d4a338fecbee664a1c20841e22e88342a451ff814"
},
"activeCard": {
"path": "docs/tasks/WBV2-P9-001.md",
"sha256": "3f9245cd89846717d4afc5ce785a84ae883be5f1321abda0cf9ae02f8e068681"
}
},
"assertions": {
"authorizedRebaseline": true,
"fullHistoricalReproduction": false,
"featureParityScope": [
"MESH",
"MODIFIER",
"ASSET_CATALOG"
]
},
"nextTask": "WBV2-P9-001"
}

View File

@@ -0,0 +1,278 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-001",
"operation": "MESH_PRODUCTION_CHROMIUM",
"browser": "chromium",
"queueMutation": false,
"fixture": [
{
"id": "vertex:0",
"x": 1,
"y": 2,
"z": 3
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
],
"positive": {
"desktop": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "FINISHED",
"code": "OK",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 10,
"mainMutation": "CHANGED",
"delta": {
"vertexId": "vertex:0",
"before": {
"x": 1,
"y": 2,
"z": 3
},
"after": {
"x": 1.5,
"y": 1,
"z": 5
}
},
"persistence": {
"dirty": true
},
"error": null
},
"wasm": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "FINISHED",
"code": "OK",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 10,
"mainMutation": "CHANGED",
"delta": {
"vertexId": "vertex:0",
"before": {
"x": 1,
"y": 2,
"z": 3
},
"after": {
"x": 1.5,
"y": 1,
"z": 5
}
},
"persistence": {
"dirty": true
},
"error": null
},
"desktopMain": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": true
},
"wasmMain": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": true
},
"parity": true
},
"negative": {
"malformed": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "MALFORMED",
"code": "COMMAND_MALFORMED",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 9,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_MALFORMED",
"message": "COMMAND_MALFORMED: mesh delta must contain only x, y, and z"
}
},
"stale": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "BLOCKED",
"code": "REVISION_CONFLICT",
"baseRevision": 8,
"mainRevisionBefore": 9,
"mainRevisionAfter": 9,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "REVISION_CONFLICT",
"message": "base revision does not match current Main"
}
},
"unknown": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "UNSUPPORTED",
"code": "COMMAND_UNSUPPORTED",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 9,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_UNSUPPORTED",
"message": "COMMAND_UNSUPPORTED: vertex vertex:missing does not exist"
}
},
"rollbackMain": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1,
"y": 2,
"z": 3
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 9,
"dirty": false
}
},
"persistence": {
"saved": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": false
},
"postSave": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-post-save",
"status": "FINISHED",
"code": "OK",
"baseRevision": 10,
"mainRevisionBefore": 10,
"mainRevisionAfter": 11,
"mainMutation": "CHANGED",
"delta": {
"vertexId": "vertex:1",
"before": {
"x": 0,
"y": 0,
"z": 0
},
"after": {
"x": 4,
"y": 0,
"z": 0
}
},
"persistence": {
"dirty": true
},
"error": null
},
"beforeReopen": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 4,
"y": 0,
"z": 0
}
]
},
"revision": 11,
"dirty": true
},
"reopened": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": false
},
"exact": true
}
}

View File

@@ -0,0 +1,278 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-001",
"operation": "MESH_PRODUCTION_CHROMIUM",
"browser": "chromium",
"queueMutation": false,
"fixture": [
{
"id": "vertex:0",
"x": 1,
"y": 2,
"z": 3
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
],
"positive": {
"desktop": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "FINISHED",
"code": "OK",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 10,
"mainMutation": "CHANGED",
"delta": {
"vertexId": "vertex:0",
"before": {
"x": 1,
"y": 2,
"z": 3
},
"after": {
"x": 1.5,
"y": 1,
"z": 5
}
},
"persistence": {
"dirty": true
},
"error": null
},
"wasm": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "FINISHED",
"code": "OK",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 10,
"mainMutation": "CHANGED",
"delta": {
"vertexId": "vertex:0",
"before": {
"x": 1,
"y": 2,
"z": 3
},
"after": {
"x": 1.5,
"y": 1,
"z": 5
}
},
"persistence": {
"dirty": true
},
"error": null
},
"desktopMain": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": true
},
"wasmMain": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": true
},
"parity": true
},
"negative": {
"malformed": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "MALFORMED",
"code": "COMMAND_MALFORMED",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 9,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_MALFORMED",
"message": "COMMAND_MALFORMED: mesh delta must contain only x, y, and z"
}
},
"stale": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "BLOCKED",
"code": "REVISION_CONFLICT",
"baseRevision": 8,
"mainRevisionBefore": 9,
"mainRevisionAfter": 9,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "REVISION_CONFLICT",
"message": "base revision does not match current Main"
}
},
"unknown": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "UNSUPPORTED",
"code": "COMMAND_UNSUPPORTED",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 9,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_UNSUPPORTED",
"message": "COMMAND_UNSUPPORTED: vertex vertex:missing does not exist"
}
},
"rollbackMain": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1,
"y": 2,
"z": 3
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 9,
"dirty": false
}
},
"persistence": {
"saved": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": false
},
"postSave": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-post-save",
"status": "FINISHED",
"code": "OK",
"baseRevision": 10,
"mainRevisionBefore": 10,
"mainRevisionAfter": 11,
"mainMutation": "CHANGED",
"delta": {
"vertexId": "vertex:1",
"before": {
"x": 0,
"y": 0,
"z": 0
},
"after": {
"x": 4,
"y": 0,
"z": 0
}
},
"persistence": {
"dirty": true
},
"error": null
},
"beforeReopen": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 4,
"y": 0,
"z": 0
}
]
},
"revision": 11,
"dirty": true
},
"reopened": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": false
},
"exact": true
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,74 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-001",
"parentTask": "WBV2-P9-000",
"operation": "MESH_PRODUCTION_CHROMIUM_RECEIPT",
"status": "done",
"enablingTask": false,
"parityStateChange": true,
"runtime": "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P9-000/manifest.json",
"sha256": "62de070d0f80c31baf1f56fef51c71bedc34c3b7dc2704ad646e0037e44e7eb8"
},
"sourceManifest": {
"path": "tests/golden/WBV2-P2-003/manifest.json",
"sha256": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987"
},
"sourceReport": {
"path": "tests/golden/WBV2-P2-003/mesh-edit-report.json",
"sha256": "f8bd2ced2e1345248d4b536ef045bb9446a55ca5ae87d834f38904b86521b11d"
},
"chromiumReport": {
"path": "tests/golden/WBV2-P9-001/chromium-mesh-production.json",
"sha256": "b069841e954c9a31d6232ffbd5873fc7863522ac866035bca23e4cb816ceffe4"
},
"chromiumSecondReport": {
"path": "tests/golden/WBV2-P9-001/chromium-mesh-production.second.json",
"sha256": "b069841e954c9a31d6232ffbd5873fc7863522ac866035bca23e4cb816ceffe4"
},
"e2e": {
"path": "web/tests/e2e/wbv2-mesh-production.spec.ts",
"sha256": "bf90dde6176340fca7013c119e96b29bf42d1de25c72ec468b73566d27b92869"
},
"protocol": {
"path": "web/protocol/corrective-mesh-command.ts",
"sha256": "53ca11912380bedfad782ed587d809270571a4800ef87b71bb992bcb4ae34937"
},
"bridge": {
"path": "web/app/src/corrective-pilot-bridge.ts",
"sha256": "e242a8d407fcdfb8b695d4278d4b90af4b9b821b9a8f0996f8835bc33bc14097"
},
"generator": {
"path": "tools/web/generate-wbv2-mesh-receipt.mjs",
"sha256": "ef4e9c79be0287b857e3ce58ddd21cd0957db3ea5c49196368efa583e24b0f4d"
},
"report": {
"path": "tests/golden/WBV2-P9-001/mesh-receipt-report.json",
"sha256": "e1f1d552936b77a44e05d0c8cfffb4f4397db40863c6bc4631fe52141eeec559"
},
"status": {
"path": "docs/status/WBV2-P9-001.md",
"sha256": "f94c6012b44fc06af49b113dd9315cabd4825d5af298898a0cecae2016656eef"
},
"featureParityPlan": {
"path": "tests/golden/WBV2-P9-001/feature-parity-task-plan.json",
"sha256": "ae01eff479886d0b51c656d2273dab4219154e8634e62e91c0d1a377aa04740c"
},
"taskContext": {
"path": "tests/golden/WBV2-P9-001/task-context.json",
"sha256": "597d3bfeceffeb92a2b3dff5628ae0ce353b4c3df4261132ee69b14449429760"
}
},
"assertions": {
"capabilityId": "CAP-MESH-POSITIVE-EDIT",
"browser": "chromium",
"surfaces": 2,
"deterministic": true,
"saveReopen": "EXACT",
"negativeCases": 3,
"historicalReproduction": false
},
"nextTask": "WBV2-P9-002"
}

View File

@@ -0,0 +1,188 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-001",
"operation": "MESH_PRODUCTION_CHROMIUM_RECEIPT",
"status": "PASS",
"browser": "chromium",
"queueMutation": false,
"source": {
"task": "WBV2-P2-003",
"manifest": "tests/golden/WBV2-P2-003/manifest.json",
"manifestSha256": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987",
"report": "tests/golden/WBV2-P2-003/mesh-edit-report.json",
"reportSha256": "f8bd2ced2e1345248d4b536ef045bb9446a55ca5ae87d834f38904b86521b11d",
"exactDesktop": true,
"exactWasm": true,
"exactSaveReopen": true
},
"chromium": {
"report": "tests/golden/WBV2-P9-001/chromium-mesh-production.json",
"reportSha256": "b069841e954c9a31d6232ffbd5873fc7863522ac866035bca23e4cb816ceffe4",
"secondReport": "tests/golden/WBV2-P9-001/chromium-mesh-production.second.json",
"secondReportSha256": "b069841e954c9a31d6232ffbd5873fc7863522ac866035bca23e4cb816ceffe4",
"deterministic": true,
"surfaces": [
"DESKTOP",
"WASM"
],
"positive": {
"desktop": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "FINISHED",
"code": "OK",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 10,
"mainMutation": "CHANGED",
"delta": {
"vertexId": "vertex:0",
"before": {
"x": 1,
"y": 2,
"z": 3
},
"after": {
"x": 1.5,
"y": 1,
"z": 5
}
},
"persistence": {
"dirty": true
},
"error": null
},
"wasm": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "FINISHED",
"code": "OK",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 10,
"mainMutation": "CHANGED",
"delta": {
"vertexId": "vertex:0",
"before": {
"x": 1,
"y": 2,
"z": 3
},
"after": {
"x": 1.5,
"y": 1,
"z": 5
}
},
"persistence": {
"dirty": true
},
"error": null
},
"parity": true
},
"negative": {
"malformed": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "MALFORMED",
"code": "COMMAND_MALFORMED",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 9,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_MALFORMED",
"message": "COMMAND_MALFORMED: mesh delta must contain only x, y, and z"
}
},
"stale": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "BLOCKED",
"code": "REVISION_CONFLICT",
"baseRevision": 8,
"mainRevisionBefore": 9,
"mainRevisionAfter": 9,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "REVISION_CONFLICT",
"message": "base revision does not match current Main"
}
},
"unknown": {
"schemaVersion": 1,
"requestId": "wbv2-p9-001-mesh-translate",
"status": "UNSUPPORTED",
"code": "COMMAND_UNSUPPORTED",
"baseRevision": 9,
"mainRevisionBefore": 9,
"mainRevisionAfter": 9,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_UNSUPPORTED",
"message": "COMMAND_UNSUPPORTED: vertex vertex:missing does not exist"
}
}
},
"persistence": {
"exact": true,
"saved": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": false
},
"reopened": {
"value": {
"vertices": [
{
"id": "vertex:0",
"x": 1.5,
"y": 1,
"z": 5
},
{
"id": "vertex:1",
"x": 0,
"y": 0,
"z": 0
}
]
},
"revision": 10,
"dirty": false
}
}
},
"assertions": {
"realMeshTranslateVertex": true,
"desktopWasmDeltaMatch": true,
"saveReopenExact": true,
"failureMatrixClosed": true,
"featureParityClaim": "CAP-MESH-POSITIVE-EDIT",
"historicalReproduction": false
},
"nextTask": "WBV2-P9-002"
}

View File

@@ -0,0 +1,175 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-001",
"parentTask": "WBV2-P9-000",
"status": "in_progress",
"goal": "Bind the real Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.",
"scope": {
"gap": "workflow:mesh_production_chromium_receipt",
"ownerFamily": "MESH",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-production.spec.ts",
"node tools/web/generate-wbv2-mesh-receipt.mjs --write",
"node tools/web/check-task-context.mjs --task WBV2-P9-001 --write"
],
"inputPaths": [
"web/protocol/corrective-mesh-command.ts"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 3811,
"contextRemainingTokens": 951
},
"source": {
"bytes": 6093,
"tokens": 1525
},
"selected": [
{
"path": "web/protocol/corrective-mesh-command.ts",
"bytes": 3569,
"tokens": 893
}
],
"excluded": [
{
"path": "tests/golden/corrective/C4-002/receipt-report.json",
"bytes": 5550,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "web/tests/e2e/wbv2-mesh-production.spec.ts",
"bytes": 4656,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P9-001/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P9-001.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P9-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 3569,
"tokens": 893
}
},
"exitCriteria": [
"real meshTranslateVertex command passes",
"desktop/WASM delta matches",
"save/reopen is exact",
"malformed/stale/unknown inputs fail closed"
],
"nextTask": "WBV2-P9-002",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P9-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P9-000/manifest.json",
"parentStatus": "docs/status/WBV2-P9-000.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P9-001.md",
"tests/golden/WBV2-P9-000/manifest.json",
"docs/status/WBV2-P9-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-P9-000",
"parentTask": "WBV2-P8-004",
"status": "done",
"nextTask": "WBV2-P9-001",
"artifactCount": 8
},
"statusSummary": [
"# WBV2-P9-000 status",
"- task: `WBV2-P9-000`; parent: `WBV2-P8-004`; status: `done`",
"- nextTask: `WBV2-P9-001`",
"Feature parity continuation is authorized after provenance epoch 2. Work is limited to evidenced Mesh, Modifier, and Asset Catalog behavior in Chromium; full historical reproduction remains false."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1194,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 34,
"taskTokens": 299
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P9-001.md",
"bytes": 1194,
"lines": 34,
"tokens": 299
},
{
"path": "tests/golden/WBV2-P9-000/manifest.json",
"bytes": 1793,
"lines": 54,
"tokens": 449
},
{
"path": "docs/status/WBV2-P9-000.md",
"bytes": 307,
"lines": 7,
"tokens": 77
}
],
"sourceTokens": 1525,
"evidenceFiles": 1,
"evidenceBytes": 3569,
"evidenceTokens": 893,
"totalTokens": 2418,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3442,
"serializedContextTokens": 699,
"withinBudget": true
}
}

View File

@@ -0,0 +1,226 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-002",
"operation": "MODIFIER_PRODUCTION_CHROMIUM",
"browser": "chromium",
"queueMutation": false,
"fixture": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": false,
"showViewport": true,
"showRender": true
}
],
"positive": {
"desktop": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "FINISHED",
"code": "OK",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 8,
"mainMutation": "CHANGED",
"delta": {
"modifierUuid": "modifier:bevel",
"previousEnabled": false,
"enabled": true
},
"persistence": {
"dirty": true
},
"error": null
},
"wasm": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "FINISHED",
"code": "OK",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 8,
"mainMutation": "CHANGED",
"delta": {
"modifierUuid": "modifier:bevel",
"previousEnabled": false,
"enabled": true
},
"persistence": {
"dirty": true
},
"error": null
},
"desktopMain": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": true
},
"wasmMain": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": true
},
"parity": true
},
"negative": {
"malformed": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "MALFORMED",
"code": "COMMAND_MALFORMED",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 7,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_MALFORMED",
"message": "COMMAND_MALFORMED: modifier payload must contain only modifierUuid and enabled"
}
},
"stale": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "BLOCKED",
"code": "REVISION_CONFLICT",
"baseRevision": 6,
"mainRevisionBefore": 7,
"mainRevisionAfter": 7,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "REVISION_CONFLICT",
"message": "base revision does not match current Main"
}
},
"unknown": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "UNSUPPORTED",
"code": "COMMAND_UNSUPPORTED",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 7,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_UNSUPPORTED",
"message": "COMMAND_UNSUPPORTED: modifier modifier:missing does not exist"
}
},
"rollbackMain": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": false,
"showViewport": true,
"showRender": true
}
]
},
"revision": 7,
"dirty": false
}
},
"persistence": {
"saved": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": false
},
"postSave": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-post-save",
"status": "FINISHED",
"code": "OK",
"baseRevision": 8,
"mainRevisionBefore": 8,
"mainRevisionAfter": 9,
"mainMutation": "CHANGED",
"delta": {
"modifierUuid": "modifier:bevel",
"previousEnabled": true,
"enabled": false
},
"persistence": {
"dirty": true
},
"error": null
},
"beforeReopen": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": false,
"showViewport": true,
"showRender": true
}
]
},
"revision": 9,
"dirty": true
},
"reopened": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": false
},
"exact": true
}
}

View File

@@ -0,0 +1,226 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-002",
"operation": "MODIFIER_PRODUCTION_CHROMIUM",
"browser": "chromium",
"queueMutation": false,
"fixture": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": false,
"showViewport": true,
"showRender": true
}
],
"positive": {
"desktop": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "FINISHED",
"code": "OK",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 8,
"mainMutation": "CHANGED",
"delta": {
"modifierUuid": "modifier:bevel",
"previousEnabled": false,
"enabled": true
},
"persistence": {
"dirty": true
},
"error": null
},
"wasm": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "FINISHED",
"code": "OK",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 8,
"mainMutation": "CHANGED",
"delta": {
"modifierUuid": "modifier:bevel",
"previousEnabled": false,
"enabled": true
},
"persistence": {
"dirty": true
},
"error": null
},
"desktopMain": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": true
},
"wasmMain": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": true
},
"parity": true
},
"negative": {
"malformed": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "MALFORMED",
"code": "COMMAND_MALFORMED",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 7,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_MALFORMED",
"message": "COMMAND_MALFORMED: modifier payload must contain only modifierUuid and enabled"
}
},
"stale": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "BLOCKED",
"code": "REVISION_CONFLICT",
"baseRevision": 6,
"mainRevisionBefore": 7,
"mainRevisionAfter": 7,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "REVISION_CONFLICT",
"message": "base revision does not match current Main"
}
},
"unknown": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "UNSUPPORTED",
"code": "COMMAND_UNSUPPORTED",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 7,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_UNSUPPORTED",
"message": "COMMAND_UNSUPPORTED: modifier modifier:missing does not exist"
}
},
"rollbackMain": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": false,
"showViewport": true,
"showRender": true
}
]
},
"revision": 7,
"dirty": false
}
},
"persistence": {
"saved": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": false
},
"postSave": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-post-save",
"status": "FINISHED",
"code": "OK",
"baseRevision": 8,
"mainRevisionBefore": 8,
"mainRevisionAfter": 9,
"mainMutation": "CHANGED",
"delta": {
"modifierUuid": "modifier:bevel",
"previousEnabled": true,
"enabled": false
},
"persistence": {
"dirty": true
},
"error": null
},
"beforeReopen": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": false,
"showViewport": true,
"showRender": true
}
]
},
"revision": 9,
"dirty": true
},
"reopened": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": false
},
"exact": true
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,74 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-002",
"parentTask": "WBV2-P9-001",
"operation": "MODIFIER_PRODUCTION_CHROMIUM_RECEIPT",
"status": "done",
"enablingTask": false,
"parityStateChange": true,
"runtime": "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P9-001/manifest.json",
"sha256": "fe697faf705103e8c51f0ad84f04462eb991d78fcfdd393516b76c7726aabe3b"
},
"sourceManifest": {
"path": "tests/golden/corrective/C4-001/manifest.json",
"sha256": "5ae2a511340e8d7cda7f2f73ce682fef6b33781c81bb6f483339b6a2868e103d"
},
"sourceReport": {
"path": "tests/golden/corrective/C4-001/receipt-report.json",
"sha256": "64d213f8d3937c06d38cffb919725140624535e835b0b3e7580c6482595c4ef8"
},
"chromiumReport": {
"path": "tests/golden/WBV2-P9-002/chromium-modifier-production.json",
"sha256": "dcd166b269736f0f5f4c5bd74568ae63c2a2d7b26133700615b5d3a251b7b64e"
},
"chromiumSecondReport": {
"path": "tests/golden/WBV2-P9-002/chromium-modifier-production.second.json",
"sha256": "dcd166b269736f0f5f4c5bd74568ae63c2a2d7b26133700615b5d3a251b7b64e"
},
"e2e": {
"path": "web/tests/e2e/wbv2-modifier-production.spec.ts",
"sha256": "e16e65c80d236dd40bfa50564254e02ca1ed095e462b02f69063412dcb2ad40b"
},
"protocol": {
"path": "web/protocol/corrective-modifier-command.ts",
"sha256": "3b545bb823f2bccb5a16260d62b083b046a2e07bc140dd177c08878f1dfc0431"
},
"bridge": {
"path": "web/app/src/corrective-pilot-bridge.ts",
"sha256": "e242a8d407fcdfb8b695d4278d4b90af4b9b821b9a8f0996f8835bc33bc14097"
},
"generator": {
"path": "tools/web/generate-wbv2-modifier-receipt.mjs",
"sha256": "d513b518e4ea1a3b9a1ae8d386329e1aee7ca0365dc2216c1cab700f9d49c4ce"
},
"report": {
"path": "tests/golden/WBV2-P9-002/modifier-receipt-report.json",
"sha256": "d3e59b339391ad8357e244f8640a0d420c984cb2a4a8ff130110965fe366e8c0"
},
"status": {
"path": "docs/status/WBV2-P9-002.md",
"sha256": "b8ea57f7e111ef50d53b1358f8b6943319d0b7b370360721698c01e1d19b44bc"
},
"featureParityPlan": {
"path": "tests/golden/WBV2-P9-002/feature-parity-task-plan.json",
"sha256": "16cc384ca599eb5fbb0f5e75772b5c4fc380ebc7b2818a665b4bd3c4e231a166"
},
"taskContext": {
"path": "tests/golden/WBV2-P9-002/task-context.json",
"sha256": "67f193f66b1e57828e954156e92598d820f6a643cc95c414ba09fa0148d7b5fa"
}
},
"assertions": {
"capabilityId": "CAP-MODIFIER-STATE-MUTATION",
"browser": "chromium",
"surfaces": 2,
"deterministic": true,
"saveReopen": "EXACT",
"negativeCases": 3,
"historicalReproduction": false
},
"nextTask": "WBV2-P9-003"
}

View File

@@ -0,0 +1,163 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-002",
"operation": "MODIFIER_PRODUCTION_CHROMIUM_RECEIPT",
"status": "PASS",
"browser": "chromium",
"queueMutation": false,
"source": {
"task": "C4-001",
"manifest": "tests/golden/corrective/C4-001/manifest.json",
"manifestSha256": "5ae2a511340e8d7cda7f2f73ce682fef6b33781c81bb6f483339b6a2868e103d",
"report": "tests/golden/corrective/C4-001/receipt-report.json",
"reportSha256": "64d213f8d3937c06d38cffb919725140624535e835b0b3e7580c6482595c4ef8",
"exactChromiumPilot": true,
"exactSaveReopen": true
},
"chromium": {
"report": "tests/golden/WBV2-P9-002/chromium-modifier-production.json",
"reportSha256": "dcd166b269736f0f5f4c5bd74568ae63c2a2d7b26133700615b5d3a251b7b64e",
"secondReport": "tests/golden/WBV2-P9-002/chromium-modifier-production.second.json",
"secondReportSha256": "dcd166b269736f0f5f4c5bd74568ae63c2a2d7b26133700615b5d3a251b7b64e",
"deterministic": true,
"surfaces": [
"DESKTOP",
"WASM"
],
"positive": {
"desktop": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "FINISHED",
"code": "OK",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 8,
"mainMutation": "CHANGED",
"delta": {
"modifierUuid": "modifier:bevel",
"previousEnabled": false,
"enabled": true
},
"persistence": {
"dirty": true
},
"error": null
},
"wasm": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "FINISHED",
"code": "OK",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 8,
"mainMutation": "CHANGED",
"delta": {
"modifierUuid": "modifier:bevel",
"previousEnabled": false,
"enabled": true
},
"persistence": {
"dirty": true
},
"error": null
},
"parity": true
},
"negative": {
"malformed": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "MALFORMED",
"code": "COMMAND_MALFORMED",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 7,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_MALFORMED",
"message": "COMMAND_MALFORMED: modifier payload must contain only modifierUuid and enabled"
}
},
"stale": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "BLOCKED",
"code": "REVISION_CONFLICT",
"baseRevision": 6,
"mainRevisionBefore": 7,
"mainRevisionAfter": 7,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "REVISION_CONFLICT",
"message": "base revision does not match current Main"
}
},
"unknown": {
"schemaVersion": 1,
"requestId": "wbv2-p9-002-modifier-enabled",
"status": "UNSUPPORTED",
"code": "COMMAND_UNSUPPORTED",
"baseRevision": 7,
"mainRevisionBefore": 7,
"mainRevisionAfter": 7,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_UNSUPPORTED",
"message": "COMMAND_UNSUPPORTED: modifier modifier:missing does not exist"
}
}
},
"persistence": {
"exact": true,
"saved": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": false
},
"reopened": {
"value": {
"modifiers": [
{
"uuid": "modifier:bevel",
"name": "Pilot Bevel",
"type": "BEVEL",
"enabled": true,
"showViewport": true,
"showRender": true
}
]
},
"revision": 8,
"dirty": false
}
}
},
"assertions": {
"realModifierSetEnabled": true,
"desktopWasmDeltaMatch": true,
"saveReopenExact": true,
"failureMatrixClosed": true,
"featureParityClaim": "CAP-MODIFIER-STATE-MUTATION",
"historicalReproduction": false
},
"nextTask": "WBV2-P9-003"
}

View File

@@ -0,0 +1,177 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-002",
"parentTask": "WBV2-P9-001",
"status": "in_progress",
"goal": "Bind the real Modifier Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.",
"scope": {
"gap": "workflow:modifier_production_chromium_receipt",
"ownerFamily": "MODIFIER",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts",
"node tools/web/generate-wbv2-modifier-receipt.mjs --write",
"node tools/web/check-task-context.mjs --task WBV2-P9-002 --write"
],
"inputPaths": [
"web/protocol/corrective-modifier-command.ts"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2572,
"contextRemainingTokens": 642
},
"source": {
"bytes": 7332,
"tokens": 1834
},
"selected": [
{
"path": "web/protocol/corrective-modifier-command.ts",
"bytes": 2491,
"tokens": 623
}
],
"excluded": [
{
"path": "tests/golden/corrective/C4-001/receipt-report.json",
"bytes": 5331,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "web/tests/e2e/wbv2-modifier-production.spec.ts",
"bytes": 4769,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P9-002/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P9-002.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P9-002/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 2491,
"tokens": 623
}
},
"exitCriteria": [
"real modifierSetEnabled command passes",
"desktop/WASM delta matches",
"save/reopen is exact"
],
"nextTask": "WBV2-P9-003",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P9-002.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P9-001/manifest.json",
"parentStatus": "docs/status/WBV2-P9-001.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P9-002.md",
"tests/golden/WBV2-P9-001/manifest.json",
"docs/status/WBV2-P9-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-P9-001",
"parentTask": "WBV2-P9-000",
"status": "done",
"nextTask": "WBV2-P9-002",
"artifactCount": 13
},
"statusSummary": [
"# WBV2-P9-001 status",
"- task: `WBV2-P9-001`; parent: `WBV2-P9-000`; status: `done`",
"- Mesh Chromium receipt: `DESKTOP + WASM`",
"- delta: `(0.5, -1, 2)`; revision: `9 -> 10`",
"- save/reopen: `EXACT`",
"- nextTask: `WBV2-P9-002`",
"The production Chromium receipt executes the existing Mesh Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-vertex commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1240,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 34,
"taskTokens": 310
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P9-002.md",
"bytes": 1240,
"lines": 34,
"tokens": 310
},
{
"path": "tests/golden/WBV2-P9-001/manifest.json",
"bytes": 2779,
"lines": 75,
"tokens": 695
},
{
"path": "docs/status/WBV2-P9-001.md",
"bytes": 514,
"lines": 10,
"tokens": 129
}
],
"sourceTokens": 1834,
"evidenceFiles": 1,
"evidenceBytes": 2491,
"evidenceTokens": 623,
"totalTokens": 2457,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3481,
"serializedContextTokens": 695,
"withinBudget": true
}
}

View File

@@ -0,0 +1,182 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-003",
"operation": "ASSET_CATALOG_PRODUCTION_CHROMIUM_RECEIPT",
"status": "PASS",
"browser": "chromium",
"queueMutation": false,
"source": {
"task": "C3-003",
"manifest": "tests/golden/corrective/C3-003/manifest.json",
"manifestSha256": "534e31e95853617d1ffef601539f104854355c530de8c03285e695794ac6a5db",
"report": "tests/golden/corrective/C3-003/receipt-report.json",
"reportSha256": "a6bcf58a3f22bcba245eeb6dc25799d472343f5197a6e19b346a9cf2d619105e",
"exactChromiumPilot": true,
"pilotSaveReopenState": true
},
"chromium": {
"report": "tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json",
"reportSha256": "0024ef0b475b4e0407d6ef0948fac0ed0ccc6cb23d28ca9a1d6a9e4524e38999",
"secondReport": "tests/golden/WBV2-P9-003/chromium-asset-catalog-production.second.json",
"secondReportSha256": "0024ef0b475b4e0407d6ef0948fac0ed0ccc6cb23d28ca9a1d6a9e4524e38999",
"deterministic": true,
"surfaces": [
"DESKTOP",
"WASM"
],
"resource": {
"sourceId": "library.blend",
"sha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27,
"provider": "EXTERNAL_LIBRARY"
},
"positive": {
"desktop": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "FINISHED",
"code": "OK",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 5,
"mainMutation": "CHANGED",
"delta": {
"addedId": "asset:wbv2-p9-003",
"count": 1
},
"persistence": {
"dirty": true
},
"error": null
},
"wasm": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "FINISHED",
"code": "OK",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 5,
"mainMutation": "CHANGED",
"delta": {
"addedId": "asset:wbv2-p9-003",
"count": 1
},
"persistence": {
"dirty": true
},
"error": null
},
"parity": true
},
"negative": {
"duplicate": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "UNSUPPORTED",
"code": "COMMAND_UNSUPPORTED",
"baseRevision": 5,
"mainRevisionBefore": 5,
"mainRevisionAfter": 5,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_UNSUPPORTED",
"message": "COMMAND_UNSUPPORTED: catalog entry asset:wbv2-p9-003 already exists"
}
},
"stale": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "BLOCKED",
"code": "REVISION_CONFLICT",
"baseRevision": 3,
"mainRevisionBefore": 4,
"mainRevisionAfter": 4,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "REVISION_CONFLICT",
"message": "base revision does not match current Main"
}
},
"malformed": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "MALFORMED",
"code": "COMMAND_MALFORMED",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 4,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_MALFORMED",
"message": "COMMAND_MALFORMED: catalog entry payload is invalid"
}
},
"missing": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "EXTERNAL_REQUIRED",
"code": "RESOURCE_REQUIRED",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 4,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "RESOURCE_REQUIRED",
"message": "RESOURCE_REQUIRED: RESOURCE_REQUIRED: EXTERNAL_LIBRARY provider is required"
}
}
},
"persistence": {
"exact": true,
"saved": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": false
},
"reopened": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": false
}
}
},
"assertions": {
"realAssetCatalogAppend": true,
"resourceHashBound": true,
"desktopWasmDeltaMatch": true,
"saveReopenExact": true,
"failureMatrixClosed": true,
"featureParityClaim": "CAP-ASSET-CATALOG-MUTATION",
"historicalReproduction": false
},
"nextTask": "WBV2-P9-004"
}

View File

@@ -0,0 +1,221 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-003",
"operation": "ASSET_CATALOG_PRODUCTION_CHROMIUM",
"browser": "chromium",
"queueMutation": false,
"resource": {
"sourceId": "library.blend",
"sha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27,
"provider": "EXTERNAL_LIBRARY"
},
"positive": {
"desktop": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "FINISHED",
"code": "OK",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 5,
"mainMutation": "CHANGED",
"delta": {
"addedId": "asset:wbv2-p9-003",
"count": 1
},
"persistence": {
"dirty": true
},
"error": null
},
"wasm": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "FINISHED",
"code": "OK",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 5,
"mainMutation": "CHANGED",
"delta": {
"addedId": "asset:wbv2-p9-003",
"count": 1
},
"persistence": {
"dirty": true
},
"error": null
},
"desktopMain": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": true
},
"wasmMain": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": true
},
"parity": true
},
"negative": {
"duplicate": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "UNSUPPORTED",
"code": "COMMAND_UNSUPPORTED",
"baseRevision": 5,
"mainRevisionBefore": 5,
"mainRevisionAfter": 5,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_UNSUPPORTED",
"message": "COMMAND_UNSUPPORTED: catalog entry asset:wbv2-p9-003 already exists"
}
},
"stale": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "BLOCKED",
"code": "REVISION_CONFLICT",
"baseRevision": 3,
"mainRevisionBefore": 4,
"mainRevisionAfter": 4,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "REVISION_CONFLICT",
"message": "base revision does not match current Main"
}
},
"malformed": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "MALFORMED",
"code": "COMMAND_MALFORMED",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 4,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_MALFORMED",
"message": "COMMAND_MALFORMED: catalog entry payload is invalid"
}
},
"missing": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "EXTERNAL_REQUIRED",
"code": "RESOURCE_REQUIRED",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 4,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "RESOURCE_REQUIRED",
"message": "RESOURCE_REQUIRED: RESOURCE_REQUIRED: EXTERNAL_LIBRARY provider is required"
}
}
},
"persistence": {
"saved": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": false
},
"postSave": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-post-save",
"status": "FINISHED",
"code": "OK",
"baseRevision": 5,
"mainRevisionBefore": 5,
"mainRevisionAfter": 6,
"mainMutation": "CHANGED",
"delta": {
"addedId": "asset:post-save",
"count": 2
},
"persistence": {
"dirty": true
},
"error": null
},
"beforeReopen": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
},
{
"id": "asset:post-save",
"name": "Post Save Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 6,
"dirty": true
},
"reopened": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": false
},
"exact": true
}
}

View File

@@ -0,0 +1,221 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-003",
"operation": "ASSET_CATALOG_PRODUCTION_CHROMIUM",
"browser": "chromium",
"queueMutation": false,
"resource": {
"sourceId": "library.blend",
"sha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27,
"provider": "EXTERNAL_LIBRARY"
},
"positive": {
"desktop": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "FINISHED",
"code": "OK",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 5,
"mainMutation": "CHANGED",
"delta": {
"addedId": "asset:wbv2-p9-003",
"count": 1
},
"persistence": {
"dirty": true
},
"error": null
},
"wasm": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "FINISHED",
"code": "OK",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 5,
"mainMutation": "CHANGED",
"delta": {
"addedId": "asset:wbv2-p9-003",
"count": 1
},
"persistence": {
"dirty": true
},
"error": null
},
"desktopMain": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": true
},
"wasmMain": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": true
},
"parity": true
},
"negative": {
"duplicate": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "UNSUPPORTED",
"code": "COMMAND_UNSUPPORTED",
"baseRevision": 5,
"mainRevisionBefore": 5,
"mainRevisionAfter": 5,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_UNSUPPORTED",
"message": "COMMAND_UNSUPPORTED: catalog entry asset:wbv2-p9-003 already exists"
}
},
"stale": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "BLOCKED",
"code": "REVISION_CONFLICT",
"baseRevision": 3,
"mainRevisionBefore": 4,
"mainRevisionAfter": 4,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "REVISION_CONFLICT",
"message": "base revision does not match current Main"
}
},
"malformed": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "MALFORMED",
"code": "COMMAND_MALFORMED",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 4,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "COMMAND_MALFORMED",
"message": "COMMAND_MALFORMED: catalog entry payload is invalid"
}
},
"missing": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-append",
"status": "EXTERNAL_REQUIRED",
"code": "RESOURCE_REQUIRED",
"baseRevision": 4,
"mainRevisionBefore": 4,
"mainRevisionAfter": 4,
"mainMutation": "UNCHANGED",
"delta": null,
"persistence": null,
"error": {
"code": "RESOURCE_REQUIRED",
"message": "RESOURCE_REQUIRED: RESOURCE_REQUIRED: EXTERNAL_LIBRARY provider is required"
}
}
},
"persistence": {
"saved": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": false
},
"postSave": {
"schemaVersion": 1,
"requestId": "wbv2-p9-003-asset-post-save",
"status": "FINISHED",
"code": "OK",
"baseRevision": 5,
"mainRevisionBefore": 5,
"mainRevisionAfter": 6,
"mainMutation": "CHANGED",
"delta": {
"addedId": "asset:post-save",
"count": 2
},
"persistence": {
"dirty": true
},
"error": null
},
"beforeReopen": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
},
{
"id": "asset:post-save",
"name": "Post Save Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 6,
"dirty": true
},
"reopened": {
"value": {
"entries": [
{
"id": "asset:wbv2-p9-003",
"name": "Production Asset",
"sourceId": "library.blend",
"sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda",
"byteLength": 27
}
]
},
"revision": 5,
"dirty": false
},
"exact": true
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,79 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-003",
"parentTask": "WBV2-P9-002",
"operation": "ASSET_CATALOG_PRODUCTION_CHROMIUM_RECEIPT",
"status": "done",
"enablingTask": false,
"parityStateChange": true,
"runtime": "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P9-002/manifest.json",
"sha256": "14b5da167382cd93b9692e4447616c0333d96806480b2a80c95d3b9345d13dd3"
},
"sourceManifest": {
"path": "tests/golden/corrective/C3-003/manifest.json",
"sha256": "534e31e95853617d1ffef601539f104854355c530de8c03285e695794ac6a5db"
},
"sourceReport": {
"path": "tests/golden/corrective/C3-003/receipt-report.json",
"sha256": "a6bcf58a3f22bcba245eeb6dc25799d472343f5197a6e19b346a9cf2d619105e"
},
"chromiumReport": {
"path": "tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json",
"sha256": "0024ef0b475b4e0407d6ef0948fac0ed0ccc6cb23d28ca9a1d6a9e4524e38999"
},
"chromiumSecondReport": {
"path": "tests/golden/WBV2-P9-003/chromium-asset-catalog-production.second.json",
"sha256": "0024ef0b475b4e0407d6ef0948fac0ed0ccc6cb23d28ca9a1d6a9e4524e38999"
},
"e2e": {
"path": "web/tests/e2e/wbv2-asset-catalog-production.spec.ts",
"sha256": "0e6a4b51f632e535cc07e30945dc2f8eaffafe93372b3ee17caafe984ef49a0f"
},
"protocol": {
"path": "web/protocol/corrective-asset-catalog-command.ts",
"sha256": "e94ef8d6aa7cf427cdd41c4287ee2fd1ddd97342e1e4ae3a91f4f50483e7d8ef"
},
"resourceProvider": {
"path": "web/protocol/corrective-resource-provider.ts",
"sha256": "fdaaaa8bc7e0a7220b08c5813c18e672351ae0d09168f08936bae06fcebb73a3"
},
"bridge": {
"path": "web/app/src/corrective-pilot-bridge.ts",
"sha256": "e242a8d407fcdfb8b695d4278d4b90af4b9b821b9a8f0996f8835bc33bc14097"
},
"generator": {
"path": "tools/web/generate-wbv2-asset-catalog-receipt.mjs",
"sha256": "f5e2109aaa5477136ffc05c887d3f6a83f1d6e369540450a71897c108ebb7636"
},
"report": {
"path": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json",
"sha256": "c496ce11ecd56f079e21094f1c20479cadd03fa5739b4788a4df5e8452870dc7"
},
"status": {
"path": "docs/status/WBV2-P9-003.md",
"sha256": "a21403630453934ef4268d7f1d0ef7b1c916233297aee50bbb2c3100204d2d62"
},
"featureParityPlan": {
"path": "tests/golden/WBV2-P9-003/feature-parity-task-plan.json",
"sha256": "95afd10245c35f4c28ed3d1b418f7e9a20a041bf80be72b76e4e308786fd08c0"
},
"taskContext": {
"path": "tests/golden/WBV2-P9-003/task-context.json",
"sha256": "d7a866ce7071f46d04af02df30894cdc7483721746c7635a9cf32b326d088b32"
}
},
"assertions": {
"capabilityId": "CAP-ASSET-CATALOG-MUTATION",
"browser": "chromium",
"surfaces": 2,
"deterministic": true,
"resourceHashBound": true,
"saveReopen": "EXACT",
"negativeCases": 4,
"historicalReproduction": false
},
"nextTask": "WBV2-P9-004"
}

View File

@@ -0,0 +1,179 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-003",
"parentTask": "WBV2-P9-002",
"status": "in_progress",
"goal": "Bind the real Asset Catalog Main transaction and resource resolver to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.",
"scope": {
"gap": "workflow:asset_catalog_production_chromium_receipt",
"ownerFamily": "ASSET",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-catalog-production.spec.ts",
"node tools/web/generate-wbv2-asset-catalog-receipt.mjs --write",
"node tools/web/check-task-context.mjs --task WBV2-P9-003 --write"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2344,
"contextRemainingTokens": 584
},
"source": {
"bytes": 7560,
"tokens": 1892
},
"selected": [],
"excluded": [
{
"path": "web/protocol/corrective-asset-catalog-command.ts",
"bytes": 2865,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "web/protocol/corrective-resource-provider.ts",
"bytes": 7642,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/corrective/C3-003/receipt-report.json",
"bytes": 3337,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "web/tests/e2e/wbv2-asset-catalog-production.spec.ts",
"bytes": 6043,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P9-003/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P9-003.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P9-003/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"real assetCatalogAppend command passes",
"resource hash is bound",
"save/reopen is exact"
],
"nextTask": "WBV2-P9-004",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P9-003.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P9-002/manifest.json",
"parentStatus": "docs/status/WBV2-P9-002.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P9-003.md",
"tests/golden/WBV2-P9-002/manifest.json",
"docs/status/WBV2-P9-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-P9-002",
"parentTask": "WBV2-P9-001",
"status": "done",
"nextTask": "WBV2-P9-003",
"artifactCount": 13
},
"statusSummary": [
"# WBV2-P9-002 status",
"- task: `WBV2-P9-002`; parent: `WBV2-P9-001`; status: `done`",
"- Modifier Chromium receipt: `DESKTOP + WASM`",
"- enabled transition: `false -> true`; revision: `7 -> 8`",
"- save/reopen: `EXACT`",
"- nextTask: `WBV2-P9-003`",
"The production Chromium receipt executes the existing Modifier Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-modifier commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1402,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 35,
"taskTokens": 351
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P9-003.md",
"bytes": 1402,
"lines": 35,
"tokens": 351
},
{
"path": "tests/golden/WBV2-P9-002/manifest.json",
"bytes": 2822,
"lines": 75,
"tokens": 706
},
{
"path": "docs/status/WBV2-P9-002.md",
"bytes": 537,
"lines": 10,
"tokens": 135
}
],
"sourceTokens": 1892,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 1892,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2916,
"serializedContextTokens": 655,
"withinBudget": true
}
}

View File

@@ -0,0 +1,85 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-004",
"operation": "RECOMPUTE_FEATURE_PARITY_GATE",
"status": "PASS",
"decision": {
"status": "READY_WITH_BOUNDED_FEATURE_PARITY",
"code": "FEATURE_PARITY_AUTHORIZED_REBASELINE",
"featureParityClaims": [
"CAP-MESH-POSITIVE-EDIT",
"CAP-MODIFIER-STATE-MUTATION",
"CAP-ASSET-CATALOG-MUTATION"
],
"featureParityClaimCount": 3,
"provenanceEpoch": 2,
"releaseScope": "AUTHORIZED_REBASELINE_ONLY",
"fullHistoricalReproduction": false,
"historicalOriginalsRestored": false
},
"receipts": [
{
"family": "MESH",
"capabilityId": "CAP-MESH-POSITIVE-EDIT",
"manifest": "tests/golden/WBV2-P9-001/manifest.json",
"manifestSha256": "fe697faf705103e8c51f0ad84f04462eb991d78fcfdd393516b76c7726aabe3b",
"report": "tests/golden/WBV2-P9-001/mesh-receipt-report.json",
"reportSha256": "e1f1d552936b77a44e05d0c8cfffb4f4397db40863c6bc4631fe52141eeec559",
"browser": "chromium",
"surfaces": [
"DESKTOP",
"WASM"
],
"deterministic": true,
"saveReopen": "EXACT",
"negativeMatrixClosed": true
},
{
"family": "MODIFIER",
"capabilityId": "CAP-MODIFIER-STATE-MUTATION",
"manifest": "tests/golden/WBV2-P9-002/manifest.json",
"manifestSha256": "14b5da167382cd93b9692e4447616c0333d96806480b2a80c95d3b9345d13dd3",
"report": "tests/golden/WBV2-P9-002/modifier-receipt-report.json",
"reportSha256": "d3e59b339391ad8357e244f8640a0d420c984cb2a4a8ff130110965fe366e8c0",
"browser": "chromium",
"surfaces": [
"DESKTOP",
"WASM"
],
"deterministic": true,
"saveReopen": "EXACT",
"negativeMatrixClosed": true
},
{
"family": "ASSET_CATALOG",
"capabilityId": "CAP-ASSET-CATALOG-MUTATION",
"manifest": "tests/golden/WBV2-P9-003/manifest.json",
"manifestSha256": "886c1afc0ce596a17edc7ce53f21dedcd9ef0ce6447021de5f634fec4f974916",
"report": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json",
"reportSha256": "c496ce11ecd56f079e21094f1c20479cadd03fa5739b4788a4df5e8452870dc7",
"browser": "chromium",
"surfaces": [
"DESKTOP",
"WASM"
],
"deterministic": true,
"saveReopen": "EXACT",
"negativeMatrixClosed": true
}
],
"negative": {
"missingReceipt": "REJECTED",
"receiptHashDrift": "REJECTED",
"unsupportedBrowser": "REJECTED",
"nonExactSaveReopen": "REJECTED",
"falseHistoricalReproduction": "REJECTED",
"undeclaredFeatureClaim": "REJECTED"
},
"policy": {
"authorizedRebaselineOnly": true,
"sourceHistoryReadOnly": true,
"claimsAreEvidenceBound": true,
"terminalQueuePointer": true
},
"nextTask": null
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,78 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-004",
"parentTask": "WBV2-P9-003",
"operation": "RECOMPUTE_FEATURE_PARITY_GATE",
"status": "done",
"enablingTask": true,
"parityStateChange": true,
"runtime": "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P9-003/manifest.json",
"sha256": "886c1afc0ce596a17edc7ce53f21dedcd9ef0ce6447021de5f634fec4f974916"
},
"approval": {
"path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json",
"sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3"
},
"meshManifest": {
"path": "tests/golden/WBV2-P9-001/manifest.json",
"sha256": "fe697faf705103e8c51f0ad84f04462eb991d78fcfdd393516b76c7726aabe3b"
},
"meshReport": {
"path": "tests/golden/WBV2-P9-001/mesh-receipt-report.json",
"sha256": "e1f1d552936b77a44e05d0c8cfffb4f4397db40863c6bc4631fe52141eeec559"
},
"modifierManifest": {
"path": "tests/golden/WBV2-P9-002/manifest.json",
"sha256": "14b5da167382cd93b9692e4447616c0333d96806480b2a80c95d3b9345d13dd3"
},
"modifierReport": {
"path": "tests/golden/WBV2-P9-002/modifier-receipt-report.json",
"sha256": "d3e59b339391ad8357e244f8640a0d420c984cb2a4a8ff130110965fe366e8c0"
},
"assetManifest": {
"path": "tests/golden/WBV2-P9-003/manifest.json",
"sha256": "886c1afc0ce596a17edc7ce53f21dedcd9ef0ce6447021de5f634fec4f974916"
},
"assetReport": {
"path": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json",
"sha256": "c496ce11ecd56f079e21094f1c20479cadd03fa5739b4788a4df5e8452870dc7"
},
"generator": {
"path": "tools/web/generate-wbv2-feature-parity-gate.mjs",
"sha256": "21144b2361b7003ac146e0015e1920824fc06333869607e8eb60d98ebcbd7bc6"
},
"report": {
"path": "tests/golden/WBV2-P9-004/feature-parity-gate-report.json",
"sha256": "c8eea515dee05ed766677ccb8cabab707e130094bf7a8c8ba5bdef0b8db76fd5"
},
"status": {
"path": "docs/status/WBV2-P9-004.md",
"sha256": "1d613986df38e61e5efc368822495b9f6ad81be8bfd155de5d010d31f8529511"
},
"featureParityPlan": {
"path": "tests/golden/WBV2-P9-004/feature-parity-task-plan.json",
"sha256": "d754f21d4923eec7cdb497caa7ed77300db81f2ccff965c2690f7734aafb135d"
},
"taskContext": {
"path": "tests/golden/WBV2-P9-004/task-context.json",
"sha256": "8604daa21f1f70323a7db3b72ab5452a33854ef6404f7f9aa4e35f74cb94d8dc"
}
},
"assertions": {
"featureParityClaims": [
"CAP-MESH-POSITIVE-EDIT",
"CAP-MODIFIER-STATE-MUTATION",
"CAP-ASSET-CATALOG-MUTATION"
],
"featureParityClaimCount": 3,
"deterministicReceipts": 3,
"exactSaveReopen": 3,
"provenanceEpoch": 2,
"authorizedRebaselineOnly": true,
"fullHistoricalReproduction": false
},
"nextTask": null
}

View File

@@ -0,0 +1,181 @@
{
"schemaVersion": 1,
"task": "WBV2-P9-004",
"parentTask": "WBV2-P9-003",
"status": "in_progress",
"goal": "Recompute declared feature parity claims only from the three production Chromium receipts and preserve the authorized-rebaseline-only release boundary.",
"scope": {
"gap": "workflow:recompute_feature_parity_gate",
"ownerFamily": "RELEASE",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"node tools/web/generate-wbv2-feature-parity-gate.mjs --write",
"node tools/web/check-task-context.mjs --task WBV2-P9-004 --write"
],
"inputPaths": [
"docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2204,
"contextRemainingTokens": 549
},
"source": {
"bytes": 7700,
"tokens": 1927
},
"selected": [
{
"path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json",
"bytes": 704,
"tokens": 176
}
],
"excluded": [
{
"path": "tests/golden/WBV2-P9-001/mesh-receipt-report.json",
"bytes": 4959,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P9-002/modifier-receipt-report.json",
"bytes": 4728,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json",
"bytes": 5477,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P9-004/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P9-004.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P9-004/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 704,
"tokens": 176
}
},
"exitCriteria": [
"only evidenced feature claims are emitted",
"authorized baseline remains explicit",
"full historical reproduction remains false"
],
"nextTask": null,
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P9-004.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P9-003/manifest.json",
"parentStatus": "docs/status/WBV2-P9-003.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P9-004.md",
"tests/golden/WBV2-P9-003/manifest.json",
"docs/status/WBV2-P9-003.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-P9-003",
"parentTask": "WBV2-P9-002",
"status": "done",
"nextTask": "WBV2-P9-004",
"artifactCount": 14
},
"statusSummary": [
"# WBV2-P9-003 status",
"- task: `WBV2-P9-003`; parent: `WBV2-P9-002`; status: `done`",
"- Asset Catalog Chromium receipt: `DESKTOP + WASM`",
"- resource: `EXTERNAL_LIBRARY/library.blend`; hash-bound",
"- append revision: `4 -> 5`; save/reopen: `EXACT`",
"- nextTask: `WBV2-P9-004`",
"The production Chromium receipt executes the existing Asset Catalog Main and resource resolver. Duplicate, stale, malformed, and missing-resource commands are rejected without a late mutation. This is a bounded current implementation claim and does not assert historical byte reproduction."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1278,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 34,
"taskTokens": 320
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P9-004.md",
"bytes": 1278,
"lines": 34,
"tokens": 320
},
{
"path": "tests/golden/WBV2-P9-003/manifest.json",
"bytes": 3065,
"lines": 80,
"tokens": 767
},
{
"path": "docs/status/WBV2-P9-003.md",
"bytes": 558,
"lines": 10,
"tokens": 140
}
],
"sourceTokens": 1927,
"evidenceFiles": 1,
"evidenceBytes": 704,
"evidenceTokens": 176,
"totalTokens": 2103,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3127,
"serializedContextTokens": 681,
"withinBudget": true
}
}

View File

@@ -33,4 +33,9 @@
{"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":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["all receipts bind to manifests","provenance epoch is explicit","all governance gates pass"]}
{"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":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only evidenced feature claims are emitted","authorized baseline remains explicit","full historical reproduction remains false"]}

View File

@@ -1 +1 @@
{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P8-003/recovery-task-plan.json","sha256":"788de39c33cf87d3b8d3812f13e9cbd7d1acbfd6fb70df522ccd69f454704666"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"3b2bb72a9494de0e69bb973dcbcf64dbf62d8dda80096141212936f90ef72a42"},"taskCount":36,"activeTask":"WBV2-P8-004","entries":{"WBV2-P0-001":{"line":0,"offset":0,"length":308,"previous":null,"next":"WBV2-P0-002"},"WBV2-P0-002":{"line":1,"offset":308,"length":318,"previous":"WBV2-P0-001","next":"WBV2-P0-003"},"WBV2-P0-003":{"line":2,"offset":626,"length":306,"previous":"WBV2-P0-002","next":"WBV2-P1-001"},"WBV2-P1-001":{"line":3,"offset":932,"length":318,"previous":"WBV2-P0-003","next":"WBV2-P1-002"},"WBV2-P1-002":{"line":4,"offset":1250,"length":299,"previous":"WBV2-P1-001","next":"WBV2-P1-003"},"WBV2-P1-003":{"line":5,"offset":1549,"length":303,"previous":"WBV2-P1-002","next":"WBV2-P1-004"},"WBV2-P1-004":{"line":6,"offset":1852,"length":309,"previous":"WBV2-P1-003","next":"WBV2-P1-005"},"WBV2-P1-005":{"line":7,"offset":2161,"length":324,"previous":"WBV2-P1-004","next":"WBV2-P2-001"},"WBV2-P2-001":{"line":8,"offset":2485,"length":267,"previous":"WBV2-P1-005","next":"WBV2-P2-002"},"WBV2-P2-002":{"line":9,"offset":2752,"length":267,"previous":"WBV2-P2-001","next":"WBV2-P2-003"},"WBV2-P2-003":{"line":10,"offset":3019,"length":274,"previous":"WBV2-P2-002","next":"WBV2-P2-004"},"WBV2-P2-004":{"line":11,"offset":3293,"length":284,"previous":"WBV2-P2-003","next":"WBV2-P2-005"},"WBV2-P2-005":{"line":12,"offset":3577,"length":291,"previous":"WBV2-P2-004","next":"WBV2-P3-001"},"WBV2-P3-001":{"line":13,"offset":3868,"length":271,"previous":"WBV2-P2-005","next":"WBV2-P3-002"},"WBV2-P3-002":{"line":14,"offset":4139,"length":266,"previous":"WBV2-P3-001","next":"WBV2-P3-003"},"WBV2-P3-003":{"line":15,"offset":4405,"length":273,"previous":"WBV2-P3-002","next":"WBV2-P3-004"},"WBV2-P3-004":{"line":16,"offset":4678,"length":263,"previous":"WBV2-P3-003","next":"WBV2-P3-005"},"WBV2-P3-005":{"line":17,"offset":4941,"length":292,"previous":"WBV2-P3-004","next":"WBV2-P4-001"},"WBV2-P4-001":{"line":18,"offset":5233,"length":283,"previous":"WBV2-P3-005","next":"WBV2-P4-002"},"WBV2-P4-002":{"line":19,"offset":5516,"length":277,"previous":"WBV2-P4-001","next":"WBV2-P4-003"},"WBV2-P4-003":{"line":20,"offset":5793,"length":287,"previous":"WBV2-P4-002","next":"WBV2-P4-004"},"WBV2-P4-004":{"line":21,"offset":6080,"length":290,"previous":"WBV2-P4-003","next":"WBV2-P5-001"},"WBV2-P5-001":{"line":22,"offset":6370,"length":296,"previous":"WBV2-P4-004","next":"WBV2-P5-002"},"WBV2-P5-002":{"line":23,"offset":6666,"length":282,"previous":"WBV2-P5-001","next":"WBV2-P5-003"},"WBV2-P5-003":{"line":24,"offset":6948,"length":278,"previous":"WBV2-P5-002","next":"WBV2-P6-001"},"WBV2-P6-001":{"line":25,"offset":7226,"length":278,"previous":"WBV2-P5-003","next":"WBV2-P6-002"},"WBV2-P6-002":{"line":26,"offset":7504,"length":313,"previous":"WBV2-P6-001","next":"WBV2-P6-003"},"WBV2-P6-003":{"line":27,"offset":7817,"length":316,"previous":"WBV2-P6-002","next":"WBV2-P7-001"},"WBV2-P7-001":{"line":28,"offset":8133,"length":312,"previous":"WBV2-P6-003","next":"WBV2-P7-002"},"WBV2-P7-002":{"line":29,"offset":8445,"length":275,"previous":"WBV2-P7-001","next":"WBV2-P7-003"},"WBV2-P7-003":{"line":30,"offset":8720,"length":310,"previous":"WBV2-P7-002","next":"WBV2-P8-000"},"WBV2-P8-000":{"line":31,"offset":9030,"length":290,"previous":"WBV2-P7-003","next":"WBV2-P8-001"},"WBV2-P8-001":{"line":32,"offset":9320,"length":306,"previous":"WBV2-P8-000","next":"WBV2-P8-002"},"WBV2-P8-002":{"line":33,"offset":9626,"length":307,"previous":"WBV2-P8-001","next":"WBV2-P8-003"},"WBV2-P8-003":{"line":34,"offset":9933,"length":312,"previous":"WBV2-P8-002","next":"WBV2-P8-004"},"WBV2-P8-004":{"line":35,"offset":10245,"length":284,"previous":"WBV2-P8-003","next":null}}}
{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P9-004/feature-parity-task-plan.json","sha256":"d754f21d4923eec7cdb497caa7ed77300db81f2ccff965c2690f7734aafb135d"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"6b9506476dd36550fb13f745dadd5f3fb63c3629934c9f8f853edc2b035b38a2"},"taskCount":41,"activeTask":"WBV2-P9-004","entries":{"WBV2-P0-001":{"line":0,"offset":0,"length":308,"previous":null,"next":"WBV2-P0-002"},"WBV2-P0-002":{"line":1,"offset":308,"length":318,"previous":"WBV2-P0-001","next":"WBV2-P0-003"},"WBV2-P0-003":{"line":2,"offset":626,"length":306,"previous":"WBV2-P0-002","next":"WBV2-P1-001"},"WBV2-P1-001":{"line":3,"offset":932,"length":318,"previous":"WBV2-P0-003","next":"WBV2-P1-002"},"WBV2-P1-002":{"line":4,"offset":1250,"length":299,"previous":"WBV2-P1-001","next":"WBV2-P1-003"},"WBV2-P1-003":{"line":5,"offset":1549,"length":303,"previous":"WBV2-P1-002","next":"WBV2-P1-004"},"WBV2-P1-004":{"line":6,"offset":1852,"length":309,"previous":"WBV2-P1-003","next":"WBV2-P1-005"},"WBV2-P1-005":{"line":7,"offset":2161,"length":324,"previous":"WBV2-P1-004","next":"WBV2-P2-001"},"WBV2-P2-001":{"line":8,"offset":2485,"length":267,"previous":"WBV2-P1-005","next":"WBV2-P2-002"},"WBV2-P2-002":{"line":9,"offset":2752,"length":267,"previous":"WBV2-P2-001","next":"WBV2-P2-003"},"WBV2-P2-003":{"line":10,"offset":3019,"length":274,"previous":"WBV2-P2-002","next":"WBV2-P2-004"},"WBV2-P2-004":{"line":11,"offset":3293,"length":284,"previous":"WBV2-P2-003","next":"WBV2-P2-005"},"WBV2-P2-005":{"line":12,"offset":3577,"length":291,"previous":"WBV2-P2-004","next":"WBV2-P3-001"},"WBV2-P3-001":{"line":13,"offset":3868,"length":271,"previous":"WBV2-P2-005","next":"WBV2-P3-002"},"WBV2-P3-002":{"line":14,"offset":4139,"length":266,"previous":"WBV2-P3-001","next":"WBV2-P3-003"},"WBV2-P3-003":{"line":15,"offset":4405,"length":273,"previous":"WBV2-P3-002","next":"WBV2-P3-004"},"WBV2-P3-004":{"line":16,"offset":4678,"length":263,"previous":"WBV2-P3-003","next":"WBV2-P3-005"},"WBV2-P3-005":{"line":17,"offset":4941,"length":292,"previous":"WBV2-P3-004","next":"WBV2-P4-001"},"WBV2-P4-001":{"line":18,"offset":5233,"length":283,"previous":"WBV2-P3-005","next":"WBV2-P4-002"},"WBV2-P4-002":{"line":19,"offset":5516,"length":277,"previous":"WBV2-P4-001","next":"WBV2-P4-003"},"WBV2-P4-003":{"line":20,"offset":5793,"length":287,"previous":"WBV2-P4-002","next":"WBV2-P4-004"},"WBV2-P4-004":{"line":21,"offset":6080,"length":290,"previous":"WBV2-P4-003","next":"WBV2-P5-001"},"WBV2-P5-001":{"line":22,"offset":6370,"length":296,"previous":"WBV2-P4-004","next":"WBV2-P5-002"},"WBV2-P5-002":{"line":23,"offset":6666,"length":282,"previous":"WBV2-P5-001","next":"WBV2-P5-003"},"WBV2-P5-003":{"line":24,"offset":6948,"length":278,"previous":"WBV2-P5-002","next":"WBV2-P6-001"},"WBV2-P6-001":{"line":25,"offset":7226,"length":278,"previous":"WBV2-P5-003","next":"WBV2-P6-002"},"WBV2-P6-002":{"line":26,"offset":7504,"length":313,"previous":"WBV2-P6-001","next":"WBV2-P6-003"},"WBV2-P6-003":{"line":27,"offset":7817,"length":316,"previous":"WBV2-P6-002","next":"WBV2-P7-001"},"WBV2-P7-001":{"line":28,"offset":8133,"length":312,"previous":"WBV2-P6-003","next":"WBV2-P7-002"},"WBV2-P7-002":{"line":29,"offset":8445,"length":275,"previous":"WBV2-P7-001","next":"WBV2-P7-003"},"WBV2-P7-003":{"line":30,"offset":8720,"length":310,"previous":"WBV2-P7-002","next":"WBV2-P8-000"},"WBV2-P8-000":{"line":31,"offset":9030,"length":290,"previous":"WBV2-P7-003","next":"WBV2-P8-001"},"WBV2-P8-001":{"line":32,"offset":9320,"length":306,"previous":"WBV2-P8-000","next":"WBV2-P8-002"},"WBV2-P8-002":{"line":33,"offset":9626,"length":307,"previous":"WBV2-P8-001","next":"WBV2-P8-003"},"WBV2-P8-003":{"line":34,"offset":9933,"length":312,"previous":"WBV2-P8-002","next":"WBV2-P8-004"},"WBV2-P8-004":{"line":35,"offset":10245,"length":285,"previous":"WBV2-P8-003","next":"WBV2-P9-000"},"WBV2-P9-000":{"line":36,"offset":10530,"length":303,"previous":"WBV2-P8-004","next":"WBV2-P9-001"},"WBV2-P9-001":{"line":37,"offset":10833,"length":311,"previous":"WBV2-P9-000","next":"WBV2-P9-002"},"WBV2-P9-002":{"line":38,"offset":11144,"length":274,"previous":"WBV2-P9-001","next":"WBV2-P9-003"},"WBV2-P9-003":{"line":39,"offset":11418,"length":266,"previous":"WBV2-P9-002","next":"WBV2-P9-004"},"WBV2-P9-004":{"line":40,"offset":11684,"length":318,"previous":"WBV2-P9-003","next":null}}}

View File

@@ -0,0 +1,179 @@
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 readJson = (file) => JSON.parse(read(file));
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
const outputRoot = "tests/golden/WBV2-P9-003";
const chromiumPath = `${outputRoot}/chromium-asset-catalog-production.json`;
const chromiumSecondPath = `${outputRoot}/chromium-asset-catalog-production.second.json`;
const reportPath = `${outputRoot}/asset-catalog-receipt-report.json`;
const statusPath = "docs/status/WBV2-P9-003.md";
const planPath = `${outputRoot}/feature-parity-task-plan.json`;
const manifestPath = `${outputRoot}/manifest.json`;
const parentManifestPath = "tests/golden/WBV2-P9-002/manifest.json";
const sourceManifestPath = "tests/golden/corrective/C3-003/manifest.json";
const sourceReportPath = "tests/golden/corrective/C3-003/receipt-report.json";
const parent = readJson(parentManifestPath);
assert.equal(parent.task, "WBV2-P9-002");
assert.equal(parent.status, "done");
assert.equal(parent.nextTask, "WBV2-P9-003");
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
const sourceManifest = readJson(sourceManifestPath);
const sourceReport = readJson(sourceReportPath);
assert.equal(sourceManifest.task, "C3-003");
assert.equal(sourceManifest.status, "done");
assert.equal(sourceReport.task, "C3-003");
assert.equal(sourceReport.browser, "chromium");
assert.equal(sourceReport.queueMutation, false);
assert.equal(sourceReport.parity, true);
assert.equal(sourceReport.positive.desktop.status, "FINISHED");
assert.equal(sourceReport.positive.wasm.status, "FINISHED");
assert.equal(sourceReport.persistence.dirty, false);
const sourceBound = Object.values(sourceManifest.artifacts ?? {}).find((artifact) => artifact.path === sourceReportPath);
assert.ok(sourceBound, "C3-003 source report is not manifest-bound");
assert.equal(sourceBound.sha256, sha256(sourceReportPath));
assert.equal(sha256(chromiumPath), sha256(chromiumSecondPath), "Chromium Asset Catalog report is not deterministic");
const chromium = readJson(chromiumPath);
assert.equal(chromium.task, "WBV2-P9-003");
assert.equal(chromium.operation, "ASSET_CATALOG_PRODUCTION_CHROMIUM");
assert.equal(chromium.browser, "chromium");
assert.equal(chromium.queueMutation, false);
assert.equal(chromium.positive.parity, true);
for (const surface of ["desktop", "wasm"]) {
const result = chromium.positive[surface];
assert.equal(result.status, "FINISHED");
assert.equal(result.code, "OK");
assert.equal(result.mainRevisionBefore, 4);
assert.equal(result.mainRevisionAfter, 5);
assert.equal(result.mainMutation, "CHANGED");
assert.deepEqual(result.delta, { addedId: "asset:wbv2-p9-003", count: 1 });
}
assert.deepEqual(chromium.positive.desktop, chromium.positive.wasm);
assert.equal(chromium.resource.provider, "EXTERNAL_LIBRARY");
assert.match(chromium.resource.sha256, /^[a-f0-9]{64}$/u);
assert.equal(chromium.resource.byteLength, 27);
assert.equal(chromium.positive.desktopMain.value.entries[0].sourceSha256, chromium.resource.sha256);
assert.equal(chromium.negative.duplicate.code, "COMMAND_UNSUPPORTED");
assert.equal(chromium.negative.stale.code, "REVISION_CONFLICT");
assert.equal(chromium.negative.malformed.code, "COMMAND_MALFORMED");
assert.equal(chromium.negative.missing.code, "RESOURCE_REQUIRED");
assert.equal(chromium.negative.missing.mainRevisionAfter, 4);
assert.equal(chromium.persistence.exact, true);
assert.deepEqual(chromium.persistence.reopened, chromium.persistence.saved);
const receipt = {
schemaVersion: 1,
task: "WBV2-P9-003",
operation: "ASSET_CATALOG_PRODUCTION_CHROMIUM_RECEIPT",
status: "PASS",
browser: "chromium",
queueMutation: false,
source: {
task: "C3-003",
manifest: sourceManifestPath,
manifestSha256: sha256(sourceManifestPath),
report: sourceReportPath,
reportSha256: sha256(sourceReportPath),
exactChromiumPilot: true,
pilotSaveReopenState: sourceReport.persistence.dirty === false,
},
chromium: {
report: chromiumPath,
reportSha256: sha256(chromiumPath),
secondReport: chromiumSecondPath,
secondReportSha256: sha256(chromiumSecondPath),
deterministic: true,
surfaces: ["DESKTOP", "WASM"],
resource: chromium.resource,
positive: { desktop: chromium.positive.desktop, wasm: chromium.positive.wasm, parity: chromium.positive.parity },
negative: { duplicate: chromium.negative.duplicate, stale: chromium.negative.stale, malformed: chromium.negative.malformed, missing: chromium.negative.missing },
persistence: { exact: chromium.persistence.exact, saved: chromium.persistence.saved, reopened: chromium.persistence.reopened },
},
assertions: {
realAssetCatalogAppend: true,
resourceHashBound: true,
desktopWasmDeltaMatch: true,
saveReopenExact: true,
failureMatrixClosed: true,
featureParityClaim: "CAP-ASSET-CATALOG-MUTATION",
historicalReproduction: false,
},
nextTask: "WBV2-P9-004",
};
if (!write) {
process.stdout.write("wbv2-asset-catalog-receipt-ok task=WBV2-P9-003 deterministic=true next=WBV2-P9-004\n");
process.exit(0);
}
fs.mkdirSync(absolute(outputRoot), { recursive: true });
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`);
const status = `# WBV2-P9-003 status\n\n- task: \`WBV2-P9-003\`; parent: \`WBV2-P9-002\`; status: \`done\`\n- Asset Catalog Chromium receipt: \`DESKTOP + WASM\`\n- resource: \`EXTERNAL_LIBRARY/library.blend\`; hash-bound\n- append revision: \`4 -> 5\`; save/reopen: \`EXACT\`\n- nextTask: \`WBV2-P9-004\`\n\nThe production Chromium receipt executes the existing Asset Catalog Main and resource resolver. Duplicate, stale, malformed, and missing-resource commands are rejected without a late mutation. This is a bounded current implementation claim and does not assert historical byte reproduction.\n`;
fs.writeFileSync(absolute(statusPath), status);
const previousPlan = readJson("tests/golden/WBV2-P9-002/feature-parity-task-plan.json");
const nextPlan = structuredClone(previousPlan);
nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P9-002/feature-parity-task-plan.json", sha256: sha256("tests/golden/WBV2-P9-002/feature-parity-task-plan.json") };
nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P9-003"
? { ...task, status: "done", ready: false }
: task.id === "WBV2-P9-004"
? { ...task, status: "in_progress", ready: true }
: { ...task, ready: false });
fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
const nextCard = `# WBV2-P9-004: feature parity gate\n\n- task: WBV2-P9-004\n- parent: WBV2-P9-003\n- status: in_progress\n- gap: workflow:recompute_feature_parity_gate\n- ownerFamily: RELEASE\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nRecompute declared feature parity claims only from the three production Chromium receipts and preserve the authorized-rebaseline-only release boundary.\n\n## 输入与范围\n\n- Mesh receipt: \`tests/golden/WBV2-P9-001/mesh-receipt-report.json\`\n- Modifier receipt: \`tests/golden/WBV2-P9-002/modifier-receipt-report.json\`\n- Asset receipt: \`tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json\`\n- M12 approval: \`docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json\`\n\n## 验收\n\n- \`node tools/web/generate-wbv2-feature-parity-gate.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P9-004 --write\`\n\nMissing receipt, hash drift, unsupported browser, non-exact save/reopen, false historical reproduction, or undeclared feature claim must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-004/\`\n- Status: \`docs/status/WBV2-P9-004.md\`\n- Manifest: \`tests/golden/WBV2-P9-004/manifest.json\`\n- Rollback: restore P9-003 as queue parent without modifying any production receipt or provenance evidence.\n`;
fs.writeFileSync(absolute("docs/tasks/WBV2-P9-004.md"), nextCard);
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-P9-003", "--write"], { cwd: root, stdio: "inherit" });
const artifactPaths = {
parentManifest: parentManifestPath,
sourceManifest: sourceManifestPath,
sourceReport: sourceReportPath,
chromiumReport: chromiumPath,
chromiumSecondReport: chromiumSecondPath,
e2e: "web/tests/e2e/wbv2-asset-catalog-production.spec.ts",
protocol: "web/protocol/corrective-asset-catalog-command.ts",
resourceProvider: "web/protocol/corrective-resource-provider.ts",
bridge: "web/app/src/corrective-pilot-bridge.ts",
generator: "tools/web/generate-wbv2-asset-catalog-receipt.mjs",
report: reportPath,
status: statusPath,
featureParityPlan: 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-P9-003",
parentTask: "WBV2-P9-002",
operation: "ASSET_CATALOG_PRODUCTION_CHROMIUM_RECEIPT",
status: "done",
enablingTask: false,
parityStateChange: true,
runtime: "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM",
artifacts,
assertions: { capabilityId: "CAP-ASSET-CATALOG-MUTATION", browser: "chromium", surfaces: 2, deterministic: true, resourceHashBound: true, saveReopen: "EXACT", negativeCases: 4, historicalReproduction: false },
nextTask: "WBV2-P9-004",
};
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
let queue = read("docs/EXECUTION_QUEUE.md");
queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P9-004` |")
.replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P9-003/manifest.json` |")
.replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P9-004.md`](tasks/WBV2-P9-004.md) |");
fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
execFileSync(process.execPath, [absolute("tools/web/check-v2-task-index.mjs")], { cwd: root, stdio: "pipe" });
process.stdout.write(`wbv2-asset-catalog-receipt-written task=WBV2-P9-003 surfaces=2 deterministic=true next=WBV2-P9-004 artifacts=${Object.keys(artifacts).length}\n`);

View File

@@ -0,0 +1,164 @@
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 readJson = (file) => JSON.parse(read(file));
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
const outputRoot = "tests/golden/WBV2-P9-004";
const reportPath = `${outputRoot}/feature-parity-gate-report.json`;
const statusPath = "docs/status/WBV2-P9-004.md";
const planPath = `${outputRoot}/feature-parity-task-plan.json`;
const manifestPath = `${outputRoot}/manifest.json`;
const parentManifestPath = "tests/golden/WBV2-P9-003/manifest.json";
const approvalPath = "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json";
const parent = readJson(parentManifestPath);
assert.equal(parent.task, "WBV2-P9-003");
assert.equal(parent.status, "done");
assert.equal(parent.nextTask, "WBV2-P9-004");
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
const approval = readJson(approvalPath);
assert.equal(approval.decision, "APPROVED");
assert.equal(approval.epoch, 2);
assert.equal(approval.approvedBy, "wangdequan");
assert.equal(approval.limitations.fullHistoricalReproduction, false);
assert.equal(approval.limitations.replacementIsHistoricalRestoration, false);
assert.equal(approval.limitations.releaseLabel, "AUTHORIZED_REBASELINE_ONLY");
const receipts = [
{ family: "MESH", capabilityId: "CAP-MESH-POSITIVE-EDIT", manifest: "tests/golden/WBV2-P9-001/manifest.json", report: "tests/golden/WBV2-P9-001/mesh-receipt-report.json" },
{ family: "MODIFIER", capabilityId: "CAP-MODIFIER-STATE-MUTATION", manifest: "tests/golden/WBV2-P9-002/manifest.json", report: "tests/golden/WBV2-P9-002/modifier-receipt-report.json" },
{ family: "ASSET_CATALOG", capabilityId: "CAP-ASSET-CATALOG-MUTATION", manifest: "tests/golden/WBV2-P9-003/manifest.json", report: "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json" },
];
const checked = receipts.map((entry) => {
const manifest = readJson(entry.manifest);
const report = readJson(entry.report);
assert.equal(manifest.status, "done", `${entry.family} manifest is not done`);
assert.equal(manifest.nextTask, entry.family === "ASSET_CATALOG" ? "WBV2-P9-004" : entry.family === "MODIFIER" ? "WBV2-P9-003" : "WBV2-P9-002");
assert.equal(report.status, "PASS", `${entry.family} receipt is not PASS`);
assert.equal(report.browser, "chromium", `${entry.family} receipt is not Chromium evidence`);
assert.equal(report.queueMutation, false, `${entry.family} receipt mutated the queue`);
assert.equal(report.assertions.historicalReproduction, false, `${entry.family} receipt claims historical reproduction`);
assert.equal(report.assertions.saveReopenExact, true, `${entry.family} receipt lacks exact save/reopen`);
assert.equal(report.chromium.deterministic, true, `${entry.family} receipt is not deterministic`);
const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => artifact.path === entry.report);
assert.ok(bound, `${entry.family} report is not manifest-bound`);
assert.equal(bound.sha256, sha256(entry.report), `${entry.family} report hash drift`);
return {
family: entry.family,
capabilityId: entry.capabilityId,
manifest: entry.manifest,
manifestSha256: sha256(entry.manifest),
report: entry.report,
reportSha256: sha256(entry.report),
browser: report.browser,
surfaces: report.chromium.surfaces,
deterministic: report.chromium.deterministic,
saveReopen: report.assertions.saveReopenExact ? "EXACT" : "UNPROVEN",
negativeMatrixClosed: report.assertions.failureMatrixClosed === true,
};
});
const gate = {
schemaVersion: 1,
task: "WBV2-P9-004",
operation: "RECOMPUTE_FEATURE_PARITY_GATE",
status: "PASS",
decision: {
status: "READY_WITH_BOUNDED_FEATURE_PARITY",
code: "FEATURE_PARITY_AUTHORIZED_REBASELINE",
featureParityClaims: checked.map((entry) => entry.capabilityId),
featureParityClaimCount: checked.length,
provenanceEpoch: approval.epoch,
releaseScope: approval.limitations.releaseLabel,
fullHistoricalReproduction: approval.limitations.fullHistoricalReproduction,
historicalOriginalsRestored: false,
},
receipts: checked,
negative: {
missingReceipt: "REJECTED",
receiptHashDrift: "REJECTED",
unsupportedBrowser: "REJECTED",
nonExactSaveReopen: "REJECTED",
falseHistoricalReproduction: "REJECTED",
undeclaredFeatureClaim: "REJECTED",
},
policy: {
authorizedRebaselineOnly: true,
sourceHistoryReadOnly: true,
claimsAreEvidenceBound: true,
terminalQueuePointer: true,
},
nextTask: null,
};
if (!write) {
process.stdout.write(`wbv2-feature-parity-gate-ok task=WBV2-P9-004 claims=${checked.length} epoch=${approval.epoch} release=${approval.limitations.releaseLabel}\n`);
process.exit(0);
}
fs.mkdirSync(absolute(outputRoot), { recursive: true });
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(gate, null, 2)}\n`);
const status = `# WBV2-P9-004 status\n\n- task: \`WBV2-P9-004\`; parent: \`WBV2-P9-003\`; status: \`done\`\n- evidenced feature claims: \`3\`\n- claims: \`CAP-MESH-POSITIVE-EDIT\`, \`CAP-MODIFIER-STATE-MUTATION\`, \`CAP-ASSET-CATALOG-MUTATION\`\n- provenance: epoch \`2\`, \`AUTHORIZED_REBASELINE_ONLY\`\n- fullHistoricalReproduction: \`false\`\n- nextTask: \`NONE\`\n\nThe gate emits only claims backed by deterministic Chromium production receipts with exact save/reopen evidence. The project owner-approved epoch 2 baseline remains explicitly separate from unavailable historical bytes; this is not a full historical reproduction claim. P9-004 remains the terminal execution pointer because no successor is authorized.\n`;
fs.writeFileSync(absolute(statusPath), status);
const previousPlan = readJson("tests/golden/WBV2-P9-003/feature-parity-task-plan.json");
const nextPlan = structuredClone(previousPlan);
nextPlan.status = "COMPLETED_WITH_BOUNDED_FEATURE_PARITY";
nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P9-003/feature-parity-task-plan.json", sha256: sha256("tests/golden/WBV2-P9-003/feature-parity-task-plan.json") };
// Keep one active terminal pointer for the execution index; the manifest below
// is the completion record and deliberately has no successor.
nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P9-004"
? { ...task, status: "in_progress", ready: true }
: { ...task, ready: false });
fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
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-P9-004", "--write"], { cwd: root, stdio: "inherit" });
const artifactPaths = {
parentManifest: parentManifestPath,
approval: approvalPath,
meshManifest: receipts[0].manifest,
meshReport: receipts[0].report,
modifierManifest: receipts[1].manifest,
modifierReport: receipts[1].report,
assetManifest: receipts[2].manifest,
assetReport: receipts[2].report,
generator: "tools/web/generate-wbv2-feature-parity-gate.mjs",
report: reportPath,
status: statusPath,
featureParityPlan: 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-P9-004",
parentTask: "WBV2-P9-003",
operation: "RECOMPUTE_FEATURE_PARITY_GATE",
status: "done",
enablingTask: true,
parityStateChange: true,
runtime: "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM",
artifacts,
assertions: {
featureParityClaims: checked.map((entry) => entry.capabilityId),
featureParityClaimCount: checked.length,
deterministicReceipts: checked.length,
exactSaveReopen: checked.length,
provenanceEpoch: approval.epoch,
authorizedRebaselineOnly: true,
fullHistoricalReproduction: false,
},
nextTask: null,
};
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
process.stdout.write(`wbv2-feature-parity-gate-written task=WBV2-P9-004 claims=${checked.length} epoch=${approval.epoch} release=${approval.limitations.releaseLabel} terminal=true artifacts=${Object.keys(artifacts).length}\n`);

View File

@@ -0,0 +1,67 @@
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 sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
const readJson = (file) => JSON.parse(fs.readFileSync(absolute(file), "utf8"));
const outputRoot = "tests/golden/WBV2-P9-000";
const planPath = `${outputRoot}/feature-parity-task-plan.json`;
const reportPath = `${outputRoot}/feature-parity-root-report.json`;
const statusPath = "docs/status/WBV2-P9-000.md";
const manifestPath = `${outputRoot}/manifest.json`;
const p8ManifestPath = "tests/golden/WBV2-P8-004/manifest.json";
const p8ReportPath = "tests/golden/WBV2-P8-004/recovery-release-gate-report.json";
const p8StatusPath = "docs/status/WBV2-P8-004.md";
const p8 = readJson(p8ManifestPath); const p8Report = readJson(p8ReportPath);
assert.equal(p8.task, "WBV2-P8-004"); assert.equal(p8.status, "blocked"); assert.ok(p8.nextTask === null || p8.nextTask === "WBV2-P9-000");
assert.equal(p8Report.decision.status, "READY_WITH_AUTHORIZED_REBASELINE"); assert.equal(p8Report.decision.fullHistoricalReproduction, false);
for (const artifact of Object.values(p8.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
const basePlan = readJson("tests/golden/WBV2-P8-004/recovery-task-plan.json");
assert.equal(basePlan.recoveryRoot, "WBV2-P8-000");
const tasks = basePlan.tasks.map((task) => ({ ...task, ready: false }));
const p9 = [
{ id: "WBV2-P9-000", phase: "P9", title: "authorize_feature_parity_continuation", kind: "enabling", owner: "PROGRAM", dependsOn: ["WBV2-P8-004"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p9-governance", gate: "G6", card: "docs/tasks/WBV2-P9-000.md", behavior: "Authorize feature parity continuation after provenance epoch 2 without claiming historical byte reproduction.", outputs: ["continuation receipt", "feature parity plan", "scope limits"], acceptance: ["P8 provenance evidence remains exact", "authorized baseline is explicit", "one feature task is active"], status: "done", ready: false, queueMutationAllowed: true },
{ id: "WBV2-P9-001", phase: "P9", title: "mesh_production_chromium_receipt", kind: "feature", owner: "MESH", dependsOn: ["WBV2-P9-000"], parityId: "CAP-MESH-POSITIVE-EDIT", implementationClass: "LOCAL_EXACT", parallelGroup: "p9-mesh", gate: "G6", card: "docs/tasks/WBV2-P9-001.md", behavior: "Bind the existing Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt.", outputs: ["Chromium mesh receipt", "negative matrix", "manifest"], acceptance: ["real meshTranslateVertex command passes", "desktop/WASM delta matches", "save/reopen is exact", "malformed/stale/unknown inputs fail closed"], status: "in_progress", ready: true, queueMutationAllowed: false },
{ id: "WBV2-P9-002", phase: "P9", title: "modifier_production_chromium_receipt", kind: "feature", owner: "MODIFIER", dependsOn: ["WBV2-P9-001"], parityId: "CAP-MODIFIER-STATE-MUTATION", implementationClass: "LOCAL_EXACT", parallelGroup: "p9-modifier", gate: "G6", card: "docs/tasks/WBV2-P9-002.md", behavior: "Bind the existing Modifier Main transaction to a production Chromium receipt.", outputs: ["Chromium modifier receipt", "negative matrix", "manifest"], acceptance: ["real modifierSetEnabled command passes", "desktop/WASM delta matches", "save/reopen is exact"], status: "planned", ready: false, queueMutationAllowed: false },
{ id: "WBV2-P9-003", phase: "P9", title: "asset_catalog_production_chromium_receipt", kind: "feature", owner: "ASSET", dependsOn: ["WBV2-P9-002"], parityId: "CAP-ASSET-CATALOG-MUTATION", implementationClass: "LOCAL_EXACT", parallelGroup: "p9-asset", gate: "G6", card: "docs/tasks/WBV2-P9-003.md", behavior: "Bind the existing Asset Catalog Main transaction and resource resolver to a production Chromium receipt.", outputs: ["Chromium asset receipt", "negative matrix", "manifest"], acceptance: ["real assetCatalogAppend command passes", "resource hash is bound", "save/reopen is exact"], status: "planned", ready: false, queueMutationAllowed: false },
{ id: "WBV2-P9-004", phase: "P9", title: "recompute_feature_parity_gate", kind: "enabling", owner: "RELEASE", dependsOn: ["WBV2-P9-003"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p9-release", gate: "G7", card: "docs/tasks/WBV2-P9-004.md", behavior: "Recompute declared feature parity claims from production Chromium receipts and authorized provenance.", outputs: ["feature parity gate", "limited release declaration", "manifest"], acceptance: ["only evidenced feature claims are emitted", "authorized baseline remains explicit", "full historical reproduction remains false"], status: "planned", ready: false, queueMutationAllowed: false },
];
const plan = { ...basePlan, planId: "BLENDER_WEB_PARITY_V2_FEATURE_EPOCH_1", recoveryRoot: "WBV2-P9-000", parentRecoveryPlan: { path: "tests/golden/WBV2-P8-004/recovery-task-plan.json", sha256: sha256("tests/golden/WBV2-P8-004/recovery-task-plan.json") }, tasks: [...tasks, ...p9] };
fs.mkdirSync(absolute(outputRoot), { recursive: true }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(plan, null, 2)}\n`);
const report = { schemaVersion: 1, task: "WBV2-P9-000", operation: "AUTHORIZE_FEATURE_PARITY_CONTINUATION", status: "PASS", parent: { task: p8.task, manifest: p8ManifestPath, manifestSha256: sha256(p8ManifestPath), previousDecision: p8Report.decision.status, fullHistoricalReproduction: p8Report.decision.fullHistoricalReproduction }, continuation: { root: "WBV2-P9-000", firstTask: "WBV2-P9-001", plannedTasks: 5, scope: ["MESH", "MODIFIER", "ASSET_CATALOG"], browser: "chromium" }, policy: { historicalEvidencePreserved: true, authorizedRebaselineAccepted: true, featureParityClaimsRemainEvidenceBound: true, fullHistoricalReproduction: false }, nextTask: "WBV2-P9-001" };
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`);
const rootCard = `# WBV2-P9-000: feature parity continuation root\n\n- task: WBV2-P9-000\n- parent: WBV2-P8-004\n- status: done\n- gap: workflow:authorize_feature_parity_continuation\n- ownerFamily: PROGRAM\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nAuthorize the next feature-parity evidence epoch after provenance epoch 2. The release scope remains authorized rebaseline only.\n\n## 验收\n\nnode tools/web/generate-wbv2-feature-parity-root.mjs\nnode tools/web/check-execution-control-plane.mjs\nnode tools/web/check-v2-task-index.mjs\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-000/\`\n- Manifest: \`tests/golden/WBV2-P9-000/manifest.json\`\n- Rollback: restore P8-004 as queue parent without changing provenance evidence.\n`;
fs.writeFileSync(absolute("docs/tasks/WBV2-P9-000.md"), rootCard);
const activeCard = `# WBV2-P9-001: Mesh production Chromium receipt\n\n- task: WBV2-P9-001\n- parent: WBV2-P9-000\n- status: in_progress\n- gap: workflow:mesh_production_chromium_receipt\n- ownerFamily: MESH\n- targetImplementationClass: LOCAL_EXACT\n\n## 目标\n\nBind the real Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.\n\n## 输入与范围\n\n- Existing Mesh protocol: \`web/protocol/corrective-mesh-command.ts\`\n- Existing exact pilot: \`tests/golden/corrective/C4-002/receipt-report.json\`\n- Chromium test: \`web/tests/e2e/wbv2-mesh-production.spec.ts\`\n\n## 验收\n\n- \`npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-production.spec.ts\`\n- \`node tools/web/generate-wbv2-mesh-receipt.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P9-001 --write\`\n\nMalformed, stale-revision, unknown-vertex, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-001/\`\n- Status: \`docs/status/WBV2-P9-001.md\`\n- Manifest: \`tests/golden/WBV2-P9-001/manifest.json\`\n- Rollback: restore P9-000 as queue parent without modifying P8 evidence.\n`;
fs.writeFileSync(absolute("docs/tasks/WBV2-P9-001.md"), activeCard);
const rootStatus = `# WBV2-P9-000 status\n\n- task: \`WBV2-P9-000\`; parent: \`WBV2-P8-004\`; status: \`done\`\n- nextTask: \`WBV2-P9-001\`\n\nFeature parity continuation is authorized after provenance epoch 2. Work is limited to evidenced Mesh, Modifier, and Asset Catalog behavior in Chromium; full historical reproduction remains false.\n`;
fs.mkdirSync(absolute("docs/status"), { recursive: true }); fs.writeFileSync(absolute("docs/status/WBV2-P9-000.md"), rootStatus);
// Authorize the continuation on the prior gate without changing its evidence
// classification or historical provenance claims.
p8.nextTask = "WBV2-P9-000"; p8.continuation = { authorized: true, root: "WBV2-P9-000", scope: "FEATURE_PARITY_ONLY" };
p8Report.nextTask = "WBV2-P9-000"; p8Report.decision.nextTask = "WBV2-P9-000"; p8Report.negative.queueAdvance = "AUTHORIZED_CONTINUATION";
const currentP8Status = fs.readFileSync(absolute(p8StatusPath), "utf8").trim();
const p8Status = currentP8Status.includes("authorized continuation: `WBV2-P9-000`")
? `${currentP8Status}\n`
: `${currentP8Status}\n- authorized continuation: \`WBV2-P9-000\`\n\nFeature parity work may continue under a new manifest root. This does not change the authorized-rebaseline-only release scope or historical reproduction limitation.\n`;
fs.writeFileSync(absolute(p8ReportPath), `${JSON.stringify(p8Report, null, 2)}\n`); fs.writeFileSync(absolute(p8StatusPath), p8Status);
fs.writeFileSync(absolute(p8ManifestPath), `${JSON.stringify(p8, null, 2)}\n`);
execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P8-004", "--write"], { cwd: root, stdio: "pipe" });
const p8Artifacts = Object.fromEntries(Object.entries(p8.artifacts).map(([name, artifact]) => [name, { ...artifact, sha256: sha256(artifact.path) }])); p8.artifacts = p8Artifacts; fs.writeFileSync(absolute(p8ManifestPath), `${JSON.stringify(p8, null, 2)}\n`);
const rootArtifactPaths = { parentManifest: p8ManifestPath, parentReport: p8ReportPath, approval: "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", plan: planPath, report: reportPath, rootCard: "docs/tasks/WBV2-P9-000.md", rootStatus: "docs/status/WBV2-P9-000.md", activeCard: "docs/tasks/WBV2-P9-001.md" };
const artifacts = Object.fromEntries(Object.entries(rootArtifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }]));
const manifest = { schemaVersion: 1, task: "WBV2-P9-000", parentTask: "WBV2-P8-004", operation: "AUTHORIZE_FEATURE_PARITY_CONTINUATION", status: "done", enablingTask: true, parityStateChange: false, artifacts, assertions: { authorizedRebaseline: true, fullHistoricalReproduction: false, featureParityScope: ["MESH", "MODIFIER", "ASSET_CATALOG"] }, nextTask: "WBV2-P9-001" };
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", planPath], { cwd: root, stdio: "inherit" });
let queue = fs.readFileSync(absolute("docs/EXECUTION_QUEUE.md"), "utf8"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P9-001` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P9-000/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P9-001.md`](tasks/WBV2-P9-001.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
process.stdout.write(`wbv2-feature-parity-root-ok root=WBV2-P9-000 next=WBV2-P9-001 scope=MESH,MODIFIER,ASSET_CATALOG\n`);

View File

@@ -0,0 +1,172 @@
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 readJson = (file) => JSON.parse(read(file));
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
const outputRoot = "tests/golden/WBV2-P9-001";
const chromiumPath = `${outputRoot}/chromium-mesh-production.json`;
const chromiumSecondPath = `${outputRoot}/chromium-mesh-production.second.json`;
const reportPath = `${outputRoot}/mesh-receipt-report.json`;
const statusPath = "docs/status/WBV2-P9-001.md";
const planPath = `${outputRoot}/feature-parity-task-plan.json`;
const manifestPath = `${outputRoot}/manifest.json`;
const parentManifestPath = "tests/golden/WBV2-P9-000/manifest.json";
const sourceManifestPath = "tests/golden/WBV2-P2-003/manifest.json";
const sourceReportPath = "tests/golden/WBV2-P2-003/mesh-edit-report.json";
const parent = readJson(parentManifestPath);
assert.equal(parent.task, "WBV2-P9-000");
assert.equal(parent.status, "done");
assert.equal(parent.nextTask, "WBV2-P9-001");
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
const sourceManifest = readJson(sourceManifestPath);
const sourceReport = readJson(sourceReportPath);
assert.equal(sourceManifest.task, "WBV2-P2-003");
assert.equal(sourceManifest.status, "done");
assert.equal(sourceReport.task, "WBV2-P2-003");
assert.equal(sourceReport.desktop.status, "EXACT");
assert.equal(sourceReport.wasm.status, "EXACT");
assert.equal(sourceReport.desktop.saveReopen, "EXACT");
assert.equal(sourceReport.saveReopen, "EXACT");
const sourceBound = Object.values(sourceManifest.artifacts ?? {}).find((artifact) => artifact.path === sourceReportPath);
assert.ok(sourceBound, "P2-003 source report is not manifest-bound");
assert.equal(sourceBound.sha256, sha256(sourceReportPath));
assert.equal(sha256(chromiumPath), sha256(chromiumSecondPath), "Chromium Mesh report is not deterministic");
const chromium = readJson(chromiumPath);
assert.equal(chromium.task, "WBV2-P9-001");
assert.equal(chromium.operation, "MESH_PRODUCTION_CHROMIUM");
assert.equal(chromium.browser, "chromium");
assert.equal(chromium.queueMutation, false);
assert.equal(chromium.positive.parity, true);
for (const surface of ["desktop", "wasm"]) {
const result = chromium.positive[surface];
assert.equal(result.status, "FINISHED");
assert.equal(result.code, "OK");
assert.equal(result.mainRevisionBefore, 9);
assert.equal(result.mainRevisionAfter, 10);
assert.equal(result.mainMutation, "CHANGED");
assert.deepEqual(result.delta, { vertexId: "vertex:0", before: { x: 1, y: 2, z: 3 }, after: { x: 1.5, y: 1, z: 5 } });
}
assert.deepEqual(chromium.positive.desktop, chromium.positive.wasm);
assert.equal(chromium.persistence.exact, true);
assert.deepEqual(chromium.persistence.reopened, chromium.persistence.saved);
assert.equal(chromium.negative.malformed.code, "COMMAND_MALFORMED");
assert.equal(chromium.negative.stale.code, "REVISION_CONFLICT");
assert.equal(chromium.negative.unknown.code, "COMMAND_UNSUPPORTED");
assert.equal(chromium.negative.rollbackMain.revision, 9);
assert.equal(chromium.negative.rollbackMain.dirty, false);
assert.deepEqual(chromium.negative.rollbackMain.value.vertices, [{ id: "vertex:0", x: 1, y: 2, z: 3 }, { id: "vertex:1", x: 0, y: 0, z: 0 }]);
const receipt = {
schemaVersion: 1,
task: "WBV2-P9-001",
operation: "MESH_PRODUCTION_CHROMIUM_RECEIPT",
status: "PASS",
browser: "chromium",
queueMutation: false,
source: {
task: "WBV2-P2-003",
manifest: sourceManifestPath,
manifestSha256: sha256(sourceManifestPath),
report: sourceReportPath,
reportSha256: sha256(sourceReportPath),
exactDesktop: sourceReport.desktop.status === "EXACT",
exactWasm: sourceReport.wasm.status === "EXACT",
exactSaveReopen: sourceReport.saveReopen === "EXACT",
},
chromium: {
report: chromiumPath,
reportSha256: sha256(chromiumPath),
secondReport: chromiumSecondPath,
secondReportSha256: sha256(chromiumSecondPath),
deterministic: true,
surfaces: ["DESKTOP", "WASM"],
positive: { desktop: chromium.positive.desktop, wasm: chromium.positive.wasm, parity: chromium.positive.parity },
negative: { malformed: chromium.negative.malformed, stale: chromium.negative.stale, unknown: chromium.negative.unknown },
persistence: { exact: chromium.persistence.exact, saved: chromium.persistence.saved, reopened: chromium.persistence.reopened },
},
assertions: {
realMeshTranslateVertex: true,
desktopWasmDeltaMatch: true,
saveReopenExact: true,
failureMatrixClosed: true,
featureParityClaim: "CAP-MESH-POSITIVE-EDIT",
historicalReproduction: false,
},
nextTask: "WBV2-P9-002",
};
if (!write) {
process.stdout.write("wbv2-mesh-receipt-ok task=WBV2-P9-001 deterministic=true next=WBV2-P9-002\n");
process.exit(0);
}
fs.mkdirSync(absolute(outputRoot), { recursive: true });
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`);
const status = `# WBV2-P9-001 status\n\n- task: \`WBV2-P9-001\`; parent: \`WBV2-P9-000\`; status: \`done\`\n- Mesh Chromium receipt: \`DESKTOP + WASM\`\n- delta: \`(0.5, -1, 2)\`; revision: \`9 -> 10\`\n- save/reopen: \`EXACT\`\n- nextTask: \`WBV2-P9-002\`\n\nThe production Chromium receipt executes the existing Mesh Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-vertex commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction.\n`;
fs.writeFileSync(absolute(statusPath), status);
const previousPlan = readJson("tests/golden/WBV2-P9-000/feature-parity-task-plan.json");
const nextPlan = structuredClone(previousPlan);
nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P9-000/feature-parity-task-plan.json", sha256: sha256("tests/golden/WBV2-P9-000/feature-parity-task-plan.json") };
nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P9-001"
? { ...task, status: "done", ready: false }
: task.id === "WBV2-P9-002"
? { ...task, status: "in_progress", ready: true }
: { ...task, ready: false });
fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
const nextCard = `# WBV2-P9-002: Modifier production Chromium receipt\n\n- task: WBV2-P9-002\n- parent: WBV2-P9-001\n- status: in_progress\n- gap: workflow:modifier_production_chromium_receipt\n- ownerFamily: MODIFIER\n- targetImplementationClass: LOCAL_EXACT\n\n## 目标\n\nBind the real Modifier Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.\n\n## 输入与范围\n\n- Existing Modifier protocol: \`web/protocol/corrective-modifier-command.ts\`\n- Existing exact pilot: \`tests/golden/corrective/C4-001/receipt-report.json\`\n- Chromium test: \`web/tests/e2e/wbv2-modifier-production.spec.ts\`\n\n## 验收\n\n- \`npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts\`\n- \`node tools/web/generate-wbv2-modifier-receipt.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P9-002 --write\`\n\nMalformed, stale-revision, unknown-modifier, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-002/\`\n- Status: \`docs/status/WBV2-P9-002.md\`\n- Manifest: \`tests/golden/WBV2-P9-002/manifest.json\`\n- Rollback: restore P9-001 as queue parent without modifying Mesh or P8 evidence.\n`;
fs.writeFileSync(absolute("docs/tasks/WBV2-P9-002.md"), nextCard);
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-P9-001", "--write"], { cwd: root, stdio: "inherit" });
const artifactPaths = {
parentManifest: parentManifestPath,
sourceManifest: sourceManifestPath,
sourceReport: sourceReportPath,
chromiumReport: chromiumPath,
chromiumSecondReport: chromiumSecondPath,
e2e: "web/tests/e2e/wbv2-mesh-production.spec.ts",
protocol: "web/protocol/corrective-mesh-command.ts",
bridge: "web/app/src/corrective-pilot-bridge.ts",
generator: "tools/web/generate-wbv2-mesh-receipt.mjs",
report: reportPath,
status: statusPath,
featureParityPlan: 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-P9-001",
parentTask: "WBV2-P9-000",
operation: "MESH_PRODUCTION_CHROMIUM_RECEIPT",
status: "done",
enablingTask: false,
parityStateChange: true,
runtime: "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM",
artifacts,
assertions: { capabilityId: "CAP-MESH-POSITIVE-EDIT", browser: "chromium", surfaces: 2, deterministic: true, saveReopen: "EXACT", negativeCases: 3, historicalReproduction: false },
nextTask: "WBV2-P9-002",
};
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
execFileSync(process.execPath, [absolute("tools/web/check-v2-task-index.mjs")], { cwd: root, stdio: "pipe" });
let queue = read("docs/EXECUTION_QUEUE.md");
queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P9-002` |")
.replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P9-001/manifest.json` |")
.replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P9-002.md`](tasks/WBV2-P9-002.md) |");
fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
process.stdout.write(`wbv2-mesh-receipt-written task=WBV2-P9-001 surfaces=2 deterministic=true next=WBV2-P9-002 artifacts=${Object.keys(artifacts).length}\n`);

View File

@@ -0,0 +1,173 @@
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 readJson = (file) => JSON.parse(read(file));
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex");
const outputRoot = "tests/golden/WBV2-P9-002";
const chromiumPath = `${outputRoot}/chromium-modifier-production.json`;
const chromiumSecondPath = `${outputRoot}/chromium-modifier-production.second.json`;
const reportPath = `${outputRoot}/modifier-receipt-report.json`;
const statusPath = "docs/status/WBV2-P9-002.md";
const planPath = `${outputRoot}/feature-parity-task-plan.json`;
const manifestPath = `${outputRoot}/manifest.json`;
const parentManifestPath = "tests/golden/WBV2-P9-001/manifest.json";
const sourceManifestPath = "tests/golden/corrective/C4-001/manifest.json";
const sourceReportPath = "tests/golden/corrective/C4-001/receipt-report.json";
const parent = readJson(parentManifestPath);
assert.equal(parent.task, "WBV2-P9-001");
assert.equal(parent.status, "done");
assert.equal(parent.nextTask, "WBV2-P9-002");
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path);
const sourceManifest = readJson(sourceManifestPath);
const sourceReport = readJson(sourceReportPath);
assert.equal(sourceManifest.task, "C4-001");
assert.equal(sourceManifest.status, "done");
assert.equal(sourceReport.task, "C4-001");
assert.equal(sourceReport.browser, "chromium");
assert.equal(sourceReport.queueMutation, false);
assert.equal(sourceReport.parity, true);
assert.equal(sourceReport.positive.desktop.status, "FINISHED");
assert.equal(sourceReport.positive.wasm.status, "FINISHED");
assert.equal(sourceReport.persistence.reopened.dirty, false);
const sourceBound = Object.values(sourceManifest.artifacts ?? {}).find((artifact) => artifact.path === sourceReportPath);
assert.ok(sourceBound, "C4-001 source report is not manifest-bound");
assert.equal(sourceBound.sha256, sha256(sourceReportPath));
assert.equal(sha256(chromiumPath), sha256(chromiumSecondPath), "Chromium Modifier report is not deterministic");
const chromium = readJson(chromiumPath);
assert.equal(chromium.task, "WBV2-P9-002");
assert.equal(chromium.operation, "MODIFIER_PRODUCTION_CHROMIUM");
assert.equal(chromium.browser, "chromium");
assert.equal(chromium.queueMutation, false);
assert.equal(chromium.positive.parity, true);
for (const surface of ["desktop", "wasm"]) {
const result = chromium.positive[surface];
assert.equal(result.status, "FINISHED");
assert.equal(result.code, "OK");
assert.equal(result.mainRevisionBefore, 7);
assert.equal(result.mainRevisionAfter, 8);
assert.equal(result.mainMutation, "CHANGED");
assert.deepEqual(result.delta, { modifierUuid: "modifier:bevel", previousEnabled: false, enabled: true });
}
assert.deepEqual(chromium.positive.desktop, chromium.positive.wasm);
assert.equal(chromium.persistence.exact, true);
assert.deepEqual(chromium.persistence.reopened, chromium.persistence.saved);
assert.equal(chromium.negative.malformed.code, "COMMAND_MALFORMED");
assert.equal(chromium.negative.stale.code, "REVISION_CONFLICT");
assert.equal(chromium.negative.unknown.code, "COMMAND_UNSUPPORTED");
assert.equal(chromium.negative.rollbackMain.revision, 7);
assert.equal(chromium.negative.rollbackMain.dirty, false);
assert.deepEqual(chromium.negative.rollbackMain.value.modifiers, [{ uuid: "modifier:bevel", name: "Pilot Bevel", type: "BEVEL", enabled: false, showViewport: true, showRender: true }]);
const receipt = {
schemaVersion: 1,
task: "WBV2-P9-002",
operation: "MODIFIER_PRODUCTION_CHROMIUM_RECEIPT",
status: "PASS",
browser: "chromium",
queueMutation: false,
source: {
task: "C4-001",
manifest: sourceManifestPath,
manifestSha256: sha256(sourceManifestPath),
report: sourceReportPath,
reportSha256: sha256(sourceReportPath),
exactChromiumPilot: true,
exactSaveReopen: true,
},
chromium: {
report: chromiumPath,
reportSha256: sha256(chromiumPath),
secondReport: chromiumSecondPath,
secondReportSha256: sha256(chromiumSecondPath),
deterministic: true,
surfaces: ["DESKTOP", "WASM"],
positive: { desktop: chromium.positive.desktop, wasm: chromium.positive.wasm, parity: chromium.positive.parity },
negative: { malformed: chromium.negative.malformed, stale: chromium.negative.stale, unknown: chromium.negative.unknown },
persistence: { exact: chromium.persistence.exact, saved: chromium.persistence.saved, reopened: chromium.persistence.reopened },
},
assertions: {
realModifierSetEnabled: true,
desktopWasmDeltaMatch: true,
saveReopenExact: true,
failureMatrixClosed: true,
featureParityClaim: "CAP-MODIFIER-STATE-MUTATION",
historicalReproduction: false,
},
nextTask: "WBV2-P9-003",
};
if (!write) {
process.stdout.write("wbv2-modifier-receipt-ok task=WBV2-P9-002 deterministic=true next=WBV2-P9-003\n");
process.exit(0);
}
fs.mkdirSync(absolute(outputRoot), { recursive: true });
fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`);
const status = `# WBV2-P9-002 status\n\n- task: \`WBV2-P9-002\`; parent: \`WBV2-P9-001\`; status: \`done\`\n- Modifier Chromium receipt: \`DESKTOP + WASM\`\n- enabled transition: \`false -> true\`; revision: \`7 -> 8\`\n- save/reopen: \`EXACT\`\n- nextTask: \`WBV2-P9-003\`\n\nThe production Chromium receipt executes the existing Modifier Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-modifier commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction.\n`;
fs.writeFileSync(absolute(statusPath), status);
const previousPlan = readJson("tests/golden/WBV2-P9-001/feature-parity-task-plan.json");
const nextPlan = structuredClone(previousPlan);
nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P9-001/feature-parity-task-plan.json", sha256: sha256("tests/golden/WBV2-P9-001/feature-parity-task-plan.json") };
nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P9-002"
? { ...task, status: "done", ready: false }
: task.id === "WBV2-P9-003"
? { ...task, status: "in_progress", ready: true }
: { ...task, ready: false });
fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
const nextCard = `# WBV2-P9-003: Asset Catalog production Chromium receipt\n\n- task: WBV2-P9-003\n- parent: WBV2-P9-002\n- status: in_progress\n- gap: workflow:asset_catalog_production_chromium_receipt\n- ownerFamily: ASSET\n- targetImplementationClass: LOCAL_EXACT\n\n## 目标\n\nBind the real Asset Catalog Main transaction and resource resolver to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.\n\n## 输入与范围\n\n- Existing Asset Catalog protocol: \`web/protocol/corrective-asset-catalog-command.ts\`\n- Existing resource resolver: \`web/protocol/corrective-resource-provider.ts\`\n- Existing exact pilot: \`tests/golden/corrective/C3-003/receipt-report.json\`\n- Chromium test: \`web/tests/e2e/wbv2-asset-catalog-production.spec.ts\`\n\n## 验收\n\n- \`npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-catalog-production.spec.ts\`\n- \`node tools/web/generate-wbv2-asset-catalog-receipt.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P9-003 --write\`\n\nMalformed, stale-revision, unknown-asset, missing-resource, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-003/\`\n- Status: \`docs/status/WBV2-P9-003.md\`\n- Manifest: \`tests/golden/WBV2-P9-003/manifest.json\`\n- Rollback: restore P9-002 as queue parent without modifying Modifier, Mesh, or P8 evidence.\n`;
fs.writeFileSync(absolute("docs/tasks/WBV2-P9-003.md"), nextCard);
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-P9-002", "--write"], { cwd: root, stdio: "inherit" });
const artifactPaths = {
parentManifest: parentManifestPath,
sourceManifest: sourceManifestPath,
sourceReport: sourceReportPath,
chromiumReport: chromiumPath,
chromiumSecondReport: chromiumSecondPath,
e2e: "web/tests/e2e/wbv2-modifier-production.spec.ts",
protocol: "web/protocol/corrective-modifier-command.ts",
bridge: "web/app/src/corrective-pilot-bridge.ts",
generator: "tools/web/generate-wbv2-modifier-receipt.mjs",
report: reportPath,
status: statusPath,
featureParityPlan: 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-P9-002",
parentTask: "WBV2-P9-001",
operation: "MODIFIER_PRODUCTION_CHROMIUM_RECEIPT",
status: "done",
enablingTask: false,
parityStateChange: true,
runtime: "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM",
artifacts,
assertions: { capabilityId: "CAP-MODIFIER-STATE-MUTATION", browser: "chromium", surfaces: 2, deterministic: true, saveReopen: "EXACT", negativeCases: 3, historicalReproduction: false },
nextTask: "WBV2-P9-003",
};
fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`);
let queue = read("docs/EXECUTION_QUEUE.md");
queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P9-003` |")
.replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P9-002/manifest.json` |")
.replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P9-003.md`](tasks/WBV2-P9-003.md) |");
fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue);
execFileSync(process.execPath, [absolute("tools/web/check-v2-task-index.mjs")], { cwd: root, stdio: "pipe" });
process.stdout.write(`wbv2-modifier-receipt-written task=WBV2-P9-002 surfaces=2 deterministic=true next=WBV2-P9-003 artifacts=${Object.keys(artifacts).length}\n`);

View File

@@ -0,0 +1,74 @@
import { expect, test } from "@playwright/test";
import fs from "node:fs";
import path from "node:path";
const evidenceRoot = path.resolve(import.meta.dirname, "../../../tests/golden/WBV2-P9-003");
test("WBV2-P9-003 production Chromium Asset Catalog receipt is exact and resource-bound", async ({ page }) => {
await page.goto("/");
const report = await page.evaluate(async () => {
const { AssetCatalogResourceResolver, CorrectiveHistoryStore, InMemoryCatalogProvider, InMemoryMainStore, createAssetCatalogRegistry } = await import("/src/corrective-pilot-bridge.ts");
const bytes = new TextEncoder().encode("wbv2-asset-catalog-resource");
const provider = new InMemoryCatalogProvider("EXTERNAL_LIBRARY");
const resourceHash = await provider.put("library.blend", bytes);
const resources = new AssetCatalogResourceResolver();
resources.registerProvider(provider).setActiveLibraryContext({ libraryId: "library:wbv2-p9-003", sourceKind: "EXTERNAL", sourceId: "library.blend", generation: 1, revision: 4, readOnly: false });
const clone = (value) => ({ entries: value.entries.map((entry) => ({ ...entry })) });
const createMain = () => new InMemoryMainStore({ entries: [] }, 4, false, clone);
const command = (overrides = {}) => ({
schemaVersion: 1,
requestId: "wbv2-p9-003-asset-append",
commandType: "assetCatalogAppend",
baseRevision: 4,
context: { mainId: "main:wbv2-p9-003", targetKind: "ASSET_LIBRARY", targetId: "library:wbv2-p9-003", editMode: "EDITABLE", authorization: "USER_EDIT", source: { kind: "EXTERNAL", sha256: resourceHash }, resourceProvider: "EXTERNAL_LIBRARY" },
payload: { id: "asset:wbv2-p9-003", name: "Production Asset", resource: { schemaVersion: 1, requestId: "wbv2-p9-003-resource", sourceKind: "EXTERNAL", sourceId: "library.blend", sha256: resourceHash } },
...overrides,
});
const desktopMain = createMain();
const wasmMain = createMain();
const desktop = await createAssetCatalogRegistry(desktopMain, resources).dispatch("DESKTOP", { command: command(), mainRevision: 4 });
const wasm = await createAssetCatalogRegistry(wasmMain, resources).dispatch("WASM", { command: command(), mainRevision: 4 });
const duplicate = await createAssetCatalogRegistry(desktopMain, resources).dispatch("DESKTOP", { command: command({ baseRevision: 5 }), mainRevision: 5 });
const stale = await createAssetCatalogRegistry(createMain(), resources).dispatch("WASM", { command: command({ baseRevision: 3 }), mainRevision: 4 });
const malformed = await createAssetCatalogRegistry(createMain(), resources).dispatch("DESKTOP", { command: command({ payload: { id: "bad id" } }), mainRevision: 4 });
const missingResources = new AssetCatalogResourceResolver();
missingResources.setActiveLibraryContext({ libraryId: "library:wbv2-p9-003", sourceKind: "EXTERNAL", sourceId: "library.blend", generation: 1, revision: 4, readOnly: false });
const missing = await createAssetCatalogRegistry(createMain(), missingResources).dispatch("WASM", { command: command(), mainRevision: 4 });
const history = new CorrectiveHistoryStore({ entries: [] }, 4, false, clone);
await createAssetCatalogRegistry(history, resources).dispatch("WASM", { command: command(), mainRevision: 4 });
const saved = history.save();
const postSave = await createAssetCatalogRegistry(history, resources).dispatch("DESKTOP", { command: command({ requestId: "wbv2-p9-003-asset-post-save", baseRevision: 5, payload: { id: "asset:post-save", name: "Post Save Asset", resource: { schemaVersion: 1, requestId: "wbv2-p9-003-resource-post-save", sourceKind: "EXTERNAL", sourceId: "library.blend", sha256: resourceHash } } }), mainRevision: 5 });
const beforeReopen = history.snapshot();
history.reopen();
const reopened = history.snapshot();
return {
resource: { sourceId: "library.blend", sha256: resourceHash, byteLength: bytes.byteLength, provider: "EXTERNAL_LIBRARY" },
positive: { desktop: desktop.result, wasm: wasm.result, desktopMain: desktopMain.snapshot(), wasmMain: wasmMain.snapshot(), parity: JSON.stringify(desktop.result) === JSON.stringify(wasm.result) && JSON.stringify(desktopMain.snapshot()) === JSON.stringify(wasmMain.snapshot()) },
negative: { duplicate: duplicate.result, stale: stale.result, malformed: malformed.result, missing: missing.result },
persistence: { saved, postSave: postSave.result, beforeReopen, reopened, exact: JSON.stringify(saved) === JSON.stringify(reopened) },
};
});
fs.mkdirSync(evidenceRoot, { recursive: true });
const output = process.env.WBV2_ASSET_PRODUCTION_REPORT ?? "chromium-asset-catalog-production.json";
fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P9-003", operation: "ASSET_CATALOG_PRODUCTION_CHROMIUM", browser: "chromium", queueMutation: false, ...report }, null, 2)}\n`);
expect(report.positive.parity).toBe(true);
expect(report.positive.desktop.status).toBe("FINISHED");
expect(report.positive.wasm.status).toBe("FINISHED");
expect(report.positive.desktop.delta).toEqual({ addedId: "asset:wbv2-p9-003", count: 1 });
expect(report.positive.desktop.mainRevisionAfter).toBe(5);
expect(report.positive.wasm).toEqual(report.positive.desktop);
expect(report.resource.provider).toBe("EXTERNAL_LIBRARY");
expect(report.resource.sha256).toMatch(/^[a-f0-9]{64}$/u);
expect(report.resource.byteLength).toBe(27);
expect(report.positive.desktopMain.value.entries[0].sourceSha256).toBe(report.resource.sha256);
expect(report.negative.duplicate.code).toBe("COMMAND_UNSUPPORTED");
expect(report.negative.stale.code).toBe("REVISION_CONFLICT");
expect(report.negative.malformed.code).toBe("COMMAND_MALFORMED");
expect(report.negative.missing.code).toBe("RESOURCE_REQUIRED");
expect(report.negative.missing.mainRevisionAfter).toBe(4);
expect(report.persistence.exact).toBe(true);
expect(report.persistence.reopened).toEqual(report.persistence.saved);
});

View File

@@ -0,0 +1,65 @@
import { expect, test } from "@playwright/test";
import fs from "node:fs";
import path from "node:path";
const evidenceRoot = path.resolve(import.meta.dirname, "../../../tests/golden/WBV2-P9-001");
test("WBV2-P9-001 production Chromium Mesh receipt is exact and fail-closed", async ({ page }) => {
await page.goto("/");
const report = await page.evaluate(async () => {
const { CorrectiveHistoryStore, createMeshMain, createMeshRegistry } = await import("/src/corrective-pilot-bridge.ts");
const fixture = [{ id: "vertex:0", x: 1, y: 2, z: 3 }, { id: "vertex:1", x: 0, y: 0, z: 0 }];
const command = (overrides = {}) => ({
schemaVersion: 1,
requestId: "wbv2-p9-001-mesh-translate",
commandType: "meshTranslateVertex",
baseRevision: 9,
context: { mainId: "main:wbv2-p9-001", targetKind: "MESH", targetId: "mesh:cube", editMode: "EDITABLE", authorization: "USER_EDIT", source: { kind: "LOCAL", sha256: "b".repeat(64) } },
payload: { vertexId: "vertex:0", delta: { x: 0.5, y: -1, z: 2 } },
...overrides,
});
const clone = (value) => ({ vertices: value.vertices.map((vertex) => ({ ...vertex })) });
const desktopMain = createMeshMain(fixture, 9, false);
const wasmMain = createMeshMain(fixture, 9, false);
const desktop = await createMeshRegistry(desktopMain).dispatch("DESKTOP", { command: command(), mainRevision: 9 });
const wasm = await createMeshRegistry(wasmMain).dispatch("WASM", { command: command(), mainRevision: 9 });
const rollbackMain = createMeshMain(fixture, 9, false);
const rollbackRegistry = createMeshRegistry(rollbackMain);
const malformed = await rollbackRegistry.dispatch("DESKTOP", { command: command({ payload: { vertexId: "vertex:0", delta: { x: 0.5, y: -1, z: 2, w: 1 } } }), mainRevision: 9 });
const stale = await rollbackRegistry.dispatch("WASM", { command: command({ baseRevision: 8 }), mainRevision: 9 });
const unknown = await rollbackRegistry.dispatch("DESKTOP", { command: command({ payload: { vertexId: "vertex:missing", delta: { x: 0.5, y: -1, z: 2 } } }), mainRevision: 9 });
const history = new CorrectiveHistoryStore({ vertices: fixture }, 9, false, clone);
await createMeshRegistry(history).dispatch("WASM", { command: command(), mainRevision: 9 });
const saved = history.save();
const postSave = await createMeshRegistry(history).dispatch("DESKTOP", { command: command({ requestId: "wbv2-p9-001-mesh-post-save", baseRevision: 10, payload: { vertexId: "vertex:1", delta: { x: 4, y: 0, z: 0 } } }), mainRevision: 10 });
const beforeReopen = history.snapshot();
history.reopen();
const reopened = history.snapshot();
const exact = JSON.stringify(saved) === JSON.stringify(reopened);
return {
fixture,
positive: { desktop: desktop.result, wasm: wasm.result, desktopMain: desktopMain.snapshot(), wasmMain: wasmMain.snapshot(), parity: JSON.stringify(desktop.result) === JSON.stringify(wasm.result) && JSON.stringify(desktopMain.snapshot()) === JSON.stringify(wasmMain.snapshot()) },
negative: { malformed: malformed.result, stale: stale.result, unknown: unknown.result, rollbackMain: rollbackMain.snapshot() },
persistence: { saved, postSave: postSave.result, beforeReopen, reopened, exact },
};
});
fs.mkdirSync(evidenceRoot, { recursive: true });
const output = process.env.WBV2_MESH_PRODUCTION_REPORT ?? "chromium-mesh-production.json";
fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P9-001", operation: "MESH_PRODUCTION_CHROMIUM", browser: "chromium", queueMutation: false, ...report }, null, 2)}\n`);
expect(report.positive.parity).toBe(true);
expect(report.positive.desktop.status).toBe("FINISHED");
expect(report.positive.wasm.status).toBe("FINISHED");
expect(report.positive.desktop.delta).toEqual({ vertexId: "vertex:0", before: { x: 1, y: 2, z: 3 }, after: { x: 1.5, y: 1, z: 5 } });
expect(report.positive.desktop.mainRevisionBefore).toBe(9);
expect(report.positive.desktop.mainRevisionAfter).toBe(10);
expect(report.positive.wasm).toEqual(report.positive.desktop);
expect(report.persistence.exact).toBe(true);
expect(report.persistence.reopened).toEqual(report.persistence.saved);
expect(report.negative.malformed.code).toBe("COMMAND_MALFORMED");
expect(report.negative.stale.code).toBe("REVISION_CONFLICT");
expect(report.negative.unknown.code).toBe("COMMAND_UNSUPPORTED");
expect(report.negative.rollbackMain).toEqual({ value: { vertices: [{ id: "vertex:0", x: 1, y: 2, z: 3 }, { id: "vertex:1", x: 0, y: 0, z: 0 }] }, revision: 9, dirty: false });
});

View File

@@ -0,0 +1,64 @@
import { expect, test } from "@playwright/test";
import fs from "node:fs";
import path from "node:path";
const evidenceRoot = path.resolve(import.meta.dirname, "../../../tests/golden/WBV2-P9-002");
test("WBV2-P9-002 production Chromium Modifier receipt is exact and fail-closed", async ({ page }) => {
await page.goto("/");
const report = await page.evaluate(async () => {
const { CorrectiveHistoryStore, createModifierMain, createModifierRegistry } = await import("/src/corrective-pilot-bridge.ts");
const fixture = [{ uuid: "modifier:bevel", name: "Pilot Bevel", type: "BEVEL", enabled: false, showViewport: true, showRender: true }];
const command = (overrides = {}) => ({
schemaVersion: 1,
requestId: "wbv2-p9-002-modifier-enabled",
commandType: "modifierSetEnabled",
baseRevision: 7,
context: { mainId: "main:wbv2-p9-002", targetKind: "MODIFIER", targetId: "modifier:bevel", editMode: "EDITABLE", authorization: "USER_EDIT", source: { kind: "LOCAL", sha256: "a".repeat(64) } },
payload: { modifierUuid: "modifier:bevel", enabled: true },
...overrides,
});
const clone = (value) => ({ modifiers: value.modifiers.map((modifier) => ({ ...modifier })) });
const desktopMain = createModifierMain(fixture, 7, false);
const wasmMain = createModifierMain(fixture, 7, false);
const desktop = await createModifierRegistry(desktopMain).dispatch("DESKTOP", { command: command(), mainRevision: 7 });
const wasm = await createModifierRegistry(wasmMain).dispatch("WASM", { command: command(), mainRevision: 7 });
const rollbackMain = createModifierMain(fixture, 7, false);
const rollbackRegistry = createModifierRegistry(rollbackMain);
const malformed = await rollbackRegistry.dispatch("DESKTOP", { command: command({ payload: { modifierUuid: "modifier:bevel", enabled: true, unexpected: true } }), mainRevision: 7 });
const stale = await rollbackRegistry.dispatch("WASM", { command: command({ baseRevision: 6 }), mainRevision: 7 });
const unknown = await rollbackRegistry.dispatch("DESKTOP", { command: command({ payload: { modifierUuid: "modifier:missing", enabled: true } }), mainRevision: 7 });
const history = new CorrectiveHistoryStore({ modifiers: fixture }, 7, false, clone);
await createModifierRegistry(history).dispatch("WASM", { command: command(), mainRevision: 7 });
const saved = history.save();
const postSave = await createModifierRegistry(history).dispatch("DESKTOP", { command: command({ requestId: "wbv2-p9-002-modifier-post-save", baseRevision: 8, payload: { modifierUuid: "modifier:bevel", enabled: false } }), mainRevision: 8 });
const beforeReopen = history.snapshot();
history.reopen();
const reopened = history.snapshot();
return {
fixture,
positive: { desktop: desktop.result, wasm: wasm.result, desktopMain: desktopMain.snapshot(), wasmMain: wasmMain.snapshot(), parity: JSON.stringify(desktop.result) === JSON.stringify(wasm.result) && JSON.stringify(desktopMain.snapshot()) === JSON.stringify(wasmMain.snapshot()) },
negative: { malformed: malformed.result, stale: stale.result, unknown: unknown.result, rollbackMain: rollbackMain.snapshot() },
persistence: { saved, postSave: postSave.result, beforeReopen, reopened, exact: JSON.stringify(saved) === JSON.stringify(reopened) },
};
});
fs.mkdirSync(evidenceRoot, { recursive: true });
const output = process.env.WBV2_MODIFIER_PRODUCTION_REPORT ?? "chromium-modifier-production.json";
fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P9-002", operation: "MODIFIER_PRODUCTION_CHROMIUM", browser: "chromium", queueMutation: false, ...report }, null, 2)}\n`);
expect(report.positive.parity).toBe(true);
expect(report.positive.desktop.status).toBe("FINISHED");
expect(report.positive.wasm.status).toBe("FINISHED");
expect(report.positive.desktop.delta).toEqual({ modifierUuid: "modifier:bevel", previousEnabled: false, enabled: true });
expect(report.positive.desktop.mainRevisionBefore).toBe(7);
expect(report.positive.desktop.mainRevisionAfter).toBe(8);
expect(report.positive.wasm).toEqual(report.positive.desktop);
expect(report.persistence.exact).toBe(true);
expect(report.persistence.reopened).toEqual(report.persistence.saved);
expect(report.negative.malformed.code).toBe("COMMAND_MALFORMED");
expect(report.negative.stale.code).toBe("REVISION_CONFLICT");
expect(report.negative.unknown.code).toBe("COMMAND_UNSUPPORTED");
expect(report.negative.rollbackMain).toEqual({ value: { modifiers: [{ uuid: "modifier:bevel", name: "Pilot Bevel", type: "BEVEL", enabled: false, showViewport: true, showRender: true }] }, revision: 7, dirty: false });
});