Advance deduplicated object rename coverage
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

This commit is contained in:
mes123456
2026-08-28 16:14:21 +08:00
parent ec46223aba
commit 69fc086b12
40 changed files with 2204 additions and 20 deletions

View File

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

View File

@@ -7,3 +7,6 @@
- repeated Blender/Chromium validation: `0`; unique behavior batches: Paint, Duplicate, Create, Parent, Collection
- provenance epoch: `2`; release: `AUTHORIZED_REBASELINE_ONLY`; fullHistoricalReproduction: `false`
- nextTask: `NONE`
- authorized continuation: `WBV2-P21-000`
Object Rename may continue under a new root without changing the P20 overlay.

View File

@@ -0,0 +1,7 @@
# WBV2-P21-000 status
- task: `WBV2-P21-000`; parent: `WBV2-P20-003`; status: `done`
- candidate: `OBJECT_OPERATIONS.RENAME`; source API is present
- effective inventory carried forward: `287` completed, `6612` pending
- duplicate validation: `forbidden`; representative slice only
- nextTask: `WBV2-P21-001`

View File

@@ -0,0 +1,7 @@
# WBV2-P21-001 status
- task: `WBV2-P21-001`; parent: `WBV2-P21-000`; status: `done`
- selected behavior: `renameId`; exact candidate: `operator:object.add_named`
- base inventory: `6900` total, `6618` pending; effective carried overlay: `6612` pending
- behavior hash: `0f0c4597be3a67123eb4b90ccfe58a08fcf5e530568a1f4ccdc1bd5113dd3fea`; duplicate validation: `forbidden`
- nextTask: `WBV2-P21-002`

View File

@@ -0,0 +1,8 @@
# WBV2-P21-002 status
- task: `WBV2-P21-002`; parent: `WBV2-P21-001`; status: `done`
- exact inventory binding: `operator:object.add_named` via `renameId`
- name: `BasicCube -> WBV2P2102Renamed`; revisions: `1 -> 4` sequential
- malformed rename rejected; save/reopen: `EXACT`; deterministic second run: `true`
- effective pending before overlay: `6612`; representative slice: `true`
- nextTask: `WBV2-P21-003`

View File

@@ -0,0 +1,9 @@
# WBV2-P21-003 status
- task: `WBV2-P21-003`; parent: `WBV2-P21-002`; status: `done`
- new feature claim: `OBJECT_OPERATIONS.RENAME`; exact binding: `operator:object.add_named`
- base inventory: `6900` total, `281` completed, `6618` pending
- cumulative overlay: `288` effective completed, `6611` effective pending, claimed complete overlay: `7`
- repeated Blender/Chromium validation: `0`; unique behavior batches: Paint, Duplicate, Create, Parent, Collection, Rename
- provenance epoch: `2`; release: `AUTHORIZED_REBASELINE_ONLY`; fullHistoricalReproduction: `false`
- nextTask: `NONE`

View File

@@ -0,0 +1,23 @@
# WBV2-P21-000: object rename continuation root
- task: WBV2-P21-000
- parent: WBV2-P20-003
- status: done
- gap: workflow:authorize_object_rename_continuation
- ownerFamily: PROGRAM
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Authorize one source-backed Object Rename behavior after the P20 collection overlay.
## 验收
- `node tools/web/generate-wbv2-rename-root.mjs`
- `node tools/web/check-execution-control-plane.mjs`
## 交付与回滚
- Reports: `tests/golden/WBV2-P21-000/`
- Manifest: `tests/golden/WBV2-P21-000/manifest.json`
- Rollback: restore P20-003 as queue parent.

View File

@@ -0,0 +1,34 @@
# WBV2-P21-001: select_object_rename_batch
- task: WBV2-P21-001
- parent: WBV2-P21-000
- status: in_progress
- gap: capability:OBJECT_OPERATIONS.RENAME
- ownerFamily: PARITY
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Select renameId as one unique Object Operations behavior.
## 输入与范围
- Focused source: `blender-5.2.0/source/blender/web_engine/web_engine_api.cpp`
- Existing client: `web/app/src/engine-client/WebEngineClient.ts`
- Inventory: `tests/golden/WBV2-P0-002/parity-map.json`
- Production entrypoint: `node tools/web/generate-wbv2-rename-selection.mjs --write`
## 验收
- source command is hash-bound
- previous object evidence is not rerun
- one legacy operator binding is selected
- malformed, hash-drift, unsupported, or false-completion input keeps in_progress
- `node tools/web/check-task-context.mjs --task WBV2-P21-001 --write`
## 交付与回滚
- Reports: `tests/golden/WBV2-P21-001/`
- Status: `docs/status/WBV2-P21-001.md`
- Manifest: `tests/golden/WBV2-P21-001/manifest.json`
- Rollback: restore P21-000 as queue parent.

View File

@@ -0,0 +1,34 @@
# WBV2-P21-002: object rename engine receipt
- task: WBV2-P21-002
- parent: WBV2-P21-001
- status: in_progress
- gap: capability:OBJECT_OPERATIONS.RENAME
- ownerFamily: OBJECT
- targetImplementationClass: LOCAL_EXACT
## 目标
Bind renameId, undo/redo, malformed rejection, and exact save/reopen to compiled WASM Main in Chromium.
## 输入与范围
- Focused source: `tests/golden/WBV2-P21-001/object-rename-selection-report.json`
- Production test: `web/tests/e2e/wbv2-object-rename-production.spec.ts`
- Production entrypoint: `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-rename-production.spec.ts`
## 验收
- object name changes
- undo/redo revisions are sequential
- malformed rename fails closed without Main mutation
- save/reopen is exact and deterministic
- Chromium is the only browser
- `node tools/web/check-task-context.mjs --task WBV2-P21-002 --write`
## 交付与回滚
- Reports: `tests/golden/WBV2-P21-002/`
- Status: `docs/status/WBV2-P21-002.md`
- Manifest: `tests/golden/WBV2-P21-002/manifest.json`
- Rollback: restore P21-001 as queue parent.

View File

@@ -0,0 +1,34 @@
# WBV2-P21-003: close object rename gate
- task: WBV2-P21-003
- parent: WBV2-P21-002
- status: in_progress
- gap: workflow:close_object_rename_gate
- ownerFamily: RELEASE
- targetImplementationClass: LOCAL_BOUNDED
## 目标
Close the renameId gate and graduate only the exact operator binding.
## 输入与范围
- Focused receipt: `tests/golden/WBV2-P21-002/object-rename-receipt-report.json`
- Previous overlay: `tests/golden/WBV2-P20-003/inventory-completion-overlay.json`
- Production entrypoint: `node tools/web/generate-wbv2-rename-gate.mjs --write`
## 验收
- only object rename is claimed
- effective inventory remains explicit
- duplicate validation remains zero
- malformed, hash-drift, unsupported, or false-completion input keeps in_progress
- historical reproduction remains false
- `node tools/web/check-task-context.mjs --task WBV2-P21-003 --write`
## 交付与回滚
- Reports: `tests/golden/WBV2-P21-003/`
- Status: `docs/status/WBV2-P21-003.md`
- Manifest: `tests/golden/WBV2-P21-003/manifest.json`
- Rollback: restore P21-002 as queue parent.

View File

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

View File

@@ -159,7 +159,8 @@
"baseInventoryPreserved": true,
"inventoryRemainderExplicit": true,
"noFalseLocalParity": true,
"terminalQueuePointer": true
"terminalQueuePointer": false,
"authorizedContinuation": "WBV2-P21-000"
},
"nextTask": null
"nextTask": "WBV2-P21-000"
}

View File

@@ -30,7 +30,7 @@
},
"report": {
"path": "tests/golden/WBV2-P20-003/collection-gate-report.json",
"sha256": "52e2845aa1ff220b188e4783e4b93a7d244e25a803258de9a5b8aea5379ea895"
"sha256": "e4892dcf9e30a295c74de8fc6952f49504527b72faab3c5d13244764264b99b1"
},
"generator": {
"path": "tools/web/generate-wbv2-collection-gate.mjs",
@@ -38,7 +38,7 @@
},
"status": {
"path": "docs/status/WBV2-P20-003.md",
"sha256": "be6fc3c3fdcbe2698366dcc4cdbca0b7171f53c34894f7d1f6a442193d9dfbc6"
"sha256": "bc4c5115f7c55900025ca3491f1786a2be2b9b5ce9b187c2a78c328324ba6f7e"
},
"parityPlan": {
"path": "tests/golden/WBV2-P20-003/collection-task-plan.json",
@@ -46,7 +46,7 @@
},
"taskContext": {
"path": "tests/golden/WBV2-P20-003/task-context.json",
"sha256": "881c3213601dab388a73cb51aec5131e30f6a392748c18b7523ddb2560310eec"
"sha256": "efaa2dd8cc7b4cfad740f0881bd3a6fcb74550565252e47fb049e4c973761aff"
}
},
"assertions": {
@@ -68,5 +68,10 @@
"fullHistoricalReproduction": false,
"deterministic": true
},
"nextTask": null
"nextTask": "WBV2-P21-000",
"continuation": {
"authorized": true,
"root": "WBV2-P21-000",
"scope": "OBJECT_OPERATIONS_RENAME"
}
}

View File

@@ -67,7 +67,7 @@
"effective inventory remains explicit",
"no duplicate validation or historical over-claim"
],
"nextTask": null,
"nextTask": "WBV2-P21-000",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P20-003.md",
@@ -164,7 +164,7 @@
"totalTokens": 2417,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3441,
"serializedContextTokens": 656,
"serializedContextTokens": 659,
"withinBudget": true
}
}

View File

@@ -0,0 +1,60 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-000",
"parentTask": "WBV2-P20-003",
"operation": "AUTHORIZE_OBJECT_RENAME_CONTINUATION",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "READ_ONLY_OBJECT_RENAME_CONTINUATION_ROOT",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P20-003/manifest.json",
"sha256": "e855a77132bcbe4330a85e9efb4261d3ec8d99e761ccc8487a5944535d334f9b"
},
"parentReport": {
"path": "tests/golden/WBV2-P20-003/collection-gate-report.json",
"sha256": "e4892dcf9e30a295c74de8fc6952f49504527b72faab3c5d13244764264b99b1"
},
"inventory": {
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8"
},
"sourceApi": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
"sha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8"
},
"sourceClient": {
"path": "web/app/src/engine-client/WebEngineClient.ts",
"sha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b"
},
"plan": {
"path": "tests/golden/WBV2-P21-000/rename-task-plan.json",
"sha256": "8a693618d1f8e46d9d6cf8fe678c178a0196390741fc284a390fc8e819e9e3ed"
},
"report": {
"path": "tests/golden/WBV2-P21-000/rename-root-report.json",
"sha256": "88c49cab081706f6901e363dbca973742d0c168b720c53756ae710b105a0a338"
},
"rootCard": {
"path": "docs/tasks/WBV2-P21-000.md",
"sha256": "b08c2845f2ff32703ba0e42c2750f3330634278f9b224d29ca55fdb865b26f7f"
},
"rootStatus": {
"path": "docs/status/WBV2-P21-000.md",
"sha256": "63dcdcad90994330a4ac970c553ad26e6d41e42af215711cb66fe1f4b083440c"
}
},
"assertions": {
"p20EvidencePreserved": true,
"sourceApiBound": true,
"inventoryTotal": 6900,
"effectiveCompleted": 287,
"effectivePending": 6612,
"duplicateValidationAvoided": true,
"representativeSliceOnly": true,
"authorizedRebaselineOnly": true,
"fullHistoricalReproduction": false
},
"nextTask": "WBV2-P21-001"
}

View File

@@ -0,0 +1,33 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-000",
"operation": "AUTHORIZE_OBJECT_RENAME_CONTINUATION",
"status": "PASS",
"parent": {
"task": "WBV2-P20-003",
"manifest": "tests/golden/WBV2-P20-003/manifest.json",
"manifestSha256": "e855a77132bcbe4330a85e9efb4261d3ec8d99e761ccc8487a5944535d334f9b",
"report": "tests/golden/WBV2-P20-003/collection-gate-report.json",
"reportSha256": "e4892dcf9e30a295c74de8fc6952f49504527b72faab3c5d13244764264b99b1",
"previousDecision": "READY_WITH_COLLECTION_CREATE_SLICE_AND_INVENTORY_OVERLAY",
"effectivePending": 6612
},
"continuation": {
"root": "WBV2-P21-000",
"firstTask": "WBV2-P21-001",
"plannedTasks": 4,
"candidate": "OBJECT_OPERATIONS.RENAME",
"sourceApi": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
"browser": "chromium",
"noRepeatedExecution": true
},
"policy": {
"p20EvidencePreserved": true,
"sourceHistoryReadOnly": true,
"representativeSliceOnly": true,
"duplicateValidationAvoided": true,
"authorizedRebaselineOnly": true,
"fullHistoricalReproduction": false
},
"nextTask": "WBV2-P21-001"
}

View File

@@ -0,0 +1,146 @@
{
"schemaVersion": 1,
"planId": "BLENDER_WEB_PARITY_V2_OBJECT_RENAME_EPOCH_1",
"status": "ACTIVE_OBJECT_RENAME_QUEUE",
"authority": "queue_reactivated_after_p20_collection_gate",
"sourcePlan": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json",
"executionPointer": "docs/EXECUTION_QUEUE.md",
"runtimePolicy": {
"blenderSource": "blender-5.2.0",
"browserEvidence": [
"chromium"
],
"forbiddenBrowsers": [
"firefox",
"webkit"
],
"mainAuthority": "blender_main",
"reusePolicy": "source_hash_and_behavior_hash_deduplication"
},
"parentCollection": {
"manifest": "tests/golden/WBV2-P20-003/manifest.json",
"report": "tests/golden/WBV2-P20-003/collection-gate-report.json",
"basePending": 6618,
"effectivePending": 6612,
"duplicateValidationAvoided": true
},
"tasks": [
{
"id": "WBV2-P21-000",
"phase": "P21",
"title": "authorize_object_rename_continuation",
"kind": "enabling",
"owner": "PROGRAM",
"dependsOn": [
"WBV2-P20-003"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-governance",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-000.md",
"behavior": "Authorize one Object Rename behavior after the P20 collection overlay.",
"outputs": [
"continuation root",
"candidate scope",
"hash boundary"
],
"acceptance": [
"P20 overlay remains hash-bound",
"renameId API is present",
"one production task is active"
],
"status": "done",
"ready": false,
"queueMutationAllowed": true
},
{
"id": "WBV2-P21-001",
"phase": "P21",
"title": "select_object_rename_batch",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P21-000"
],
"parityId": "OBJECT_OPERATIONS.RENAME",
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-selection",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-001.md",
"behavior": "Select renameId as one unique Object Operations behavior.",
"outputs": [
"candidate report",
"behavior hash",
"dedupe key"
],
"acceptance": [
"source command is hash-bound",
"previous object evidence is not rerun",
"one legacy operator binding is selected"
],
"status": "in_progress",
"ready": true,
"queueMutationAllowed": false
},
{
"id": "WBV2-P21-002",
"phase": "P21",
"title": "object_rename_engine_receipt",
"kind": "feature",
"owner": "OBJECT",
"dependsOn": [
"WBV2-P21-001"
],
"parityId": "OBJECT_OPERATIONS.RENAME",
"implementationClass": "LOCAL_EXACT",
"parallelGroup": "p21-object",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-002.md",
"behavior": "Bind renameId, undo/redo, malformed rejection, and exact save/reopen to compiled WASM Main in Chromium.",
"outputs": [
"rename production report",
"rename receipt",
"manifest"
],
"acceptance": [
"object name changes",
"undo/redo revisions are sequential",
"malformed rename fails closed",
"save/reopen is exact"
],
"status": "planned",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P21-003",
"phase": "P21",
"title": "close_object_rename_gate",
"kind": "enabling",
"owner": "RELEASE",
"dependsOn": [
"WBV2-P21-002"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-release",
"gate": "G5",
"card": "docs/tasks/WBV2-P21-003.md",
"behavior": "Close the renameId gate and graduate only the exact operator binding.",
"outputs": [
"rename gate",
"completion overlay",
"manifest"
],
"acceptance": [
"only object rename is claimed",
"effective inventory remains explicit",
"no duplicate validation or historical over-claim"
],
"status": "planned",
"ready": false,
"queueMutationAllowed": false
}
]
}

View File

@@ -0,0 +1,67 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-001",
"parentTask": "WBV2-P21-000",
"operation": "SELECT_OBJECT_RENAME_BATCH",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "READ_ONLY_SOURCE_CANDIDATE_SELECTION",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P21-000/manifest.json",
"sha256": "c240d990cdac68bc975dc8af0a8dfae92380a7c417040b36ef4a2d489e8de9b1"
},
"inventory": {
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8"
},
"api": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
"sha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8"
},
"protocol": {
"path": "web/protocol/web-engine.ts",
"sha256": "3bbe172afaaa414d8ede43e6c04aa84443b6e38319d09710afa141c9b5e69fc0"
},
"candidate": {
"path": "tests/golden/WBV2-P21-001/object-rename-candidate-set.json",
"sha256": "adcec5671184a2bc91d2a85cc318b954be973b540cf554614ad85ac299d1002b"
},
"report": {
"path": "tests/golden/WBV2-P21-001/object-rename-selection-report.json",
"sha256": "3c3f0d4eed99c75719a05ddcabd646c6cf4251f0d3beeb8de9999bf94035eeda"
},
"generator": {
"path": "tools/web/generate-wbv2-rename-selection.mjs",
"sha256": "6df67b69b6f1dc2a7d32c76aef0c068d70e0ffad3bb7b53bb301859671bce2cc"
},
"status": {
"path": "docs/status/WBV2-P21-001.md",
"sha256": "6ae6c93acd64ef9dcd9f83e09c8d2324bcc6f91950f85c657781b045ec75457c"
},
"parityPlan": {
"path": "tests/golden/WBV2-P21-001/rename-task-plan.json",
"sha256": "ffd147d8073c3f072c7b6c8809f9d7c0f6fdd7f9e9ba68a1a4a1f6beeb5e71e6"
},
"taskContext": {
"path": "tests/golden/WBV2-P21-001/task-context.json",
"sha256": "a0b69e4e77002e1af83aaf747d2988175115c107c5bcfb24713a6cc80d8c4e18"
}
},
"assertions": {
"legacyId": "operator:object.add_named",
"inventoryTotal": 6900,
"basePending": 6618,
"effectivePending": 6612,
"sourceApiBound": true,
"representativeSliceOnly": true,
"fullFamilyParity": false,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"duplicateValidationAvoided": true,
"deterministic": true,
"historicalReproduction": false
},
"nextTask": "WBV2-P21-002"
}

View File

@@ -0,0 +1,63 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-001",
"operation": "OBJECT_RENAME_CANDIDATE_SELECTION",
"status": "READY",
"source": {
"inventory": "tests/golden/WBV2-P0-002/parity-map.json",
"inventorySha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8",
"api": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
"apiSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8",
"protocol": "web/protocol/web-engine.ts",
"protocolSha256": "3bbe172afaaa414d8ede43e6c04aa84443b6e38319d09710afa141c9b5e69fc0"
},
"candidate": {
"capabilityId": "OBJECT_OPERATIONS.RENAME",
"legacyId": "operator:object.add_named",
"legacyTask": "M16-GAP-01404",
"behavior": {
"capability": "OBJECT_OPERATIONS.RENAME",
"operation": "renameId",
"positive": [
"object-name-change",
"undo",
"redo",
"save-reopen"
],
"negative": [
"empty-name",
"missing-id"
],
"browser": "chromium",
"engine": "compiled-WASM-WebEngine-Main"
},
"behaviorHash": "0f0c4597be3a67123eb4b90ccfe58a08fcf5e530568a1f4ccdc1bd5113dd3fea",
"dedupeKey": "OBJECT_OPERATIONS.RENAME|0f0c4597be3a67123eb4b90ccfe58a08fcf5e530568a1f4ccdc1bd5113dd3fea|8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8|3bbe172afaaa414d8ede43e6c04aa84443b6e38319d09710afa141c9b5e69fc0",
"sourceBacked": true,
"chromiumProductionReady": true,
"fullFamilyParity": false
},
"inventory": {
"matchedEntries": 1,
"pending": 1,
"total": 6900,
"basePending": 6618,
"effectivePending": 6612,
"remainderExplicit": true
},
"entries": [
{
"id": "operator:object.add_named",
"sourceTask": "M15-01B",
"legacyState": "pending",
"targetImplementationClass": "LOCAL_EXACT"
}
],
"policy": {
"sourceHistoryReadOnly": true,
"representativeSliceOnly": true,
"noRepeatedExecution": true,
"duplicateValidationAvoided": true,
"fullHistoricalReproduction": false
}
}

View File

@@ -0,0 +1,57 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-001",
"operation": "SELECT_OBJECT_RENAME_BATCH",
"status": "PASS",
"candidate": {
"capabilityId": "OBJECT_OPERATIONS.RENAME",
"legacyId": "operator:object.add_named",
"legacyTask": "M16-GAP-01404",
"behavior": {
"capability": "OBJECT_OPERATIONS.RENAME",
"operation": "renameId",
"positive": [
"object-name-change",
"undo",
"redo",
"save-reopen"
],
"negative": [
"empty-name",
"missing-id"
],
"browser": "chromium",
"engine": "compiled-WASM-WebEngine-Main"
},
"behaviorHash": "0f0c4597be3a67123eb4b90ccfe58a08fcf5e530568a1f4ccdc1bd5113dd3fea",
"dedupeKey": "OBJECT_OPERATIONS.RENAME|0f0c4597be3a67123eb4b90ccfe58a08fcf5e530568a1f4ccdc1bd5113dd3fea|8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8|3bbe172afaaa414d8ede43e6c04aa84443b6e38319d09710afa141c9b5e69fc0",
"sourceBacked": true,
"chromiumProductionReady": true,
"fullFamilyParity": false
},
"inventory": {
"matchedEntries": 1,
"pending": 1,
"total": 6900,
"basePending": 6618,
"effectivePending": 6612,
"remainderExplicit": true
},
"source": {
"inventory": "tests/golden/WBV2-P0-002/parity-map.json",
"inventorySha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8",
"api": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
"apiSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8",
"protocol": "web/protocol/web-engine.ts",
"protocolSha256": "3bbe172afaaa414d8ede43e6c04aa84443b6e38319d09710afa141c9b5e69fc0"
},
"matchedEntryDigest": "1944e67cdc7b1ad21362a2b13b67a166e4b03b2d91b6121d059df95f58b364e4",
"efficiency": {
"oneEntryScan": true,
"existingEvidenceReused": true,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"duplicateValidationAvoided": true
},
"nextTask": "WBV2-P21-002"
}

View File

@@ -0,0 +1,150 @@
{
"schemaVersion": 1,
"planId": "BLENDER_WEB_PARITY_V2_OBJECT_RENAME_EPOCH_1",
"status": "ACTIVE_OBJECT_RENAME_QUEUE",
"authority": "queue_reactivated_after_p20_collection_gate",
"sourcePlan": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json",
"executionPointer": "docs/EXECUTION_QUEUE.md",
"runtimePolicy": {
"blenderSource": "blender-5.2.0",
"browserEvidence": [
"chromium"
],
"forbiddenBrowsers": [
"firefox",
"webkit"
],
"mainAuthority": "blender_main",
"reusePolicy": "source_hash_and_behavior_hash_deduplication"
},
"parentCollection": {
"manifest": "tests/golden/WBV2-P20-003/manifest.json",
"report": "tests/golden/WBV2-P20-003/collection-gate-report.json",
"basePending": 6618,
"effectivePending": 6612,
"duplicateValidationAvoided": true
},
"tasks": [
{
"id": "WBV2-P21-000",
"phase": "P21",
"title": "authorize_object_rename_continuation",
"kind": "enabling",
"owner": "PROGRAM",
"dependsOn": [
"WBV2-P20-003"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-governance",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-000.md",
"behavior": "Authorize one Object Rename behavior after the P20 collection overlay.",
"outputs": [
"continuation root",
"candidate scope",
"hash boundary"
],
"acceptance": [
"P20 overlay remains hash-bound",
"renameId API is present",
"one production task is active"
],
"status": "done",
"ready": false,
"queueMutationAllowed": true
},
{
"id": "WBV2-P21-001",
"phase": "P21",
"title": "select_object_rename_batch",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P21-000"
],
"parityId": "OBJECT_OPERATIONS.RENAME",
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-selection",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-001.md",
"behavior": "Select renameId as one unique Object Operations behavior.",
"outputs": [
"candidate report",
"behavior hash",
"dedupe key"
],
"acceptance": [
"source command is hash-bound",
"previous object evidence is not rerun",
"one legacy operator binding is selected"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P21-002",
"phase": "P21",
"title": "object_rename_engine_receipt",
"kind": "feature",
"owner": "OBJECT",
"dependsOn": [
"WBV2-P21-001"
],
"parityId": "OBJECT_OPERATIONS.RENAME",
"implementationClass": "LOCAL_EXACT",
"parallelGroup": "p21-object",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-002.md",
"behavior": "Bind renameId, undo/redo, malformed rejection, and exact save/reopen to compiled WASM Main in Chromium.",
"outputs": [
"rename production report",
"rename receipt",
"manifest"
],
"acceptance": [
"object name changes",
"undo/redo revisions are sequential",
"malformed rename fails closed",
"save/reopen is exact"
],
"status": "in_progress",
"ready": true,
"queueMutationAllowed": false
},
{
"id": "WBV2-P21-003",
"phase": "P21",
"title": "close_object_rename_gate",
"kind": "enabling",
"owner": "RELEASE",
"dependsOn": [
"WBV2-P21-002"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-release",
"gate": "G5",
"card": "docs/tasks/WBV2-P21-003.md",
"behavior": "Close the renameId gate and graduate only the exact operator binding.",
"outputs": [
"rename gate",
"completion overlay",
"manifest"
],
"acceptance": [
"only object rename is claimed",
"effective inventory remains explicit",
"no duplicate validation or historical over-claim"
],
"status": "planned",
"ready": false,
"queueMutationAllowed": false
}
],
"parentRecoveryPlan": {
"path": "tests/golden/WBV2-P21-000/rename-task-plan.json",
"sha256": "8a693618d1f8e46d9d6cf8fe678c178a0196390741fc284a390fc8e819e9e3ed"
}
}

View File

@@ -0,0 +1,171 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-001",
"parentTask": "WBV2-P21-000",
"status": "in_progress",
"goal": "Select renameId as one unique Object Operations behavior.",
"scope": {
"gap": "capability:OBJECT_OPERATIONS.RENAME",
"ownerFamily": "PARITY",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"node tools/web/check-task-context.mjs --task WBV2-P21-001 --write"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 3539,
"contextRemainingTokens": 883
},
"source": {
"bytes": 6365,
"tokens": 1593
},
"selected": [],
"excluded": [
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
"bytes": 126797,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "web/app/src/engine-client/WebEngineClient.ts",
"bytes": 16197,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"bytes": 5053386,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P21-001/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P21-001.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P21-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"source command is hash-bound",
"previous object evidence is not rerun",
"one legacy operator binding is selected"
],
"nextTask": "WBV2-P21-002",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P21-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P21-000/manifest.json",
"parentStatus": "docs/status/WBV2-P21-000.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P21-001.md",
"tests/golden/WBV2-P21-000/manifest.json",
"docs/status/WBV2-P21-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-P21-000",
"parentTask": "WBV2-P20-003",
"status": "done",
"nextTask": "WBV2-P21-001",
"artifactCount": 9
},
"statusSummary": [
"# WBV2-P21-000 status",
"- task: `WBV2-P21-000`; parent: `WBV2-P20-003`; status: `done`",
"- candidate: `OBJECT_OPERATIONS.RENAME`; source API is present",
"- effective inventory carried forward: `287` completed, `6612` pending",
"- duplicate validation: `forbidden`; representative slice only",
"- nextTask: `WBV2-P21-001`"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1073,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 36,
"taskTokens": 269
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2803,
"lines": 51,
"tokens": 701
},
{
"path": "docs/tasks/WBV2-P21-001.md",
"bytes": 1073,
"lines": 36,
"tokens": 269
},
{
"path": "tests/golden/WBV2-P21-000/manifest.json",
"bytes": 2179,
"lines": 61,
"tokens": 545
},
{
"path": "docs/status/WBV2-P21-000.md",
"bytes": 310,
"lines": 8,
"tokens": 78
}
],
"sourceTokens": 1593,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 1593,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2617,
"serializedContextTokens": 591,
"withinBudget": true
}
}

View File

@@ -0,0 +1,78 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-002",
"parentTask": "WBV2-P21-001",
"operation": "OBJECT_RENAME_ENGINE_RECEIPT",
"status": "done",
"enablingTask": false,
"parityStateChange": true,
"runtime": "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P21-001/manifest.json",
"sha256": "23eabd19e1eb2c4b59466199304f7b0f546e8c99080518d934d17b44abecfd7c"
},
"selection": {
"path": "tests/golden/WBV2-P21-001/object-rename-selection-report.json",
"sha256": "3c3f0d4eed99c75719a05ddcabd646c6cf4251f0d3beeb8de9999bf94035eeda"
},
"api": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
"sha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8"
},
"test": {
"path": "web/tests/e2e/wbv2-object-rename-production.spec.ts",
"sha256": "4f34f6f831fce92ccda9a24d05a4b25c37b078a749b3d6a2e5ec9acc365116d5"
},
"fixture": {
"path": "tests/files/web/basic_scene.blend",
"sha256": "6fcc55bda74da8c95da96ba068b60339bf60ca44147ff8000fbb95d296db2a73"
},
"production": {
"path": "tests/golden/WBV2-P21-002/object-rename-production.json",
"sha256": "84398d062b165c8339307e04689229893ffcbe43806678b4db59325e0d883b7c"
},
"secondProduction": {
"path": "tests/golden/WBV2-P21-002/object-rename-production.second.json",
"sha256": "84398d062b165c8339307e04689229893ffcbe43806678b4db59325e0d883b7c"
},
"report": {
"path": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json",
"sha256": "5a630449c954f5a3191a301e97214b0a8e260dd6115b9fd7564be1bd9d993200"
},
"generator": {
"path": "tools/web/generate-wbv2-rename-receipt.mjs",
"sha256": "3d69f3d6d446abc27f98ce5f1c115b09e8e3e67c2227d6e6cbd437c1a2aed956"
},
"status": {
"path": "docs/status/WBV2-P21-002.md",
"sha256": "0732ea09f0035dd171f853cc8d60e8f2ae331554b0d0411a9be4829067af9f51"
},
"parityPlan": {
"path": "tests/golden/WBV2-P21-002/rename-task-plan.json",
"sha256": "b40f78c13b288fb36c3ef9f2171018bcae2fcec18c478d29f945d201c83a63e5"
},
"taskContext": {
"path": "tests/golden/WBV2-P21-002/task-context.json",
"sha256": "18ccd2a7eb364ecff3120f2e6d1f8fe5ccc1bca29169e8a2482a20a2af4644a8"
}
},
"assertions": {
"exactInventoryBindings": 1,
"boundInventoryIds": [
"operator:object.add_named"
],
"objectRenamed": true,
"undoRedoSequential": true,
"malformedRejected": true,
"saveReopen": "EXACT",
"deterministic": true,
"representativeSliceOnly": true,
"fullFamilyParity": false,
"inventoryTotal": 6900,
"baseInventoryPending": 6618,
"effectivePending": 6612,
"historicalReproduction": false
},
"nextTask": "WBV2-P21-003"
}

View File

@@ -0,0 +1,24 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-002",
"operation": "OBJECT_RENAME_ENGINE_CHROMIUM",
"queueMutation": false,
"fixtureSha256": "6fcc55bda74da8c95da96ba068b60339bf60ca44147ff8000fbb95d296db2a73",
"browser": "chromium",
"baseRevision": 1,
"objectId": "object:BasicCube",
"beforeName": "BasicCube",
"afterName": "WBV2P2102Renamed",
"afterId": "object:WBV2P2102Renamed",
"createRevision": 2,
"undoRevision": 3,
"redoRevision": 4,
"malformed": {
"code": "INVALID_ARGUMENT",
"message": "renameId target was not found or is linked"
},
"malformedRevisionPreserved": true,
"reopenedName": "WBV2P2102Renamed",
"reopenedRevision": 1,
"savedSha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}

View File

@@ -0,0 +1,24 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-002",
"operation": "OBJECT_RENAME_ENGINE_CHROMIUM",
"queueMutation": false,
"fixtureSha256": "6fcc55bda74da8c95da96ba068b60339bf60ca44147ff8000fbb95d296db2a73",
"browser": "chromium",
"baseRevision": 1,
"objectId": "object:BasicCube",
"beforeName": "BasicCube",
"afterName": "WBV2P2102Renamed",
"afterId": "object:WBV2P2102Renamed",
"createRevision": 2,
"undoRevision": 3,
"redoRevision": 4,
"malformed": {
"code": "INVALID_ARGUMENT",
"message": "renameId target was not found or is linked"
},
"malformedRevisionPreserved": true,
"reopenedName": "WBV2P2102Renamed",
"reopenedRevision": 1,
"savedSha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}

View File

@@ -0,0 +1,65 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-002",
"operation": "OBJECT_RENAME_ENGINE_RECEIPT",
"status": "PASS",
"browser": "chromium",
"queueMutation": false,
"source": {
"manifest": "tests/golden/WBV2-P21-001/manifest.json",
"manifestSha256": "23eabd19e1eb2c4b59466199304f7b0f546e8c99080518d934d17b44abecfd7c",
"selection": "tests/golden/WBV2-P21-001/object-rename-selection-report.json",
"selectionSha256": "3c3f0d4eed99c75719a05ddcabd646c6cf4251f0d3beeb8de9999bf94035eeda",
"api": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
"apiSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8",
"test": "web/tests/e2e/wbv2-object-rename-production.spec.ts",
"testSha256": "4f34f6f831fce92ccda9a24d05a4b25c37b078a749b3d6a2e5ec9acc365116d5",
"fixture": "tests/files/web/basic_scene.blend",
"fixtureSha256": "6fcc55bda74da8c95da96ba068b60339bf60ca44147ff8000fbb95d296db2a73"
},
"production": {
"report": "tests/golden/WBV2-P21-002/object-rename-production.json",
"reportSha256": "84398d062b165c8339307e04689229893ffcbe43806678b4db59325e0d883b7c",
"secondReport": "tests/golden/WBV2-P21-002/object-rename-production.second.json",
"secondReportSha256": "84398d062b165c8339307e04689229893ffcbe43806678b4db59325e0d883b7c",
"deterministic": true,
"objectId": "object:BasicCube",
"beforeName": "BasicCube",
"afterName": "WBV2P2102Renamed",
"reopenedName": "WBV2P2102Renamed",
"revisions": [
1,
2,
3,
4
],
"malformed": {
"code": "INVALID_ARGUMENT",
"message": "renameId target was not found or is linked"
},
"malformedRevisionPreserved": true,
"reopenedRevision": 1,
"saveReopen": "EXACT"
},
"inventoryBindings": [
{
"id": "operator:object.add_named",
"evidence": "renameId",
"exact": true,
"reason": "bounded protocol command renames and persists an object ID"
}
],
"assertions": {
"objectRenamed": true,
"undoRedoSequential": true,
"malformedRejected": true,
"mainUnchangedOnMalformed": true,
"saveReopenExact": true,
"deterministic": true,
"inventoryBindingsExact": true,
"representativeSliceOnly": true,
"fullFamilyParity": false,
"historicalReproduction": false
},
"nextTask": "WBV2-P21-003"
}

View File

@@ -0,0 +1,150 @@
{
"schemaVersion": 1,
"planId": "BLENDER_WEB_PARITY_V2_OBJECT_RENAME_EPOCH_1",
"status": "ACTIVE_OBJECT_RENAME_QUEUE",
"authority": "queue_reactivated_after_p20_collection_gate",
"sourcePlan": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json",
"executionPointer": "docs/EXECUTION_QUEUE.md",
"runtimePolicy": {
"blenderSource": "blender-5.2.0",
"browserEvidence": [
"chromium"
],
"forbiddenBrowsers": [
"firefox",
"webkit"
],
"mainAuthority": "blender_main",
"reusePolicy": "source_hash_and_behavior_hash_deduplication"
},
"parentCollection": {
"manifest": "tests/golden/WBV2-P20-003/manifest.json",
"report": "tests/golden/WBV2-P20-003/collection-gate-report.json",
"basePending": 6618,
"effectivePending": 6612,
"duplicateValidationAvoided": true
},
"tasks": [
{
"id": "WBV2-P21-000",
"phase": "P21",
"title": "authorize_object_rename_continuation",
"kind": "enabling",
"owner": "PROGRAM",
"dependsOn": [
"WBV2-P20-003"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-governance",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-000.md",
"behavior": "Authorize one Object Rename behavior after the P20 collection overlay.",
"outputs": [
"continuation root",
"candidate scope",
"hash boundary"
],
"acceptance": [
"P20 overlay remains hash-bound",
"renameId API is present",
"one production task is active"
],
"status": "done",
"ready": false,
"queueMutationAllowed": true
},
{
"id": "WBV2-P21-001",
"phase": "P21",
"title": "select_object_rename_batch",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P21-000"
],
"parityId": "OBJECT_OPERATIONS.RENAME",
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-selection",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-001.md",
"behavior": "Select renameId as one unique Object Operations behavior.",
"outputs": [
"candidate report",
"behavior hash",
"dedupe key"
],
"acceptance": [
"source command is hash-bound",
"previous object evidence is not rerun",
"one legacy operator binding is selected"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P21-002",
"phase": "P21",
"title": "object_rename_engine_receipt",
"kind": "feature",
"owner": "OBJECT",
"dependsOn": [
"WBV2-P21-001"
],
"parityId": "OBJECT_OPERATIONS.RENAME",
"implementationClass": "LOCAL_EXACT",
"parallelGroup": "p21-object",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-002.md",
"behavior": "Bind renameId, undo/redo, malformed rejection, and exact save/reopen to compiled WASM Main in Chromium.",
"outputs": [
"rename production report",
"rename receipt",
"manifest"
],
"acceptance": [
"object name changes",
"undo/redo revisions are sequential",
"malformed rename fails closed",
"save/reopen is exact"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P21-003",
"phase": "P21",
"title": "close_object_rename_gate",
"kind": "enabling",
"owner": "RELEASE",
"dependsOn": [
"WBV2-P21-002"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-release",
"gate": "G5",
"card": "docs/tasks/WBV2-P21-003.md",
"behavior": "Close the renameId gate and graduate only the exact operator binding.",
"outputs": [
"rename gate",
"completion overlay",
"manifest"
],
"acceptance": [
"only object rename is claimed",
"effective inventory remains explicit",
"no duplicate validation or historical over-claim"
],
"status": "in_progress",
"ready": true,
"queueMutationAllowed": false
}
],
"parentRecoveryPlan": {
"path": "tests/golden/WBV2-P21-001/rename-task-plan.json",
"sha256": "ffd147d8073c3f072c7b6c8809f9d7c0f6fdd7f9e9ba68a1a4a1f6beeb5e71e6"
}
}

View File

@@ -0,0 +1,170 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-002",
"parentTask": "WBV2-P21-001",
"status": "in_progress",
"goal": "Bind renameId, undo/redo, malformed rejection, and exact save/reopen to compiled WASM Main in Chromium.",
"scope": {
"gap": "capability:OBJECT_OPERATIONS.RENAME",
"ownerFamily": "OBJECT",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"node tools/web/check-task-context.mjs --task WBV2-P21-002 --write"
],
"inputPaths": [
"tests/golden/WBV2-P21-001/object-rename-selection-report.json"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 3178,
"contextRemainingTokens": 793
},
"source": {
"bytes": 6726,
"tokens": 1683
},
"selected": [
{
"path": "tests/golden/WBV2-P21-001/object-rename-selection-report.json",
"bytes": 1992,
"tokens": 498
}
],
"excluded": [
{
"path": "web/tests/e2e/wbv2-object-rename-production.spec.ts",
"bytes": 3221,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P21-002/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P21-002.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P21-002/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1992,
"tokens": 498
}
},
"exitCriteria": [
"object name changes",
"undo/redo revisions are sequential",
"malformed rename fails closed",
"save/reopen is exact"
],
"nextTask": "WBV2-P21-003",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P21-002.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P21-001/manifest.json",
"parentStatus": "docs/status/WBV2-P21-001.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P21-002.md",
"tests/golden/WBV2-P21-001/manifest.json",
"docs/status/WBV2-P21-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-P21-001",
"parentTask": "WBV2-P21-000",
"status": "done",
"nextTask": "WBV2-P21-002",
"artifactCount": 10
},
"statusSummary": [
"# WBV2-P21-001 status",
"- task: `WBV2-P21-001`; parent: `WBV2-P21-000`; status: `done`",
"- selected behavior: `renameId`; exact candidate: `operator:object.add_named`",
"- base inventory: `6900` total, `6618` pending; effective carried overlay: `6612` pending",
"- behavior hash: `0f0c4597be3a67123eb4b90ccfe58a08fcf5e530568a1f4ccdc1bd5113dd3fea`; duplicate validation: `forbidden`",
"- nextTask: `WBV2-P21-002`"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1098,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 36,
"taskTokens": 275
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2803,
"lines": 51,
"tokens": 701
},
{
"path": "docs/tasks/WBV2-P21-002.md",
"bytes": 1098,
"lines": 36,
"tokens": 275
},
{
"path": "tests/golden/WBV2-P21-001/manifest.json",
"bytes": 2425,
"lines": 68,
"tokens": 607
},
{
"path": "docs/status/WBV2-P21-001.md",
"bytes": 400,
"lines": 8,
"tokens": 100
}
],
"sourceTokens": 1683,
"evidenceFiles": 1,
"evidenceBytes": 1992,
"evidenceTokens": 498,
"totalTokens": 2181,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3205,
"serializedContextTokens": 662,
"withinBudget": true
}
}

View File

@@ -0,0 +1,118 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-003",
"operation": "INVENTORY_COMPLETION_OVERLAY",
"status": "PASS",
"baseInventory": {
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8",
"total": 6900,
"pending": 6618
},
"previousOverlay": {
"path": "tests/golden/WBV2-P20-003/inventory-completion-overlay.json",
"sha256": "f86ded47e29505c9d7d7c41a1e12a26609f3c196f8acf04e6ca63faabbb7bf00",
"effectiveCompleted": 287,
"effectivePending": 6612
},
"completionEvidence": {
"receipt": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json",
"receiptSha256": "5a630449c954f5a3191a301e97214b0a8e260dd6115b9fd7564be1bd9d993200",
"deterministic": true,
"chromium": true,
"wasmMain": true,
"saveReopen": "EXACT"
},
"entries": [
{
"id": "operator:paint.vertex_color_set",
"capabilityId": "CAP-SCULPT-PAINT",
"sourceReceipt": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json",
"sourceReceiptSha256": "055531f8496d9f740c3d8b47456c7f426daece27e3a8272fb1c8e650c8c80c3a",
"evidence": "setVertexColors",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:paint.weight_set",
"capabilityId": "CAP-SCULPT-PAINT",
"sourceReceipt": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json",
"sourceReceiptSha256": "055531f8496d9f740c3d8b47456c7f426daece27e3a8272fb1c8e650c8c80c3a",
"evidence": "setVertexWeights",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:paint.vertex_color_set",
"capabilityId": "CAP-SCULPT-PAINT",
"sourceReceipt": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json",
"sourceReceiptSha256": "055531f8496d9f740c3d8b47456c7f426daece27e3a8272fb1c8e650c8c80c3a",
"evidence": "setVertexColors",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:paint.weight_set",
"capabilityId": "CAP-SCULPT-PAINT",
"sourceReceipt": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json",
"sourceReceiptSha256": "055531f8496d9f740c3d8b47456c7f426daece27e3a8272fb1c8e650c8c80c3a",
"evidence": "setVertexWeights",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.duplicate",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json",
"sourceReceiptSha256": "daa20107e07ae97b0cfc4ee21be683d729230ea32850a004ca4d14c20ff4b776",
"evidence": "duplicateObject",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.add",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P18-002/object-create-receipt-report.json",
"sourceReceiptSha256": "a18b92a2cd114caf68c9af477ba9e01a34852b64e2911b6c69777cab8846c2d3",
"evidence": "createPrimitive(CUBE)",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.parent_set",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json",
"sourceReceiptSha256": "a76479b66bc542c293d6ada71251e89ba941d8decb9475d60c4aee8c2890f32c",
"evidence": "setParent",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.collection_add",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json",
"sourceReceiptSha256": "5182020f14821f4e058eeccc59af74fa4bb4536e5d95ab9f4252d65b1d4b5717",
"evidence": "createCollection",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.add_named",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json",
"sourceReceiptSha256": "5a630449c954f5a3191a301e97214b0a8e260dd6115b9fd7564be1bd9d993200",
"evidence": "renameId",
"exact": true,
"historicalRestoration": false
}
],
"summary": {
"newlyVerifiedEntries": 1,
"effectiveCompleted": 288,
"effectivePending": 6611,
"claimedComplete": 7,
"basePendingPreserved": true,
"fullFamilyParity": false,
"historicalReproduction": false
}
}

View File

@@ -0,0 +1,72 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-003",
"parentTask": "WBV2-P21-002",
"operation": "CLOSE_OBJECT_RENAME_GATE",
"status": "done",
"enablingTask": true,
"parityStateChange": true,
"runtime": "READ_ONLY_OBJECT_RENAME_GATE_WITH_COMPLETION_OVERLAY",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P21-002/manifest.json",
"sha256": "b8e53bfd1f460b17cb144c843372ee4db3511480b334889abb5cf60d8dfa1646"
},
"receipt": {
"path": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json",
"sha256": "5a630449c954f5a3191a301e97214b0a8e260dd6115b9fd7564be1bd9d993200"
},
"previousOverlay": {
"path": "tests/golden/WBV2-P20-003/inventory-completion-overlay.json",
"sha256": "f86ded47e29505c9d7d7c41a1e12a26609f3c196f8acf04e6ca63faabbb7bf00"
},
"baseInventory": {
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8"
},
"overlay": {
"path": "tests/golden/WBV2-P21-003/inventory-completion-overlay.json",
"sha256": "d7832a395fe2d42dd82550cada4716ddcbfdd071179b2d8920bf109583460beb"
},
"report": {
"path": "tests/golden/WBV2-P21-003/object-rename-gate-report.json",
"sha256": "a8802a03be2ad3cb899e082678013e2ed933caf42b884326a6a82198f2aa3178"
},
"generator": {
"path": "tools/web/generate-wbv2-rename-gate.mjs",
"sha256": "a11a8e70939449d86f50ffe5a6428f6a8879f86f58cb35ab43dffa955ff522c9"
},
"status": {
"path": "docs/status/WBV2-P21-003.md",
"sha256": "d99ce2fc72eebb79287f098695127b0b1ec96ce659d2a859b3bdc147526bf7c8"
},
"parityPlan": {
"path": "tests/golden/WBV2-P21-003/rename-task-plan.json",
"sha256": "31f4e0de59a81ca7b769125866da4b1962d0e33c97bd2e6cf80cd17957e3f1e5"
},
"taskContext": {
"path": "tests/golden/WBV2-P21-003/task-context.json",
"sha256": "a8a042ec2148cb4d8b5e1dda94e5631599fd83f8a5880b55fa6d2709bf36162f"
}
},
"assertions": {
"totalFeatureClaims": 6,
"newObjectRenameClaims": 1,
"exactInventoryBindings": 1,
"effectiveCompleted": 288,
"effectivePending": 6611,
"baseInventoryCompleted": 281,
"baseInventoryPending": 6618,
"claimedCompleteOverlay": 7,
"uniqueBehaviorRuns": 7,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"duplicateValidationAvoided": true,
"baseInventoryUntouched": true,
"provenanceEpoch": 2,
"authorizedRebaselineOnly": true,
"fullHistoricalReproduction": false,
"deterministic": true
},
"nextTask": null
}

View File

@@ -0,0 +1,175 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-003",
"operation": "CLOSE_OBJECT_RENAME_GATE",
"status": "PASS",
"decision": {
"status": "READY_WITH_OBJECT_RENAME_SLICE_AND_INVENTORY_OVERLAY",
"code": "OBJECT_RENAME_AUTHORIZED_REBASELINE",
"featureParityClaims": [
"SCULPT.PAINT_ATTRIBUTES",
"OBJECT_OPERATIONS.DUPLICATE",
"OBJECT_OPERATIONS.CREATE",
"OBJECT_OPERATIONS.PARENT",
"OBJECT_OPERATIONS.COLLECTION_CREATE",
"OBJECT_OPERATIONS.RENAME"
],
"featureParityClaimCount": 6,
"newFeatureClaim": "OBJECT_OPERATIONS.RENAME",
"newlyVerifiedInventoryEntries": 1,
"baseInventoryPending": 6618,
"effectivePending": 6611,
"effectiveCompleted": 288,
"claimedCompleteOverlay": 7,
"fullFamilyParity": false,
"engineBound": true,
"browser": "chromium",
"provenanceEpoch": 2,
"releaseScope": "AUTHORIZED_REBASELINE_ONLY",
"fullHistoricalReproduction": false,
"inventoryTotal": 6900
},
"evidence": {
"receipt": {
"path": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json",
"sha256": "5a630449c954f5a3191a301e97214b0a8e260dd6115b9fd7564be1bd9d993200",
"bindings": [
{
"id": "operator:object.add_named",
"evidence": "renameId",
"exact": true,
"reason": "bounded protocol command renames and persists an object ID"
}
]
},
"overlay": {
"path": "tests/golden/WBV2-P21-003/inventory-completion-overlay.json",
"sha256": "d7832a395fe2d42dd82550cada4716ddcbfdd071179b2d8920bf109583460beb",
"entries": [
{
"id": "operator:paint.vertex_color_set",
"capabilityId": "CAP-SCULPT-PAINT",
"sourceReceipt": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json",
"sourceReceiptSha256": "055531f8496d9f740c3d8b47456c7f426daece27e3a8272fb1c8e650c8c80c3a",
"evidence": "setVertexColors",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:paint.weight_set",
"capabilityId": "CAP-SCULPT-PAINT",
"sourceReceipt": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json",
"sourceReceiptSha256": "055531f8496d9f740c3d8b47456c7f426daece27e3a8272fb1c8e650c8c80c3a",
"evidence": "setVertexWeights",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:paint.vertex_color_set",
"capabilityId": "CAP-SCULPT-PAINT",
"sourceReceipt": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json",
"sourceReceiptSha256": "055531f8496d9f740c3d8b47456c7f426daece27e3a8272fb1c8e650c8c80c3a",
"evidence": "setVertexColors",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:paint.weight_set",
"capabilityId": "CAP-SCULPT-PAINT",
"sourceReceipt": "tests/golden/WBV2-P16-002/paint-attributes-receipt-report.json",
"sourceReceiptSha256": "055531f8496d9f740c3d8b47456c7f426daece27e3a8272fb1c8e650c8c80c3a",
"evidence": "setVertexWeights",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.duplicate",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P17-002/object-duplicate-receipt-report.json",
"sourceReceiptSha256": "daa20107e07ae97b0cfc4ee21be683d729230ea32850a004ca4d14c20ff4b776",
"evidence": "duplicateObject",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.add",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P18-002/object-create-receipt-report.json",
"sourceReceiptSha256": "a18b92a2cd114caf68c9af477ba9e01a34852b64e2911b6c69777cab8846c2d3",
"evidence": "createPrimitive(CUBE)",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.parent_set",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P19-002/object-parent-receipt-report.json",
"sourceReceiptSha256": "a76479b66bc542c293d6ada71251e89ba941d8decb9475d60c4aee8c2890f32c",
"evidence": "setParent",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.collection_add",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P20-002/collection-create-receipt-report.json",
"sourceReceiptSha256": "5182020f14821f4e058eeccc59af74fa4bb4536e5d95ab9f4252d65b1d4b5717",
"evidence": "createCollection",
"exact": true,
"historicalRestoration": false
},
{
"id": "operator:object.add_named",
"capabilityId": "CAP-OBJECT-OPERATIONS",
"sourceReceipt": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json",
"sourceReceiptSha256": "5a630449c954f5a3191a301e97214b0a8e260dd6115b9fd7564be1bd9d993200",
"evidence": "renameId",
"exact": true,
"historicalRestoration": false
}
]
},
"previousOverlay": {
"path": "tests/golden/WBV2-P20-003/inventory-completion-overlay.json",
"sha256": "f86ded47e29505c9d7d7c41a1e12a26609f3c196f8acf04e6ca63faabbb7bf00"
},
"baseInventory": {
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8",
"pending": 6618
}
},
"efficiency": {
"uniqueBehaviorRuns": 7,
"repeatedBlenderRuns": 0,
"repeatedChromiumRuns": 0,
"duplicateValidationAvoided": true,
"baseInventoryUntouched": true
},
"coverage": {
"baseTotal": 6900,
"baseCompleted": 281,
"basePending": 6618,
"overlayCompleted": 7,
"effectiveCompleted": 288,
"effectivePending": 6611
},
"negative": {
"missingReceipt": "REJECTED",
"receiptHashDrift": "REJECTED",
"nonChromium": "REJECTED",
"nonExactSaveReopen": "REJECTED",
"representativeAsFullFamily": "REJECTED",
"historicalRestorationClaim": "REJECTED"
},
"policy": {
"sourceHistoryReadOnly": true,
"authorizedRebaselineOnly": true,
"overlayOnlyCompletion": true,
"baseInventoryPreserved": true,
"inventoryRemainderExplicit": true,
"noFalseLocalParity": true,
"terminalQueuePointer": true
},
"nextTask": null
}

View File

@@ -0,0 +1,150 @@
{
"schemaVersion": 1,
"planId": "BLENDER_WEB_PARITY_V2_OBJECT_RENAME_EPOCH_1",
"status": "COMPLETED_WITH_OBJECT_RENAME_SLICE",
"authority": "queue_reactivated_after_p20_collection_gate",
"sourcePlan": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json",
"executionPointer": "docs/EXECUTION_QUEUE.md",
"runtimePolicy": {
"blenderSource": "blender-5.2.0",
"browserEvidence": [
"chromium"
],
"forbiddenBrowsers": [
"firefox",
"webkit"
],
"mainAuthority": "blender_main",
"reusePolicy": "source_hash_and_behavior_hash_deduplication"
},
"parentCollection": {
"manifest": "tests/golden/WBV2-P20-003/manifest.json",
"report": "tests/golden/WBV2-P20-003/collection-gate-report.json",
"basePending": 6618,
"effectivePending": 6612,
"duplicateValidationAvoided": true
},
"tasks": [
{
"id": "WBV2-P21-000",
"phase": "P21",
"title": "authorize_object_rename_continuation",
"kind": "enabling",
"owner": "PROGRAM",
"dependsOn": [
"WBV2-P20-003"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-governance",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-000.md",
"behavior": "Authorize one Object Rename behavior after the P20 collection overlay.",
"outputs": [
"continuation root",
"candidate scope",
"hash boundary"
],
"acceptance": [
"P20 overlay remains hash-bound",
"renameId API is present",
"one production task is active"
],
"status": "done",
"ready": false,
"queueMutationAllowed": true
},
{
"id": "WBV2-P21-001",
"phase": "P21",
"title": "select_object_rename_batch",
"kind": "enabling",
"owner": "PARITY",
"dependsOn": [
"WBV2-P21-000"
],
"parityId": "OBJECT_OPERATIONS.RENAME",
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-selection",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-001.md",
"behavior": "Select renameId as one unique Object Operations behavior.",
"outputs": [
"candidate report",
"behavior hash",
"dedupe key"
],
"acceptance": [
"source command is hash-bound",
"previous object evidence is not rerun",
"one legacy operator binding is selected"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P21-002",
"phase": "P21",
"title": "object_rename_engine_receipt",
"kind": "feature",
"owner": "OBJECT",
"dependsOn": [
"WBV2-P21-001"
],
"parityId": "OBJECT_OPERATIONS.RENAME",
"implementationClass": "LOCAL_EXACT",
"parallelGroup": "p21-object",
"gate": "G2",
"card": "docs/tasks/WBV2-P21-002.md",
"behavior": "Bind renameId, undo/redo, malformed rejection, and exact save/reopen to compiled WASM Main in Chromium.",
"outputs": [
"rename production report",
"rename receipt",
"manifest"
],
"acceptance": [
"object name changes",
"undo/redo revisions are sequential",
"malformed rename fails closed",
"save/reopen is exact"
],
"status": "done",
"ready": false,
"queueMutationAllowed": false
},
{
"id": "WBV2-P21-003",
"phase": "P21",
"title": "close_object_rename_gate",
"kind": "enabling",
"owner": "RELEASE",
"dependsOn": [
"WBV2-P21-002"
],
"parityId": null,
"implementationClass": "LOCAL_BOUNDED",
"parallelGroup": "p21-release",
"gate": "G5",
"card": "docs/tasks/WBV2-P21-003.md",
"behavior": "Close the renameId gate and graduate only the exact operator binding.",
"outputs": [
"rename gate",
"completion overlay",
"manifest"
],
"acceptance": [
"only object rename is claimed",
"effective inventory remains explicit",
"no duplicate validation or historical over-claim"
],
"status": "in_progress",
"ready": true,
"queueMutationAllowed": false
}
],
"parentRecoveryPlan": {
"path": "tests/golden/WBV2-P21-002/rename-task-plan.json",
"sha256": "b40f78c13b288fb36c3ef9f2171018bcae2fcec18c478d29f945d201c83a63e5"
}
}

View File

@@ -0,0 +1,170 @@
{
"schemaVersion": 1,
"task": "WBV2-P21-003",
"parentTask": "WBV2-P21-002",
"status": "in_progress",
"goal": "Close the renameId gate and graduate only the exact operator binding.",
"scope": {
"gap": "workflow:close_object_rename_gate",
"ownerFamily": "RELEASE",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"node tools/web/check-task-context.mjs --task WBV2-P21-003 --write"
],
"inputPaths": [
"tests/golden/WBV2-P21-002/object-rename-receipt-report.json"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2748,
"contextRemainingTokens": 686
},
"source": {
"bytes": 7156,
"tokens": 1790
},
"selected": [
{
"path": "tests/golden/WBV2-P21-002/object-rename-receipt-report.json",
"bytes": 2360,
"tokens": 590
}
],
"excluded": [
{
"path": "tests/golden/WBV2-P20-003/inventory-completion-overlay.json",
"bytes": 4169,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P21-003/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P21-003.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P21-003/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 2360,
"tokens": 590
}
},
"exitCriteria": [
"only object rename is claimed",
"effective inventory remains explicit",
"no duplicate validation or historical over-claim"
],
"nextTask": null,
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P21-003.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P21-002/manifest.json",
"parentStatus": "docs/status/WBV2-P21-002.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P21-003.md",
"tests/golden/WBV2-P21-002/manifest.json",
"docs/status/WBV2-P21-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-P21-002",
"parentTask": "WBV2-P21-001",
"status": "done",
"nextTask": "WBV2-P21-003",
"artifactCount": 12
},
"statusSummary": [
"# WBV2-P21-002 status",
"- task: `WBV2-P21-002`; parent: `WBV2-P21-001`; status: `done`",
"- exact inventory binding: `operator:object.add_named` via `renameId`",
"- name: `BasicCube -> WBV2P2102Renamed`; revisions: `1 -> 4` sequential",
"- malformed rename rejected; save/reopen: `EXACT`; deterministic second run: `true`",
"- effective pending before overlay: `6612`; representative slice: `true`",
"- nextTask: `WBV2-P21-003`"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1073,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 36,
"taskTokens": 269
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2803,
"lines": 51,
"tokens": 701
},
{
"path": "docs/tasks/WBV2-P21-003.md",
"bytes": 1073,
"lines": 36,
"tokens": 269
},
{
"path": "tests/golden/WBV2-P21-002/manifest.json",
"bytes": 2868,
"lines": 79,
"tokens": 717
},
{
"path": "docs/status/WBV2-P21-002.md",
"bytes": 412,
"lines": 9,
"tokens": 103
}
],
"sourceTokens": 1790,
"evidenceFiles": 1,
"evidenceBytes": 2360,
"evidenceTokens": 590,
"totalTokens": 2380,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3404,
"serializedContextTokens": 651,
"withinBudget": true
}
}

View File

@@ -1,4 +1,4 @@
{"id":"WBV2-P20-000","gapId":"workflow:authorize_collection_create_continuation","ownerFamily":"PROGRAM","sourceTask":"P20","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P19 overlay remains hash-bound","createCollection API is present","one production task is active"]}
{"id":"WBV2-P20-001","gapId":"OBJECT_OPERATIONS.COLLECTION_CREATE","ownerFamily":"PARITY","sourceTask":"P20","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["source command is hash-bound","parent/create/duplicate evidence is not rerun","one legacy operator binding is selected"]}
{"id":"WBV2-P20-002","gapId":"OBJECT_OPERATIONS.COLLECTION_CREATE","ownerFamily":"OBJECT","sourceTask":"P20","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["collection is created","undo/redo revisions are sequential","malformed collection fails closed","save/reopen is exact"]}
{"id":"WBV2-P20-003","gapId":"workflow:close_collection_create_gate","ownerFamily":"RELEASE","sourceTask":"P20","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only collection add is claimed","effective inventory remains explicit","no duplicate validation or historical over-claim"]}
{"id":"WBV2-P21-000","gapId":"workflow:authorize_object_rename_continuation","ownerFamily":"PROGRAM","sourceTask":"P21","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P20 overlay remains hash-bound","renameId API is present","one production task is active"]}
{"id":"WBV2-P21-001","gapId":"OBJECT_OPERATIONS.RENAME","ownerFamily":"PARITY","sourceTask":"P21","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["source command is hash-bound","previous object evidence is not rerun","one legacy operator binding is selected"]}
{"id":"WBV2-P21-002","gapId":"OBJECT_OPERATIONS.RENAME","ownerFamily":"OBJECT","sourceTask":"P21","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["object name changes","undo/redo revisions are sequential","malformed rename fails closed","save/reopen is exact"]}
{"id":"WBV2-P21-003","gapId":"workflow:close_object_rename_gate","ownerFamily":"RELEASE","sourceTask":"P21","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only object rename is claimed","effective inventory remains explicit","no duplicate validation or historical over-claim"]}

View File

@@ -1 +1 @@
{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P20-003/collection-task-plan.json","sha256":"2b3a8f320295a4811c19d95e18ef83869dcbedc3d14195dd24a5697a739bb406"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"89dfe879774b7934a662efa2e841f2b5fa3dbccc605d98afdeb61caf13c64af1"},"taskCount":4,"activeTask":"WBV2-P20-003","entries":{"WBV2-P20-000":{"line":0,"offset":0,"length":305,"previous":"WBV2-P19-003","next":"WBV2-P20-001"},"WBV2-P20-001":{"line":1,"offset":305,"length":312,"previous":"WBV2-P20-000","next":"WBV2-P20-002"},"WBV2-P20-002":{"line":2,"offset":617,"length":309,"previous":"WBV2-P20-001","next":"WBV2-P20-003"},"WBV2-P20-003":{"line":3,"offset":926,"length":314,"previous":"WBV2-P20-002","next":null}}}
{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P21-003/rename-task-plan.json","sha256":"31f4e0de59a81ca7b769125866da4b1962d0e33c97bd2e6cf80cd17957e3f1e5"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"8574eed897c2b8e533d1f243282802ffaa4657bd74ded88bf294511160612ec6"},"taskCount":4,"activeTask":"WBV2-P21-003","entries":{"WBV2-P21-000":{"line":0,"offset":0,"length":293,"previous":"WBV2-P20-003","next":"WBV2-P21-001"},"WBV2-P21-001":{"line":1,"offset":293,"length":293,"previous":"WBV2-P21-000","next":"WBV2-P21-002"},"WBV2-P21-002":{"line":2,"offset":586,"length":292,"previous":"WBV2-P21-001","next":"WBV2-P21-003"},"WBV2-P21-003":{"line":3,"offset":878,"length":309,"previous":"WBV2-P21-002","next":null}}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,63 @@
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 abs = (file) => path.join(root, file);
const read = (file) => fs.readFileSync(abs(file), "utf8");
const json = (file) => JSON.parse(read(file));
const sha = (file) => crypto.createHash("sha256").update(fs.readFileSync(abs(file))).digest("hex");
const digest = (value) => crypto.createHash("sha256").update(value).digest("hex");
const out = "tests/golden/WBV2-P21-001";
const parentPath = "tests/golden/WBV2-P21-000/manifest.json";
const inventoryPath = "tests/golden/WBV2-P0-002/parity-map.json";
const apiPath = "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp";
const protocolPath = "web/protocol/web-engine.ts";
const planPath = `${out}/rename-task-plan.json`;
const reportPath = `${out}/object-rename-selection-report.json`;
const candidatePath = `${out}/object-rename-candidate-set.json`;
const manifestPath = `${out}/manifest.json`;
const statusPath = "docs/status/WBV2-P21-001.md";
const parent = json(parentPath);
const inventory = json(inventoryPath);
assert.equal(parent.status, "done");
assert.equal(parent.nextTask, "WBV2-P21-001");
for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha(artifact.path), artifact.sha256, artifact.path);
assert.equal(inventory.summary.inventoryEntries, 6900);
assert.match(read(apiPath), /renameId/);
assert.match(read(protocolPath), /renameId/);
const target = inventory.entries.find((entry) => entry.id === "operator:object.add_named");
assert.ok(target);
assert.equal(target.legacyState, "pending");
const behavior = { capability: "OBJECT_OPERATIONS.RENAME", operation: "renameId", positive: ["object-name-change", "undo", "redo", "save-reopen"], negative: ["empty-name", "missing-id"], browser: "chromium", engine: "compiled-WASM-WebEngine-Main" };
const behaviorHash = digest(JSON.stringify(behavior));
const candidate = { schemaVersion: 1, task: "WBV2-P21-001", operation: "OBJECT_RENAME_CANDIDATE_SELECTION", status: "READY", source: { inventory: inventoryPath, inventorySha256: sha(inventoryPath), api: apiPath, apiSha256: sha(apiPath), protocol: protocolPath, protocolSha256: sha(protocolPath) }, candidate: { capabilityId: "OBJECT_OPERATIONS.RENAME", legacyId: target.id, legacyTask: target.evidence.legacyTask, behavior, behaviorHash, dedupeKey: `OBJECT_OPERATIONS.RENAME|${behaviorHash}|${sha(apiPath)}|${sha(protocolPath)}`, sourceBacked: true, chromiumProductionReady: true, fullFamilyParity: false }, inventory: { matchedEntries: 1, pending: 1, total: 6900, basePending: 6618, effectivePending: 6612, remainderExplicit: true }, entries: [{ id: target.id, sourceTask: target.sourceTask, legacyState: target.legacyState, targetImplementationClass: target.targetImplementationClass }], policy: { sourceHistoryReadOnly: true, representativeSliceOnly: true, noRepeatedExecution: true, duplicateValidationAvoided: true, fullHistoricalReproduction: false } };
const report = { schemaVersion: 1, task: "WBV2-P21-001", operation: "SELECT_OBJECT_RENAME_BATCH", status: "PASS", candidate: candidate.candidate, inventory: candidate.inventory, source: candidate.source, matchedEntryDigest: digest(target.id), efficiency: { oneEntryScan: true, existingEvidenceReused: true, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, duplicateValidationAvoided: true }, nextTask: "WBV2-P21-002" };
if (!process.argv.includes("--write")) { console.log(`wbv2-rename-selection-ok task=WBV2-P21-001 legacyId=${target.id} behaviorHash=${behaviorHash} pending=6612 repeatedRuns=0 next=WBV2-P21-002`); process.exit(0); }
fs.mkdirSync(abs(out), { recursive: true });
fs.writeFileSync(abs(candidatePath), `${JSON.stringify(candidate, null, 2)}\n`);
fs.writeFileSync(abs(reportPath), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(abs(statusPath), `# WBV2-P21-001 status\n\n- task: \`WBV2-P21-001\`; parent: \`WBV2-P21-000\`; status: \`done\`\n- selected behavior: \`renameId\`; exact candidate: \`operator:object.add_named\`\n- base inventory: \`6900\` total, \`6618\` pending; effective carried overlay: \`6612\` pending\n- behavior hash: \`${behaviorHash}\`; duplicate validation: \`forbidden\`\n- nextTask: \`WBV2-P21-002\`\n`);
const previousPlan = json("tests/golden/WBV2-P21-000/rename-task-plan.json");
const nextPlan = structuredClone(previousPlan);
nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P21-000/rename-task-plan.json", sha256: sha("tests/golden/WBV2-P21-000/rename-task-plan.json") };
nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P21-001" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P21-002" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false });
fs.writeFileSync(abs(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`);
fs.writeFileSync(abs("docs/tasks/WBV2-P21-002.md"), read("docs/tasks/WBV2-P21-002.md").replace("- status: planned", "- status: in_progress"));
execFileSync(process.execPath, [abs("tools/web/generate-v2-task-index.mjs"), "--plan-path", abs(planPath)], { cwd: root, stdio: "inherit" });
execFileSync(process.execPath, [abs("tools/web/check-task-context.mjs"), "--task", "WBV2-P21-001", "--write"], { cwd: root, stdio: "inherit" });
const artifactPaths = { parentManifest: parentPath, inventory: inventoryPath, api: apiPath, protocol: protocolPath, candidate: candidatePath, report: reportPath, generator: "tools/web/generate-wbv2-rename-selection.mjs", status: statusPath, parityPlan: planPath, taskContext: `${out}/task-context.json` };
const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha(file) }]));
fs.writeFileSync(abs(manifestPath), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P21-001", parentTask: "WBV2-P21-000", operation: "SELECT_OBJECT_RENAME_BATCH", status: "done", enablingTask: true, parityStateChange: false, runtime: "READ_ONLY_SOURCE_CANDIDATE_SELECTION", artifacts, assertions: { legacyId: target.id, inventoryTotal: 6900, basePending: 6618, effectivePending: 6612, sourceApiBound: true, representativeSliceOnly: true, fullFamilyParity: false, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, duplicateValidationAvoided: true, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P21-002" }, null, 2)}\n`);
let queue = read("docs/EXECUTION_QUEUE.md");
queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P21-002` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P21-001/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P21-002.md`](tasks/WBV2-P21-002.md) |");
fs.writeFileSync(abs("docs/EXECUTION_QUEUE.md"), queue);
let nextTask = read("nextTask.md");
nextTask = nextTask.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P21-002` |").replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |").replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P21-001/manifest.json` |").replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P21-002.md` |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P21-003` |").replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-object-rename-production.spec.ts` |");
fs.writeFileSync(abs("nextTask.md"), nextTask);
console.log(`wbv2-rename-selection-written task=WBV2-P21-001 legacyId=${target.id} behaviorHash=${behaviorHash} next=WBV2-P21-002 artifacts=${Object.keys(artifacts).length}`);

View File

@@ -0,0 +1,6 @@
import { expect, test } from "@playwright/test";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
const root=path.resolve(import.meta.dirname,"../../..");const fixture=fs.readFileSync(path.join(root,"tests/files/web/basic_scene.blend"));const fixtureSha256=crypto.createHash("sha256").update(fixture).digest("hex");
test("WBV2-P21-002 binds renameId to compiled WASM Main",async({page})=>{test.setTimeout(120000);await page.goto("/");const result=await page.evaluate(async(bytes)=>{const{WebEngineClient}=await import("/src/engine-client/WebEngineClient.ts");const client=new WebEngineClient({timeoutMs:30000});const reopened=new WebEngineClient({timeoutMs:30000});try{const opened=await client.openBlend(Uint8Array.from(bytes).buffer);const object=opened.snapshot.nodes.find(n=>n.type==="MESH");if(!object)throw new Error("basic scene has no mesh object");const baseRevision=opened.snapshot.revision;const changed=await client.applyCommand({type:"renameId",id:object.id,name:"WBV2P2102Renamed"}as any);const renamed=changed.snapshot.nodes.find(n=>n.id===changed.snapshot.activeObjectId)||changed.snapshot.nodes.find(n=>n.id===object.id);const undone=await client.applyCommand({type:"undo"});const redone=await client.applyCommand({type:"redo"});const malformed=await client.applyCommand({type:"renameId",id:"object:missing",name:"x"}as any).then(()=>({code:"NO_ERROR"})).catch((e:any)=>({code:e?.code,message:e?.message}));const afterMalformed=await client.snapshot();const saved=await client.saveBlend();const reopen=await reopened.openBlend(saved);const renamedReopened=reopen.snapshot.nodes.find(n=>n.id===reopen.snapshot.activeObjectId)||reopen.snapshot.nodes.find(n=>n.type==="MESH");return{browser:"chromium",baseRevision,objectId:object.id,beforeName:object.name,afterName:renamed?.name,afterId:renamed?.id,createRevision:changed.snapshot.revision,undoRevision:undone.snapshot.revision,redoRevision:redone.snapshot.revision,malformed,malformedRevisionPreserved:afterMalformed.snapshot.revision===redone.snapshot.revision,reopenedName:renamedReopened?.name,reopenedRevision:reopen.snapshot.revision,savedSha256:await(async(v)=>{const h=await crypto.subtle.digest("SHA-256",v);return Array.from(new Uint8Array(h),b=>b.toString(16).padStart(2,"0")).join("")})(saved)}}finally{client.terminate();reopened.terminate()}} ,Array.from(fixture));fs.mkdirSync(path.join(root,"tests/golden/WBV2-P21-002"),{recursive:true});const output=process.env.WBV2_RENAME_REPORT??"object-rename-production.json";fs.writeFileSync(path.join(root,"tests/golden/WBV2-P21-002",output),`${JSON.stringify({schemaVersion:1,task:"WBV2-P21-002",operation:"OBJECT_RENAME_ENGINE_CHROMIUM",queueMutation:false,fixtureSha256,...result},null,2)}\n`);expect(result.browser).toBe("chromium");expect(result.afterName).toBe("WBV2P2102Renamed");expect(result.createRevision).toBe(result.baseRevision+1);expect(result.undoRevision).toBe(result.baseRevision+2);expect(result.redoRevision).toBe(result.baseRevision+3);expect(result.malformed.code).not.toBe("NO_ERROR");expect(result.malformedRevisionPreserved).toBe(true);expect(result.reopenedName).toBe("WBV2P2102Renamed");expect(result.reopenedRevision).toBe(1)});