vibe-coding-master 0.7.43 → 0.7.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +64 -39
  2. package/dist/backend/adapters/claude-adapter.js +2 -2
  3. package/dist/backend/adapters/codex-bridge-adapter.js +213 -0
  4. package/dist/backend/api/app-settings-routes.js +6 -6
  5. package/dist/backend/api/artifact-routes.js +3 -0
  6. package/dist/backend/api/harness-routes.js +16 -0
  7. package/dist/backend/api/task-routes.js +1 -0
  8. package/dist/backend/api/workflow-control-routes.js +12 -0
  9. package/dist/backend/cli/install-vcm-harness.js +21 -0
  10. package/dist/backend/server.js +11 -9
  11. package/dist/backend/services/app-settings-service.js +11 -11
  12. package/dist/backend/services/artifact-service.js +7 -30
  13. package/dist/backend/services/auto-memory-service.js +640 -12
  14. package/dist/backend/services/claude-hook-service.js +80 -2
  15. package/dist/backend/services/{ccr-integration-service.js → codex-bridge-integration-service.js} +71 -71
  16. package/dist/backend/services/gate-review-service.js +173 -74
  17. package/dist/backend/services/harness-feedback-service.js +76 -78
  18. package/dist/backend/services/harness-service.js +27 -3
  19. package/dist/backend/services/runtime-coordinator-service.js +2 -1
  20. package/dist/backend/services/session-service.js +16 -16
  21. package/dist/backend/services/status-service.js +1 -0
  22. package/dist/backend/services/translation-worker-service.js +19 -4
  23. package/dist/backend/services/usage-analytics-service.js +3 -3
  24. package/dist/backend/services/workflow-control-service.js +96 -12
  25. package/dist/backend/templates/handoff.js +44 -2
  26. package/dist/backend/templates/harness/architect-agent.js +13 -7
  27. package/dist/backend/templates/harness/architect-scaffold-worker-agent.js +1 -1
  28. package/dist/backend/templates/harness/check-scaffold-ledger.js +234 -10
  29. package/dist/backend/templates/harness/claude-root.js +3 -2
  30. package/dist/backend/templates/harness/coder-agent.js +8 -0
  31. package/dist/backend/templates/harness/gate-review.js +144 -49
  32. package/dist/backend/templates/harness/harness-engineer-agent.js +25 -10
  33. package/dist/backend/templates/harness/project-manager-agent.js +16 -10
  34. package/dist/backend/templates/harness/resolve-durable-doc-assignment.js +60 -0
  35. package/dist/backend/templates/harness/tester-agent.js +13 -0
  36. package/dist/backend/templates/harness/vcm-ask-user-skill.js +82 -0
  37. package/dist/backend/templates/harness/vcm-code-navigation-skill.js +7 -5
  38. package/dist/backend/templates/harness/vcm-task-state-skill.js +2 -2
  39. package/dist/backend/templates/harness/vcm-workflow-review-skill.js +1 -1
  40. package/dist/shared/types/session.js +28 -22
  41. package/dist/shared/types/workflow.js +1 -0
  42. package/dist/shared/validation/artifact-check.js +3 -3
  43. package/dist/shared/validation/artifact-contract.js +1 -1
  44. package/dist/shared/validation/artifact-registry.js +16 -0
  45. package/dist-frontend/assets/index-DDmygnV6.css +32 -0
  46. package/dist-frontend/assets/{index-VW9tYPP5.js → index-nAV6toi8.js} +47 -47
  47. package/dist-frontend/index.html +2 -2
  48. package/package.json +1 -1
  49. package/scripts/claude-plugins/vcm-lsp-bridge/.claude-plugin/plugin.json +21 -6
  50. package/scripts/{ccr-api-key-helper.mjs → codex-bridge-api-key-helper.mjs} +1 -1
  51. package/scripts/harness-tools/vcm-artifact +1 -2
  52. package/scripts/harness-tools/vcm-bash-guard +1 -1
  53. package/dist/backend/adapters/ccr-gateway-adapter.js +0 -172
  54. package/dist-frontend/assets/index-B0d4Z6ny.css +0 -32
@@ -1,10 +1,17 @@
1
1
  export function renderCheckScaffoldLedgerTool() {
2
2
  return `#!/usr/bin/env python3
3
- """Scaffold-ledger reconciliation machine enforcement of the Scaffold Manifest bijection.
3
+ """Lifecycle-aware Scaffold Manifest and VCM:CODE reconciliation.
4
4
 
5
5
  The architecture plan's Scaffold Manifest is an item ledger: one entry per implementation
6
6
  item, one unique ID per entry, and exactly one \`VCM:CODE <ID>\` marker in the tree per
7
- \`create\`/\`change\`/\`delete\` entry. This tool checks:
7
+ \`create\`/\`change\`/\`delete\` entry during scaffolding. Coder then removes successful
8
+ markers and preserves failed markers. The required \`--mode\` selects that lifecycle:
9
+
10
+ - \`scaffold\`: require the ledger and tree markers to form an exact bijection;
11
+ - \`completion\`: reconcile the ledger, Coder's Scaffold Completion table, and the
12
+ final tree marker state.
13
+
14
+ The tool checks:
8
15
 
9
16
  1. the ledger header follows the mandated column order (\`ID | Action | File | ...\`),
10
17
  every data-row ID matches the documented grammar as a complete cell and is unique,
@@ -17,8 +24,9 @@ item, one unique ID per entry, and exactly one \`VCM:CODE <ID>\` marker in the t
17
24
 
18
25
  Markers are scanned in git-tracked source files only (\`.md\` files and \`.ai/\` are excluded:
19
26
  prose may quote markers legitimately). Pure read; findings go to stderr; exit 0 clean,
20
- 1 on findings. \`--plan <path>\` overrides the default plan location. No plan file at all
21
- means there is nothing to check (exit 0) — a docs-only or planning-free task.
27
+ 1 on findings. \`--plan <path>\` and \`--completion <path>\` override the default artifact
28
+ locations. No plan file at all means there is nothing to check (exit 0) — a docs-only or
29
+ planning-free task.
22
30
  """
23
31
  import argparse
24
32
  import re
@@ -27,7 +35,9 @@ import sys
27
35
  from pathlib import Path
28
36
 
29
37
  PLAN = ".ai/vcm/handoffs/architecture-plan.md"
38
+ COMPLETION = ".ai/vcm/handoffs/coder-completion.md"
30
39
  MANIFEST_HEADING = re.compile(r"^##\\s+Scaffold Manifest\\s*$")
40
+ COMPLETION_HEADING = re.compile(r"^##\\s+Scaffold Completion\\s*$")
31
41
  SECTION_HEADING = re.compile(r"^##\\s+\\S")
32
42
  ID_PATTERN = re.compile(r"[A-Z]{2,6}-\\d{1,4}")
33
43
  EMPTY_MANIFEST = "No scaffold items."
@@ -36,6 +46,8 @@ TABLE_SEPARATOR_CELL = re.compile(r":?-{3,}:?")
36
46
  # The action is read from its own cell as a whole-cell verb — never sniffed from the
37
47
  # row text, so paths or prose containing action words cannot flip an item's class.
38
48
  ACTIONS = frozenset({"create", "change", "delete"})
49
+ RESULTS = frozenset({"done", "failed"})
50
+ MARKER_STATES = frozenset({"removed", "present"})
39
51
  PATH_TOKEN = re.compile(r"\`([^\`\\s]+/[^\`\\s]+|[^\`\\s]+\\.[A-Za-z0-9]{1,8})\`")
40
52
  MARKER_ANY = re.compile(r"VCM:CODE(?![A-Za-z0-9_])")
41
53
  FORBIDDEN = [
@@ -59,6 +71,19 @@ def manifest_section(plan_text: str) -> tuple[int, list[str]] | None:
59
71
  return None if start is None else (start, lines[start:])
60
72
 
61
73
 
74
+ def completion_section(completion_text: str) -> tuple[int, list[str]] | None:
75
+ """(start line number, section lines) of the Scaffold Completion section, or None."""
76
+ lines = completion_text.splitlines()
77
+ start = None
78
+ for index, line in enumerate(lines):
79
+ if start is None:
80
+ if COMPLETION_HEADING.match(line):
81
+ start = index + 1
82
+ elif SECTION_HEADING.match(line):
83
+ return (start, lines[start : index])
84
+ return None if start is None else (start, lines[start:])
85
+
86
+
62
87
  def is_separator_row(cells: list[str]) -> bool:
63
88
  return bool(cells) and all(TABLE_SEPARATOR_CELL.fullmatch(cell.replace(" ", "")) for cell in cells)
64
89
 
@@ -168,6 +193,111 @@ def parse_ledger(section_start: int, section: list[str], plan: str) -> tuple[dic
168
193
  return entries, findings, False
169
194
 
170
195
 
196
+ def parse_completion(
197
+ section_start: int,
198
+ section: list[str],
199
+ completion: str,
200
+ ) -> tuple[dict, list[str]]:
201
+ """{id: {action, result, marker_state, line}} and completion-table findings."""
202
+ entries: dict[str, dict] = {}
203
+ findings: list[str] = []
204
+ header_line = None
205
+ separator_seen = False
206
+ for offset, line in enumerate(section):
207
+ line_no = section_start + offset + 1
208
+ stripped = line.strip()
209
+ if not stripped.startswith("|"):
210
+ continue
211
+ cells = [cell.strip() for cell in stripped.strip("|").split("|")]
212
+
213
+ if header_line is None:
214
+ header_line = line_no
215
+ head = [cell.lower() for cell in cells]
216
+ if head != ["id", "action", "result", "marker state", "proof evidence"]:
217
+ findings.append(
218
+ f"{completion}:{line_no} [completion] header columns must be exactly "
219
+ f"\`ID | Action | Result | Marker State | Proof Evidence\`"
220
+ )
221
+ continue
222
+
223
+ if not separator_seen:
224
+ if is_separator_row(cells):
225
+ separator_seen = True
226
+ continue
227
+ findings.append(
228
+ f"{completion}:{line_no} [completion] missing Markdown separator row after "
229
+ f"the Scaffold Completion header"
230
+ )
231
+ separator_seen = True
232
+ elif is_separator_row(cells):
233
+ findings.append(
234
+ f"{completion}:{line_no} [completion] unexpected separator row inside "
235
+ f"Scaffold Completion data"
236
+ )
237
+ continue
238
+
239
+ entry_id = cells[0] if cells else ""
240
+ if not ID_PATTERN.fullmatch(entry_id):
241
+ findings.append(
242
+ f"{completion}:{line_no} [completion] ID cell \`{entry_id}\` must match "
243
+ f"\`[A-Z]{{2,6}}-[0-9]{{1,4}}\` exactly"
244
+ )
245
+ continue
246
+ if entry_id in entries:
247
+ findings.append(
248
+ f"{completion}:{line_no} [completion] duplicate ID {entry_id} "
249
+ f"(first at line {entries[entry_id]['line']})"
250
+ )
251
+ continue
252
+
253
+ action = cells[1].lower() if len(cells) > 1 else ""
254
+ result = cells[2].lower() if len(cells) > 2 else ""
255
+ marker_state = cells[3].lower() if len(cells) > 3 else ""
256
+ if action not in ACTIONS:
257
+ findings.append(
258
+ f"{completion}:{line_no} [completion] {entry_id} action must be exactly "
259
+ f"create/change/delete"
260
+ )
261
+ if result not in RESULTS:
262
+ findings.append(
263
+ f"{completion}:{line_no} [completion] {entry_id} result must be exactly "
264
+ f"done/failed"
265
+ )
266
+ if marker_state not in MARKER_STATES:
267
+ findings.append(
268
+ f"{completion}:{line_no} [completion] {entry_id} Marker State must be "
269
+ f"exactly removed/present"
270
+ )
271
+ entries[entry_id] = {
272
+ "action": action,
273
+ "result": result,
274
+ "marker_state": marker_state,
275
+ "line": line_no,
276
+ }
277
+
278
+ if header_line is None:
279
+ findings.append(
280
+ f"{completion}:{section_start + 1} [completion] Scaffold Completion must "
281
+ f"contain the required table"
282
+ )
283
+ elif not separator_seen:
284
+ findings.append(
285
+ f"{completion}:{header_line} [completion] Scaffold Completion table is "
286
+ f"missing its separator row"
287
+ )
288
+ if not entries:
289
+ findings.append(
290
+ f"{completion}:{header_line or section_start + 1} [completion] Scaffold "
291
+ f"Completion contains no valid entries"
292
+ )
293
+ return entries, findings
294
+
295
+
296
+ def completion_decision(completion_text: str) -> str | None:
297
+ match = re.search(r"^Decision:\\s*(\\S+)\\s*$", completion_text, re.MULTILINE)
298
+ return match.group(1) if match else None
299
+
300
+
171
301
  def forbidden_language(section_start: int, section: list[str], plan: str) -> list[str]:
172
302
  findings = []
173
303
  for offset, line in enumerate(section):
@@ -216,9 +346,15 @@ def tree_markers(root: Path) -> tuple[dict[str, list[tuple[str, int]]], list[str
216
346
 
217
347
  def main() -> int:
218
348
  parser = argparse.ArgumentParser(
219
- description="Scaffold Manifest ledger <-> VCM:CODE marker bijection check."
349
+ description="Lifecycle-aware Scaffold Manifest and VCM:CODE reconciliation."
220
350
  )
351
+ parser.add_argument("--mode", required=True, choices=("scaffold", "completion"))
221
352
  parser.add_argument("--plan", default=None, help=f"plan path (default {PLAN})")
353
+ parser.add_argument(
354
+ "--completion",
355
+ default=None,
356
+ help=f"Coder completion path for completion mode (default {COMPLETION})",
357
+ )
222
358
  args = parser.parse_args()
223
359
 
224
360
  root = Path(__file__).resolve().parents[2]
@@ -249,11 +385,6 @@ def main() -> int:
249
385
 
250
386
  ledger_ids = set(entries)
251
387
  tree_ids = set(markers)
252
- for entry_id in sorted(ledger_ids - tree_ids):
253
- findings.append(
254
- f"{plan}:{entries[entry_id]['line']} [ledger] {entry_id} has no marker "
255
- f"in the tree -> pre-place \`VCM:CODE {entry_id}\` in its declared file"
256
- )
257
388
  for entry_id in sorted(tree_ids - ledger_ids):
258
389
  path, line_no = markers[entry_id][0]
259
390
  findings.append(
@@ -271,6 +402,94 @@ def main() -> int:
271
402
  f"declared file \`{declared}\`"
272
403
  )
273
404
 
405
+ completed = 0
406
+ failed = 0
407
+ if args.mode == "scaffold":
408
+ for entry_id in sorted(ledger_ids - tree_ids):
409
+ findings.append(
410
+ f"{plan}:{entries[entry_id]['line']} [ledger] {entry_id} has no marker "
411
+ f"in the tree -> pre-place \`VCM:CODE {entry_id}\` in its declared file"
412
+ )
413
+ elif not explicit_empty:
414
+ completion_path = Path(args.completion) if args.completion else root / COMPLETION
415
+ if not completion_path.is_file():
416
+ findings.append(
417
+ f"{completion_path}:1 [completion] completion mode requires coder-completion.md"
418
+ )
419
+ else:
420
+ completion_text = completion_path.read_text(errors="replace")
421
+ completion = str(completion_path)
422
+ completed_section = completion_section(completion_text)
423
+ if completed_section is None:
424
+ findings.append(
425
+ f"{completion_path}:1 [completion] no \`## Scaffold Completion\` section"
426
+ )
427
+ completion_entries = {}
428
+ else:
429
+ completion_entries, completion_findings = parse_completion(
430
+ *completed_section,
431
+ completion,
432
+ )
433
+ findings += completion_findings
434
+
435
+ completion_ids = set(completion_entries)
436
+ for entry_id in sorted(ledger_ids - completion_ids):
437
+ findings.append(
438
+ f"{plan}:{entries[entry_id]['line']} [completion] {entry_id} is missing "
439
+ f"from Scaffold Completion"
440
+ )
441
+ for entry_id in sorted(completion_ids - ledger_ids):
442
+ findings.append(
443
+ f"{completion}:{completion_entries[entry_id]['line']} [completion] "
444
+ f"{entry_id} has no Scaffold Manifest entry"
445
+ )
446
+
447
+ for entry_id in sorted(ledger_ids & completion_ids):
448
+ ledger_entry = entries[entry_id]
449
+ completion_entry = completion_entries[entry_id]
450
+ result = completion_entry["result"]
451
+ marker_state = completion_entry["marker_state"]
452
+ marker_count = len(markers.get(entry_id, []))
453
+ if completion_entry["action"] != ledger_entry["action"]:
454
+ findings.append(
455
+ f"{completion}:{completion_entry['line']} [completion] {entry_id} "
456
+ f"action \`{completion_entry['action']}\` does not match Scaffold "
457
+ f"Manifest action \`{ledger_entry['action']}\`"
458
+ )
459
+ if result == "done":
460
+ completed += 1
461
+ if marker_state != "removed":
462
+ findings.append(
463
+ f"{completion}:{completion_entry['line']} [completion] {entry_id} "
464
+ f"done requires Marker State \`removed\`"
465
+ )
466
+ if marker_count != 0:
467
+ findings.append(
468
+ f"{completion}:{completion_entry['line']} [completion] {entry_id} "
469
+ f"is done but {marker_count} marker(s) remain -> remove the completed marker"
470
+ )
471
+ elif result == "failed":
472
+ failed += 1
473
+ if marker_state != "present":
474
+ findings.append(
475
+ f"{completion}:{completion_entry['line']} [completion] {entry_id} "
476
+ f"failed requires Marker State \`present\`"
477
+ )
478
+ if marker_count != 1:
479
+ findings.append(
480
+ f"{completion}:{completion_entry['line']} [completion] {entry_id} "
481
+ f"failed requires exactly one preserved marker; found {marker_count}"
482
+ )
483
+
484
+ decision = completion_decision(completion_text)
485
+ expected_decision = "failed" if failed else "ready_for_review"
486
+ if decision != expected_decision:
487
+ findings.append(
488
+ f"{completion_path}:1 [completion] Decision must be "
489
+ f"\`{expected_decision}\` for the recorded item results; found "
490
+ f"\`{decision or 'missing'}\`"
491
+ )
492
+
274
493
  for finding in findings:
275
494
  sys.stderr.write(finding + "\\n")
276
495
  if findings:
@@ -278,6 +497,11 @@ def main() -> int:
278
497
  return 1
279
498
  if explicit_empty:
280
499
  print("ledger explicitly empty: 0 ledger item(s), 0 marker(s)")
500
+ elif args.mode == "completion":
501
+ print(
502
+ f"ledger completion clean: {len(ledger_ids)} ledger item(s), "
503
+ f"{completed} done, {failed} failed, {len(tree_ids)} marker(s) remain"
504
+ )
281
505
  else:
282
506
  print(
283
507
  f"ledger reconciliation clean: {len(ledger_ids)} ledger item(s), "
@@ -14,7 +14,7 @@ export function renderRootClaudeHarnessRules() {
14
14
 
15
15
  ## VCM Managed Artifacts
16
16
 
17
- - VCM-managed Markdown under \`.ai/vcm/handoffs/\`, Coder Worker reports, request-scoped Gate Review reports, route messages, memory proposals, Harness Feedback, and retrospective reports must be submitted with \`.ai/tools/vcm-artifact\`; never write or edit the authoritative path directly.
17
+ - VCM-managed Markdown under \`.ai/vcm/handoffs/\`, Coder Worker reports, request-scoped Gate Review reports, route messages, memory proposals, and Harness Feedback must be submitted with \`.ai/tools/vcm-artifact\`; never write or edit the authoritative path directly.
18
18
  - Write the candidate outside \`.ai/vcm/\`, then run \`.ai/tools/vcm-artifact <kind> --file <candidate> --mode <draft|final>\`. Dynamic artifacts also require the exact VCM-assigned \`--path\`.
19
19
  - Use \`draft\` while an allowed lifecycle remains incomplete. Use \`final\` before routing or consuming a terminal artifact. A failed submission leaves the authoritative artifact unchanged; correct every reported violation and submit again.
20
20
  - Do not route, review, or rely on a candidate file. Only the VCM-written authoritative path is workflow evidence.
@@ -61,10 +61,11 @@ If a reusable harness problem is suspected, it is enough to record a concise fee
61
61
  - Architect Debug Mode runs inside either Architect Debug Flow or Architect Debug Branch. Architecture Diagnosis Mode runs inside either Architecture Diagnosis Flow or Architecture Diagnosis Branch.
62
62
  - Code-Change Flow, Architect Debug Flow, and an Architecture Diagnosis Flow that produces code changes run tester validation, validation-adequacy Gate Review, and then code-diff Gate Review before architect docs sync and project-manager final acceptance. An analysis-only Architecture Diagnosis Flow completes from the diagnosis result.
63
63
  - Architect Debug Branch and Architecture Diagnosis Branch preserve the active parent flow and resume point, then return there after tester validation, validation-adequacy Gate Review, and code-diff Gate Review complete. They do not run their own final acceptance.
64
- - Docs-Only Flow uses: \`project-manager -> architect -> project-manager completion\`.
64
+ - Docs-Only Flow uses: \`project-manager -> assigned documentation role or roles -> project-manager completion\`.
65
65
  - Validation-Only Flow uses: \`project-manager -> tester -> validation-adequacy Gate Review -> project-manager completion\`.
66
66
  - Communication-Only Flow uses: \`project-manager response or relay -> completion\`.
67
67
  - Gate Review is PM-triggered at its defined trigger points; the tool decides whether review is enabled or required.
68
+ - Ignore commits whose subject starts with \`[VCM Harness]\`. Do not review, attribute, or route those commits unless they cause a test failure. A test failure caused by a Harness commit follows the normal test-failure flow.
68
69
  - Final acceptance closes only a complete code-delivery flow; it never closes Architect Debug Branch or Architecture Diagnosis Branch.
69
70
  - PR-Preparation Flow starts only after the active delivery flow completes; every complete code-delivery flow requires final acceptance to pass.
70
71
  - If Docs-Only Flow or Validation-Only Flow reveals that the accepted outcome requires production-code, runtime-behavior, public-contract, dependency, or system-architecture changes, project-manager routes through the full Code-Change Flow.
@@ -11,6 +11,7 @@ ${renderRoleMemoryRules("coder")}
11
11
  - When parallel worker implementation is used, own worker task splitting, worker prompts, worker result inspection for assigned completion and integration, final Scaffold Completion, and coder-level validation.
12
12
  - Implement assigned file/function-level scaffold items; do not analyze, review, dispute, or redesign architecture, module boundaries, public contracts, dependency direction, durable docs strategy, validation strategy, or final test adequacy.
13
13
  - Treat the architecture plan and scaffold as execution instructions, not review targets. Do not critique, reinterpret, or challenge them during Coder work.
14
+ - In a PM-routed Docs-Only Flow, update the assigned documentation and related documentation needed for consistency without changing production code or tests.
14
15
 
15
16
  ### Code Navigation
16
17
 
@@ -76,7 +77,14 @@ ${renderRoleMemoryRules("coder")}
76
77
 
77
78
  ### Handoff
78
79
 
80
+ - For a \`[VCM Durable Documentation Assignment]\`, verify and update the assigned
81
+ durable document and directly related documentation, run applicable checks,
82
+ commit the result, and submit \`docs-update-report.md\` with the exact assigned
83
+ Assignment ID. This backend assignment does not start Docs-Only Flow.
84
+
85
+ - In Docs-Only Flow, commit the documentation changes and submit \`.ai/vcm/handoffs/docs-update-report.md\` through \`vcm-artifact\` with the decision, changed and reviewed documents, evidence, checks, commit, and remaining documentation issues. Do not submit \`coder-completion.md\` for Docs-Only work.
79
86
  - Submit \`.ai/vcm/handoffs/coder-completion.md\` before routing back to project-manager: write a candidate outside \`.ai/vcm\`, then run \`.ai/tools/vcm-artifact coder-completion --file <candidate> --mode draft|final\`. This file is the complete, self-contained current implementation completion evidence, not a log. Each revision must restate every Scaffold Manifest disposition, changed file, helper, deviation, generated-context result, baseline-test change, L0/L1 command and result, worker result, commit, and objective failure still needed to review the current implementation without a prior revision. Replace stale content instead of appending history.
87
+ - After committing the actual implementation state and before submitting a final \`coder-completion.md\`, run \`.ai/tools/check-scaffold-ledger --mode completion --completion <candidate>\`; submit the candidate only after it passes. An incomplete draft does not use completion mode.
80
88
  - \`coder-completion.md\` must include \`Decision: ready_for_review | incomplete | failed\`.
81
89
  - \`coder-completion.md\` must report every Scaffold Manifest item disposition in the fixed Scaffold Completion table, plus changed files, private helpers added, manifest deviations as report-only facts, generated context status, baseline tests added or updated, L0/L1 commands and results, worker commits and integration status when workers were used, and compile/typecheck or L0/L1 failures.
82
90
  - Use this structure: