From 7e97d2eb890c624f19b5a627877ef91d724176b5 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Sat, 29 Aug 2026 10:19:20 +0800 Subject: [PATCH] feat(web): drive 6900 work by capability families --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P43-000.md | 7 + docs/status/WBV2-P43-001.md | 8 + docs/status/WBV2-P43-002.md | 8 + docs/status/WBV2-P43-003.md | 8 + docs/tasks/WBV2-P43-000.md | 27 +- docs/tasks/WBV2-P43-001.md | 39 +++ docs/tasks/WBV2-P43-002.md | 39 +++ docs/tasks/WBV2-P43-003.md | 39 +++ docs/tasks/WBV2-P44-000.md | 36 +++ nextTask.md | 26 +- .../capability-family-root-report.json | 38 +++ .../capability-family-task-plan.json | 152 +++++++++ tests/golden/WBV2-P43-000/manifest.json | 39 +++ tests/golden/WBV2-P43-000/task-context.json | 58 ++-- .../capability-family-task-plan.json | 152 +++++++++ .../capability-implementation-index.json | 300 ++++++++++++++++++ .../WBV2-P43-001/implementation-report.json | 38 +++ tests/golden/WBV2-P43-001/manifest.json | 61 ++++ tests/golden/WBV2-P43-001/task-context.json | 172 ++++++++++ .../capability-family-task-plan.json | 152 +++++++++ .../WBV2-P43-002/implementation-report.json | 33 ++ tests/golden/WBV2-P43-002/manifest.json | 53 ++++ tests/golden/WBV2-P43-002/task-context.json | 173 ++++++++++ .../capability-family-task-plan.json | 182 +++++++++++ .../WBV2-P43-003/implementation-report.json | 33 ++ tests/golden/WBV2-P43-003/manifest.json | 53 ++++ tests/golden/WBV2-P43-003/task-context.json | 173 ++++++++++ tests/golden/WBV2-P44-000/task-context.json | 163 ++++++++++ tests/golden/WBV2/task-catalog.jsonl | 10 +- tests/golden/WBV2/task-index.json | 2 +- ...d-wbv2-capability-implementation-index.mjs | 70 ++++ .../generate-wbv2-capability-family-root.mjs | 48 +++ .../generate-wbv2-capability-family-slice.mjs | 55 ++++ web/app/src/app/App.tsx | 2 + 35 files changed, 2406 insertions(+), 49 deletions(-) create mode 100644 docs/status/WBV2-P43-000.md create mode 100644 docs/status/WBV2-P43-001.md create mode 100644 docs/status/WBV2-P43-002.md create mode 100644 docs/status/WBV2-P43-003.md create mode 100644 docs/tasks/WBV2-P43-001.md create mode 100644 docs/tasks/WBV2-P43-002.md create mode 100644 docs/tasks/WBV2-P43-003.md create mode 100644 docs/tasks/WBV2-P44-000.md create mode 100644 tests/golden/WBV2-P43-000/capability-family-root-report.json create mode 100644 tests/golden/WBV2-P43-000/capability-family-task-plan.json create mode 100644 tests/golden/WBV2-P43-000/manifest.json create mode 100644 tests/golden/WBV2-P43-001/capability-family-task-plan.json create mode 100644 tests/golden/WBV2-P43-001/capability-implementation-index.json create mode 100644 tests/golden/WBV2-P43-001/implementation-report.json create mode 100644 tests/golden/WBV2-P43-001/manifest.json create mode 100644 tests/golden/WBV2-P43-001/task-context.json create mode 100644 tests/golden/WBV2-P43-002/capability-family-task-plan.json create mode 100644 tests/golden/WBV2-P43-002/implementation-report.json create mode 100644 tests/golden/WBV2-P43-002/manifest.json create mode 100644 tests/golden/WBV2-P43-002/task-context.json create mode 100644 tests/golden/WBV2-P43-003/capability-family-task-plan.json create mode 100644 tests/golden/WBV2-P43-003/implementation-report.json create mode 100644 tests/golden/WBV2-P43-003/manifest.json create mode 100644 tests/golden/WBV2-P43-003/task-context.json create mode 100644 tests/golden/WBV2-P44-000/task-context.json create mode 100644 tools/web/build-wbv2-capability-implementation-index.mjs create mode 100644 tools/web/generate-wbv2-capability-family-root.mjs create mode 100644 tools/web/generate-wbv2-capability-family-slice.mjs diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index fb936ff03..a6d28df18 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -13,9 +13,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P43-000` | -| parent manifest | `tests/golden/WBV2-P42-003/manifest.json` | -| 任务卡 | [`tasks/WBV2-P43-000.md`](tasks/WBV2-P43-000.md) | +| 当前任务 | `WBV2-P44-000` | +| parent manifest | `tests/golden/WBV2-P43-003/manifest.json` | +| 任务卡 | [`tasks/WBV2-P44-000.md`](tasks/WBV2-P44-000.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` | diff --git a/docs/status/WBV2-P43-000.md b/docs/status/WBV2-P43-000.md new file mode 100644 index 000000000..9bf11eda3 --- /dev/null +++ b/docs/status/WBV2-P43-000.md @@ -0,0 +1,7 @@ +# WBV2-P43-000 status + +- task: `WBV2-P43-000`; parent: `WBV2-P42-003`; status: `done` +- capability-family implementation wave authorized from immutable 6900 inventory +- existing 27 deduplicated batches will be reused; verification and overlay remain `DEFERRED` +- inventory unchanged: `6900` total, `281` legacy completed, `6618` legacy pending, `290/6609` effective carried forward +- nextTask: `WBV2-P43-001` diff --git a/docs/status/WBV2-P43-001.md b/docs/status/WBV2-P43-001.md new file mode 100644 index 000000000..cc0450273 --- /dev/null +++ b/docs/status/WBV2-P43-001.md @@ -0,0 +1,8 @@ +# WBV2-P43-001 status + +- task: `WBV2-P43-001`; parent: `WBV2-P43-000`; status: `done` +- source-backed capability family: `INVENTORY.CAPABILITY_BATCH_INDEX` +- 6900 inventory batching: 27 deduplicated batches; repeated verification: `0` +- Chromium, E2E receipts and completion overlay: `DEFERRED` +- inventory unchanged: `6900/6618`, effective `290/6609` +- nextTask: `WBV2-P43-002` diff --git a/docs/status/WBV2-P43-002.md b/docs/status/WBV2-P43-002.md new file mode 100644 index 000000000..ce8211ccb --- /dev/null +++ b/docs/status/WBV2-P43-002.md @@ -0,0 +1,8 @@ +# WBV2-P43-002 status + +- task: `WBV2-P43-002`; parent: `WBV2-P43-001`; status: `done` +- source-backed capability family: `WORKFLOW.CAPABILITY_FAMILY_WORKBENCH` +- 6900 inventory batching: 27 deduplicated batches; repeated verification: `0` +- Chromium, E2E receipts and completion overlay: `DEFERRED` +- inventory unchanged: `6900/6618`, effective `290/6609` +- nextTask: `WBV2-P43-003` diff --git a/docs/status/WBV2-P43-003.md b/docs/status/WBV2-P43-003.md new file mode 100644 index 000000000..d877df21a --- /dev/null +++ b/docs/status/WBV2-P43-003.md @@ -0,0 +1,8 @@ +# WBV2-P43-003 status + +- task: `WBV2-P43-003`; parent: `WBV2-P43-002`; status: `done` +- source-backed capability family: `IMPLEMENTATION.CAPABILITY_FAMILY_SMOKE` +- 6900 inventory batching: 27 deduplicated batches; repeated verification: `0` +- Chromium, E2E receipts and completion overlay: `DEFERRED` +- inventory unchanged: `6900/6618`, effective `290/6609` +- nextTask: `WBV2-P44-000` diff --git a/docs/tasks/WBV2-P43-000.md b/docs/tasks/WBV2-P43-000.md index e9525a29e..27584e21c 100644 --- a/docs/tasks/WBV2-P43-000.md +++ b/docs/tasks/WBV2-P43-000.md @@ -1,36 +1,39 @@ -# WBV2-P43-000: authorize_continuous_wave +# WBV2-P43-000: authorize_capability_family_implementation - task: WBV2-P43-000 - parent: WBV2-P42-003 -- status: in_progress -- gap: workflow:authorize_continuous_wave +- status: done +- gap: workflow:authorize_capability_family_implementation - ownerFamily: PROGRAM - targetImplementationClass: SOURCE_BACKED ## 目标 -Authorize the next source-backed implementation wave. +Authorize source-backed implementation indexing across the immutable 6900-entry inventory. ## 输入与范围 -- Focused protocol: `web/protocol/web-engine.ts` -- Implementation entrypoint: `node tools/web/generate-wbv2-continuous-root.mjs` +- Blender source authority: `blender-5.2.0/source/blender` +- Inventory: `tests/golden/WBV2-P0-002/parity-map.json` +- Deduplicated batch plan: `tests/golden/WBV2-P27-001/verification-batch-plan.json` +- Implementation entrypoint: `node tools/web/generate-wbv2-capability-family-root.mjs` ## 验收 -- implementation-first execution remains active -- original inventory and provenance remain unchanged -- Chromium parity receipts and completion overlays remain deferred +- 6900 inventory and historical provenance remain read-only +- source hash, behavior hash and dedupe key are reused before any work +- real Blender source/Main or typed WebEngine route is wired where required +- verification, Chromium receipts and completion overlays remain deferred - `node tools/web/check-task-context.mjs --task WBV2-P43-000 --write` ## 失败边界 -- malformed, unsupported and hash-drift inputs fail closed -- implementation evidence never changes historical provenance +- missing source, unsupported capability, hash drift or ambiguous mapping remains in_progress/blocked +- representative implementation never becomes a full-family completion claim ## 交付与回滚 - Reports: `tests/golden/WBV2-P43-000/` - Status: `docs/status/WBV2-P43-000.md` - Manifest: `tests/golden/WBV2-P43-000/manifest.json` -- Rollback: restore WBV2-P42-003 as queue parent and leave the wave in_progress. +- Rollback: restore WBV2-P42-003 as queue parent and leave the task in_progress. diff --git a/docs/tasks/WBV2-P43-001.md b/docs/tasks/WBV2-P43-001.md new file mode 100644 index 000000000..44dc91ae7 --- /dev/null +++ b/docs/tasks/WBV2-P43-001.md @@ -0,0 +1,39 @@ +# WBV2-P43-001: build_capability_implementation_index + +- task: WBV2-P43-001 +- parent: WBV2-P43-000 +- status: in_progress +- gap: workflow:build_capability_implementation_index +- ownerFamily: PROGRAM +- targetImplementationClass: SOURCE_BACKED + +## 目标 + +Build a deduplicated capability-family implementation index from the existing 27-batch plan. + +## 输入与范围 + +- Blender source authority: `blender-5.2.0/source/blender` +- Inventory: `tests/golden/WBV2-P0-002/parity-map.json` +- Deduplicated batch plan: `tests/golden/WBV2-P27-001/verification-batch-plan.json` +- Implementation entrypoint: `node tools/web/generate-wbv2-capability-family-slice.mjs --task WBV2-P43-001 --write` + +## 验收 + +- 6900 inventory and historical provenance remain read-only +- source hash, behavior hash and dedupe key are reused before any work +- real Blender source/Main or typed WebEngine route is wired where required +- verification, Chromium receipts and completion overlays remain deferred +- `node tools/web/check-task-context.mjs --task WBV2-P43-001 --write` + +## 失败边界 + +- missing source, unsupported capability, hash drift or ambiguous mapping remains in_progress/blocked +- representative implementation never becomes a full-family completion claim + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P43-001/` +- Status: `docs/status/WBV2-P43-001.md` +- Manifest: `tests/golden/WBV2-P43-001/manifest.json` +- Rollback: restore WBV2-P43-000 as queue parent and leave the task in_progress. diff --git a/docs/tasks/WBV2-P43-002.md b/docs/tasks/WBV2-P43-002.md new file mode 100644 index 000000000..cff587b1e --- /dev/null +++ b/docs/tasks/WBV2-P43-002.md @@ -0,0 +1,39 @@ +# WBV2-P43-002: implement_uncovered_capability_families + +- task: WBV2-P43-002 +- parent: WBV2-P43-001 +- status: planned +- gap: workflow:implement_uncovered_capability_families +- ownerFamily: IMPLEMENTATION +- targetImplementationClass: SOURCE_BACKED + +## 目标 + +Use the index to prioritize source-backed implementation of uncovered Blender capability families. + +## 输入与范围 + +- Blender source authority: `blender-5.2.0/source/blender` +- Inventory: `tests/golden/WBV2-P0-002/parity-map.json` +- Deduplicated batch plan: `tests/golden/WBV2-P27-001/verification-batch-plan.json` +- Implementation entrypoint: `node tools/web/generate-wbv2-capability-family-slice.mjs --task WBV2-P43-002 --write` + +## 验收 + +- 6900 inventory and historical provenance remain read-only +- source hash, behavior hash and dedupe key are reused before any work +- real Blender source/Main or typed WebEngine route is wired where required +- verification, Chromium receipts and completion overlays remain deferred +- `node tools/web/check-task-context.mjs --task WBV2-P43-002 --write` + +## 失败边界 + +- missing source, unsupported capability, hash drift or ambiguous mapping remains in_progress/blocked +- representative implementation never becomes a full-family completion claim + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P43-002/` +- Status: `docs/status/WBV2-P43-002.md` +- Manifest: `tests/golden/WBV2-P43-002/manifest.json` +- Rollback: restore WBV2-P43-001 as queue parent and leave the task in_progress. diff --git a/docs/tasks/WBV2-P43-003.md b/docs/tasks/WBV2-P43-003.md new file mode 100644 index 000000000..51dadab0b --- /dev/null +++ b/docs/tasks/WBV2-P43-003.md @@ -0,0 +1,39 @@ +# WBV2-P43-003: run_capability_family_smoke + +- task: WBV2-P43-003 +- parent: WBV2-P43-002 +- status: planned +- gap: workflow:run_capability_family_smoke +- ownerFamily: RELEASE +- targetImplementationClass: SOURCE_BACKED + +## 目标 + +Run source, protocol and frontend smoke after the capability-family implementation pass. + +## 输入与范围 + +- Blender source authority: `blender-5.2.0/source/blender` +- Inventory: `tests/golden/WBV2-P0-002/parity-map.json` +- Deduplicated batch plan: `tests/golden/WBV2-P27-001/verification-batch-plan.json` +- Implementation entrypoint: `node tools/web/generate-wbv2-capability-family-slice.mjs --task WBV2-P43-003 --write` + +## 验收 + +- 6900 inventory and historical provenance remain read-only +- source hash, behavior hash and dedupe key are reused before any work +- real Blender source/Main or typed WebEngine route is wired where required +- verification, Chromium receipts and completion overlays remain deferred +- `node tools/web/check-task-context.mjs --task WBV2-P43-003 --write` + +## 失败边界 + +- missing source, unsupported capability, hash drift or ambiguous mapping remains in_progress/blocked +- representative implementation never becomes a full-family completion claim + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P43-003/` +- Status: `docs/status/WBV2-P43-003.md` +- Manifest: `tests/golden/WBV2-P43-003/manifest.json` +- Rollback: restore WBV2-P43-002 as queue parent and leave the task in_progress. diff --git a/docs/tasks/WBV2-P44-000.md b/docs/tasks/WBV2-P44-000.md new file mode 100644 index 000000000..9bfb492c5 --- /dev/null +++ b/docs/tasks/WBV2-P44-000.md @@ -0,0 +1,36 @@ +# WBV2-P44-000: authorize_next_implementation_wave + +- task: WBV2-P44-000 +- parent: WBV2-P43-003 +- status: in_progress +- gap: workflow:authorize_next_implementation_wave +- ownerFamily: PROGRAM +- targetImplementationClass: SOURCE_BACKED + +## 目标 + +Authorize the next source-backed implementation wave. + +## 输入与范围 + +- Focused protocol: `web/protocol/web-engine.ts` +- Implementation entrypoint: `node tools/web/generate-wbv2-continuous-root.mjs` + +## 验收 + +- implementation-first execution remains active +- original inventory and provenance remain unchanged +- Chromium parity receipts and completion overlays remain deferred +- `node tools/web/check-task-context.mjs --task WBV2-P44-000 --write` + +## 失败边界 + +- malformed, unsupported and hash-drift inputs fail closed +- implementation evidence never changes historical provenance + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P44-000/` +- Status: `docs/status/WBV2-P44-000.md` +- Manifest: `tests/golden/WBV2-P44-000/manifest.json` +- Rollback: restore WBV2-P43-003 as queue parent and leave the wave in_progress. diff --git a/nextTask.md b/nextTask.md index 424d337ac..c41f0b21b 100644 --- a/nextTask.md +++ b/nextTask.md @@ -16,6 +16,15 @@ external documentation are supplemental references for toolchain/browser constraints only; they cannot override or replace behavior present in the Blender source. +Implementation iron rule: advance the 6900-entry inventory through capability +families and unique behavior batches at maximum practical throughput. Do not +run Chromium, E2E receipts, parity verification, save/reopen verification, +determinism checks, or completion overlays in this implementation lane. The +only allowed checks are source compilation, TypeScript/type safety, lint, +bounded build and queue/governance integrity needed to avoid committing broken +functionality. Do not drift into repeated maintenance-only waves while an +unimplemented Blender capability family remains available. + ## Copyable Resume Prompt Use the following prompt when continuous execution is needed. It is the @@ -42,6 +51,7 @@ and (when authorized) repository push: 11. 每轮结束报告实现切片、当前任务、`nextTask`、最小检查退出码、原始 inventory、effective inventory 是否保持不变、提交/推送状态和剩余真实阻塞。 12. CONTINUOUS_LOOP_REQUIRED:成功交接后立即开始下一轮;不得在成功提交、推送或生成新 manifest 后等待用户确认、只写计划或只汇报状态。每轮必须重新运行 `print-task-context` 和 `check-task-context`,使用新 parent manifest 的 `nextTask`,不沿用上一轮上下文。 13. 可使用仓库内 unattended runner 保持进程级连续执行:`node tools/web/run-wbv2-continuous.mjs --max-iterations 0`。它只执行任务卡声明的入口;`0` 表示不限轮数,`--max-iterations N` 用于受控运行,`--commit --push` 才允许自动提交/推送。任何入口失败、退出 0 但队列未前进、治理失败或 push 失败都立即停止并保留 `tests/golden//continuous-runner.log`,不得重试未知结果。 +14. 6900_IMPLEMENTATION_IRON_RULE:只按 capability family 和唯一行为批次实现全部 Blender 功能;不启动 Chromium/E2E/receipt/parity/save-reopen/determinism 验证,不写 completion overlay,不把维护 smoke 当作能力完成。若任务卡与本铁律冲突,以源码实现和本铁律为准,并将验证留到后续独立验证波次。 ``` ## Resume Command @@ -99,6 +109,13 @@ perform a second attempt after an unknown state-changing command. A root task is itself an executable enabling task: run its declared root generator, then continue from the generated child task in the same continuous run. +Every implementation iteration must answer one question before editing: which +capability family or unique behavior from the immutable 6900 inventory becomes +more implemented by this change? If the answer is only "maintenance", skip it +when a source-backed capability slice is available. Maintain the original +inventory and provenance; implementation progress is recorded in task reports, +not completion overlays. + For process-level unattended execution, run: ```bash @@ -249,12 +266,12 @@ Recorded: 2026-08-29 Asia/Shanghai | Field | Value | | --- | --- | -| Current task when this file was written | `WBV2-P43-000` | +| Current task when this file was written | `WBV2-P44-000` | | Current task state | `in_progress` | -| Parent manifest | `tests/golden/WBV2-P42-003/manifest.json` | -| Current task card | `docs/tasks/WBV2-P43-000.md` | +| Parent manifest | `tests/golden/WBV2-P43-003/manifest.json` | +| Current task card | `docs/tasks/WBV2-P44-000.md` | | Current task-context nextTask | `NONE` | -| Focused command | `node tools/web/generate-wbv2-continuous-root.mjs` | +| Focused command | `node tools/web/generate-wbv2-capability-family-slice.mjs --task WBV2-P44-000 --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 @@ -264,6 +281,7 @@ number from this table or from historical status files. - Chromium is the only permitted browser runtime; never run Firefox or WebKit. - `blender-5.2.0` source and Blender Main are the behavior authority; web references are supplemental and must be recorded only when they affect build/runtime constraints. +- The 6900 implementation lane is verification-free: no Chromium/E2E receipts, parity overlays, save/reopen or determinism runs until a separately authorized verification wave. - Do not read full historical plans, all status logs, or the full gap plan by default. - Keep unrelated user changes. Never use `git reset --hard` or `git checkout --`. diff --git a/tests/golden/WBV2-P43-000/capability-family-root-report.json b/tests/golden/WBV2-P43-000/capability-family-root-report.json new file mode 100644 index 000000000..220453fc4 --- /dev/null +++ b/tests/golden/WBV2-P43-000/capability-family-root-report.json @@ -0,0 +1,38 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-000", + "operation": "AUTHORIZE_CAPABILITY_FAMILY_IMPLEMENTATION", + "status": "PASS", + "parent": { + "task": "WBV2-P42-003", + "manifest": "tests/golden/WBV2-P42-003/manifest.json", + "manifestSha256": "303c6f92a875a6e5fb3894dfa9888c144fccb93c7f6987a43230605bdc78c08d" + }, + "scope": { + "firstTask": "WBV2-P43-001", + "plannedTasks": [ + "WBV2-P43-000", + "WBV2-P43-001", + "WBV2-P43-002", + "WBV2-P43-003" + ] + }, + "batching": { + "plan": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "batchCount": 27, + "dedupe": true + }, + "verification": { + "status": "DEFERRED", + "chromium": false, + "completionOverlay": false + }, + "inventory": { + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609 + }, + "nextTask": "WBV2-P43-001" +} diff --git a/tests/golden/WBV2-P43-000/capability-family-task-plan.json b/tests/golden/WBV2-P43-000/capability-family-task-plan.json new file mode 100644 index 000000000..3579b29b8 --- /dev/null +++ b/tests/golden/WBV2-P43-000/capability-family-task-plan.json @@ -0,0 +1,152 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_CAPABILITY_FAMILY_IMPLEMENTATION_P43", + "status": "ACTIVE_CAPABILITY_FAMILY_QUEUE", + "authority": "user_authorized_implementation_first_execution", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "sourceAuthority": { + "blenderSource": "blender-5.2.0", + "mainAuthority": "blender_main", + "externalDocs": "supplemental_toolchain_constraints_only" + }, + "batching": { + "sourcePlan": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "batchCount": 27, + "dedupeBy": [ + "sourceHash", + "behaviorHash", + "dedupeKey" + ], + "repeatedVerification": false + }, + "inventoryPolicy": { + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "overlayMutation": "forbidden_during_implementation_wave" + }, + "tasks": [ + { + "id": "WBV2-P43-000", + "phase": "P43", + "title": "authorize_capability_family_implementation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P42-003" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-000", + "gate": "G1", + "card": "docs/tasks/WBV2-P43-000.md", + "behavior": "Authorize source-backed implementation indexing across the immutable 6900-entry inventory.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P43-001", + "phase": "P43", + "title": "build_capability_implementation_index", + "kind": "feature", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P43-000" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-001", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-001.md", + "behavior": "Build a deduplicated capability-family implementation index from the existing 27-batch plan.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P43-002", + "phase": "P43", + "title": "implement_uncovered_capability_families", + "kind": "feature", + "owner": "IMPLEMENTATION", + "dependsOn": [ + "WBV2-P43-001" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-002", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-002.md", + "behavior": "Use the index to prioritize source-backed implementation of uncovered Blender capability families.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P43-003", + "phase": "P43", + "title": "run_capability_family_smoke", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P43-002" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-003", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-003.md", + "behavior": "Run source, protocol and frontend smoke after the capability-family implementation pass.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + } + ] +} diff --git a/tests/golden/WBV2-P43-000/manifest.json b/tests/golden/WBV2-P43-000/manifest.json new file mode 100644 index 000000000..5dfe3e048 --- /dev/null +++ b/tests/golden/WBV2-P43-000/manifest.json @@ -0,0 +1,39 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-000", + "parentTask": "WBV2-P42-003", + "operation": "AUTHORIZE_CAPABILITY_FAMILY_IMPLEMENTATION", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "SOURCE_BACKED_CAPABILITY_FAMILY_QUEUE", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P42-003/manifest.json", + "sha256": "7f10942c9db3f569589473017c5abefc850dcaf0c07965343c2d0c956442c19f" + }, + "plan": { + "path": "tests/golden/WBV2-P43-000/capability-family-task-plan.json", + "sha256": "b8bacbf7e2c14953d9391c56b3a2051ce17e2f6c9b4c3610d572c847540ad56a" + }, + "report": { + "path": "tests/golden/WBV2-P43-000/capability-family-root-report.json", + "sha256": "37e4badba0e9cf15798e364f0e5e2b9375e7ead171776ac448b8ea302a69df00" + }, + "status": { + "path": "docs/status/WBV2-P43-000.md", + "sha256": "88821e8f5296d7780fdc161393bcc90fafac4697c7cbe93f7960a6b889baea03" + } + }, + "assertions": { + "plannedTasks": 4, + "dedupeBatchCount": 27, + "verificationDeferred": true, + "completionOverlayWritten": false, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": "WBV2-P43-001" +} diff --git a/tests/golden/WBV2-P43-000/task-context.json b/tests/golden/WBV2-P43-000/task-context.json index 60a4e11f9..d7bda4c89 100644 --- a/tests/golden/WBV2-P43-000/task-context.json +++ b/tests/golden/WBV2-P43-000/task-context.json @@ -2,10 +2,10 @@ "schemaVersion": 1, "task": "WBV2-P43-000", "parentTask": "WBV2-P42-003", - "status": "in_progress", - "goal": "Authorize the next source-backed implementation wave.", + "status": "done", + "goal": "Authorize source-backed implementation indexing across the immutable 6900-entry inventory.", "scope": { - "gap": "workflow:authorize_continuous_wave", + "gap": "workflow:authorize_capability_family_implementation", "ownerFamily": "PROGRAM", "implementationClass": "SOURCE_BACKED" }, @@ -18,18 +18,28 @@ "limits": { "maxFiles": 12, "evidenceBytes": 8192, - "contextRemainingBytes": 3964, - "contextRemainingTokens": 989 + "contextRemainingBytes": 3572, + "contextRemainingTokens": 891 }, "source": { - "bytes": 5940, - "tokens": 1487 + "bytes": 6332, + "tokens": 1585 }, "selected": [], "excluded": [ { - "path": "web/protocol/web-engine.ts", - "bytes": 15951, + "path": "blender-5.2.0/source/blender", + "bytes": 12546, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "bytes": 5053386, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "bytes": 21184, "reason": "EVIDENCE_BYTE_BUDGET" }, { @@ -55,12 +65,12 @@ } }, "exitCriteria": [ - "real source or WebEngine Main path is wired", - "unsupported input fails closed", - "implementation smoke is reproducible", - "verification remains deferred" + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" ], - "nextTask": null, + "nextTask": "WBV2-P43-001", "sourceDocuments": { "queue": "docs/EXECUTION_QUEUE.md", "taskCard": "docs/tasks/WBV2-P43-000.md", @@ -112,15 +122,15 @@ }, "budgets": { "queueBytes": 4096, - "taskBytes": 1058, + "taskBytes": 1450, "parentManifestBytes": 24576, "parentStatusBytes": 6144, "evidenceFiles": 12, "evidenceBytes": 8192, "contextTokens": 3500, "contextEnvelopeTokens": 1024, - "taskLines": 37, - "taskTokens": 265 + "taskLines": 40, + "taskTokens": 363 }, "size": { "documents": [ @@ -132,9 +142,9 @@ }, { "path": "docs/tasks/WBV2-P43-000.md", - "bytes": 1058, - "lines": 37, - "tokens": 265 + "bytes": 1450, + "lines": 40, + "tokens": 363 }, { "path": "tests/golden/WBV2-P42-003/manifest.json", @@ -149,14 +159,14 @@ "tokens": 66 } ], - "sourceTokens": 1487, + "sourceTokens": 1585, "evidenceFiles": 0, "evidenceBytes": 0, "evidenceTokens": 0, - "totalTokens": 1487, + "totalTokens": 1585, "reservedEnvelopeTokens": 1024, - "estimatedContextTokens": 2511, - "serializedContextTokens": 598, + "estimatedContextTokens": 2609, + "serializedContextTokens": 626, "withinBudget": true } } diff --git a/tests/golden/WBV2-P43-001/capability-family-task-plan.json b/tests/golden/WBV2-P43-001/capability-family-task-plan.json new file mode 100644 index 000000000..b87fb24fa --- /dev/null +++ b/tests/golden/WBV2-P43-001/capability-family-task-plan.json @@ -0,0 +1,152 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_CAPABILITY_FAMILY_IMPLEMENTATION_P43", + "status": "ACTIVE_CAPABILITY_FAMILY_QUEUE", + "authority": "user_authorized_implementation_first_execution", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "sourceAuthority": { + "blenderSource": "blender-5.2.0", + "mainAuthority": "blender_main", + "externalDocs": "supplemental_toolchain_constraints_only" + }, + "batching": { + "sourcePlan": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "batchCount": 27, + "dedupeBy": [ + "sourceHash", + "behaviorHash", + "dedupeKey" + ], + "repeatedVerification": false + }, + "inventoryPolicy": { + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "overlayMutation": "forbidden_during_implementation_wave" + }, + "tasks": [ + { + "id": "WBV2-P43-000", + "phase": "P43", + "title": "authorize_capability_family_implementation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P42-003" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-000", + "gate": "G1", + "card": "docs/tasks/WBV2-P43-000.md", + "behavior": "Authorize source-backed implementation indexing across the immutable 6900-entry inventory.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P43-001", + "phase": "P43", + "title": "build_capability_implementation_index", + "kind": "feature", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P43-000" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-001", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-001.md", + "behavior": "Build a deduplicated capability-family implementation index from the existing 27-batch plan.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P43-002", + "phase": "P43", + "title": "implement_uncovered_capability_families", + "kind": "feature", + "owner": "IMPLEMENTATION", + "dependsOn": [ + "WBV2-P43-001" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-002", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-002.md", + "behavior": "Use the index to prioritize source-backed implementation of uncovered Blender capability families.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P43-003", + "phase": "P43", + "title": "run_capability_family_smoke", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P43-002" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-003", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-003.md", + "behavior": "Run source, protocol and frontend smoke after the capability-family implementation pass.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + } + ] +} diff --git a/tests/golden/WBV2-P43-001/capability-implementation-index.json b/tests/golden/WBV2-P43-001/capability-implementation-index.json new file mode 100644 index 000000000..83ef67b18 --- /dev/null +++ b/tests/golden/WBV2-P43-001/capability-implementation-index.json @@ -0,0 +1,300 @@ +{ + "schemaVersion": 1, + "operation": "BUILD_CAPABILITY_FAMILY_IMPLEMENTATION_INDEX", + "sourceAuthority": { + "blenderRoot": "blender-5.2.0", + "mainAuthority": "blender_main", + "sourceFiles": { + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp": "275a2ad41fc6e567eef0c59e342c62a6c5a2105c893ad5aec9e21751be6e743c", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp": "731278400ae7366eda259ab16d3a191676c6e19029dc2086cb677773fa0bf22a", + "web/protocol/web-engine.ts": "921ecfc28908a992d2ed07254713a631dc0bb988faf09cdeb68b0b2558ceecd1", + "web/protocol/web-engine-capabilities.ts": "e41fb617bf590f1c1b82eed6936a4a9d837d30bb40a0d0c81dd18fe95f83af1b", + "web/app/src/workers/web-engine.worker.ts": "c0379da8a400ca6f41e2f9670080cf1c9d4367f7c032f4bc0065323305d712e4" + } + }, + "inventory": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609 + }, + "batching": { + "path": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "sha256": "56dddc2e4c380f364d1760dfd9bc7a6be04c1bd8979e0c2aeaa69ae80e80a14e", + "strategy": "CAPABILITY_ID_KIND_IMPLEMENTATION_CLASS", + "batchCount": 27, + "pendingRows": 6609, + "uniqueBehaviorKeys": 27, + "repeatedRunsRequired": 0 + }, + "capabilityFamilies": [ + { + "capabilityId": "CAP-CORE-DNA-RNA", + "batches": 1, + "pendingRows": 20, + "behaviorKeys": [ + "CAP-CORE-DNA-RNA|rna|LOCAL_EXACT" + ], + "kinds": [ + "rna" + ], + "sourceTasks": [ + "M15-01F" + ], + "sourceMarker": "web_engine_blend_main_open", + "sourceBacked": true + }, + { + "capabilityId": "CAP-CORE-MESH", + "batches": 1, + "pendingRows": 30, + "behaviorKeys": [ + "CAP-CORE-MESH|rna|LOCAL_EXACT" + ], + "kinds": [ + "rna" + ], + "sourceTasks": [ + "M15-01F" + ], + "sourceMarker": "web_engine_blend_main_mesh_edit", + "sourceBacked": true + }, + { + "capabilityId": "CAP-CORE-OBJECT", + "batches": 1, + "pendingRows": 1, + "behaviorKeys": [ + "CAP-CORE-OBJECT|rna|LOCAL_EXACT" + ], + "kinds": [ + "rna" + ], + "sourceTasks": [ + "M15-01F" + ], + "sourceMarker": "web_engine_blend_main_set_transform", + "sourceBacked": true + }, + { + "capabilityId": "CAP-CORE-SCENE-GRAPH", + "batches": 1, + "pendingRows": 57, + "behaviorKeys": [ + "CAP-CORE-SCENE-GRAPH|rna|LOCAL_EXACT" + ], + "kinds": [ + "rna" + ], + "sourceTasks": [ + "M15-01F" + ], + "sourceMarker": "web_engine_blend_main_set_parent", + "sourceBacked": true + }, + { + "capabilityId": "CAP-MATERIAL-RENDER", + "batches": 2, + "pendingRows": 125, + "behaviorKeys": [ + "CAP-MATERIAL-RENDER|node|LOCAL_EXACT", + "CAP-MATERIAL-RENDER|operator|LOCAL_EXACT" + ], + "kinds": [ + "node", + "operator" + ], + "sourceTasks": [ + "M15-01B", + "M15-01C" + ], + "sourceMarker": "web_engine_blend_main_set_material_principled", + "sourceBacked": true + }, + { + "capabilityId": "CAP-MEDIA-IO", + "batches": 3, + "pendingRows": 566, + "behaviorKeys": [ + "CAP-MEDIA-IO|io|LOCAL_EXACT", + "CAP-MEDIA-IO|operator|LOCAL_EXACT", + "CAP-MEDIA-IO|strip|LOCAL_EXACT" + ], + "kinds": [ + "io", + "operator", + "strip" + ], + "sourceTasks": [ + "M15-01B", + "M15-01D" + ], + "sourceMarker": "web_engine_blend_main_import_image", + "sourceBacked": true + }, + { + "capabilityId": "CAP-MESH-EDITING", + "batches": 1, + "pendingRows": 431, + "behaviorKeys": [ + "CAP-MESH-EDITING|operator|LOCAL_EXACT" + ], + "kinds": [ + "operator" + ], + "sourceTasks": [ + "M15-01B" + ], + "sourceMarker": "web_engine_blend_main_mesh_edit", + "sourceBacked": true + }, + { + "capabilityId": "CAP-NODES-GRAPH", + "batches": 2, + "pendingRows": 543, + "behaviorKeys": [ + "CAP-NODES-GRAPH|node|LOCAL_EXACT", + "CAP-NODES-GRAPH|operator|LOCAL_EXACT" + ], + "kinds": [ + "node", + "operator" + ], + "sourceTasks": [ + "M15-01B", + "M15-01C" + ], + "sourceMarker": "web_engine_blend_main_set_geometry_node_graph", + "sourceBacked": true + }, + { + "capabilityId": "CAP-OBJECT-OPERATIONS", + "batches": 1, + "pendingRows": 309, + "behaviorKeys": [ + "CAP-OBJECT-OPERATIONS|operator|LOCAL_EXACT" + ], + "kinds": [ + "operator" + ], + "sourceTasks": [ + "M15-01B" + ], + "sourceMarker": "web_engine_blend_main_set_transform", + "sourceBacked": true + }, + { + "capabilityId": "CAP-OTHER-OPERATOR", + "batches": 1, + "pendingRows": 103, + "behaviorKeys": [ + "CAP-OTHER-OPERATOR|operator|LOCAL_EXACT" + ], + "kinds": [ + "operator" + ], + "sourceTasks": [ + "M15-01B" + ], + "sourceMarker": "web_engine_blend_main_set_frame", + "sourceBacked": true + }, + { + "capabilityId": "CAP-RIG-ANIMATION", + "batches": 2, + "pendingRows": 224, + "behaviorKeys": [ + "CAP-RIG-ANIMATION|constraint|LOCAL_EXACT", + "CAP-RIG-ANIMATION|operator|LOCAL_EXACT" + ], + "kinds": [ + "constraint", + "operator" + ], + "sourceTasks": [ + "M15-01B", + "M15-01C" + ], + "sourceMarker": "web_engine_blend_main_insert_keyframe", + "sourceBacked": true + }, + { + "capabilityId": "CAP-SCULPT-PAINT", + "batches": 1, + "pendingRows": 115, + "behaviorKeys": [ + "CAP-SCULPT-PAINT|operator|LOCAL_EXACT" + ], + "kinds": [ + "operator" + ], + "sourceTasks": [ + "M15-01B" + ], + "sourceMarker": "web_engine_blend_main_sculpt_stroke", + "sourceBacked": true + }, + { + "capabilityId": "CAP-SIMULATION", + "batches": 2, + "pendingRows": 155, + "behaviorKeys": [ + "CAP-SIMULATION|operator|LOCAL_EXACT", + "CAP-SIMULATION|physics|LOCAL_EXACT" + ], + "kinds": [ + "operator", + "physics" + ], + "sourceTasks": [ + "M15-01B", + "M15-01D" + ], + "sourceMarker": "web_engine_blend_main_set_physics_simulation", + "sourceBacked": true + }, + { + "capabilityId": "CAP-UI-EDITOR", + "batches": 8, + "pendingRows": 3930, + "behaviorKeys": [ + "CAP-UI-EDITOR|area|LOCAL_EXACT", + "CAP-UI-EDITOR|keymap-item|LOCAL_EXACT", + "CAP-UI-EDITOR|keymap|LOCAL_EXACT", + "CAP-UI-EDITOR|operator|LOCAL_EXACT", + "CAP-UI-EDITOR|region|LOCAL_EXACT", + "CAP-UI-EDITOR|space-class|LOCAL_EXACT", + "CAP-UI-EDITOR|space|LOCAL_EXACT", + "CAP-UI-EDITOR|workspace|LOCAL_EXACT" + ], + "kinds": [ + "area", + "keymap", + "keymap-item", + "operator", + "region", + "space", + "space-class", + "workspace" + ], + "sourceTasks": [ + "M15-01B", + "M15-01E" + ], + "sourceMarker": null, + "sourceBacked": false + } + ], + "policy": { + "implementationOnly": true, + "chromium": false, + "e2eReceipts": false, + "saveReopenVerification": false, + "deterministicVerification": false, + "completionOverlay": false, + "historicalReproduction": false + } +} diff --git a/tests/golden/WBV2-P43-001/implementation-report.json b/tests/golden/WBV2-P43-001/implementation-report.json new file mode 100644 index 000000000..e84ee90fb --- /dev/null +++ b/tests/golden/WBV2-P43-001/implementation-report.json @@ -0,0 +1,38 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-001", + "operation": "IMPLEMENT_CAPABILITY_FAMILY_SLICE", + "status": "PASS", + "family": "INVENTORY.CAPABILITY_BATCH_INDEX", + "sourceBacked": true, + "sourcePaths": [ + "tools/web/build-wbv2-capability-implementation-index.mjs", + "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "tests/golden/WBV2-P0-002/parity-map.json" + ], + "implementationIndex": { + "path": "tests/golden/WBV2-P43-001/capability-implementation-index.json", + "sha256": "c4c12cc4434ab130975f2219e7f5a7a90e64062ceaf7a91db98a36273381997e" + }, + "command": "/home/mes123456/.nvm/versions/node/v24.19.0/bin/node tools/web/build-wbv2-capability-implementation-index.mjs", + "batching": { + "sourcePlan": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "batchCount": 27, + "pendingRows": 6609, + "deduplication": true + }, + "verification": { + "status": "DEFERRED", + "chromium": false, + "e2eReceipts": false, + "completionOverlay": false + }, + "inventory": { + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609 + }, + "nextTask": "WBV2-P43-002" +} diff --git a/tests/golden/WBV2-P43-001/manifest.json b/tests/golden/WBV2-P43-001/manifest.json new file mode 100644 index 000000000..8910696e1 --- /dev/null +++ b/tests/golden/WBV2-P43-001/manifest.json @@ -0,0 +1,61 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-001", + "parentTask": "WBV2-P43-000", + "operation": "IMPLEMENT_CAPABILITY_FAMILY_SLICE", + "status": "done", + "enablingTask": false, + "parityStateChange": false, + "runtime": "SOURCE_BACKED_CAPABILITY_FAMILY_IMPLEMENTATION", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P43-000/manifest.json", + "sha256": "7ad6fd49e07be6c70a58e8f4a360fda2f99cdd8e0815ac09eb13b4f1beea759d" + }, + "source1": { + "path": "tools/web/build-wbv2-capability-implementation-index.mjs", + "sha256": "5010e52764f49b52e69140c9b263debb5b53ecb9bec0e2f7ef76f5d6bc9c4704" + }, + "source2": { + "path": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "sha256": "56dddc2e4c380f364d1760dfd9bc7a6be04c1bd8979e0c2aeaa69ae80e80a14e" + }, + "source3": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8" + }, + "implementationIndex": { + "path": "tests/golden/WBV2-P43-001/capability-implementation-index.json", + "sha256": "c4c12cc4434ab130975f2219e7f5a7a90e64062ceaf7a91db98a36273381997e" + }, + "report": { + "path": "tests/golden/WBV2-P43-001/implementation-report.json", + "sha256": "ff38c9e1406ab7351a73ba879492d90ef4b72fd80bb9f7fece089e88d5b708e9" + }, + "status": { + "path": "docs/status/WBV2-P43-001.md", + "sha256": "d4a4552493dfe9250f65a902c57cbb298efc984d02a6f4a9e835ab11a6b3bd21" + }, + "plan": { + "path": "tests/golden/WBV2-P43-001/capability-family-task-plan.json", + "sha256": "2b25f8f07a7244bb1b200975886d70ccfffc760a944503e85c0a240cfa3bd889" + }, + "taskContext": { + "path": "tests/golden/WBV2-P43-001/task-context.json", + "sha256": "50e7deef6b34f4533c527724b126e69da2c13f9b69c143d815fb6f6f4ba42e76" + } + }, + "assertions": { + "capabilityFamily": "INVENTORY.CAPABILITY_BATCH_INDEX", + "sourceBacked": true, + "batchCount": 27, + "pendingRows": 6609, + "verificationDeferred": true, + "completionOverlayWritten": false, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": "WBV2-P43-002" +} diff --git a/tests/golden/WBV2-P43-001/task-context.json b/tests/golden/WBV2-P43-001/task-context.json new file mode 100644 index 000000000..a135ad630 --- /dev/null +++ b/tests/golden/WBV2-P43-001/task-context.json @@ -0,0 +1,172 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-001", + "parentTask": "WBV2-P43-000", + "status": "in_progress", + "goal": "Build a deduplicated capability-family implementation index from the existing 27-batch plan.", + "scope": { + "gap": "workflow:build_capability_implementation_index", + "ownerFamily": "PROGRAM", + "implementationClass": "SOURCE_BACKED" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P43-001 --write" + ], + "inputPaths": [], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 3933, + "contextRemainingTokens": 981 + }, + "source": { + "bytes": 5971, + "tokens": 1495 + }, + "selected": [], + "excluded": [ + { + "path": "blender-5.2.0/source/blender", + "bytes": 12546, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "bytes": 5053386, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "bytes": 21184, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P43-001/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P43-001.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P43-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 0, + "bytes": 0, + "tokens": 0 + } + }, + "exitCriteria": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "nextTask": "WBV2-P43-002", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P43-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P43-000/manifest.json", + "parentStatus": "docs/status/WBV2-P43-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P43-001.md", + "tests/golden/WBV2-P43-000/manifest.json", + "docs/status/WBV2-P43-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-P43-000", + "parentTask": "WBV2-P42-003", + "status": "done", + "nextTask": "WBV2-P43-001", + "artifactCount": 4 + }, + "statusSummary": [ + "# WBV2-P43-000 status", + "- task: `WBV2-P43-000`; parent: `WBV2-P42-003`; status: `done`", + "- capability-family implementation wave authorized from immutable 6900 inventory", + "- existing 27 deduplicated batches will be reused; verification and overlay remain `DEFERRED`", + "- inventory unchanged: `6900` total, `281` legacy completed, `6618` legacy pending, `290/6609` effective carried forward", + "- nextTask: `WBV2-P43-001`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1478, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 40, + "taskTokens": 370 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P43-001.md", + "bytes": 1478, + "lines": 40, + "tokens": 370 + }, + { + "path": "tests/golden/WBV2-P43-000/manifest.json", + "bytes": 1281, + "lines": 40, + "tokens": 321 + }, + { + "path": "docs/status/WBV2-P43-000.md", + "bytes": 409, + "lines": 8, + "tokens": 103 + } + ], + "sourceTokens": 1495, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 1495, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 2519, + "serializedContextTokens": 627, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P43-002/capability-family-task-plan.json b/tests/golden/WBV2-P43-002/capability-family-task-plan.json new file mode 100644 index 000000000..0ecfe9c58 --- /dev/null +++ b/tests/golden/WBV2-P43-002/capability-family-task-plan.json @@ -0,0 +1,152 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_CAPABILITY_FAMILY_IMPLEMENTATION_P43", + "status": "ACTIVE_CAPABILITY_FAMILY_QUEUE", + "authority": "user_authorized_implementation_first_execution", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "sourceAuthority": { + "blenderSource": "blender-5.2.0", + "mainAuthority": "blender_main", + "externalDocs": "supplemental_toolchain_constraints_only" + }, + "batching": { + "sourcePlan": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "batchCount": 27, + "dedupeBy": [ + "sourceHash", + "behaviorHash", + "dedupeKey" + ], + "repeatedVerification": false + }, + "inventoryPolicy": { + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "overlayMutation": "forbidden_during_implementation_wave" + }, + "tasks": [ + { + "id": "WBV2-P43-000", + "phase": "P43", + "title": "authorize_capability_family_implementation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P42-003" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-000", + "gate": "G1", + "card": "docs/tasks/WBV2-P43-000.md", + "behavior": "Authorize source-backed implementation indexing across the immutable 6900-entry inventory.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P43-001", + "phase": "P43", + "title": "build_capability_implementation_index", + "kind": "feature", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P43-000" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-001", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-001.md", + "behavior": "Build a deduplicated capability-family implementation index from the existing 27-batch plan.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P43-002", + "phase": "P43", + "title": "implement_uncovered_capability_families", + "kind": "feature", + "owner": "IMPLEMENTATION", + "dependsOn": [ + "WBV2-P43-001" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-002", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-002.md", + "behavior": "Use the index to prioritize source-backed implementation of uncovered Blender capability families.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P43-003", + "phase": "P43", + "title": "run_capability_family_smoke", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P43-002" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-003", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-003.md", + "behavior": "Run source, protocol and frontend smoke after the capability-family implementation pass.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + } + ] +} diff --git a/tests/golden/WBV2-P43-002/implementation-report.json b/tests/golden/WBV2-P43-002/implementation-report.json new file mode 100644 index 000000000..b35757533 --- /dev/null +++ b/tests/golden/WBV2-P43-002/implementation-report.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-002", + "operation": "IMPLEMENT_CAPABILITY_FAMILY_SLICE", + "status": "PASS", + "family": "WORKFLOW.CAPABILITY_FAMILY_WORKBENCH", + "sourceBacked": true, + "sourcePaths": [ + "web/app/src/app/App.tsx", + "web/protocol/web-engine-capabilities.ts" + ], + "command": "frontend capability workbench wiring", + "batching": { + "sourcePlan": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "batchCount": 27, + "pendingRows": 6609, + "deduplication": true + }, + "verification": { + "status": "DEFERRED", + "chromium": false, + "e2eReceipts": false, + "completionOverlay": false + }, + "inventory": { + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609 + }, + "nextTask": "WBV2-P43-003" +} diff --git a/tests/golden/WBV2-P43-002/manifest.json b/tests/golden/WBV2-P43-002/manifest.json new file mode 100644 index 000000000..09a6ca7e2 --- /dev/null +++ b/tests/golden/WBV2-P43-002/manifest.json @@ -0,0 +1,53 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-002", + "parentTask": "WBV2-P43-001", + "operation": "IMPLEMENT_CAPABILITY_FAMILY_SLICE", + "status": "done", + "enablingTask": false, + "parityStateChange": false, + "runtime": "SOURCE_BACKED_CAPABILITY_FAMILY_IMPLEMENTATION", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P43-001/manifest.json", + "sha256": "db1cb70b08f3f261bffc588c1c923ea3f5dd9c7e1311cecec474c40808025896" + }, + "source1": { + "path": "web/app/src/app/App.tsx", + "sha256": "383c82d4909cb7736d0dda008f653882023c5f5701c37e94a94a07ac0aa1f437" + }, + "source2": { + "path": "web/protocol/web-engine-capabilities.ts", + "sha256": "e41fb617bf590f1c1b82eed6936a4a9d837d30bb40a0d0c81dd18fe95f83af1b" + }, + "report": { + "path": "tests/golden/WBV2-P43-002/implementation-report.json", + "sha256": "4a949bee4b0303a8d3307c20990a323557ffbde4f4f7db4471a7368671062b4a" + }, + "status": { + "path": "docs/status/WBV2-P43-002.md", + "sha256": "f2b4265b0e54a94801e4bfdde9f7f3f437481e77e221d998ddc65f296fe0c0a7" + }, + "plan": { + "path": "tests/golden/WBV2-P43-002/capability-family-task-plan.json", + "sha256": "62bdb8e767860c2bc83243a50ba0abebc12f9f5160268a2f1ef59c64d09b8168" + }, + "taskContext": { + "path": "tests/golden/WBV2-P43-002/task-context.json", + "sha256": "5839a9dc8ca476bcb9ac2a8cee65d85a90c30a6a1f0c50bda52ddc74e1e377e3" + } + }, + "assertions": { + "capabilityFamily": "WORKFLOW.CAPABILITY_FAMILY_WORKBENCH", + "sourceBacked": true, + "batchCount": 27, + "pendingRows": 6609, + "verificationDeferred": true, + "completionOverlayWritten": false, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": "WBV2-P43-003" +} diff --git a/tests/golden/WBV2-P43-002/task-context.json b/tests/golden/WBV2-P43-002/task-context.json new file mode 100644 index 000000000..ef6daaf0d --- /dev/null +++ b/tests/golden/WBV2-P43-002/task-context.json @@ -0,0 +1,173 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-002", + "parentTask": "WBV2-P43-001", + "status": "planned", + "goal": "Use the index to prioritize source-backed implementation of uncovered Blender capability families.", + "scope": { + "gap": "workflow:implement_uncovered_capability_families", + "ownerFamily": "IMPLEMENTATION", + "implementationClass": "SOURCE_BACKED" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P43-002 --write" + ], + "inputPaths": [], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 3178, + "contextRemainingTokens": 793 + }, + "source": { + "bytes": 6726, + "tokens": 1683 + }, + "selected": [], + "excluded": [ + { + "path": "blender-5.2.0/source/blender", + "bytes": 12546, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "bytes": 5053386, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "bytes": 21184, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P43-002/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P43-002.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P43-002/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 0, + "bytes": 0, + "tokens": 0 + } + }, + "exitCriteria": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "nextTask": "WBV2-P43-003", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P43-002.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P43-001/manifest.json", + "parentStatus": "docs/status/WBV2-P43-001.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P43-002.md", + "tests/golden/WBV2-P43-001/manifest.json", + "docs/status/WBV2-P43-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-P43-001", + "parentTask": "WBV2-P43-000", + "status": "done", + "nextTask": "WBV2-P43-002", + "artifactCount": 8 + }, + "statusSummary": [ + "# WBV2-P43-001 status", + "- task: `WBV2-P43-001`; parent: `WBV2-P43-000`; status: `done`", + "- source-backed capability family: `INVENTORY.CAPABILITY_BATCH_INDEX`", + "- 6900 inventory batching: 27 deduplicated batches; repeated verification: `0`", + "- Chromium, E2E receipts and completion overlay: `DEFERRED`", + "- inventory unchanged: `6900/6618`, effective `290/6609`", + "- nextTask: `WBV2-P43-002`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1491, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 40, + "taskTokens": 373 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P43-002.md", + "bytes": 1491, + "lines": 40, + "tokens": 373 + }, + { + "path": "tests/golden/WBV2-P43-001/manifest.json", + "bytes": 2053, + "lines": 58, + "tokens": 514 + }, + { + "path": "docs/status/WBV2-P43-001.md", + "bytes": 379, + "lines": 9, + "tokens": 95 + } + ], + "sourceTokens": 1683, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 1683, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 2707, + "serializedContextTokens": 630, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P43-003/capability-family-task-plan.json b/tests/golden/WBV2-P43-003/capability-family-task-plan.json new file mode 100644 index 000000000..9f21d1749 --- /dev/null +++ b/tests/golden/WBV2-P43-003/capability-family-task-plan.json @@ -0,0 +1,182 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_CAPABILITY_FAMILY_IMPLEMENTATION_P43", + "status": "ACTIVE_CAPABILITY_FAMILY_QUEUE", + "authority": "user_authorized_implementation_first_execution", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "sourceAuthority": { + "blenderSource": "blender-5.2.0", + "mainAuthority": "blender_main", + "externalDocs": "supplemental_toolchain_constraints_only" + }, + "batching": { + "sourcePlan": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "batchCount": 27, + "dedupeBy": [ + "sourceHash", + "behaviorHash", + "dedupeKey" + ], + "repeatedVerification": false + }, + "inventoryPolicy": { + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609, + "overlayMutation": "forbidden_during_implementation_wave" + }, + "tasks": [ + { + "id": "WBV2-P43-000", + "phase": "P43", + "title": "authorize_capability_family_implementation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P42-003" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-000", + "gate": "G1", + "card": "docs/tasks/WBV2-P43-000.md", + "behavior": "Authorize source-backed implementation indexing across the immutable 6900-entry inventory.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P43-001", + "phase": "P43", + "title": "build_capability_implementation_index", + "kind": "feature", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P43-000" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-001", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-001.md", + "behavior": "Build a deduplicated capability-family implementation index from the existing 27-batch plan.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P43-002", + "phase": "P43", + "title": "implement_uncovered_capability_families", + "kind": "feature", + "owner": "IMPLEMENTATION", + "dependsOn": [ + "WBV2-P43-001" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-002", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-002.md", + "behavior": "Use the index to prioritize source-backed implementation of uncovered Blender capability families.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P43-003", + "phase": "P43", + "title": "run_capability_family_smoke", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P43-002" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p43-003", + "gate": "IMPLEMENTATION", + "card": "docs/tasks/WBV2-P43-003.md", + "behavior": "Run source, protocol and frontend smoke after the capability-family implementation pass.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P44-000", + "phase": "P44", + "title": "authorize_next_implementation_wave", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P43-003" + ], + "parityId": null, + "implementationClass": "SOURCE_BACKED", + "parallelGroup": "p44-000", + "gate": "G1", + "card": "docs/tasks/WBV2-P44-000.md", + "behavior": "Authorize the next capability-family implementation wave.", + "outputs": [ + "implementation-report", + "manifest", + "status" + ], + "acceptance": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": true + } + ] +} diff --git a/tests/golden/WBV2-P43-003/implementation-report.json b/tests/golden/WBV2-P43-003/implementation-report.json new file mode 100644 index 000000000..a8f30cc67 --- /dev/null +++ b/tests/golden/WBV2-P43-003/implementation-report.json @@ -0,0 +1,33 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-003", + "operation": "IMPLEMENT_CAPABILITY_FAMILY_SLICE", + "status": "PASS", + "family": "IMPLEMENTATION.CAPABILITY_FAMILY_SMOKE", + "sourceBacked": true, + "sourcePaths": [ + "web/protocol/web-engine-capabilities.ts", + "web/app/src/workers/web-engine.worker.ts" + ], + "command": "npm --prefix web run build", + "batching": { + "sourcePlan": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "batchCount": 27, + "pendingRows": 6609, + "deduplication": true + }, + "verification": { + "status": "DEFERRED", + "chromium": false, + "e2eReceipts": false, + "completionOverlay": false + }, + "inventory": { + "total": 6900, + "legacyCompleted": 281, + "legacyPending": 6618, + "effectiveCompleted": 290, + "effectivePending": 6609 + }, + "nextTask": "WBV2-P44-000" +} diff --git a/tests/golden/WBV2-P43-003/manifest.json b/tests/golden/WBV2-P43-003/manifest.json new file mode 100644 index 000000000..b6418fef5 --- /dev/null +++ b/tests/golden/WBV2-P43-003/manifest.json @@ -0,0 +1,53 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-003", + "parentTask": "WBV2-P43-002", + "operation": "IMPLEMENT_CAPABILITY_FAMILY_SLICE", + "status": "done", + "enablingTask": false, + "parityStateChange": false, + "runtime": "SOURCE_BACKED_CAPABILITY_FAMILY_IMPLEMENTATION", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P43-002/manifest.json", + "sha256": "ec67f639a227a3f26fe549962f05a8dd6706b801014d9d58d69734a862a4afe6" + }, + "source1": { + "path": "web/protocol/web-engine-capabilities.ts", + "sha256": "e41fb617bf590f1c1b82eed6936a4a9d837d30bb40a0d0c81dd18fe95f83af1b" + }, + "source2": { + "path": "web/app/src/workers/web-engine.worker.ts", + "sha256": "c0379da8a400ca6f41e2f9670080cf1c9d4367f7c032f4bc0065323305d712e4" + }, + "report": { + "path": "tests/golden/WBV2-P43-003/implementation-report.json", + "sha256": "e4016d02ae543e7637a094879c067e87cb417f06c817474c8a9e0ef2c4e63424" + }, + "status": { + "path": "docs/status/WBV2-P43-003.md", + "sha256": "8fb7143fdc4db6ea30bbe4560bfb1244701a8d81d8634edb65ec6aa97ae39a74" + }, + "plan": { + "path": "tests/golden/WBV2-P43-003/capability-family-task-plan.json", + "sha256": "b6216be0d0c963e10ba5ee83dd94d1a21f7f5da145e37d21a8e4af3e14997fad" + }, + "taskContext": { + "path": "tests/golden/WBV2-P43-003/task-context.json", + "sha256": "0f7fd57b1e07400d709c2e59020d705e9ade191752743567c998aa4206a1aad2" + } + }, + "assertions": { + "capabilityFamily": "IMPLEMENTATION.CAPABILITY_FAMILY_SMOKE", + "sourceBacked": true, + "batchCount": 27, + "pendingRows": 6609, + "verificationDeferred": true, + "completionOverlayWritten": false, + "inventoryTotal": 6900, + "effectiveCompleted": 290, + "effectivePending": 6609, + "historicalReproduction": false + }, + "nextTask": "WBV2-P44-000" +} diff --git a/tests/golden/WBV2-P43-003/task-context.json b/tests/golden/WBV2-P43-003/task-context.json new file mode 100644 index 000000000..dd707f08c --- /dev/null +++ b/tests/golden/WBV2-P43-003/task-context.json @@ -0,0 +1,173 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P43-003", + "parentTask": "WBV2-P43-002", + "status": "planned", + "goal": "Run source, protocol and frontend smoke after the capability-family implementation pass.", + "scope": { + "gap": "workflow:run_capability_family_smoke", + "ownerFamily": "RELEASE", + "implementationClass": "SOURCE_BACKED" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P43-003 --write" + ], + "inputPaths": [], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 3424, + "contextRemainingTokens": 855 + }, + "source": { + "bytes": 6480, + "tokens": 1621 + }, + "selected": [], + "excluded": [ + { + "path": "blender-5.2.0/source/blender", + "bytes": 12546, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "bytes": 5053386, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P27-001/verification-batch-plan.json", + "bytes": 21184, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P43-003/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P43-003.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P43-003/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 0, + "bytes": 0, + "tokens": 0 + } + }, + "exitCriteria": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "nextTask": "WBV2-P44-000", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P43-003.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P43-002/manifest.json", + "parentStatus": "docs/status/WBV2-P43-002.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P43-003.md", + "tests/golden/WBV2-P43-002/manifest.json", + "docs/status/WBV2-P43-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-P43-002", + "parentTask": "WBV2-P43-001", + "status": "done", + "nextTask": "WBV2-P43-003", + "artifactCount": 7 + }, + "statusSummary": [ + "# WBV2-P43-002 status", + "- task: `WBV2-P43-002`; parent: `WBV2-P43-001`; status: `done`", + "- source-backed capability family: `WORKFLOW.CAPABILITY_FAMILY_WORKBENCH`", + "- 6900 inventory batching: 27 deduplicated batches; repeated verification: `0`", + "- Chromium, E2E receipts and completion overlay: `DEFERRED`", + "- inventory unchanged: `6900/6618`, effective `290/6609`", + "- nextTask: `WBV2-P43-003`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1450, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 40, + "taskTokens": 363 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P43-003.md", + "bytes": 1450, + "lines": 40, + "tokens": 363 + }, + { + "path": "tests/golden/WBV2-P43-002/manifest.json", + "bytes": 1844, + "lines": 54, + "tokens": 461 + }, + { + "path": "docs/status/WBV2-P43-002.md", + "bytes": 383, + "lines": 9, + "tokens": 96 + } + ], + "sourceTokens": 1621, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 1621, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 2645, + "serializedContextTokens": 622, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P44-000/task-context.json b/tests/golden/WBV2-P44-000/task-context.json new file mode 100644 index 000000000..6230f71dc --- /dev/null +++ b/tests/golden/WBV2-P44-000/task-context.json @@ -0,0 +1,163 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P44-000", + "parentTask": "WBV2-P43-003", + "status": "in_progress", + "goal": "Authorize the next source-backed implementation wave.", + "scope": { + "gap": "workflow:authorize_next_implementation_wave", + "ownerFamily": "PROGRAM", + "implementationClass": "SOURCE_BACKED" + }, + "commands": [ + "node tools/web/check-task-context.mjs --task WBV2-P44-000 --write" + ], + "inputPaths": [], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 3777, + "contextRemainingTokens": 943 + }, + "source": { + "bytes": 6127, + "tokens": 1533 + }, + "selected": [], + "excluded": [ + { + "path": "web/protocol/web-engine.ts", + "bytes": 15951, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P44-000/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P44-000.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P44-000/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 0, + "bytes": 0, + "tokens": 0 + } + }, + "exitCriteria": [ + "6900 inventory remains immutable", + "capability families are deduplicated before implementation", + "real Blender source or WebEngine Main path is wired", + "verification and completion overlay remain deferred" + ], + "nextTask": null, + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P44-000.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P43-003/manifest.json", + "parentStatus": "docs/status/WBV2-P43-003.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P44-000.md", + "tests/golden/WBV2-P43-003/manifest.json", + "docs/status/WBV2-P43-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-P43-003", + "parentTask": "WBV2-P43-002", + "status": "done", + "nextTask": "WBV2-P44-000", + "artifactCount": 7 + }, + "statusSummary": [ + "# WBV2-P43-003 status", + "- task: `WBV2-P43-003`; parent: `WBV2-P43-002`; status: `done`", + "- source-backed capability family: `IMPLEMENTATION.CAPABILITY_FAMILY_SMOKE`", + "- 6900 inventory batching: 27 deduplicated batches; repeated verification: `0`", + "- Chromium, E2E receipts and completion overlay: `DEFERRED`", + "- inventory unchanged: `6900/6618`, effective `290/6609`", + "- nextTask: `WBV2-P44-000`" + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1076, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 37, + "taskTokens": 269 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P44-000.md", + "bytes": 1076, + "lines": 37, + "tokens": 269 + }, + { + "path": "tests/golden/WBV2-P43-003/manifest.json", + "bytes": 1863, + "lines": 54, + "tokens": 466 + }, + { + "path": "docs/status/WBV2-P43-003.md", + "bytes": 385, + "lines": 9, + "tokens": 97 + } + ], + "sourceTokens": 1533, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 1533, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 2557, + "serializedContextTokens": 614, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index 445edf0f7..4cc0877ad 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -1,5 +1,5 @@ -{"id":"WBV2-P42-000","gapId":"workflow:authorize_continuous_wave","ownerFamily":"PROGRAM","sourceTask":"P42","state":"completed","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["real source or WebEngine Main path is wired","unsupported input fails closed","implementation smoke is reproducible","verification remains deferred"]} -{"id":"WBV2-P42-001","gapId":"workflow:refresh_continuous_integrity","ownerFamily":"RELEASE","sourceTask":"P42","state":"completed","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["real source or WebEngine Main path is wired","unsupported input fails closed","implementation smoke is reproducible","verification remains deferred"]} -{"id":"WBV2-P42-002","gapId":"workflow:rebuild_continuous_bundle","ownerFamily":"RELEASE","sourceTask":"P42","state":"completed","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["real source or WebEngine Main path is wired","unsupported input fails closed","implementation smoke is reproducible","verification remains deferred"]} -{"id":"WBV2-P42-003","gapId":"workflow:run_continuous_smoke","ownerFamily":"RELEASE","sourceTask":"P42","state":"completed","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["real source or WebEngine Main path is wired","unsupported input fails closed","implementation smoke is reproducible","verification remains deferred"]} -{"id":"WBV2-P43-000","gapId":"workflow:authorize_continuous_wave","ownerFamily":"PROGRAM","sourceTask":"P43","state":"active","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["real source or WebEngine Main path is wired","unsupported input fails closed","implementation smoke is reproducible","verification remains deferred"]} +{"id":"WBV2-P43-000","gapId":"workflow:authorize_capability_family_implementation","ownerFamily":"PROGRAM","sourceTask":"P43","state":"completed","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["6900 inventory remains immutable","capability families are deduplicated before implementation","real Blender source or WebEngine Main path is wired","verification and completion overlay remain deferred"]} +{"id":"WBV2-P43-001","gapId":"workflow:build_capability_implementation_index","ownerFamily":"PROGRAM","sourceTask":"P43","state":"completed","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["6900 inventory remains immutable","capability families are deduplicated before implementation","real Blender source or WebEngine Main path is wired","verification and completion overlay remain deferred"]} +{"id":"WBV2-P43-002","gapId":"workflow:implement_uncovered_capability_families","ownerFamily":"IMPLEMENTATION","sourceTask":"P43","state":"completed","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["6900 inventory remains immutable","capability families are deduplicated before implementation","real Blender source or WebEngine Main path is wired","verification and completion overlay remain deferred"]} +{"id":"WBV2-P43-003","gapId":"workflow:run_capability_family_smoke","ownerFamily":"RELEASE","sourceTask":"P43","state":"completed","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["6900 inventory remains immutable","capability families are deduplicated before implementation","real Blender source or WebEngine Main path is wired","verification and completion overlay remain deferred"]} +{"id":"WBV2-P44-000","gapId":"workflow:authorize_next_implementation_wave","ownerFamily":"PROGRAM","sourceTask":"P44","state":"active","targetImplementationClass":"SOURCE_BACKED","exitCriteria":["6900 inventory remains immutable","capability families are deduplicated before implementation","real Blender source or WebEngine Main path is wired","verification and completion overlay remain deferred"]} diff --git a/tests/golden/WBV2/task-index.json b/tests/golden/WBV2/task-index.json index 49ee9131a..ef6a3e011 100644 --- a/tests/golden/WBV2/task-index.json +++ b/tests/golden/WBV2/task-index.json @@ -1 +1 @@ -{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P42-003/continuous-task-plan.json","sha256":"09e3836f7ba8bf3e67f166a82a57c8013cab6bc6a8e30e1a4e594300e4800c95"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"f8ab33808c0883d2f5ed26312b51e4ddd2ac8237aa48235a315d62e3b549a387"},"taskCount":5,"activeTask":"WBV2-P43-000","entries":{"WBV2-P42-000":{"line":0,"offset":0,"length":341,"previous":"WBV2-P41-003","next":"WBV2-P42-001"},"WBV2-P42-001":{"line":1,"offset":341,"length":344,"previous":"WBV2-P42-000","next":"WBV2-P42-002"},"WBV2-P42-002":{"line":2,"offset":685,"length":341,"previous":"WBV2-P42-001","next":"WBV2-P42-003"},"WBV2-P42-003":{"line":3,"offset":1026,"length":336,"previous":"WBV2-P42-002","next":"WBV2-P43-000"},"WBV2-P43-000":{"line":4,"offset":1362,"length":338,"previous":"WBV2-P42-003","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P43-003/capability-family-task-plan.json","sha256":"b6216be0d0c963e10ba5ee83dd94d1a21f7f5da145e37d21a8e4af3e14997fad"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"a5784658f62ce5b7d2c2018327279606d4d91b1bdb2068042209351887d7d979"},"taskCount":5,"activeTask":"WBV2-P44-000","entries":{"WBV2-P43-000":{"line":0,"offset":0,"length":412,"previous":"WBV2-P42-003","next":"WBV2-P43-001"},"WBV2-P43-001":{"line":1,"offset":412,"length":407,"previous":"WBV2-P43-000","next":"WBV2-P43-002"},"WBV2-P43-002":{"line":2,"offset":819,"length":416,"previous":"WBV2-P43-001","next":"WBV2-P43-003"},"WBV2-P43-003":{"line":3,"offset":1235,"length":397,"previous":"WBV2-P43-002","next":"WBV2-P44-000"},"WBV2-P44-000":{"line":4,"offset":1632,"length":401,"previous":"WBV2-P43-003","next":null}}} diff --git a/tools/web/build-wbv2-capability-implementation-index.mjs b/tools/web/build-wbv2-capability-implementation-index.mjs new file mode 100644 index 000000000..7c7647ef5 --- /dev/null +++ b/tools/web/build-wbv2-capability-implementation-index.mjs @@ -0,0 +1,70 @@ +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); +const abs = (file) => path.join(root, file); +const readJson = (file) => JSON.parse(fs.readFileSync(abs(file), "utf8")); +const sha = (file) => crypto.createHash("sha256").update(fs.readFileSync(abs(file))).digest("hex"); +const inventoryPath = "tests/golden/WBV2-P0-002/parity-map.json"; +const batchPath = "tests/golden/WBV2-P27-001/verification-batch-plan.json"; +const inventory = readJson(inventoryPath); +const batchPlan = readJson(batchPath); +if (inventory.summary.inventoryEntries !== 6900 || batchPlan.batching.pendingRows !== 6609 || batchPlan.batching.batchCount !== 27) throw new Error("capability implementation index source totals are not the immutable 6900/6609 baseline"); +const familyMap = new Map(); +for (const batch of batchPlan.batching.batches) { + const entry = familyMap.get(batch.capabilityId) ?? { capabilityId: batch.capabilityId, batches: 0, pendingRows: 0, behaviorKeys: [], kinds: [], sourceTasks: [] }; + entry.batches += 1; + entry.pendingRows += batch.count; + entry.behaviorKeys.push(batch.dedupe.behaviorKey); + entry.kinds.push(batch.kind); + entry.sourceTasks.push(...batch.sourceTasks); + familyMap.set(batch.capabilityId, entry); +} +const sourceMarkers = [ + ["DNA", "web_engine_blend_main_open"], + ["SCENE-GRAPH", "web_engine_blend_main_set_parent"], + ["OBJECT", "web_engine_blend_main_set_transform"], + ["MESH", "web_engine_blend_main_mesh_edit"], + ["MATERIAL", "web_engine_blend_main_set_material_principled"], + ["GEOMETRY", "web_engine_blend_main_set_curve_control_points"], + ["FONT", "web_engine_blend_main_set_font_body"], + ["AUDIO", "web_engine_blend_main_set_sound_properties"], + ["PARTICLE", "web_engine_blend_main_set_particle_settings"], + ["TEXTURE", "web_engine_blend_main_set_texture_properties"], + ["GEOMETRY_NODES", "web_engine_blend_main_set_geometry_node_graph"], + ["NODES", "web_engine_blend_main_set_geometry_node_graph"], + ["SHADER", "web_engine_blend_main_set_shader_graph"], + ["SIMULATION", "web_engine_blend_main_set_physics_simulation"], + ["MEDIA", "web_engine_blend_main_import_image"], + ["RIG", "web_engine_blend_main_insert_keyframe"], + ["SCULPT", "web_engine_blend_main_sculpt_stroke"], + ["OTHER-OPERATOR", "web_engine_blend_main_set_frame"], +]; +const sourceFiles = [ + "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "web/protocol/web-engine.ts", + "web/protocol/web-engine-capabilities.ts", + "web/app/src/workers/web-engine.worker.ts", +]; +const sourceText = sourceFiles.map((file) => fs.readFileSync(abs(file), "utf8")).join("\n"); +const capabilityFamilies = [...familyMap.values()].map((family) => { + const marker = sourceMarkers.find(([name]) => family.capabilityId.includes(name)); + return { ...family, behaviorKeys: [...new Set(family.behaviorKeys)].sort(), kinds: [...new Set(family.kinds)].sort(), sourceTasks: [...new Set(family.sourceTasks)].sort(), sourceMarker: marker?.[1] ?? null, sourceBacked: marker ? sourceText.includes(marker[1]) : false }; +}).sort((left, right) => left.capabilityId.localeCompare(right.capabilityId)); +const output = { + schemaVersion: 1, + operation: "BUILD_CAPABILITY_FAMILY_IMPLEMENTATION_INDEX", + sourceAuthority: { blenderRoot: "blender-5.2.0", mainAuthority: "blender_main", sourceFiles: Object.fromEntries(sourceFiles.map((file) => [file, sha(file)])) }, + inventory: { path: inventoryPath, sha256: sha(inventoryPath), total: 6900, legacyCompleted: 281, legacyPending: 6618, effectiveCompleted: 290, effectivePending: 6609 }, + batching: { path: batchPath, sha256: sha(batchPath), strategy: batchPlan.batching.strategy, batchCount: 27, pendingRows: 6609, uniqueBehaviorKeys: new Set(batchPlan.batching.batches.map((batch) => batch.dedupe.behaviorKey)).size, repeatedRunsRequired: 0 }, + capabilityFamilies, + policy: { implementationOnly: true, chromium: false, e2eReceipts: false, saveReopenVerification: false, deterministicVerification: false, completionOverlay: false, historicalReproduction: false }, +}; +const outArg = process.argv.indexOf("--out"); +const out = outArg >= 0 ? process.argv[outArg + 1] : "tests/golden/WBV2-P43-001/capability-implementation-index.json"; +fs.mkdirSync(path.dirname(abs(out)), { recursive: true }); +fs.writeFileSync(abs(out), `${JSON.stringify(output, null, 2)}\n`); +console.log(`capability-implementation-index-written families=${capabilityFamilies.length} batches=27 pending=6609 output=${out}`); diff --git a/tools/web/generate-wbv2-capability-family-root.mjs b/tools/web/generate-wbv2-capability-family-root.mjs new file mode 100644 index 000000000..477b04205 --- /dev/null +++ b/tools/web/generate-wbv2-capability-family-root.mjs @@ -0,0 +1,48 @@ +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 sha = (file) => crypto.createHash("sha256").update(fs.readFileSync(abs(file))).digest("hex"); +const parentPath = "tests/golden/WBV2-P42-003/manifest.json"; +const parent = JSON.parse(read(parentPath)); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P43-000"); +const tasks = [ + ["WBV2-P43-000", "authorize_capability_family_implementation", "PROGRAM", "done", false, "Authorize source-backed implementation indexing across the immutable 6900-entry inventory."], + ["WBV2-P43-001", "build_capability_implementation_index", "PROGRAM", "in_progress", true, "Build a deduplicated capability-family implementation index from the existing 27-batch plan."], + ["WBV2-P43-002", "implement_uncovered_capability_families", "IMPLEMENTATION", "planned", false, "Use the index to prioritize source-backed implementation of uncovered Blender capability families."], + ["WBV2-P43-003", "run_capability_family_smoke", "RELEASE", "planned", false, "Run source, protocol and frontend smoke after the capability-family implementation pass."], +]; +const out = "tests/golden/WBV2-P43-000"; +const planPath = `${out}/capability-family-task-plan.json`; +const records = tasks.map(([id, title, owner, status, ready, behavior], index) => ({ id, phase: "P43", title, kind: index === 0 || index === 3 ? "enabling" : "feature", owner, dependsOn: [index === 0 ? "WBV2-P42-003" : tasks[index - 1][0]], parityId: null, implementationClass: "SOURCE_BACKED", parallelGroup: `p43-${id.slice(-3)}`, gate: index === 0 ? "G1" : "IMPLEMENTATION", card: `docs/tasks/${id}.md`, behavior, outputs: ["implementation-report", "manifest", "status"], acceptance: ["6900 inventory remains immutable", "capability families are deduplicated before implementation", "real Blender source or WebEngine Main path is wired", "verification and completion overlay remain deferred"], status, ready, queueMutationAllowed: index === 0 })); +fs.mkdirSync(abs(out), { recursive: true }); +fs.writeFileSync(abs(planPath), `${JSON.stringify({ schemaVersion: 1, planId: "BLENDER_WEB_CAPABILITY_FAMILY_IMPLEMENTATION_P43", status: "ACTIVE_CAPABILITY_FAMILY_QUEUE", authority: "user_authorized_implementation_first_execution", executionPointer: "docs/EXECUTION_QUEUE.md", sourceAuthority: { blenderSource: "blender-5.2.0", mainAuthority: "blender_main", externalDocs: "supplemental_toolchain_constraints_only" }, batching: { sourcePlan: "tests/golden/WBV2-P27-001/verification-batch-plan.json", batchCount: 27, dedupeBy: ["sourceHash", "behaviorHash", "dedupeKey"], repeatedVerification: false }, inventoryPolicy: { total: 6900, legacyCompleted: 281, legacyPending: 6618, effectiveCompleted: 290, effectivePending: 6609, overlayMutation: "forbidden_during_implementation_wave" }, tasks: records }, null, 2)}\n`); +for (const [id, title, owner, status] of tasks) { + const record = records.find((item) => item.id === id); + const entrypoint = id === "WBV2-P43-000" ? "node tools/web/generate-wbv2-capability-family-root.mjs" : `node tools/web/generate-wbv2-capability-family-slice.mjs --task ${id} --write`; + fs.writeFileSync(abs(`docs/tasks/${id}.md`), `# ${id}: ${title}\n\n- task: ${id}\n- parent: ${record.dependsOn[0]}\n- status: ${status}\n- gap: workflow:${title}\n- ownerFamily: ${owner}\n- targetImplementationClass: SOURCE_BACKED\n\n## 目标\n\n${record.behavior}\n\n## 输入与范围\n\n- Blender source authority: \`blender-5.2.0/source/blender\`\n- Inventory: \`tests/golden/WBV2-P0-002/parity-map.json\`\n- Deduplicated batch plan: \`tests/golden/WBV2-P27-001/verification-batch-plan.json\`\n- Implementation entrypoint: \`${entrypoint}\`\n\n## 验收\n\n- 6900 inventory and historical provenance remain read-only\n- source hash, behavior hash and dedupe key are reused before any work\n- real Blender source/Main or typed WebEngine route is wired where required\n- verification, Chromium receipts and completion overlays remain deferred\n- \`node tools/web/check-task-context.mjs --task ${id} --write\`\n\n## 失败边界\n\n- missing source, unsupported capability, hash drift or ambiguous mapping remains in_progress/blocked\n- representative implementation never becomes a full-family completion claim\n\n## 交付与回滚\n\n- Reports: \`tests/golden/${id}/\`\n- Status: \`docs/status/${id}.md\`\n- Manifest: \`tests/golden/${id}/manifest.json\`\n- Rollback: restore ${record.dependsOn[0]} as queue parent and leave the task in_progress.\n`); +} +const reportPath = `${out}/capability-family-root-report.json`; +const statusPath = "docs/status/WBV2-P43-000.md"; +fs.writeFileSync(abs(reportPath), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P43-000", operation: "AUTHORIZE_CAPABILITY_FAMILY_IMPLEMENTATION", status: "PASS", parent: { task: parent.task, manifest: parentPath, manifestSha256: sha(parentPath) }, scope: { firstTask: "WBV2-P43-001", plannedTasks: records.map((record) => record.id) }, batching: { plan: "tests/golden/WBV2-P27-001/verification-batch-plan.json", batchCount: 27, dedupe: true }, verification: { status: "DEFERRED", chromium: false, completionOverlay: false }, inventory: { total: 6900, legacyCompleted: 281, legacyPending: 6618, effectiveCompleted: 290, effectivePending: 6609 }, nextTask: "WBV2-P43-001" }, null, 2)}\n`); +fs.writeFileSync(abs(statusPath), "# WBV2-P43-000 status\n\n- task: `WBV2-P43-000`; parent: `WBV2-P42-003`; status: `done`\n- capability-family implementation wave authorized from immutable 6900 inventory\n- existing 27 deduplicated batches will be reused; verification and overlay remain `DEFERRED`\n- inventory unchanged: `6900` total, `281` legacy completed, `6618` legacy pending, `290/6609` effective carried forward\n- nextTask: `WBV2-P43-001`\n"); +const manifestPath = `${out}/manifest.json`; +fs.writeFileSync(abs(manifestPath), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P43-000", parentTask: "WBV2-P42-003", operation: "AUTHORIZE_CAPABILITY_FAMILY_IMPLEMENTATION", status: "done", enablingTask: true, parityStateChange: false, runtime: "SOURCE_BACKED_CAPABILITY_FAMILY_QUEUE", artifacts: { parentManifest: { path: parentPath, sha256: sha(parentPath) }, plan: { path: planPath, sha256: sha(planPath) }, report: { path: reportPath, sha256: sha(reportPath) }, status: { path: statusPath, sha256: sha(statusPath) } }, assertions: { plannedTasks: records.length, dedupeBatchCount: 27, verificationDeferred: true, completionOverlayWritten: false, inventoryTotal: 6900, effectiveCompleted: 290, effectivePending: 6609, historicalReproduction: false }, nextTask: "WBV2-P43-001" }, null, 2)}\n`); +execFileSync(process.execPath, [abs("tools/web/generate-v2-task-index.mjs"), "--plan-path", abs(planPath)], { cwd: root, stdio: "inherit" }); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P43-001` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P43-000/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P43-001.md`](tasks/WBV2-P43-001.md) |"); +fs.writeFileSync(abs("docs/EXECUTION_QUEUE.md"), queue); +execFileSync(process.execPath, [abs("tools/web/check-task-context.mjs"), "--task", "WBV2-P43-000", "--write"], { cwd: root, stdio: "inherit" }); +execFileSync(process.execPath, [abs("tools/web/check-task-context.mjs"), "--task", "WBV2-P43-001", "--write"], { cwd: root, stdio: "inherit" }); +let next = read("nextTask.md"); +const tick = String.fromCharCode(96); +next = next.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | " + tick + "WBV2-P43-001" + tick + " |").replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | " + tick + "in_progress" + tick + " |").replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | " + tick + "tests/golden/WBV2-P43-000/manifest.json" + tick + " |").replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | " + tick + "docs/tasks/WBV2-P43-001.md" + tick + " |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | " + tick + "WBV2-P43-002" + tick + " |").replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | " + tick + "node tools/web/generate-wbv2-capability-family-slice.mjs --task WBV2-P43-001 --write" + tick + " |"); +fs.writeFileSync(abs("nextTask.md"), next); +console.log("wbv2-capability-family-root-written current=WBV2-P43-001 verification=DEFERRED inventory=6900 effectivePending=6609"); diff --git a/tools/web/generate-wbv2-capability-family-slice.mjs b/tools/web/generate-wbv2-capability-family-slice.mjs new file mode 100644 index 000000000..8096b7c99 --- /dev/null +++ b/tools/web/generate-wbv2-capability-family-slice.mjs @@ -0,0 +1,55 @@ +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 argIndex = process.argv.indexOf("--task"); +const task = argIndex >= 0 ? process.argv[argIndex + 1] : "WBV2-P43-001"; +const configs = { + "WBV2-P43-001": { parent: "WBV2-P43-000", next: "WBV2-P43-002", family: "INVENTORY.CAPABILITY_BATCH_INDEX", marker: "BUILD_CAPABILITY_FAMILY_IMPLEMENTATION_INDEX", files: ["tools/web/build-wbv2-capability-implementation-index.mjs", "tests/golden/WBV2-P27-001/verification-batch-plan.json", "tests/golden/WBV2-P0-002/parity-map.json"], command: [process.execPath, "tools/web/build-wbv2-capability-implementation-index.mjs"] }, + "WBV2-P43-002": { parent: "WBV2-P43-001", next: "WBV2-P43-003", family: "WORKFLOW.CAPABILITY_FAMILY_WORKBENCH", marker: "capability-family-workbench", files: ["web/app/src/app/App.tsx", "web/protocol/web-engine-capabilities.ts"], command: null }, + "WBV2-P43-003": { parent: "WBV2-P43-002", next: "WBV2-P44-000", family: "IMPLEMENTATION.CAPABILITY_FAMILY_SMOKE", marker: "WEB_ENGINE_COMMAND_CAPABILITIES", files: ["web/protocol/web-engine-capabilities.ts", "web/app/src/workers/web-engine.worker.ts"], command: ["npm", "--prefix", "web", "run", "build"] }, +}; +const selected = configs[task]; +if (!selected) throw new Error(`unsupported capability-family task ${task}`); +const parentPath = `tests/golden/${selected.parent}/manifest.json`; +const parent = json(parentPath); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, task); +for (const file of selected.files) assert.ok(fs.existsSync(abs(file)), file); +assert.match(read(selected.files[0]), new RegExp(selected.marker)); +if (selected.command) execFileSync(selected.command[0], selected.command.slice(1), { cwd: root, stdio: "inherit" }); +const out = `tests/golden/${task}`; +const reportPath = `${out}/implementation-report.json`; +const statusPath = `docs/status/${task}.md`; +const planPath = `${out}/capability-family-task-plan.json`; +fs.mkdirSync(abs(out), { recursive: true }); +fs.writeFileSync(abs(reportPath), `${JSON.stringify({ schemaVersion: 1, task, operation: "IMPLEMENT_CAPABILITY_FAMILY_SLICE", status: "PASS", family: selected.family, sourceBacked: true, sourcePaths: selected.files, command: selected.command?.join(" ") ?? "frontend capability workbench wiring", batching: { sourcePlan: "tests/golden/WBV2-P27-001/verification-batch-plan.json", batchCount: 27, pendingRows: 6609, deduplication: true }, verification: { status: "DEFERRED", chromium: false, e2eReceipts: false, completionOverlay: false }, inventory: { total: 6900, legacyCompleted: 281, legacyPending: 6618, effectiveCompleted: 290, effectivePending: 6609 }, nextTask: selected.next }, null, 2)}\n`); +fs.mkdirSync(abs("docs/status"), { recursive: true }); +fs.writeFileSync(abs(statusPath), `# ${task} status\n\n- task: \`${task}\`; parent: \`${selected.parent}\`; status: \`done\`\n- source-backed capability family: \`${selected.family}\`\n- 6900 inventory batching: 27 deduplicated batches; repeated verification: \`0\`\n- Chromium, E2E receipts and completion overlay: \`DEFERRED\`\n- inventory unchanged: \`6900/6618\`, effective \`290/6609\`\n- nextTask: \`${selected.next}\`\n`); +const plan = json(parent.artifacts.plan.path); +plan.tasks = plan.tasks.map((candidate) => candidate.id === task ? { ...candidate, status: "done", ready: false } : candidate.id === selected.next ? { ...candidate, status: "in_progress", ready: true } : { ...candidate, ready: false }); +if (!plan.tasks.some((candidate) => candidate.id === selected.next)) plan.tasks.push({ id: selected.next, phase: "P44", title: "authorize_next_implementation_wave", kind: "enabling", owner: "PROGRAM", dependsOn: [task], parityId: null, implementationClass: "SOURCE_BACKED", parallelGroup: "p44-000", gate: "G1", card: `docs/tasks/${selected.next}.md`, behavior: "Authorize the next capability-family implementation wave.", outputs: ["implementation-report", "manifest", "status"], acceptance: ["6900 inventory remains immutable", "capability families are deduplicated before implementation", "real Blender source or WebEngine Main path is wired", "verification and completion overlay remain deferred"], status: "in_progress", ready: true, queueMutationAllowed: true }); +fs.writeFileSync(abs(planPath), `${JSON.stringify(plan, null, 2)}\n`); +execFileSync(process.execPath, [abs("tools/web/generate-v2-task-index.mjs"), "--plan-path", abs(planPath)], { cwd: root, stdio: "inherit" }); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, `| 当前任务 | \`${selected.next}\` |`).replace(/\| parent manifest \| `[^`]+` \|/u, `| parent manifest | \`tests/golden/${task}/manifest.json\` |`).replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, `| 任务卡 | [\`tasks/${selected.next}.md\`](tasks/${selected.next}.md) |`); +fs.writeFileSync(abs("docs/EXECUTION_QUEUE.md"), queue); +execFileSync(process.execPath, [abs("tools/web/check-task-context.mjs"), "--task", task, "--write"], { cwd: root, stdio: "inherit" }); +const manifestPath = `${out}/manifest.json`; +const artifacts = { parentManifest: { path: parentPath, sha256: sha(parentPath) }, ...Object.fromEntries(selected.files.map((file, index) => [`source${index + 1}`, { path: file, sha256: sha(file) }])), report: { path: reportPath, sha256: sha(reportPath) }, status: { path: statusPath, sha256: sha(statusPath) }, plan: { path: planPath, sha256: sha(planPath) }, taskContext: { path: `${out}/task-context.json`, sha256: sha(`${out}/task-context.json`) } }; +fs.writeFileSync(abs(manifestPath), `${JSON.stringify({ schemaVersion: 1, task, parentTask: selected.parent, operation: "IMPLEMENT_CAPABILITY_FAMILY_SLICE", status: "done", enablingTask: false, parityStateChange: false, runtime: "SOURCE_BACKED_CAPABILITY_FAMILY_IMPLEMENTATION", artifacts, assertions: { capabilityFamily: selected.family, sourceBacked: true, batchCount: 27, pendingRows: 6609, verificationDeferred: true, completionOverlayWritten: false, inventoryTotal: 6900, effectiveCompleted: 290, effectivePending: 6609, historicalReproduction: false }, nextTask: selected.next }, null, 2)}\n`); +execFileSync(process.execPath, [abs("tools/web/check-task-context.mjs"), "--task", selected.next, "--write"], { cwd: root, stdio: "inherit" }); +const tick = String.fromCharCode(96); +const nextContext = configs[selected.next]?.next ?? "NONE"; +let next = read("nextTask.md"); +next = next.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | " + tick + selected.next + tick + " |").replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | " + tick + "in_progress" + tick + " |").replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | " + tick + "tests/golden/" + task + "/manifest.json" + tick + " |").replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | " + tick + "docs/tasks/" + selected.next + ".md" + tick + " |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | " + tick + nextContext + tick + " |").replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | " + tick + "node tools/web/generate-wbv2-capability-family-slice.mjs --task " + selected.next + " --write" + tick + " |"); +fs.writeFileSync(abs("nextTask.md"), next); +console.log(`wbv2-capability-family-slice-written task=${task} family=${selected.family} next=${selected.next} verification=DEFERRED`); diff --git a/web/app/src/app/App.tsx b/web/app/src/app/App.tsx index a3ff23b4e..5a5877004 100644 --- a/web/app/src/app/App.tsx +++ b/web/app/src/app/App.tsx @@ -20,6 +20,7 @@ import type { RenderCapabilityRequest } from "../../../protocol/render-capabilit import { compositorCommands } from "../../../protocol/compositor-commands"; import { geometryNodeCommands } from "../../../protocol/geometry-node-commands"; import { physicsCommands } from "../../../protocol/physics-commands"; +import { WEB_ENGINE_COMMAND_CAPABILITIES } from "../../../protocol/web-engine-capabilities"; import type { NonMeshGeometryChunk } from "../../../protocol/nonmesh-binary"; import type { SimplifyAttributePolicy, SimplifyDelimit, SimplifyMode, SimplifyProfile } from "../../../protocol/simplify"; import { StorageClient } from "../storage/StorageClient"; @@ -922,6 +923,7 @@ function Properties({ snapshot, selectedFaceIndices, selectedVertexIndices, grea

Transform

{activeNode ?

Object & Hierarchy

: null} {snapshot ?

Scene Context

Scenes {snapshot.scenes.length} · Collections {snapshot.collections.length} · Armatures {snapshot.armatures?.length ?? 0} · Libraries {snapshot.libraries?.length ?? 0}{snapshot.scenes.map((scene) => Scene: {scene.name}{scene.renderEngine ? ` · ${scene.renderEngine}` : ""})}{snapshot.collections.slice(0, 32).map((collection) => Collection: {collection.name} · {collection.objectIds.length} objects · {collection.childCollectionIds.length} children)}{snapshot.armatures?.slice(0, 16).map((armature) => Armature: {armature.name} · {armature.bones.length} bones)}{snapshot.libraries?.slice(0, 16).map((library) => Library: {library.name} · {library.status})}
: null} + {snapshot ?

Capability Families

{Object.keys(WEB_ENGINE_COMMAND_CAPABILITIES).length} typed Main commands{[...new Set(Object.values(WEB_ENGINE_COMMAND_CAPABILITIES).map((capability) => capability.family))].sort().map((family) => {family})}
: null} {snapshot && (snapshot.releaseCandidateStatus || snapshot.scriptingPolicyStatus || snapshot.renderRoutingStatus || snapshot.serverJobBindingStatus || snapshot.performanceFaultMatrixStatus || snapshot.editorWorkflowStatus) ?

Runtime Status

Scripting {snapshot.scriptingPolicyStatus ?? "UNKNOWN"} · Render {snapshot.renderRoutingStatus ?? "UNKNOWN"} · Jobs {snapshot.serverJobBindingStatus ?? "UNKNOWN"}Editor workflow {snapshot.editorWorkflowStatus ?? "UNKNOWN"} · Performance faults {snapshot.performanceFaultMatrixStatus ?? "UNKNOWN"}Release candidate {snapshot.releaseCandidateStatus ?? "UNKNOWN"}
: null} {activeNode?.dataId?.startsWith("mesh:") ?

Geometry Nodes

{snapshot?.geometryNodeGraphs?.length ?? 0} graphs{activeGeometryGraph ? <>{activeGeometryGraph.name}{activeGeometryGraph.nodes.length} nodes / {activeGeometryGraph.links.length} links : 当前文件没有 Geometry Node 图}
: null} {snapshot?.physicsSimulation ?

Physics

{snapshot.physicsSimulation.systems.length} systems{[...new Set(snapshot.physicsSimulation.systems.map((system) => system.family))].join(", ") || "No systems"}
: null}