Complete WBV2 feature parity evidence epoch
This commit is contained in:
@@ -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` |
|
||||
|
||||
@@ -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.
|
||||
|
||||
6
docs/status/WBV2-P9-000.md
Normal file
6
docs/status/WBV2-P9-000.md
Normal 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.
|
||||
9
docs/status/WBV2-P9-001.md
Normal file
9
docs/status/WBV2-P9-001.md
Normal 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.
|
||||
9
docs/status/WBV2-P9-002.md
Normal file
9
docs/status/WBV2-P9-002.md
Normal 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.
|
||||
9
docs/status/WBV2-P9-003.md
Normal file
9
docs/status/WBV2-P9-003.md
Normal 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.
|
||||
10
docs/status/WBV2-P9-004.md
Normal file
10
docs/status/WBV2-P9-004.md
Normal 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
24
docs/tasks/WBV2-P9-000.md
Normal 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
33
docs/tasks/WBV2-P9-001.md
Normal 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
33
docs/tasks/WBV2-P9-002.md
Normal 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
34
docs/tasks/WBV2-P9-003.md
Normal 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
33
docs/tasks/WBV2-P9-004.md
Normal 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.
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
31
tests/golden/WBV2-P9-000/feature-parity-root-report.json
Normal file
31
tests/golden/WBV2-P9-000/feature-parity-root-report.json
Normal 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"
|
||||
}
|
||||
1448
tests/golden/WBV2-P9-000/feature-parity-task-plan.json
Normal file
1448
tests/golden/WBV2-P9-000/feature-parity-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
53
tests/golden/WBV2-P9-000/manifest.json
Normal file
53
tests/golden/WBV2-P9-000/manifest.json
Normal 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"
|
||||
}
|
||||
278
tests/golden/WBV2-P9-001/chromium-mesh-production.json
Normal file
278
tests/golden/WBV2-P9-001/chromium-mesh-production.json
Normal 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
|
||||
}
|
||||
}
|
||||
278
tests/golden/WBV2-P9-001/chromium-mesh-production.second.json
Normal file
278
tests/golden/WBV2-P9-001/chromium-mesh-production.second.json
Normal 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
|
||||
}
|
||||
}
|
||||
1448
tests/golden/WBV2-P9-001/feature-parity-task-plan.json
Normal file
1448
tests/golden/WBV2-P9-001/feature-parity-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
74
tests/golden/WBV2-P9-001/manifest.json
Normal file
74
tests/golden/WBV2-P9-001/manifest.json
Normal 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"
|
||||
}
|
||||
188
tests/golden/WBV2-P9-001/mesh-receipt-report.json
Normal file
188
tests/golden/WBV2-P9-001/mesh-receipt-report.json
Normal 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"
|
||||
}
|
||||
175
tests/golden/WBV2-P9-001/task-context.json
Normal file
175
tests/golden/WBV2-P9-001/task-context.json
Normal 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
|
||||
}
|
||||
}
|
||||
226
tests/golden/WBV2-P9-002/chromium-modifier-production.json
Normal file
226
tests/golden/WBV2-P9-002/chromium-modifier-production.json
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
1448
tests/golden/WBV2-P9-002/feature-parity-task-plan.json
Normal file
1448
tests/golden/WBV2-P9-002/feature-parity-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
74
tests/golden/WBV2-P9-002/manifest.json
Normal file
74
tests/golden/WBV2-P9-002/manifest.json
Normal 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"
|
||||
}
|
||||
163
tests/golden/WBV2-P9-002/modifier-receipt-report.json
Normal file
163
tests/golden/WBV2-P9-002/modifier-receipt-report.json
Normal 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"
|
||||
}
|
||||
177
tests/golden/WBV2-P9-002/task-context.json
Normal file
177
tests/golden/WBV2-P9-002/task-context.json
Normal 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
|
||||
}
|
||||
}
|
||||
182
tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json
Normal file
182
tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json
Normal 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"
|
||||
}
|
||||
221
tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json
Normal file
221
tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
1448
tests/golden/WBV2-P9-003/feature-parity-task-plan.json
Normal file
1448
tests/golden/WBV2-P9-003/feature-parity-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
79
tests/golden/WBV2-P9-003/manifest.json
Normal file
79
tests/golden/WBV2-P9-003/manifest.json
Normal 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"
|
||||
}
|
||||
179
tests/golden/WBV2-P9-003/task-context.json
Normal file
179
tests/golden/WBV2-P9-003/task-context.json
Normal 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
|
||||
}
|
||||
}
|
||||
85
tests/golden/WBV2-P9-004/feature-parity-gate-report.json
Normal file
85
tests/golden/WBV2-P9-004/feature-parity-gate-report.json
Normal 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
|
||||
}
|
||||
1448
tests/golden/WBV2-P9-004/feature-parity-task-plan.json
Normal file
1448
tests/golden/WBV2-P9-004/feature-parity-task-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
78
tests/golden/WBV2-P9-004/manifest.json
Normal file
78
tests/golden/WBV2-P9-004/manifest.json
Normal 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
|
||||
}
|
||||
181
tests/golden/WBV2-P9-004/task-context.json
Normal file
181
tests/golden/WBV2-P9-004/task-context.json
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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"]}
|
||||
|
||||
@@ -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}}}
|
||||
|
||||
179
tools/web/generate-wbv2-asset-catalog-receipt.mjs
Normal file
179
tools/web/generate-wbv2-asset-catalog-receipt.mjs
Normal 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`);
|
||||
164
tools/web/generate-wbv2-feature-parity-gate.mjs
Normal file
164
tools/web/generate-wbv2-feature-parity-gate.mjs
Normal 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`);
|
||||
67
tools/web/generate-wbv2-feature-parity-root.mjs
Normal file
67
tools/web/generate-wbv2-feature-parity-root.mjs
Normal 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`);
|
||||
172
tools/web/generate-wbv2-mesh-receipt.mjs
Normal file
172
tools/web/generate-wbv2-mesh-receipt.mjs
Normal 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`);
|
||||
173
tools/web/generate-wbv2-modifier-receipt.mjs
Normal file
173
tools/web/generate-wbv2-modifier-receipt.mjs
Normal 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`);
|
||||
74
web/tests/e2e/wbv2-asset-catalog-production.spec.ts
Normal file
74
web/tests/e2e/wbv2-asset-catalog-production.spec.ts
Normal 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);
|
||||
});
|
||||
65
web/tests/e2e/wbv2-mesh-production.spec.ts
Normal file
65
web/tests/e2e/wbv2-mesh-production.spec.ts
Normal 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 });
|
||||
});
|
||||
64
web/tests/e2e/wbv2-modifier-production.spec.ts
Normal file
64
web/tests/e2e/wbv2-modifier-production.spec.ts
Normal 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 });
|
||||
});
|
||||
Reference in New Issue
Block a user