feat(web): activate implementation-first product queue
This commit is contained in:
@@ -15,9 +15,9 @@
|
||||
| 字段 | 值 |
|
||||
| --- | --- |
|
||||
| 里程碑 | WBV2 capability workflow |
|
||||
| 当前任务 | `WBV2-P1419-001` |
|
||||
| parent manifest | `tests/golden/WBV2-P1419-000/manifest.json` |
|
||||
| 任务卡 | [`tasks/WBV2-P1419-001.md`](tasks/WBV2-P1419-001.md) |
|
||||
| 当前任务 | `WBV2-P1420-001` |
|
||||
| parent manifest | `tests/golden/WBV2-P1420-000/manifest.json` |
|
||||
| 任务卡 | [`tasks/WBV2-P1420-001.md`](tasks/WBV2-P1420-001.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` |
|
||||
|
||||
@@ -6,4 +6,4 @@
|
||||
- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt
|
||||
- dynamic source inventory: `3745` units; verified `1153`; unverified `2592`; planning estimate `5200` (non-binding); this-segment binding delta: `1`
|
||||
- historical 6900-entry inventory remains read-only; full-family parity: `false`
|
||||
- nextTask: `NONE`
|
||||
- nextTask: `WBV2-P1420-000`
|
||||
|
||||
5
docs/status/WBV2-P1420-000.md
Normal file
5
docs/status/WBV2-P1420-000.md
Normal file
@@ -0,0 +1,5 @@
|
||||
# WBV2-P1420-000 status
|
||||
|
||||
- task: `WBV2-P1420-000`; status: `done`
|
||||
- strategy: `implementation_first_user_feedback`
|
||||
- nextTask: `WBV2-P1420-001`
|
||||
20
docs/tasks/WBV2-P1420-000.md
Normal file
20
docs/tasks/WBV2-P1420-000.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# WBV2-P1420-000: authorize implementation-first Web migration
|
||||
|
||||
- task: WBV2-P1420-000
|
||||
- parent: WBV2-P1419-001
|
||||
- status: done
|
||||
- targetImplementationClass: QUEUE_ONLY
|
||||
- Implementation entrypoint: `python3 my-tools/activate_web_product_migration.py`
|
||||
|
||||
## Goal
|
||||
|
||||
Replace source-symbol verification batches with the user-workflow implementation backlog.
|
||||
|
||||
## Inputs
|
||||
|
||||
- `docs/WEB_PRODUCT_MIGRATION_STRATEGY.md`
|
||||
- `tests/golden/WBV2/web-product-backlog.json`
|
||||
|
||||
## Handoff
|
||||
|
||||
- nextTask: `WBV2-P1420-001`
|
||||
43
docs/tasks/WBV2-P1420-001.md
Normal file
43
docs/tasks/WBV2-P1420-001.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# WBV2-P1420-001: complete Web product workflow implementation
|
||||
|
||||
- task: WBV2-P1420-001
|
||||
- parent: WBV2-P1420-000
|
||||
- status: in_progress
|
||||
- gap: product-workflow:user-reachable-main-commands
|
||||
- ownerFamily: WEB_PRODUCT
|
||||
- targetImplementationClass: PRODUCT_WORKFLOW
|
||||
- commandBudget: one implementation subtask per Codex turn
|
||||
- Implementation entrypoint: `python3 my-tools/run_web_product_migration.py`
|
||||
|
||||
## 目标
|
||||
|
||||
Complete the implementation tasks in `tests/golden/WBV2/web-product-backlog.json`.
|
||||
The `3745` source-unit inventory is traceability-only and is not the completion denominator.
|
||||
|
||||
## 输入与范围
|
||||
|
||||
- `web/app/src/app/App.tsx`
|
||||
- direct typed protocol helpers named by the active backlog task
|
||||
- `docs/WEB_PRODUCT_MIGRATION_STRATEGY.md`
|
||||
|
||||
## 验收
|
||||
|
||||
- implement exactly one backlog task per Codex turn
|
||||
- preserve existing dirty changes
|
||||
- do not run tests, builds, typecheck, browsers, validators, or coverage binding
|
||||
- do not claim similarly named desktop operators
|
||||
- outer scheduler owns subtask rotation
|
||||
- `node tools/web/print-task-context.mjs`
|
||||
|
||||
## 失败边界
|
||||
|
||||
- a failed Codex turn remains pending and is retried without advancing the backlog
|
||||
- unrelated dirty files are never reverted or included in an automatic commit
|
||||
- no implementation task changes the source traceability ledger
|
||||
|
||||
## 交付与回滚
|
||||
|
||||
All 16 workflow modules are implementation-complete. Runtime defects are opened from user operation.
|
||||
- Backlog: `tests/golden/WBV2/web-product-backlog.json`
|
||||
- Report: `tests/golden/WBV2-P1420-001/product-implementation-report.json`
|
||||
- Rollback: stop `my-tools/run_web_product_migration.py` and retain the last completed subtask.
|
||||
215
my-tools/activate_web_product_migration.py
Normal file
215
my-tools/activate_web_product_migration.py
Normal file
@@ -0,0 +1,215 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Create the authoritative queue bridge for implementation-first Web work."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
from wbv2_runtime import CONTROL_ROOT, INDEX, QUEUE, ROOT
|
||||
|
||||
|
||||
CURRENT = "WBV2-P1419-001"
|
||||
ROOT_TASK = "WBV2-P1420-000"
|
||||
TASK = "WBV2-P1420-001"
|
||||
|
||||
|
||||
def read_json(path: Path) -> dict:
|
||||
return json.loads(path.read_text(encoding="utf-8"))
|
||||
|
||||
|
||||
def write_json(path: Path, value: object) -> None:
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
path.write_text(json.dumps(value, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
||||
|
||||
|
||||
def write_text(path: Path, value: str) -> None:
|
||||
path.parent.mkdir(parents=True, exist_ok=True)
|
||||
path.write_text(value, encoding="utf-8")
|
||||
|
||||
|
||||
def sha(path: Path) -> str:
|
||||
return hashlib.sha256(path.read_bytes()).hexdigest()
|
||||
|
||||
|
||||
def rel(path: Path) -> str:
|
||||
return path.relative_to(ROOT).as_posix()
|
||||
|
||||
|
||||
def main() -> int:
|
||||
index = read_json(INDEX)
|
||||
source_plan_path = ROOT / index["source"]["path"]
|
||||
plan = read_json(source_plan_path)
|
||||
if any(record.get("id") == TASK for record in plan.get("tasks", [])):
|
||||
print(f"web-product-queue-already-active task={TASK}")
|
||||
return 0
|
||||
|
||||
current_manifest_path = ROOT / "tests/golden" / CURRENT / "manifest.json"
|
||||
current_status_path = ROOT / "docs/status" / f"{CURRENT}.md"
|
||||
current_manifest = read_json(current_manifest_path)
|
||||
current_manifest["nextTask"] = ROOT_TASK
|
||||
if current_status_path.is_file():
|
||||
status = re.sub(r"- nextTask: `[^`]+`", f"- nextTask: `{ROOT_TASK}`", current_status_path.read_text(encoding="utf-8"))
|
||||
write_text(current_status_path, status)
|
||||
if isinstance(current_manifest.get("artifacts", {}).get("status"), dict):
|
||||
current_manifest["artifacts"]["status"]["sha256"] = sha(current_status_path)
|
||||
write_json(current_manifest_path, current_manifest)
|
||||
|
||||
root_dir = ROOT / "tests/golden" / ROOT_TASK
|
||||
task_dir = ROOT / "tests/golden" / TASK
|
||||
plan_path = root_dir / "product-implementation-plan.json"
|
||||
root_status = ROOT / "docs/status" / f"{ROOT_TASK}.md"
|
||||
root_card = ROOT / "docs/tasks" / f"{ROOT_TASK}.md"
|
||||
task_card = ROOT / "docs/tasks" / f"{TASK}.md"
|
||||
root_report = root_dir / "product-migration-authorization.json"
|
||||
root_manifest = root_dir / "manifest.json"
|
||||
|
||||
root_record = {
|
||||
"id": ROOT_TASK,
|
||||
"phase": "1420",
|
||||
"title": "authorize implementation-first Web product migration",
|
||||
"kind": "enabling",
|
||||
"owner": "PROGRAM",
|
||||
"dependsOn": [CURRENT],
|
||||
"implementationClass": "QUEUE_ONLY",
|
||||
"card": rel(root_card),
|
||||
"commands": [],
|
||||
"status": "done",
|
||||
"ready": False,
|
||||
"queueMutationAllowed": True,
|
||||
}
|
||||
task_record = {
|
||||
"id": TASK,
|
||||
"phase": "1420",
|
||||
"title": "complete user-facing Web workflow implementation",
|
||||
"kind": "product-module",
|
||||
"owner": "WEB_PRODUCT",
|
||||
"dependsOn": [ROOT_TASK],
|
||||
"implementationClass": "PRODUCT_WORKFLOW",
|
||||
"card": rel(task_card),
|
||||
"commands": ["python3 my-tools/run_web_product_migration.py"],
|
||||
"status": "in_progress",
|
||||
"ready": True,
|
||||
"queueMutationAllowed": True,
|
||||
"productBacklog": "tests/golden/WBV2/web-product-backlog.json",
|
||||
}
|
||||
product_plan = {
|
||||
**plan,
|
||||
"planId": "BLENDER_WEB_PRODUCT_IMPLEMENTATION_P1420",
|
||||
"status": "ACTIVE_PRODUCT_IMPLEMENTATION",
|
||||
"verificationPolicy": {
|
||||
"mode": "DEFERRED_TO_USER_OPERATION",
|
||||
"browser": "not_run",
|
||||
"required": [],
|
||||
},
|
||||
"tasks": [*plan.get("tasks", []), root_record, task_record],
|
||||
}
|
||||
write_json(plan_path, product_plan)
|
||||
write_text(root_card, f"""# {ROOT_TASK}: authorize implementation-first Web migration
|
||||
|
||||
- task: {ROOT_TASK}
|
||||
- parent: {CURRENT}
|
||||
- status: done
|
||||
- targetImplementationClass: QUEUE_ONLY
|
||||
- Implementation entrypoint: `python3 my-tools/activate_web_product_migration.py`
|
||||
|
||||
## 目标
|
||||
|
||||
Replace source-symbol verification batches with the user-workflow implementation backlog.
|
||||
|
||||
## Inputs
|
||||
|
||||
- `docs/WEB_PRODUCT_MIGRATION_STRATEGY.md`
|
||||
- `tests/golden/WBV2/web-product-backlog.json`
|
||||
|
||||
## Handoff
|
||||
|
||||
- nextTask: `{TASK}`
|
||||
""")
|
||||
write_text(task_card, f"""# {TASK}: complete Web product workflow implementation
|
||||
|
||||
- task: {TASK}
|
||||
- parent: {ROOT_TASK}
|
||||
- status: in_progress
|
||||
- gap: product-workflow:user-reachable-main-commands
|
||||
- ownerFamily: WEB_PRODUCT
|
||||
- targetImplementationClass: PRODUCT_WORKFLOW
|
||||
- commandBudget: one implementation subtask per Codex turn
|
||||
- Implementation entrypoint: `python3 my-tools/run_web_product_migration.py`
|
||||
|
||||
## Goal
|
||||
|
||||
Complete the implementation tasks in `tests/golden/WBV2/web-product-backlog.json`.
|
||||
The `3745` source-unit inventory is traceability-only and is not the completion denominator.
|
||||
|
||||
## 输入与范围
|
||||
|
||||
- `web/app/src/app/App.tsx`
|
||||
- direct typed protocol helpers named by the active backlog task
|
||||
- `docs/WEB_PRODUCT_MIGRATION_STRATEGY.md`
|
||||
|
||||
## 验收
|
||||
|
||||
- implement exactly one backlog task per Codex turn
|
||||
- preserve existing dirty changes
|
||||
- do not run tests, builds, typecheck, browsers, validators, or coverage binding
|
||||
- do not claim similarly named desktop operators
|
||||
- outer scheduler owns subtask rotation
|
||||
- `node tools/web/print-task-context.mjs`
|
||||
|
||||
## 失败边界
|
||||
|
||||
- a failed Codex turn remains pending and is retried without advancing the backlog
|
||||
- unrelated dirty files are never reverted or included in an automatic commit
|
||||
- no implementation task changes the source traceability ledger
|
||||
|
||||
## 交付与回滚
|
||||
|
||||
All 16 workflow modules are implementation-complete. Runtime defects are opened from user operation.
|
||||
- Backlog: `tests/golden/WBV2/web-product-backlog.json`
|
||||
- Report: `tests/golden/{TASK}/product-implementation-report.json`
|
||||
- Rollback: stop `my-tools/run_web_product_migration.py` and retain the last completed subtask.
|
||||
""")
|
||||
write_text(root_status, f"# {ROOT_TASK} status\n\n- task: `{ROOT_TASK}`; status: `done`\n- strategy: `implementation_first_user_feedback`\n- nextTask: `{TASK}`\n")
|
||||
write_json(root_report, {
|
||||
"schemaVersion": 1,
|
||||
"task": ROOT_TASK,
|
||||
"operation": "AUTHORIZE_WEB_PRODUCT_IMPLEMENTATION",
|
||||
"status": "PASS",
|
||||
"sourceInventoryRole": "traceability_only",
|
||||
"workflowModuleCount": 16,
|
||||
"implementationTaskCount": 4,
|
||||
"nextTask": TASK,
|
||||
})
|
||||
write_json(root_manifest, {
|
||||
"schemaVersion": 1,
|
||||
"task": ROOT_TASK,
|
||||
"parentTask": CURRENT,
|
||||
"operation": "AUTHORIZE_WEB_PRODUCT_IMPLEMENTATION",
|
||||
"status": "done",
|
||||
"artifacts": {
|
||||
"parentManifest": {"path": rel(current_manifest_path), "sha256": sha(current_manifest_path)},
|
||||
"plan": {"path": rel(plan_path), "sha256": sha(plan_path)},
|
||||
"report": {"path": rel(root_report), "sha256": sha(root_report)},
|
||||
"status": {"path": rel(root_status), "sha256": sha(root_status)},
|
||||
},
|
||||
"nextTask": TASK,
|
||||
})
|
||||
|
||||
queue = QUEUE.read_text(encoding="utf-8")
|
||||
queue = re.sub(r"\| 当前任务 \| `[^`]+` \|", f"| 当前任务 | `{TASK}` |", queue, count=1)
|
||||
queue = re.sub(r"\| parent manifest \| `[^`]+` \|", f"| parent manifest | `tests/golden/{ROOT_TASK}/manifest.json` |", queue, count=1, flags=re.IGNORECASE)
|
||||
queue = re.sub(r"\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|", f"| 任务卡 | [`tasks/{TASK}.md`](tasks/{TASK}.md) |", queue, count=1)
|
||||
write_text(QUEUE, queue)
|
||||
task_dir.mkdir(parents=True, exist_ok=True)
|
||||
subprocess.run(["node", "tools/web/generate-v2-task-index.mjs", "--plan-path", rel(plan_path)], cwd=ROOT, check=True)
|
||||
subprocess.run(["node", "tools/web/check-task-context.mjs", "--task", TASK, "--write"], cwd=ROOT, check=True)
|
||||
print(f"web-product-queue-activated task={TASK} modules=16 implementationTasks=4")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
@@ -92,6 +92,74 @@ def refresh_modules(backlog: dict) -> None:
|
||||
module["status"] = "partial"
|
||||
|
||||
|
||||
def finalize_product_task(backlog: dict) -> None:
|
||||
task_id = "WBV2-P1420-001"
|
||||
parent_id = "WBV2-P1420-000"
|
||||
index = read_json(CONTROL / "task-index.json")
|
||||
plan_path = ROOT / index["source"]["path"]
|
||||
plan = read_json(plan_path)
|
||||
for record in plan.get("tasks", []):
|
||||
if record.get("id") == task_id:
|
||||
record["status"] = "done"
|
||||
record["ready"] = False
|
||||
plan["status"] = "PRODUCT_IMPLEMENTATION_COMPLETE"
|
||||
write_json(plan_path, plan)
|
||||
output = ROOT / "tests/golden" / task_id
|
||||
report_path = output / "product-implementation-report.json"
|
||||
status_path = ROOT / "docs/status" / f"{task_id}.md"
|
||||
task_context_path = output / "task-context.json"
|
||||
changed_files = []
|
||||
for task in backlog.get("tasks", []):
|
||||
result_path = ROOT / task["resultPath"]
|
||||
result = read_json(result_path) if result_path.is_file() else {}
|
||||
changed_files.extend(result.get("changedFiles", []))
|
||||
changed_files = list(dict.fromkeys(path for path in changed_files if isinstance(path, str)))
|
||||
write_json(report_path, {
|
||||
"schemaVersion": 1,
|
||||
"task": task_id,
|
||||
"operation": "WEB_PRODUCT_IMPLEMENTATION_COMPLETE",
|
||||
"status": "implemented",
|
||||
"strategy": backlog.get("strategy"),
|
||||
"verificationPolicy": backlog.get("verificationPolicy"),
|
||||
"workflowModules": backlog.get("workflowModules", []),
|
||||
"implementationTasks": backlog.get("tasks", []),
|
||||
"changedFiles": changed_files,
|
||||
"sourceInventory": backlog.get("sourceInventory"),
|
||||
})
|
||||
write_json(status_path.with_suffix(".json"), {
|
||||
"schemaVersion": 1,
|
||||
"task": task_id,
|
||||
"status": "implemented",
|
||||
"verification": "deferred_until_user_reports",
|
||||
})
|
||||
status_path.write_text(
|
||||
f"# {task_id} status\n\n- status: `implemented`\n- workflow modules: `16/16`\n- implementation tasks: `{len(backlog.get('tasks', []))}/{len(backlog.get('tasks', []))}`\n- verification: `deferred_until_user_reports`\n- nextTask: `NONE`\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
artifacts = {
|
||||
"parentManifest": {"path": f"tests/golden/{parent_id}/manifest.json", "sha256": file_hash(f"tests/golden/{parent_id}/manifest.json")},
|
||||
"backlog": {"path": str(BACKLOG.relative_to(ROOT)), "sha256": file_hash(str(BACKLOG.relative_to(ROOT)))},
|
||||
"strategy": {"path": "docs/WEB_PRODUCT_MIGRATION_STRATEGY.md", "sha256": file_hash("docs/WEB_PRODUCT_MIGRATION_STRATEGY.md")},
|
||||
"report": {"path": str(report_path.relative_to(ROOT)), "sha256": file_hash(str(report_path.relative_to(ROOT)))},
|
||||
"status": {"path": str(status_path.relative_to(ROOT)), "sha256": file_hash(str(status_path.relative_to(ROOT)))},
|
||||
"plan": {"path": str(plan_path.relative_to(ROOT)), "sha256": file_hash(str(plan_path.relative_to(ROOT)))},
|
||||
}
|
||||
if task_context_path.is_file():
|
||||
artifacts["taskContext"] = {"path": str(task_context_path.relative_to(ROOT)), "sha256": file_hash(str(task_context_path.relative_to(ROOT)))}
|
||||
write_json(output / "manifest.json", {
|
||||
"schemaVersion": 1,
|
||||
"task": task_id,
|
||||
"parentTask": parent_id,
|
||||
"operation": "WEB_PRODUCT_IMPLEMENTATION_COMPLETE",
|
||||
"status": "done",
|
||||
"implementationComplete": True,
|
||||
"verificationDeferred": True,
|
||||
"artifacts": artifacts,
|
||||
"nextTask": None,
|
||||
})
|
||||
subprocess.run(["node", "tools/web/generate-v2-task-index.mjs", "--plan-path", str(plan_path.relative_to(ROOT))], cwd=ROOT, check=True)
|
||||
|
||||
|
||||
def write_status(backlog: dict, status: str, **extra: object) -> None:
|
||||
tasks = backlog.get("tasks", [])
|
||||
modules = backlog.get("workflowModules", [])
|
||||
@@ -127,8 +195,10 @@ Implementation requirement: {task['implementation']}
|
||||
|
||||
Rules:
|
||||
- Follow the repository AGENTS.md minimal-context instructions first.
|
||||
- The authoritative queue task is WBV2-P1420-001; this product task is one bounded subtask inside it. Run the default task-context check once, and never pass the product subtask id to check-task-context.
|
||||
- Preserve all existing dirty changes. Do not revert or rewrite unrelated work.
|
||||
- Read only the owned paths and their direct imported types/helpers.
|
||||
- For scoped searches, pass each owned path explicitly through the batch search runtime option; never pass a bare --runtime flag.
|
||||
- Implement production behavior through the existing Blender Main/WASM command routes; do not simulate Blender behavior in JavaScript.
|
||||
- Do not run tests, builds, typecheck, lint, Chromium, full validators, or coverage binding. The user explicitly deferred verification to real usage.
|
||||
- Do not modify docs/EXECUTION_QUEUE.md, nextTask.md, source coverage ledgers, manifests, or this backlog.
|
||||
@@ -215,6 +285,8 @@ def main() -> int:
|
||||
refresh_modules(backlog)
|
||||
write_json(BACKLOG, backlog)
|
||||
blocked = [task for task in backlog.get("tasks", []) if task.get("status") == "blocked"]
|
||||
if not blocked:
|
||||
finalize_product_task(backlog)
|
||||
write_status(backlog, "blocked" if blocked else "implementation_complete")
|
||||
return 2 if blocked else 0
|
||||
pending["status"] = "active"
|
||||
|
||||
@@ -104,5 +104,5 @@
|
||||
"historicalEffectivePending": 6609,
|
||||
"historicalReproduction": false
|
||||
},
|
||||
"nextTask": null
|
||||
"nextTask": "WBV2-P1420-000"
|
||||
}
|
||||
|
||||
26
tests/golden/WBV2-P1420-000/manifest.json
Normal file
26
tests/golden/WBV2-P1420-000/manifest.json
Normal file
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P1420-000",
|
||||
"parentTask": "WBV2-P1419-001",
|
||||
"operation": "AUTHORIZE_WEB_PRODUCT_IMPLEMENTATION",
|
||||
"status": "done",
|
||||
"artifacts": {
|
||||
"parentManifest": {
|
||||
"path": "tests/golden/WBV2-P1419-001/manifest.json",
|
||||
"sha256": "12cb60e88dd9ee9e805aac3592b0b1ce26a7be80e75f8b25fba85a97f66a809c"
|
||||
},
|
||||
"plan": {
|
||||
"path": "tests/golden/WBV2-P1420-000/product-implementation-plan.json",
|
||||
"sha256": "c3fde3a825257ce340742dcd3ec9d5a4d5e8963887c91340f0674bee29a22584"
|
||||
},
|
||||
"report": {
|
||||
"path": "tests/golden/WBV2-P1420-000/product-migration-authorization.json",
|
||||
"sha256": "4549a97a72cf2a79993a39d048a7800746f9177beeb7d418be4ecb56ac969da0"
|
||||
},
|
||||
"status": {
|
||||
"path": "docs/status/WBV2-P1420-000.md",
|
||||
"sha256": "c38f26b37506fd76d589d3899e573a49cee3791628ac14b27df63b1707988cd8"
|
||||
}
|
||||
},
|
||||
"nextTask": "WBV2-P1420-001"
|
||||
}
|
||||
52845
tests/golden/WBV2-P1420-000/product-implementation-plan.json
Normal file
52845
tests/golden/WBV2-P1420-000/product-implementation-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P1420-000",
|
||||
"operation": "AUTHORIZE_WEB_PRODUCT_IMPLEMENTATION",
|
||||
"status": "PASS",
|
||||
"sourceInventoryRole": "traceability_only",
|
||||
"workflowModuleCount": 16,
|
||||
"implementationTaskCount": 4,
|
||||
"nextTask": "WBV2-P1420-001"
|
||||
}
|
||||
199
tests/golden/WBV2-P1420-001/task-context.json
Normal file
199
tests/golden/WBV2-P1420-001/task-context.json
Normal file
@@ -0,0 +1,199 @@
|
||||
{
|
||||
"schemaVersion": 1,
|
||||
"task": "WBV2-P1420-001",
|
||||
"parentTask": "WBV2-P1420-000",
|
||||
"status": "in_progress",
|
||||
"goal": "Complete the implementation tasks in `tests/golden/WBV2/web-product-backlog.json`.",
|
||||
"scope": {
|
||||
"gap": "product-workflow:user-reachable-main-commands",
|
||||
"ownerFamily": "WEB_PRODUCT",
|
||||
"implementationClass": "PRODUCT_WORKFLOW"
|
||||
},
|
||||
"commands": [
|
||||
"node tools/web/print-task-context.mjs"
|
||||
],
|
||||
"inputPaths": [
|
||||
"docs/WEB_PRODUCT_MIGRATION_STRATEGY.md"
|
||||
],
|
||||
"inputMetadata": {
|
||||
"docs/EXECUTION_QUEUE.md": {
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"exists": true,
|
||||
"bytes": 4030,
|
||||
"mtime_ns": "1788641257839325568",
|
||||
"sha256": "c38215959bc41712ead05c477a6f38c872b6fcfa25c07d95d63b404fe4d79d49"
|
||||
},
|
||||
"docs/tasks/WBV2-P1420-001.md": {
|
||||
"path": "docs/tasks/WBV2-P1420-001.md",
|
||||
"exists": true,
|
||||
"bytes": 1643,
|
||||
"mtime_ns": "1788641430334103944",
|
||||
"sha256": "04400771a33468e10c0e4edbf353d4b7afddafef3d010d251f40da02c866bca9"
|
||||
},
|
||||
"tests/golden/WBV2-P1420-000/manifest.json": {
|
||||
"path": "tests/golden/WBV2-P1420-000/manifest.json",
|
||||
"exists": true,
|
||||
"bytes": 911,
|
||||
"mtime_ns": "1788641257839124781",
|
||||
"sha256": "ee4da3d487d87c38515b155cb1e67534ce233e13db2d93dcd34129374ecbec85"
|
||||
},
|
||||
"docs/status/WBV2-P1420-000.md": {
|
||||
"path": "docs/status/WBV2-P1420-000.md",
|
||||
"exists": true,
|
||||
"bytes": 144,
|
||||
"mtime_ns": "1788641257837596874",
|
||||
"sha256": "c38f26b37506fd76d589d3899e573a49cee3791628ac14b27df63b1707988cd8"
|
||||
},
|
||||
"docs/WEB_PRODUCT_MIGRATION_STRATEGY.md": {
|
||||
"path": "docs/WEB_PRODUCT_MIGRATION_STRATEGY.md",
|
||||
"exists": true,
|
||||
"bytes": 3066,
|
||||
"mtime_ns": "1788640338290223181",
|
||||
"sha256": "b0086cf81a52c71b9efdd764c005d65de7fe48a8f013ce6405a76486bf2310e6"
|
||||
}
|
||||
},
|
||||
"inputSelection": {
|
||||
"schemaVersion": 1,
|
||||
"limits": {
|
||||
"maxFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextRemainingBytes": 3176,
|
||||
"contextRemainingTokens": 793
|
||||
},
|
||||
"source": {
|
||||
"bytes": 6728,
|
||||
"tokens": 1683
|
||||
},
|
||||
"selected": [
|
||||
{
|
||||
"path": "docs/WEB_PRODUCT_MIGRATION_STRATEGY.md",
|
||||
"bytes": 3066,
|
||||
"tokens": 767
|
||||
}
|
||||
],
|
||||
"excluded": [
|
||||
{
|
||||
"path": "tests/golden/WBV2/web-product-backlog.json",
|
||||
"bytes": 5133,
|
||||
"reason": "CONTEXT_REMAINING_SPACE"
|
||||
},
|
||||
{
|
||||
"path": "web/app/src/app/App.tsx",
|
||||
"bytes": 224710,
|
||||
"reason": "EVIDENCE_BYTE_BUDGET"
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P1420-001/product-implementation-report.json",
|
||||
"bytes": null,
|
||||
"reason": "MISSING_PATH"
|
||||
}
|
||||
],
|
||||
"totals": {
|
||||
"files": 1,
|
||||
"bytes": 3066,
|
||||
"tokens": 767
|
||||
}
|
||||
},
|
||||
"exitCriteria": [
|
||||
"focused command exits 0",
|
||||
"report and manifest are hash-bound",
|
||||
"failure path does not publish a late result"
|
||||
],
|
||||
"nextTask": null,
|
||||
"sourceDocuments": {
|
||||
"queue": "docs/EXECUTION_QUEUE.md",
|
||||
"taskCard": "docs/tasks/WBV2-P1420-001.md",
|
||||
"taskIndex": "tests/golden/WBV2/task-index.json",
|
||||
"parentManifest": "tests/golden/WBV2-P1420-000/manifest.json",
|
||||
"parentStatus": "docs/status/WBV2-P1420-000.md"
|
||||
},
|
||||
"readPolicy": {
|
||||
"required": [
|
||||
"docs/EXECUTION_QUEUE.md",
|
||||
"docs/tasks/WBV2-P1420-001.md",
|
||||
"tests/golden/WBV2-P1420-000/manifest.json",
|
||||
"docs/status/WBV2-P1420-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-P1420-000",
|
||||
"parentTask": "WBV2-P1419-001",
|
||||
"status": "done",
|
||||
"nextTask": "WBV2-P1420-001",
|
||||
"artifactCount": 4
|
||||
},
|
||||
"statusSummary": [
|
||||
"# WBV2-P1420-000 status",
|
||||
"- task: `WBV2-P1420-000`; status: `done`",
|
||||
"- strategy: `implementation_first_user_feedback`",
|
||||
"- nextTask: `WBV2-P1420-001`"
|
||||
]
|
||||
},
|
||||
"budgets": {
|
||||
"queueBytes": 4096,
|
||||
"taskBytes": 1643,
|
||||
"parentManifestBytes": 24576,
|
||||
"parentStatusBytes": 6144,
|
||||
"evidenceFiles": 12,
|
||||
"evidenceBytes": 8192,
|
||||
"contextTokens": 3500,
|
||||
"contextEnvelopeTokens": 1024,
|
||||
"taskLines": 44,
|
||||
"taskTokens": 411
|
||||
},
|
||||
"size": {
|
||||
"documents": [
|
||||
{
|
||||
"path": "docs/EXECUTION_QUEUE.md",
|
||||
"bytes": 4030,
|
||||
"lines": 58,
|
||||
"tokens": 1008
|
||||
},
|
||||
{
|
||||
"path": "docs/tasks/WBV2-P1420-001.md",
|
||||
"bytes": 1643,
|
||||
"lines": 44,
|
||||
"tokens": 411
|
||||
},
|
||||
{
|
||||
"path": "tests/golden/WBV2-P1420-000/manifest.json",
|
||||
"bytes": 911,
|
||||
"lines": 27,
|
||||
"tokens": 228
|
||||
},
|
||||
{
|
||||
"path": "docs/status/WBV2-P1420-000.md",
|
||||
"bytes": 144,
|
||||
"lines": 6,
|
||||
"tokens": 36
|
||||
}
|
||||
],
|
||||
"sourceTokens": 1683,
|
||||
"evidenceFiles": 1,
|
||||
"evidenceBytes": 3066,
|
||||
"evidenceTokens": 767,
|
||||
"totalTokens": 2450,
|
||||
"reservedEnvelopeTokens": 1024,
|
||||
"estimatedContextTokens": 3474,
|
||||
"serializedContextTokens": 650,
|
||||
"withinBudget": true
|
||||
}
|
||||
}
|
||||
@@ -617,3 +617,5 @@
|
||||
{"id":"WBV2-P1418-001","gapId":"MESH_MERGE_MACRO_BATCH","ownerFamily":"MESH","sourceTask":"1418","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]}
|
||||
{"id":"WBV2-P1419-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1419","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]}
|
||||
{"id":"WBV2-P1419-001","gapId":"MESH_MERGE_MACRO_BATCH","ownerFamily":"MESH","sourceTask":"1419","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","every selected Main reader type is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact"]}
|
||||
{"id":"WBV2-P1420-000","gapId":"workflow:authorize implementation-first Web product migration","ownerFamily":"PROGRAM","sourceTask":"1420","state":"completed","targetImplementationClass":"QUEUE_ONLY"}
|
||||
{"id":"WBV2-P1420-001","gapId":"workflow:complete user-facing Web workflow implementation","ownerFamily":"WEB_PRODUCT","sourceTask":"1420","state":"active","targetImplementationClass":"PRODUCT_WORKFLOW"}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -37,6 +37,12 @@ const runtimeAllowlist = new Set([
|
||||
"tools/web/reuse-wbv2-source-dependencies.mjs",
|
||||
"my-tools/wbv2_runtime.py",
|
||||
"web/app/src/engine-client/WebEngineClient.ts",
|
||||
"web/app/src/app/App.tsx",
|
||||
"web/protocol/nonmesh-geometry-commands.ts",
|
||||
"web/protocol/animation-render-commands.ts",
|
||||
"web/protocol/nla.ts",
|
||||
"web/protocol/paint.ts",
|
||||
"web/app/src/fonts/external-vfont-import.ts",
|
||||
]);
|
||||
const runtimePaths = [];
|
||||
for (let index = 0; index < process.argv.length; index += 1) {
|
||||
|
||||
Reference in New Issue
Block a user