qfai 2.1.1 → 2.2.0

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 (185) hide show
  1. package/README.md +56 -36
  2. package/assets/defaults/agent-routing/qfai-implement.yml +9 -0
  3. package/assets/defaults/agent-routing/qfai-triage.yml +18 -0
  4. package/assets/defaults/workflows/answer-in-session.yml +8 -0
  5. package/assets/defaults/workflows/quarantine-flaky.yml +3 -0
  6. package/assets/defaults/workflows/repair-consistency.yml +1 -0
  7. package/assets/defaults/workflows/run-operation.yml +11 -0
  8. package/assets/defaults/workflows/run-owned-cleanup.yml +12 -0
  9. package/assets/defaults/workflows/write-procedure.yml +18 -0
  10. package/assets/graph/codegraph-native.mjs +174 -0
  11. package/assets/graph/graphify-native.py +72 -0
  12. package/assets/init/.claude/settings.json +9 -9
  13. package/assets/init/.codex/hooks.json +8 -8
  14. package/assets/init/.qfai/assistant/agent/frontend-engineer.md +5 -0
  15. package/assets/init/.qfai/assistant/agent/product-experience-architect.md +4 -0
  16. package/assets/init/.qfai/assistant/agent/product-surface-reviewer.md +7 -0
  17. package/assets/init/.qfai/assistant/agent/requirements-analyst.md +8 -0
  18. package/assets/init/.qfai/assistant/rule/communication.md +18 -8
  19. package/assets/init/.qfai/assistant/rule/constitution.md +31 -15
  20. package/assets/init/.qfai/assistant/rule/drift-protocol.md +119 -2
  21. package/assets/init/.qfai/assistant/rule/references/asset-authoring.md +6 -4
  22. package/assets/init/.qfai/assistant/rule/references/codex-delegation.md +27 -0
  23. package/assets/init/.qfai/assistant/rule/references/griller-recommendations.md +21 -9
  24. package/assets/init/.qfai/assistant/rule/references/worker-edit-boundary.md +48 -0
  25. package/assets/init/.qfai/assistant/rule/review-convergence.md +25 -12
  26. package/assets/init/.qfai/assistant/rule/shared-skill-delegation-baseline.md +16 -25
  27. package/assets/init/.qfai/assistant/rule/shared-skill-operating-baseline.md +16 -11
  28. package/assets/init/.qfai/assistant/rule/ui-definition-protocol.md +6 -1
  29. package/assets/init/.qfai/assistant/rule/workflow.md +2 -1
  30. package/assets/init/.qfai/assistant/skill/qfai-configure/SKILL.md +3 -3
  31. package/assets/init/.qfai/assistant/skill/qfai-discussion/SKILL.md +6 -0
  32. package/assets/init/.qfai/assistant/skill/qfai-discussion/references/discussion-completion-matrix.md +20 -15
  33. package/assets/init/.qfai/assistant/skill/qfai-discussion/references/ui-bearing-playbook.md +2 -4
  34. package/assets/init/.qfai/assistant/skill/qfai-discussion/references/ui_ux_best_practices.md +1 -6
  35. package/assets/init/.qfai/assistant/skill/qfai-discussion/templates/uiux/00_index.md +0 -16
  36. package/assets/init/.qfai/assistant/skill/qfai-grilling/SKILL.md +30 -20
  37. package/assets/init/.qfai/assistant/skill/qfai-grilling/references/delegated-session.md +4 -3
  38. package/assets/init/.qfai/assistant/skill/qfai-grilling/references/session-record.md +8 -2
  39. package/assets/init/.qfai/assistant/skill/qfai-implement/SKILL.md +16 -3
  40. package/assets/init/.qfai/assistant/skill/qfai-implement/references/parallelization-policy.md +9 -1
  41. package/assets/init/.qfai/assistant/skill/qfai-implement/references/red-admissibility.md +46 -0
  42. package/assets/init/.qfai/assistant/skill/qfai-implement/references/ui-affecting.md +5 -2
  43. package/assets/init/.qfai/assistant/skill/qfai-maintain/SKILL.md +3 -3
  44. package/assets/init/.qfai/assistant/skill/qfai-migration-v1-to-v2/SKILL.md +12 -6
  45. package/assets/init/.qfai/assistant/skill/qfai-migration-v1-to-v2/references/migration-guide.md +1 -265
  46. package/assets/init/.qfai/assistant/skill/qfai-migration-v1-to-v2/references/migration-placement.md +273 -0
  47. package/assets/init/.qfai/assistant/skill/qfai-prototyping/SKILL.md +4 -3
  48. package/assets/init/.qfai/assistant/skill/qfai-prototyping/references/review-payload-schema.md +2 -3
  49. package/assets/init/.qfai/assistant/skill/qfai-prototyping/references/reviewer-prompt.md +17 -1
  50. package/assets/init/.qfai/assistant/skill/qfai-run/SKILL.md +52 -37
  51. package/assets/init/.qfai/assistant/skill/qfai-run/references/codex-cloud-install.md +80 -0
  52. package/assets/init/.qfai/assistant/skill/qfai-run/references/evidence-delivery.md +322 -0
  53. package/assets/init/.qfai/assistant/skill/qfai-run/references/extraction.md +83 -49
  54. package/assets/init/.qfai/assistant/skill/qfai-run/references/operator-screens.md +226 -11
  55. package/assets/init/.qfai/assistant/skill/qfai-run/references/plan.md +6 -3
  56. package/assets/init/.qfai/assistant/skill/qfai-run/references/reached-step-observations.md +132 -0
  57. package/assets/init/.qfai/assistant/skill/qfai-run/references/stage-points.md +14 -0
  58. package/assets/init/.qfai/assistant/skill/qfai-run/scripts/codex-cloud-install.mjs +117 -0
  59. package/assets/init/.qfai/assistant/skill/qfai-sdd/SKILL.md +4 -3
  60. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/contract-artifact-rules.md +1 -0
  61. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/design-anti-patterns.md +23 -5
  62. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/design-md-authoring.md +20 -7
  63. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/requirements-decomposition.md +8 -0
  64. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/sdd-execution-playbook.md +29 -4
  65. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/sdd-phase-checklists.md +1 -1
  66. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/sdd-pre-draft-grilling.md +4 -1
  67. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/sdd-quality-gate.md +1 -1
  68. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/sdd-triage.md +159 -4
  69. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/spec-traceability-rules.md +14 -2
  70. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/ui-contract-guide.md +146 -0
  71. package/assets/init/.qfai/assistant/skill/qfai-sdd/references/ui-design-contract-normalization.md +4 -29
  72. package/assets/init/.qfai/assistant/skill/qfai-sdd/templates/change-request.md +38 -1
  73. package/assets/init/.qfai/assistant/skill/qfai-sdd/templates/contracts/ui-contract.sample.yaml +52 -5
  74. package/assets/init/.qfai/assistant/skill/qfai-sdd/templates/spec/decisions.md +12 -0
  75. package/assets/init/.qfai/assistant/skill/qfai-triage/SKILL.md +34 -21
  76. package/assets/init/.qfai/assistant/skill/qfai-verify/SKILL.md +5 -4
  77. package/assets/init/.qfai/assistant/skill/qfai-verify/references/context-load.md +9 -6
  78. package/assets/init/.qfai/assistant/skill/qfai-verify/references/verify-output-contract.md +80 -15
  79. package/assets/init/.qfai/assistant/skill/web-research/SKILL.md +35 -21
  80. package/assets/init/.qfai/assistant/skill/web-research/mcp-templates/brave-search/config.toml +2 -4
  81. package/assets/init/.qfai/assistant/skill/web-research/mcp-templates/brave-search/mcp-config.json +9 -5
  82. package/assets/init/.qfai/assistant/skill/web-research/mcp-templates/firecrawl/.mcp.json +1 -2
  83. package/assets/init/.qfai/assistant/skill/web-research/mcp-templates/firecrawl/config.toml +3 -3
  84. package/assets/init/.qfai/assistant/skill/web-research/mcp-templates/firecrawl/mcp-config.json +11 -8
  85. package/assets/init/.qfai/assistant/skill/web-research/mcp-templates/playwright/config.toml +1 -1
  86. package/assets/init/.qfai/assistant/skill/web-research/mcp-templates/playwright/mcp-config.json +7 -3
  87. package/assets/init/.qfai/assistant/step/common-design-md/STEP.md +33 -20
  88. package/assets/init/.qfai/assistant/step/common-gate-run/STEP.md +124 -8
  89. package/assets/init/.qfai/assistant/step/common-grilling-record/STEP.md +10 -2
  90. package/assets/init/.qfai/assistant/step/common-policy-check/STEP.md +1 -0
  91. package/assets/init/.qfai/assistant/step/common-review-cycle/STEP.md +26 -9
  92. package/assets/init/.qfai/assistant/step/discussion-interview/STEP.md +15 -8
  93. package/assets/init/.qfai/assistant/step/discussion-oq/STEP.md +5 -1
  94. package/assets/init/.qfai/assistant/step/discussion-pack/STEP.md +6 -1
  95. package/assets/init/.qfai/assistant/step/discussion-research/STEP.md +2 -0
  96. package/assets/init/.qfai/assistant/step/discussion-uiux/STEP.md +6 -4
  97. package/assets/init/.qfai/assistant/step/implement-backport/STEP.md +1 -1
  98. package/assets/init/.qfai/assistant/step/implement-benchmark/STEP.md +7 -4
  99. package/assets/init/.qfai/assistant/step/implement-dep-bump/STEP.md +11 -2
  100. package/assets/init/.qfai/assistant/step/implement-diagnose/STEP.md +2 -0
  101. package/assets/init/.qfai/assistant/step/implement-oracle-parity/STEP.md +2 -2
  102. package/assets/init/.qfai/assistant/step/implement-procedure/STEP.md +69 -0
  103. package/assets/init/.qfai/assistant/step/implement-quarantine/STEP.md +24 -7
  104. package/assets/init/.qfai/assistant/step/implement-refactor/STEP.md +2 -2
  105. package/assets/init/.qfai/assistant/step/implement-regression-fix/STEP.md +7 -6
  106. package/assets/init/.qfai/assistant/step/implement-retire/STEP.md +6 -3
  107. package/assets/init/.qfai/assistant/step/implement-revert/STEP.md +4 -3
  108. package/assets/init/.qfai/assistant/step/implement-seam/STEP.md +6 -5
  109. package/assets/init/.qfai/assistant/step/implement-stress-harness/STEP.md +34 -3
  110. package/assets/init/.qfai/assistant/step/implement-sweep/STEP.md +4 -3
  111. package/assets/init/.qfai/assistant/step/implement-tdd/STEP.md +39 -5
  112. package/assets/init/.qfai/assistant/step/implement-tooling/STEP.md +22 -2
  113. package/assets/init/.qfai/assistant/step/maintain-edit/STEP.md +18 -14
  114. package/assets/init/.qfai/assistant/step/prototyping-grill/STEP.md +4 -3
  115. package/assets/init/.qfai/assistant/step/prototyping-loop/STEP.md +4 -0
  116. package/assets/init/.qfai/assistant/step/prototyping-preflight/STEP.md +9 -3
  117. package/assets/init/.qfai/assistant/step/sdd-contract/STEP.md +11 -0
  118. package/assets/init/.qfai/assistant/step/sdd-flow/STEP.md +2 -0
  119. package/assets/init/.qfai/assistant/step/sdd-story/STEP.md +10 -0
  120. package/assets/init/.qfai/assistant/step/sdd-triage/STEP.md +34 -10
  121. package/assets/init/.qfai/assistant/step/triage-answer/STEP.md +7 -6
  122. package/assets/init/.qfai/assistant/step/triage-close/STEP.md +33 -23
  123. package/assets/init/.qfai/assistant/step/triage-cluster/STEP.md +5 -3
  124. package/assets/init/.qfai/assistant/step/triage-decompose/STEP.md +2 -0
  125. package/assets/init/.qfai/assistant/step/triage-dedupe/STEP.md +4 -0
  126. package/assets/init/.qfai/assistant/step/triage-handoff/STEP.md +13 -4
  127. package/assets/init/.qfai/assistant/step/triage-investigate/STEP.md +8 -5
  128. package/assets/init/.qfai/assistant/step/triage-operate/STEP.md +50 -0
  129. package/assets/init/.qfai/assistant/step/triage-owned-cleanup/STEP.md +86 -0
  130. package/assets/init/.qfai/assistant/step/triage-request-info/STEP.md +2 -0
  131. package/assets/init/.qfai/assistant/step/triage-security-intake/STEP.md +6 -3
  132. package/assets/init/.qfai/assistant/step/verify-change-note/STEP.md +1 -0
  133. package/assets/init/.qfai/assistant/step/verify-commit/STEP.md +37 -9
  134. package/assets/init/.qfai/assistant/step/verify-external/STEP.md +5 -2
  135. package/assets/init/.qfai/assistant/step/verify-qfai-gate/STEP.md +14 -16
  136. package/assets/init/.qfai/assistant/step/verify-release-notes/STEP.md +1 -0
  137. package/assets/init/.qfai/assistant/step/verify-repeat-run/STEP.md +46 -4
  138. package/assets/init/.qfai/assistant/step/verify-repo-gate/STEP.md +133 -30
  139. package/assets/init/root/.agents/rules/ai-readable-markdown.md +2 -2
  140. package/assets/init/root/.agents/rules/api-budget.md +187 -8
  141. package/assets/init/root/.agents/rules/document-schema.md +17 -0
  142. package/assets/init/root/.agents/rules/documentation-clarity.md +163 -34
  143. package/assets/init/root/.agents/rules/graph-exploration.md +150 -0
  144. package/assets/init/root/.agents/rules/grilling.md +100 -43
  145. package/assets/init/root/.agents/rules/minimal-implementation.md +3 -3
  146. package/assets/init/root/.agents/rules/reminders.json +27 -18
  147. package/assets/init/root/.agents/rules/session-feedback.md +131 -0
  148. package/assets/init/root/.agents/rules/temporary-files.md +33 -0
  149. package/assets/init/root/.agents/rules/untrusted-content.md +2 -2
  150. package/assets/init/root/.agents/rules/user-questions.md +51 -40
  151. package/assets/init/root/.github/workflows/qfai-docs.yml +3 -3
  152. package/assets/init/root/.github/workflows/qfai-tests.yml +88 -35
  153. package/assets/init/root/.github/workflows/qfai-validate.yml +2 -2
  154. package/assets/init/root/AGENTS.md +24 -22
  155. package/assets/sandbox-templates/default-deny.yaml +9 -3
  156. package/assets/schemas/workflow/extraction.schema.json +89 -5
  157. package/assets/scripts/check-mdschema.mjs +77 -8
  158. package/assets/uix-rev/comparison-review.md +1 -1
  159. package/assets/uix-rev/contracts-review.md +1 -2
  160. package/dist/cli/index.cjs +9444 -10071
  161. package/dist/cli/index.cjs.map +1 -1
  162. package/dist/cli/index.mjs +9421 -10041
  163. package/dist/cli/index.mjs.map +1 -1
  164. package/dist/graph/cli.cjs +1568 -0
  165. package/dist/graph/cli.cjs.map +1 -0
  166. package/dist/graph/cli.d.cts +9 -0
  167. package/dist/graph/cli.d.ts +9 -0
  168. package/dist/graph/cli.mjs +1541 -0
  169. package/dist/graph/cli.mjs.map +1 -0
  170. package/dist/graph/hook.cjs +817 -0
  171. package/dist/graph/hook.cjs.map +1 -0
  172. package/dist/graph/hook.d.cts +9 -0
  173. package/dist/graph/hook.d.ts +9 -0
  174. package/dist/graph/hook.mjs +792 -0
  175. package/dist/graph/hook.mjs.map +1 -0
  176. package/dist/index.cjs +7634 -8517
  177. package/dist/index.cjs.map +1 -1
  178. package/dist/index.d.cts +146 -658
  179. package/dist/index.d.ts +146 -658
  180. package/dist/index.mjs +7462 -8318
  181. package/dist/index.mjs.map +1 -1
  182. package/dist/process-C21nTvkT.d.cts +12 -0
  183. package/dist/process-C21nTvkT.d.ts +12 -0
  184. package/package.json +4 -6
  185. package/assets/init/root/CLAUDE.md +0 -46
@@ -0,0 +1,273 @@
1
+ # Place stories and write the documents
2
+
3
+ What the bundled steps need from a person before they place stories and
4
+ rules, and the shape of what steps 1 to 7 write: the plan, the retired
5
+ configuration keys, the contract numbers, the business rules and the story-tree
6
+ documents.
7
+
8
+ ## Contents
9
+
10
+ - Place stories and rules
11
+ - Retired configuration keys
12
+ - Contract IDs
13
+ - Business rules
14
+ - Documents in their template's shape
15
+
16
+ ## Place stories and rules
17
+
18
+ The AI writes `tmp/qfai-migration/plan.yaml` before running
19
+ step 4. `plan.yaml` may be written before step 1, because only steps 4 and 7
20
+ read it and a contract is named by the path it has in the contracts directory
21
+ before step 3, which is also a key of `contract-map.json` once step 3 has run.
22
+
23
+ The plan states the decisions the scripts cannot make. `flows` says which
24
+ business flow holds each old story. `rules` says which existing contract
25
+ enforces each old business rule, or that it enforces none. The optional
26
+ `examples` list places an example whose criterion the test cases leave open.
27
+ Flow order and story order determine the new IDs.
28
+
29
+ - **`from`.** A `from` value identifies an old flow to continue; omit it for a
30
+ new flow. It is the exact title of any H2 section of the old
31
+ `_policies/04_Business-Flow.md`, and no other H2 of that file has the same
32
+ title. For the unnamed opening flow, which is the text before the first
33
+ `CHG-` heading or the whole file where it has none, use the reserved value
34
+ `_policies/04_Business-Flow.md`. Several flows may continue the same section,
35
+ and each takes that section's prose and diagram. If `from` is omitted, the
36
+ script writes a template flow and reports that its diagram needs a person.
37
+ - **`criteria`.** An old criterion belongs to the story its `Parent:` line
38
+ names or, where it has none, to the story its row of the criteria catalog
39
+ table names in the `US Ref`, `US-Refs` or `Maps To` column. Add `criteria`
40
+ to a story only when the criterion has no such reference, the reference
41
+ names several stories, or the two disagree.
42
+ - **`contract`.** A contract path is relative to the configured contracts
43
+ directory, lies under `cli/`, `api/`, `db/` or `ui/`, and names the contract
44
+ file as it is before step 3 renames it. A Markdown file under `api/`, `db/`
45
+ or `ui/` and a file under `design/` hold no contract, so a rule cannot be
46
+ placed in one.
47
+ - **`binds: none` and `retire`.** A rule with no contract takes one of these
48
+ instead of `contract`. `binds: none` is allowed only where the rule's
49
+ `Contract-Refs` cell is `-`. `retire` takes a reason. Step 7 removes such a
50
+ rule from its `04_Business-Rules.md`, lists it under `## Operations` with
51
+ its old ID and, for `retire`, the reason, and gives it no new ID.
52
+ - **`examples`.** An entry names an old example ID and a `criterion`, one of
53
+ the old criterion IDs that the `AC-Refs` of the test cases citing the example
54
+ name. Step 4 places the example under that criterion's story, and its test
55
+ cases enter the ID map, so that step 8 rewrites their annotations.
56
+
57
+ ```yaml
58
+ flows:
59
+ - title: Place an order
60
+ stories:
61
+ - id: US-0001-0001
62
+ criteria: [AC-0001-0001]
63
+ examples:
64
+ - id: EX-0001-0002
65
+ criterion: AC-0001-0001
66
+ rules:
67
+ - id: BR-0006-0001
68
+ contract: api/orders.yaml
69
+ - id: BR-0006-0002
70
+ binds: none
71
+ - id: BR-0006-0003
72
+ retire: The payment provider enforces this limit.
73
+ ```
74
+
75
+ Use IDs from the old files in this plan. Assign each old story, rule, example
76
+ and criterion at most once. A `from` value that matches no old flow or matches
77
+ several, an invalid plan, a duplicate assignment, an `examples` criterion that
78
+ none of the citing test cases names, a rule with none or more than one of
79
+ `contract`, `binds` and `retire`, or a contract path that is outside the four
80
+ contract directories or names no contract stops step 4 before writing. Check
81
+ the step-4 dry run before accepting its numbering. Step 4 writes
82
+ `tmp/qfai-migration/id-map.json` once, and later steps use
83
+ that map. Write the `examples` entries and the rule marks before step 4: once
84
+ the map exists, an `examples` entry and a mark on a rule the map holds are
85
+ refused. A mark on a rule step 4 left unplaced is still accepted while a spec
86
+ pack is left. Place any other unplaced content in the new tree through `/qfai-sdd`. While the
87
+ map exists and no spec pack is left, steps 4 and 7 read no plan, so a missing or
88
+ rewritten `plan.yaml` stops nothing.
89
+
90
+ ## Retired configuration keys
91
+
92
+ Three keys of `qfai.config.yaml` no longer exist in 2.x. Each is handled by the
93
+ step named here:
94
+
95
+ | Key | What the migration does |
96
+ | --------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
97
+ | `validation.traceability.scMustHaveTest` | Step 1 removes it and lists it under `## Operations` |
98
+ | `validation.traceability.unknownContractIdSeverity` | Step 1 removes it and lists it under `## Operations` |
99
+ | `prototyping.primarySpecId` | Step 3 replaces it with `prototyping.primaryUiContract` where exactly one UI contract is tied to that spec |
100
+
101
+ Step 1 also removes a `validation.traceability` or `validation` mapping that
102
+ the removal leaves empty. Steps 1 to 3 run although the configuration loader
103
+ reports these keys. Steps 4 to 12 refuse with exit 2 before writing, naming the
104
+ key, while `qfai.config.yaml` still holds one of the three. That refusal does
105
+ not mean an earlier step has not run.
106
+
107
+ A UI contract is tied to a spec when the contract IDs named by the
108
+ `Contract-Refs` of that spec's business rules translate, through the contract
109
+ map, to one UI contract. Step 3 lists the replacement under `## Operations`.
110
+ Where `prototyping.primaryUiContract` is already set, step 3 removes the old key
111
+ instead. Where no UI contract is tied, more than one is, or the spec pack is
112
+ gone, step 3 leaves `prototyping.primarySpecId` and lists it under
113
+ `## For a person` with its old value, and exits 3. Replace it by hand with
114
+ `prototyping.primaryUiContract: UI-NNNN` naming the contract. Steps 4 to 12 then
115
+ run.
116
+
117
+ When a step cannot load `qfai.config.yaml` for any other reason, it exits 2
118
+ before writing and prints on standard error the message of each configuration
119
+ issue, one per line.
120
+
121
+ ## Contract IDs
122
+
123
+ Step 3 gives every contract file that has no 2.x contract ID one, and renames
124
+ the file to match:
125
+
126
+ | Old contract | Declares | New ID | New file |
127
+ | -------------------------- | -------------- | -------- | -------------------------- |
128
+ | `cli/orders.md` | nothing | CLI-0001 | `cli/cli-0001-orders.md` |
129
+ | `api/api-0001-orders.yaml` | `CON-API-0001` | API-0002 | `api/api-0002-orders.yaml` |
130
+ | `db/db-0001-orders.sql` | `CON-DB-0001` | DB-0003 | `db/db-0003-orders.sql` |
131
+
132
+ - Numbers run across all contracts, in the order CLI, API, DB, UI, then by
133
+ the old number, then by path. No two contracts share a number.
134
+ - The new ID replaces the old one in the file's declaration: the H1 of a
135
+ Markdown contract, as `# CLI-0001: <title>`, and the `QFAI-CONTRACT-ID` line
136
+ of any other. The old IDs in `-- Depends on:` and `x-qfai-depends-on` become
137
+ the new ones, and a YAML contract keeps its `x-qfai-depends-on` list on one
138
+ line.
139
+ - `contracts.md` becomes one index table listing every contract. The old
140
+ index's other sections are reported for a person.
141
+ - `tmp/qfai-migration/contract-map.json` records each old
142
+ path and old ID with the new ones, and step 4 copies it into the ID map.
143
+ - Step 7 writes the new IDs into rule statements, and step 8 changes a
144
+ `QFAI:CON-API-0001` test annotation to `QFAI:API-0002`.
145
+
146
+ Step 3 gives no ID to a file that is not a 2.x contract, and does not write it
147
+ into the new tree:
148
+
149
+ | Old file | Why it is not a contract |
150
+ | -------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
151
+ | A Markdown file under `api/`, `db/` or `ui/` | Those directories hold OpenAPI YAML or JSON, SQL and UI YAML contracts |
152
+ | Any file under `design/` | The directory no longer exists: the brand belongs in the root `DESIGN.md`, a screen in a `ui/` contract |
153
+
154
+ Step 3 deletes each one, `design/` as one directory, and lists each file under
155
+ `## For a person`. Rewrite what the file stated, from git history, in the form
156
+ its row names.
157
+
158
+ The old `design/prototype-handoff.yaml` is now
159
+ `.qfai/prototype/final/handoff.json`, which `/qfai-prototyping` writes when
160
+ the user confirms the prototype. The migration does not convert
161
+ the old file into it.
162
+
163
+ Step 3 also replaces every old `CON-*` ID that the contract map translates inside
164
+ the contract files it writes, wherever it stands in the file, and lists none of
165
+ them. It writes nothing outside those files. An old ID the map cannot translate,
166
+ such as an ID no contract declared or that several declared, stays as written
167
+ and is reported for a person with its file and line, as is a UI marker in
168
+ application code.
169
+
170
+ Step 3 groups its `## For a person` items under `### Content` and
171
+ `### Identifiers`. `### Content` comes first and holds what a person rewrites
172
+ or decides. `### Identifiers` holds an item that only pairs an old ID with its
173
+ new one, such as a changed constraint ID. A group with no item is not printed.
174
+
175
+ Step 3 writes a `routing:` override into `qfai.config.yaml` only for an entry
176
+ of `agent-routing.yml` that differs from the installed default. It writes none
177
+ for an entry equal to a default or to an entry a 1.x release shipped. Step 3
178
+ lists each routing entry it does write under `## For a person`, with its name
179
+ and a warning that a routing entry copied from a 1.x manifest hides the roles
180
+ the 2.x skills declare.
181
+
182
+ ## Business rules
183
+
184
+ Rules are numbered per contract, `BR-<contract number>-NNNN` from `0001` in plan
185
+ order: the first rule step 4 places in API-0006 is BR-0006-0001. Step 7 writes
186
+ each rule into its contract in the form the contract's format takes:
187
+
188
+ | Contract format | Where the rule goes |
189
+ | --------------- | ----------------------------------------------------------------------- |
190
+ | Markdown | A row of the `## Business rules` table: BR-ID, Statement and Examples |
191
+ | YAML or JSON | An entry `{ id, statement, examples }` of the top-level `x-qfai-rules:` |
192
+ | SQL | A `-- Rule BR-0006-0001: <statement>` line, then an `-- Examples:` line |
193
+
194
+ A Markdown contract without a `## Business rules` section gets one as its last
195
+ section. A rule's examples are the new IDs of the examples that cited it. A
196
+ rule written as a heading section takes the value of its `Rule` field as its
197
+ statement, and a SQL contract holds that statement on one line.
198
+
199
+ ## Documents in their template's shape
200
+
201
+ Each story-tree document the steps write takes the shape of its `qfai-sdd`
202
+ template, which is the shape the document schema checks:
203
+
204
+ | Documents | Step |
205
+ | --------------------------------------------------------------------------------------- | ---- |
206
+ | `decisions.md` and `open-questions.md` rows | 2 |
207
+ | `objective.md`, `initiative.md`, `principle.md`, `glossary.md` and `constraint.md` | 3 |
208
+ | `contracts.md` and `tech.md` | 3 |
209
+ | Markdown contracts under `cli/` | 3 |
210
+ | `business-flows.md`, `business-flow.md`, `user-stories.md` and each story's three files | 4 |
211
+ | Examples turned from test cases | 5 |
212
+
213
+ Content that does not fit that shape is listed under `## For a person`, and the
214
+ step exits 3:
215
+
216
+ - Step 3 leaves it out of the policy file, `tech.md` or CLI contract, and names the source
217
+ file and, where one fits, the template section that takes the content once a
218
+ person rewrites it. The source file is deleted, so the content is read from
219
+ git history.
220
+ - Step 3 also leaves as it is a policy file or `tech.md` that already exists
221
+ and differs from what it would write.
222
+ - A constraint row keeps only its ID, Constraint and Rationale. Step 3 lists
223
+ an Impact column, whose content belongs to the contract or `tech.md` that
224
+ owns it, and a row that names a file, a command or a rule ID, to be rewritten
225
+ in plain words.
226
+ - Step 3 numbers each constraint section from 01 in table order, and lists
227
+ every ID that changed with the ID that replaces it.
228
+ - Steps 4 and 5 write a story sentence or an example cell of another form as it
229
+ stands, for a person to rewrite.
230
+ - Step 4 lists every business flow, so that a person writes its alternate and
231
+ exception paths.
232
+
233
+ The steps do not write these into the new tree. Each stays in its old spec-pack
234
+ file, which stays in the pack while any of its content is unplaced and is then
235
+ deleted, kept in git history only:
236
+
237
+ - a spec pack's scope and source provenance;
238
+ - a story block's `Parent`, `Source` and `Flow` fields;
239
+ - a criterion's `# Parent:` line, since its directory names the story;
240
+ - a `Background:`, any scenario after a criterion's first named one, and a
241
+ `Scenario Outline:`, each listed for a person.
242
+
243
+ Step 3 writes no structure document. It routes the old `catalog/structure.md`
244
+ section by section:
245
+
246
+ | Old content | New home |
247
+ | ------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------- |
248
+ | An entrypoint with a smoke or skeleton command | A `- Skeleton:` line in `tech.md`'s Standard commands |
249
+ | A layer row of an `## Architecture` or `## Architecture constraints` table of Layer, Responsibility and Depends on columns, naming no path | The `## Architecture` table of `tech.md` |
250
+ | The `ui_paths:` globs of `## UI surface paths` | `uiux.surfacePaths` in `qfai.config.yaml`, if unset |
251
+ | Anything else | `## For a person` |
252
+
253
+ Step 3 writes the moved layers in the shape of the Architecture section: a
254
+ `flowchart TD` with a node per layer and an edge per dependency, then the table
255
+ with the rows ordered from the uppermost layer down. Where the rows cannot be
256
+ ordered, because a layer depends on one that has no row or layers depend on each
257
+ other, none of them moves: the section is listed under `## For a person` with
258
+ the reason, and `tech.md` keeps the template's Architecture section.
259
+
260
+ Step 3 writes each Markdown contract under `cli/` in the shape of the CLI
261
+ contract template: its `# CLI-0001: <title>` heading, `## Ownership boundary`
262
+ and a `## Business rules` table, and nothing else.
263
+
264
+ - An old `## Ownership boundary` of one to three paragraphs that name no rule is
265
+ kept as it stands.
266
+ - Where the old contract has none, the section holds the template's placeholder,
267
+ and the contract is listed for a person to write it.
268
+ - The text before the first section, lines such as `Status:` or `Rule refs:`,
269
+ and every other section are left out. Each is listed with the old file.
270
+
271
+ Step 7 then writes the contract's rules into that table. A rule whose statement
272
+ names another rule is written and listed for a person, because a CLI contract's
273
+ rule cites only examples.
@@ -95,9 +95,10 @@ decide completion.
95
95
  The invocation completes when the user confirms the prototype and
96
96
  `prototyping-handoff` has written the handoff. A blocking finding the latest
97
97
  review still lists at that point is named in the final report. Report every
98
- decision a session adopted, as that step says. The report ends with a question
99
- listing the actions under Next, as `.agents/rules/user-questions.md` § 6 sets
100
- out. Under a no-question mode, list them in the report instead.
98
+ decision a session adopted, as that step says. Ask about the actions under Next
99
+ only when proceeding requires the user's answer, as
100
+ `.agents/rules/user-questions.md` § 6 sets out. A completion-only report needs
101
+ no question. Under a no-question mode, list any remaining actions instead.
101
102
 
102
103
  ## Next
103
104
 
@@ -7,7 +7,7 @@ and the user reads what it finds before confirming the prototype.
7
7
  The schema is **closed**: any key not listed below is rejected. The
8
8
  orchestrator checks each payload against it before writing it, and asks the
9
9
  reviewer again for one that does not conform before the prototype is put to
10
- the user. A near-miss (extra key, misspelled field, legacy flat key) fails the
10
+ the user. A near-miss (extra key, misspelled field) fails the
11
11
  whole file.
12
12
 
13
13
  ## Contents
@@ -99,8 +99,7 @@ These keys belong to the per-iteration summary, **not** to this payload.
99
99
  Writing any of them here breaks the closed schema:
100
100
 
101
101
  `iterIndex`, `reviewerId`, `proseCritique`, `pivotDirective`,
102
- `evidenceRefs`, and the retired flat `timeBudgetSoftWarning` string
103
- (use `softWarnings.timeBudget: boolean`).
102
+ and `evidenceRefs`.
104
103
 
105
104
  ## `sessionStatus` and the retry policy
106
105
 
@@ -168,7 +168,7 @@ count can support a finding, but cannot replace the live assessment.
168
168
  | 5 | No catalogued anti-pattern is present | `lap-*`, below |
169
169
  | 6 | Conformant, procured, restrained and consistent | below |
170
170
  | 7 | Every declared `primary_task` walks | below |
171
- | 8 | No text on the screen explains the interface | `.agents/rules/interface-clarity.md` |
171
+ | 8 | No text explains the interface, and the text shown is the contract's | `.agents/rules/interface-clarity.md` |
172
172
 
173
173
  Criteria 1 to 4 are the procurement ladder read as questions, so a screen
174
174
  cannot pass by a standard it was not built to.
@@ -214,6 +214,22 @@ Hint text survives only where a need was demonstrated, the control was
214
214
  improved first and the need remained, and it is one sentence at most. Longer
215
215
  means the question needs clarifying or splitting.
216
216
 
217
+ Compare the rendered text with the screen's UI contract in both directions. The
218
+ screen shows its `title`, the group headings of its `structure`, its labels and
219
+ the `supplements` it declares. A text shown that none of them declares is excess,
220
+ and a declared supplement that is not shown is an unmet need. The finding names
221
+ the screen, the task or state, the meaning that is duplicated or the need that is
222
+ unmet, and the text to remove or the control or structure to repair. Apply the
223
+ patterns of the section on copy that adds no meaning, which the loop step names; the
224
+ rest of the design anti-patterns list stays with the direction review.
225
+
226
+ A repair keeps what the task needs: a condition, cost, storage or transmission
227
+ destination, result, recovery step, the consequence of an action that cannot be
228
+ undone, and every label, accessible name, role and state. Moving that into a
229
+ tooltip or a placeholder is not a repair. After a repair, walk the task again at
230
+ the declared narrow and desktop widths, in the normal, empty, error, loading and
231
+ success states the screen has.
232
+
217
233
  The counts are contract-relative. A screen declaring one primary task and
218
234
  carrying forty controls is wrong; the same forty elsewhere may be right. The
219
235
  denominator is in the contract, so no global threshold has to be invented.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: qfai-run
3
3
  title: QFAI Run (Change request entry)
4
- description: "Use when the user asks for a change, a fix, an investigation of the codebase or a question about the project in plain words and names no stage skill. A question that one command or one file read answers needs no plan. Plans the request with `npx qfai workflow plan` and runs the plan's steps in order to its end."
4
+ description: "Use when the user asks for a change, a fix, an investigation of the codebase, a question about the project or an operation on finished work in plain words and names no stage skill. Plans every such request, the lightest included, with `npx qfai workflow plan` and runs the plan's steps in order to its end."
5
5
  argument-hint: "<the change, in your own words>"
6
6
  allowed-tools: [Read, Glob, Grep, Write, Edit, Bash, TodoWrite, Task, Agent]
7
7
  roles: [orchestrator]
@@ -14,14 +14,15 @@ mode: execution-focused
14
14
 
15
15
  [DRIFT-PROTOCOL:REQUIRED]
16
16
 
17
- The user states a change once. This skill reads the request into facts, asks
18
- `npx qfai workflow plan` for the plan they give, and runs its steps in order.
17
+ Follow the CLI plan's steps in order. Read no reference up front; each line says when.
19
18
 
20
- - The facts a request is read into: `references/extraction.md`.
21
- - The command, its input and its output: `references/plan.md`.
22
- - What the user sees, and how questions are put: `references/operator-screens.md`.
23
- - What is done at a release, decision or branch point: `references/stage-points.md`.
24
- - Invoke the CLI through the launcher of `.qfai/assistant/rule/shared-skill-operating-baseline.md#canonical-qfai-launcher-mandatory`.
19
+ - `references/extraction.md`: for an extraction step 1 does not give.
20
+ - `references/plan.md`: for a plan field this file does not name, or a refused plan.
21
+ - `references/operator-screens.md`: when a line below or a step names it, such as to ask or report.
22
+ - `references/stage-points.md`: at a step the plan marks with a point.
23
+ - Run preflight before planning, as `.qfai/assistant/rule/shared-skill-operating-baseline.md#canonical-qfai-launcher-mandatory` says.
24
+ If the launcher is missing or preflight fails, read `references/operator-screens.md` for recovery.
25
+ - Read `references/codex-cloud-install.md` before configuring an environment-owned Install script or Start skill, or preparing dependencies for a fresh checkout. Use the reviewed target's successful preparation and canonical proof before planning.
25
26
 
26
27
  ## What this skill never does
27
28
 
@@ -34,8 +35,8 @@ The user states a change once. This skill reads the request into facts, asks
34
35
 
35
36
  ## Mode
36
37
 
37
- Read `workflow.mode` in `qfai.config.yaml` first. No key means `active`; any
38
- value but the three below plans nothing.
38
+ Read `workflow.mode` in `qfai.config.yaml` first. No key means `active`; unlisted
39
+ values plan nothing.
39
40
 
40
41
  | Mode | What this skill does |
41
42
  | -------- | ------------------------------------------------------------------------------------ |
@@ -45,48 +46,60 @@ value but the three below plans nothing.
45
46
 
46
47
  ## Request kinds
47
48
 
48
- - A change, a question, a proposal to decide or a report to close is planned.
49
- A question plans a route that answers it and changes nothing. Text that is
50
- not a request is not planned.
49
+ - For independent targets under one goal, read `references/operator-screens.md`
50
+ before planning or switching during a wait.
51
+ - Plan changes, questions, proposals to decide and reports to close.
52
+ Questions plan answers without changes; nonrequests get no plan.
53
+ - Replies with a requested answer or result, including failure, resume the same step without
54
+ a new invocation. An independent new request is planned; read `references/operator-screens.md`
55
+ for replies.
51
56
  - `stop`: end the work at once and list every open decision as open.
52
57
  - A request naming a stage skill: invoke that skill by name.
53
58
 
54
59
  ## The work
55
60
 
56
- 1. **Extract.** Read the request into an extraction as
57
- `references/extraction.md` sets out, and pass it to
58
- `npx qfai workflow plan --in <file>`, or `--in -` on standard input.
61
+ 1. **Extract.** A question one read answers is `{ intent: question-why, qualifiers: [session-answerable] }`
62
+ (or `question-how`, `question-help`); an operation on finished work that the session runs itself and
63
+ that deletes nothing is `{ intent: order, artifacts: [] }`. Every other field is empty, with
64
+ `confidence: high`; neither needs a reference. Read any other request as `references/extraction.md`
65
+ sets out, and pass the extraction to `npx qfai workflow plan --in <file>`, or `--in -`.
59
66
  2. **Candidates.** When `plan` returns `candidates`, put one single-select
60
67
  question, each option saying in the user's words what that route will do,
61
68
  then run `npx qfai workflow plan --route <route>` for the chosen one.
62
- 3. **Scope.** Ask which scope to run, as `references/operator-screens.md` says; run only its stages.
63
- 4. **Announce.** Before the first stage, give the goal, the chosen stages in
64
- order in plain words, and the files the work may change. Ask nothing. Then run
65
- `common-policy-check` once. On a route that changes no file, one that
69
+ 3. **Scope.** With two or more scopes, ask which to run as `references/operator-screens.md` says,
70
+ and run only its stages. With one scope, no scopes, or a branch destination's plan, ask
71
+ nothing and run every stage.
72
+ 4. **Announce.** Before the first stage, give the goal, the chosen stages in order in plain words,
73
+ and the files the work may change. Ask nothing. Then run `common-policy-check` once, unless the
74
+ plan's one step is `triage-answer` or `triage-operate`. On a route that changes no file, one that
66
75
  closes, answers or asks, it reads and reports and writes nothing.
67
76
  5. **Run the stages.** Run each stage in plan order, and each of its steps in
68
- order. Write any artifact yourself. Give a part to a sub-agent only to run
69
- independent parts in parallel, or for a review. At each step, handle the
70
- points the plan names for it, as `references/stage-points.md` sets out:
77
+ order, as `.qfai/assistant/rule/shared-skill-operating-baseline.md#running-steps-mandatory` says.
78
+ When a step is short or passes without edits, read `references/operator-screens.md`.
79
+ Write artifacts yourself or delegate independent parallel work or review.
80
+ At a step the plan marks with a point, follow `references/stage-points.md`:
71
81
  - **Release point.** Ask the user to approve the release before the step `releasePoint` names.
72
82
  - **Decision point.** Put each critical decision at a step `decisionPoints` names to the user.
73
83
  - **Branch point.** Move to the destination a step `branchPoints` names, and plan it at once.
74
- 6. **Review.** After a stage whose `review` is `spec`, `requirements-reviewer`
75
- reviews, with `architecture-reviewer` when a contract changed; after one
76
- whose `review` is `code`, `implementation-reviewer`.
77
- `product-surface-reviewer` joins both where a UI contract with screens
78
- serves the flow. No agent reviews its own work, and no step adds a review.
79
- Each review returns PASS or REVISE, and each finding is fixed or answered
80
- once, with no re-review. A step that would go beyond the request stops.
84
+ 6. **Review.** After a stage whose `review` is `spec`, `requirements-reviewer` reviews; for `code`,
85
+ `implementation-reviewer`. Only a contract or screen change no earlier review read adds
86
+ `architecture-reviewer` or `product-surface-reviewer`, as `common-review-cycle` lists; no one else
87
+ joins. A review whose target's only edits resolve the conflicts of a merge or branch update between
88
+ reviewed sides gets no reviewer.
89
+ No agent reviews its own work; no step adds a review. Each returns PASS or REVISE.
90
+ Fix or answer each finding once, with no re-review. Stop a step that exceeds the request.
81
91
  7. **Approvals.** Each approval of a specification change, a critical decision
82
92
  or a release is one `decisions.md` row: what was approved, who approved it,
83
- when, and the chosen option's label. A decision you took appends no row.
93
+ when, and the chosen option's label, in the `qfai-sdd` decisions template's form. A decision you took appends no row.
84
94
  8. **A finding no stage serves.** Stop, and name the finding, its owner and the stage skill to invoke by name.
85
95
  9. **Commit.** `verify-commit` runs last, after any release point; never pushes.
96
+ 10. **Session feedback.** When the final report closes the user's last task and nothing waits on them, follow `.agents/rules/session-feedback.md` once.
86
97
 
87
98
  ## Under a no-question mode
88
99
 
89
100
  Nothing is asked. The plan's narrowest scope, or the first candidate and its narrowest scope, is taken and reported as an assumption.
101
+ An uncovered question-only move to tracked-file repair instead stops that target
102
+ with a report and no tracked open question, as `references/stage-points.md` says.
90
103
  A critical decision or a release point becomes one `open-questions.md` row,
91
104
  the step stops before the change that depends on it, and the report lists the
92
105
  decision as open. A third branch move, or one from a scope that leaves stages out, stops the work.
@@ -108,11 +121,7 @@ Follow `.qfai/assistant/rule/shared-skill-delegation-baseline.md`.
108
121
 
109
122
  ## Work Orders Summary
110
123
 
111
- Where parts ran in parallel, report one row per part given to a sub-agent.
112
-
113
- | Step | Role (sub-agent) | Agent instance | Task title | Input (refs) | Output (refs) | Status (PASS/REVISE/PENDING) |
114
- | ---- | ---------------- | --------------- | ----------------- | ------------- | ------------- | ---------------------------- |
115
- | 1 | `<role>` | `<instance id>` | `<part in words>` | The step file | The result | PASS/REVISE |
124
+ When parts ran in parallel, use the summary in `references/operator-screens.md`.
116
125
 
117
126
  ## Default Autopilot Policy
118
127
 
@@ -127,7 +136,13 @@ Where parts ran in parallel, report one row per part given to a sub-agent.
127
136
 
128
137
  ## Completion Contract (Shared)
129
138
 
130
- Follow `.qfai/assistant/rule/shared-skill-operating-baseline.md#completion-contract-shared`. **Smallest applicable smoke check** (this skill's override): the gates of the `verify-qfai-gate` and `verify-repo-gate` steps the chosen scope holds; a scope holding none runs no gate, and the report says so. A gate that cannot run is UNRUN, not a pass.
139
+ Follow `.qfai/assistant/rule/shared-skill-operating-baseline.md#completion-contract-shared`. **Smallest applicable smoke check**: the chosen scope's `verify-qfai-gate` and `verify-repo-gate` gates. With none, run no gate and report it. Unavailable gates are UNRUN, never PASS.
140
+
141
+ At stage boundaries, follow `references/reached-step-observations.md` in the existing report.
142
+
143
+ If requested evidence handover must precede archive, read `references/evidence-delivery.md`
144
+ and complete receiving proof first. Missing access leaves handover pending and originals
145
+ retained; ordinary completion requires no unsolicited upload.
131
146
 
132
147
  project_memory:
133
148
 
@@ -0,0 +1,80 @@
1
+ # Codex Cloud dependency preparation
2
+
3
+ Read before configuring an environment-owned Install script or Start skill, or
4
+ when a fresh checkout cannot pass the canonical launcher preflight. Init writes
5
+ the preparation entry and this guide; it performs no installation or host setup.
6
+
7
+ ## Before execution
8
+
9
+ Review the project-declared executable, separate argv and absolute checkout cwd.
10
+ Read the declared Install command from the project's Standard commands; translate
11
+ it into a reviewed native executable and arguments before configuration. The entry
12
+ does not parse Markdown, shell text or choose a package manager.
13
+
14
+ Covered authority for the command and its lifecycle scripts must already exist.
15
+ Preserve network, secret, trust and publication permissions. A generated file,
16
+ invocation or flag grants no authority. Missing authority blocks execution.
17
+ Review argument and output contents before retaining or sharing them.
18
+
19
+ ## Install script
20
+
21
+ Use the generated entry with the reviewed tuple:
22
+
23
+ ```text
24
+ node .qfai/assistant/skill/qfai-run/scripts/codex-cloud-install.mjs --cwd <absolute-checkout> -- <executable> [argument...]
25
+ ```
26
+
27
+ Replace the placeholders with the reviewed values and configure the host's
28
+ supported Install script. The executable and arguments are passed with no shell
29
+ parsing at the explicit cwd. Do not supply an entire shell command as one argument.
30
+ Do not use a parent, remote or cached command as a substitute.
31
+
32
+ Missing inputs, an unknown option, a relative cwd or an unreadable target directory
33
+ fail before installation. Unavailable tools, spawn errors, signals, nonzero exit
34
+ and observed timeout remain failed preparation. Retain the actual reason; there
35
+ is no automatic retry, extra timeout option or new deadline.
36
+
37
+ After successful installation the entry checks the same cwd for its local
38
+ `node_modules/.bin/qfai`, or a root `.pnp.cjs` / `.pnp.loader.mjs` marker with a
39
+ declared qfai dependency and native `yarn exec qfai --help` exiting 0. A failed
40
+ installation stays failed even if a launcher already exists. A Windows wrapper
41
+ that cannot start natively remains a tool failure; no shell fallback is added.
42
+
43
+ ## Start skill
44
+
45
+ Check successful preparation and the canonical proof at the same reviewed cwd
46
+ before dependent planning. Failure or missing covered authority blocks planning;
47
+ report the actual blocker and owner required to resume. The entry starts no plan.
48
+ Use the launcher that the existing canonical preflight established for that target.
49
+ Preparation is neither global validation nor formal workflow completion.
50
+
51
+ ## Environment setup
52
+
53
+ Confirm current environment support for the Install script and Start skill before
54
+ real configuration. The operator performs authorized setup and publication;
55
+ init and the generated entry do not register an account or configure the host.
56
+
57
+ Saving configuration, preparing and publishing a filesystem for new tasks are
58
+ distinct operations. A refresh does not rerun installation or startup. Existing
59
+ tasks retain their own state. Confirm the actual host behavior before claiming
60
+ that preparation or a Start skill ran for a task; changing a local file is not
61
+ evidence of a published environment or a new task using it.
62
+
63
+ ## Reminders and trust
64
+
65
+ Existing reminder-only exit-0 behavior stays unchanged. Project-edited hook groups
66
+ keep their existing merge behavior. Keep linked-path refusals, unreadable-file warnings and hook
67
+ review. Preparation does not grant hook trust. No universal SessionStart installer
68
+ is added, and reminder hooks do not perform this installation.
69
+
70
+ ## Evidence limits
71
+
72
+ Distinguish generated assets, controlled native CI and actual Cloud configuration,
73
+ publication or task execution. Retain reviewed command and argv, cwd, actual exit
74
+ or signal, and canonical result without exposing secrets. A failed or interrupted
75
+ run is not ready; missing outcomes remain unknown.
76
+
77
+ Controlled native fixtures cannot prove host lifecycle or startup execution.
78
+ Actual Cloud setup and execution remain unobserved without their own receipts.
79
+ Keep existing workflow gates, trust and independent review; preparation replaces
80
+ none of them.