dorfl 0.1.0 → 0.1.2

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 (324) hide show
  1. package/dist/advance-ci-template.d.ts +3 -3
  2. package/dist/advance-ci-template.js +1 -1
  3. package/dist/advance-ci-template.js.map +1 -1
  4. package/dist/advance-classify.d.ts +5 -5
  5. package/dist/advance-classify.d.ts.map +1 -1
  6. package/dist/advance-classify.js +4 -4
  7. package/dist/advance-drivers.d.ts +7 -7
  8. package/dist/advance-drivers.d.ts.map +1 -1
  9. package/dist/advance-drivers.js +5 -5
  10. package/dist/advance-drivers.js.map +1 -1
  11. package/dist/advance-isolated.d.ts +3 -3
  12. package/dist/advance-isolated.d.ts.map +1 -1
  13. package/dist/advance-isolated.js +1 -1
  14. package/dist/advance-lifecycle-template.d.ts +2 -2
  15. package/dist/advance-lifecycle-template.js +9 -9
  16. package/dist/advance-lifecycle-template.js.map +1 -1
  17. package/dist/advance-loop-driver.d.ts +3 -3
  18. package/dist/advance-loop-driver.d.ts.map +1 -1
  19. package/dist/advance-loop-driver.js +1 -1
  20. package/dist/advance-treeless-publish.d.ts +1 -1
  21. package/dist/advance.d.ts +11 -11
  22. package/dist/advance.d.ts.map +1 -1
  23. package/dist/advance.js +21 -21
  24. package/dist/advance.js.map +1 -1
  25. package/dist/advancing-lock.d.ts +1 -1
  26. package/dist/advancing-lock.js +5 -5
  27. package/dist/apply-decide.d.ts +2 -2
  28. package/dist/apply-decide.js +2 -2
  29. package/dist/apply-merge-action.d.ts +4 -4
  30. package/dist/apply-merge-action.js +2 -2
  31. package/dist/apply-persist.d.ts +5 -5
  32. package/dist/apply-persist.d.ts.map +1 -1
  33. package/dist/apply-persist.js +7 -7
  34. package/dist/apply-persist.js.map +1 -1
  35. package/dist/buildable-body.d.ts +14 -14
  36. package/dist/buildable-body.js +9 -9
  37. package/dist/claim-cas.d.ts +3 -3
  38. package/dist/claim-cas.js +1 -1
  39. package/dist/claim-cas.js.map +1 -1
  40. package/dist/cli.d.ts.map +1 -1
  41. package/dist/cli.js +83 -77
  42. package/dist/cli.js.map +1 -1
  43. package/dist/close-job-template.d.ts +3 -3
  44. package/dist/close-job-template.js +8 -8
  45. package/dist/close-job.d.ts +8 -8
  46. package/dist/close-job.js +25 -25
  47. package/dist/close-job.js.map +1 -1
  48. package/dist/complete.d.ts +3 -3
  49. package/dist/complete.js +8 -8
  50. package/dist/complete.js.map +1 -1
  51. package/dist/concurrency.d.ts +1 -1
  52. package/dist/concurrency.js +1 -1
  53. package/dist/config.d.ts +32 -32
  54. package/dist/config.js +5 -5
  55. package/dist/config.js.map +1 -1
  56. package/dist/continue-branch.d.ts +1 -1
  57. package/dist/continue-branch.js +1 -1
  58. package/dist/cwd-section.js +1 -1
  59. package/dist/cwd-section.js.map +1 -1
  60. package/dist/decision-engine.d.ts +2 -2
  61. package/dist/do-autopick.d.ts +6 -6
  62. package/dist/do-autopick.d.ts.map +1 -1
  63. package/dist/do-autopick.js +5 -5
  64. package/dist/do-autopick.js.map +1 -1
  65. package/dist/do-config.d.ts +3 -3
  66. package/dist/do-config.js +3 -3
  67. package/dist/do-config.js.map +1 -1
  68. package/dist/do-remote-auto.d.ts +2 -2
  69. package/dist/do-remote-auto.js +1 -1
  70. package/dist/do.d.ts +25 -25
  71. package/dist/do.d.ts.map +1 -1
  72. package/dist/do.js +22 -22
  73. package/dist/do.js.map +1 -1
  74. package/dist/drop-source.d.ts +2 -2
  75. package/dist/env-config.js +8 -8
  76. package/dist/env-config.js.map +1 -1
  77. package/dist/format.js +3 -3
  78. package/dist/format.js.map +1 -1
  79. package/dist/frontmatter.d.ts +33 -39
  80. package/dist/frontmatter.d.ts.map +1 -1
  81. package/dist/frontmatter.js +18 -31
  82. package/dist/frontmatter.js.map +1 -1
  83. package/dist/install-ci-branch-protection.d.ts +1 -1
  84. package/dist/install-ci-branch-protection.js +1 -1
  85. package/dist/install-ci-capabilities/advance-lifecycle.d.ts +1 -1
  86. package/dist/install-ci-capabilities/advance-lifecycle.js +1 -1
  87. package/dist/install-ci-capabilities/close-job.d.ts +1 -1
  88. package/dist/install-ci-capabilities/close-job.js +1 -1
  89. package/dist/install-ci-capabilities/example-noop.d.ts +1 -1
  90. package/dist/install-ci-capabilities/example-noop.js +1 -1
  91. package/dist/install-ci-capabilities/intake.d.ts +2 -2
  92. package/dist/install-ci-capabilities/intake.js +2 -2
  93. package/dist/install-ci-capabilities/verify.d.ts +1 -1
  94. package/dist/install-ci-capabilities/verify.js +1 -1
  95. package/dist/install-ci-core.d.ts +3 -3
  96. package/dist/install-ci-core.js +2 -2
  97. package/dist/install-ci-core.js.map +1 -1
  98. package/dist/install-ci-github.d.ts +1 -1
  99. package/dist/install-ci-github.js +1 -1
  100. package/dist/install-ci.d.ts +1 -1
  101. package/dist/install-ci.js +4 -4
  102. package/dist/install-ci.js.map +1 -1
  103. package/dist/intake-event.d.ts +6 -6
  104. package/dist/intake-event.js +6 -6
  105. package/dist/intake-marker.d.ts +3 -3
  106. package/dist/intake-marker.d.ts.map +1 -1
  107. package/dist/intake-triage.d.ts +1 -1
  108. package/dist/intake-triage.js +2 -2
  109. package/dist/intake-trigger-template.d.ts +8 -8
  110. package/dist/intake-trigger-template.d.ts.map +1 -1
  111. package/dist/intake-trigger-template.js +16 -16
  112. package/dist/intake-trigger-template.js.map +1 -1
  113. package/dist/intake.d.ts +50 -50
  114. package/dist/intake.d.ts.map +1 -1
  115. package/dist/intake.js +70 -70
  116. package/dist/intake.js.map +1 -1
  117. package/dist/integration-core.d.ts +17 -17
  118. package/dist/integration-core.js +17 -17
  119. package/dist/integration-core.js.map +1 -1
  120. package/dist/isolation.d.ts +3 -3
  121. package/dist/issue-provider.d.ts +4 -4
  122. package/dist/issue-provider.js +1 -1
  123. package/dist/item-lock.d.ts +21 -21
  124. package/dist/item-lock.d.ts.map +1 -1
  125. package/dist/item-lock.js +16 -16
  126. package/dist/item-path.d.ts +2 -2
  127. package/dist/item-path.js +2 -2
  128. package/dist/ledger-lint.d.ts +9 -9
  129. package/dist/ledger-lint.js +9 -9
  130. package/dist/ledger-read.d.ts +57 -57
  131. package/dist/ledger-read.d.ts.map +1 -1
  132. package/dist/ledger-read.js +24 -24
  133. package/dist/ledger-read.js.map +1 -1
  134. package/dist/ledger-write.d.ts +2 -2
  135. package/dist/ledger-write.js +1 -1
  136. package/dist/lifecycle-gather.d.ts +1 -1
  137. package/dist/lifecycle-gather.js +16 -16
  138. package/dist/lifecycle-gather.js.map +1 -1
  139. package/dist/lifecycle-pools.d.ts +4 -4
  140. package/dist/lifecycle-pools.js +1 -1
  141. package/dist/merge-question-surfacer.d.ts +3 -3
  142. package/dist/merge-question-surfacer.js +2 -2
  143. package/dist/merge-question-surfacer.js.map +1 -1
  144. package/dist/mint-adr.js +4 -4
  145. package/dist/mirror-pool-scan.d.ts +2 -2
  146. package/dist/mirror-pool-scan.js +3 -3
  147. package/dist/mirror-pool-scan.js.map +1 -1
  148. package/dist/needs-attention.d.ts +13 -13
  149. package/dist/needs-attention.d.ts.map +1 -1
  150. package/dist/needs-attention.js +11 -11
  151. package/dist/needs-attention.js.map +1 -1
  152. package/dist/orphan-sidecar.d.ts +2 -2
  153. package/dist/placement.d.ts +6 -6
  154. package/dist/placement.js +2 -2
  155. package/dist/prd-to-spec.d.ts +15 -1
  156. package/dist/prd-to-spec.d.ts.map +1 -1
  157. package/dist/prd-to-spec.js +36 -14
  158. package/dist/prd-to-spec.js.map +1 -1
  159. package/dist/prompt.d.ts +24 -24
  160. package/dist/prompt.d.ts.map +1 -1
  161. package/dist/prompt.js +29 -31
  162. package/dist/prompt.js.map +1 -1
  163. package/dist/protocol/CLAIM-PROTOCOL.md +4 -4
  164. package/dist/protocol/REVIEW-PROTOCOL.md +1 -1
  165. package/dist/protocol/TASKING-PROTOCOL.md +12 -12
  166. package/dist/protocol/WORK-CONTRACT.md +39 -39
  167. package/dist/protocol/spec-template.md +1 -1
  168. package/dist/protocol/task-template.md +3 -3
  169. package/dist/readiness.d.ts +1 -1
  170. package/dist/recover-isolated.js +1 -1
  171. package/dist/repo-config.js +12 -12
  172. package/dist/repo-config.js.map +1 -1
  173. package/dist/review-gate.d.ts +3 -3
  174. package/dist/review-gate.d.ts.map +1 -1
  175. package/dist/review-gate.js +11 -10
  176. package/dist/review-gate.js.map +1 -1
  177. package/dist/review-verdict.d.ts +2 -2
  178. package/dist/review-verdict.d.ts.map +1 -1
  179. package/dist/review-verdict.js +1 -1
  180. package/dist/run.d.ts +1 -1
  181. package/dist/run.js +5 -5
  182. package/dist/run.js.map +1 -1
  183. package/dist/scan.d.ts +10 -10
  184. package/dist/scan.d.ts.map +1 -1
  185. package/dist/scan.js +8 -8
  186. package/dist/scan.js.map +1 -1
  187. package/dist/select-order.d.ts +1 -1
  188. package/dist/select-priority.d.ts +12 -12
  189. package/dist/select-priority.d.ts.map +1 -1
  190. package/dist/select-priority.js +5 -5
  191. package/dist/select-priority.js.map +1 -1
  192. package/dist/sidecar.d.ts +2 -2
  193. package/dist/sidecar.js +2 -2
  194. package/dist/sidecar.js.map +1 -1
  195. package/dist/slug-namespace.d.ts +1 -1
  196. package/dist/slug-namespace.js +3 -3
  197. package/dist/slug-namespace.js.map +1 -1
  198. package/dist/spec-complete.js +2 -2
  199. package/dist/spec-complete.js.map +1 -1
  200. package/dist/start.d.ts +1 -1
  201. package/dist/start.js +3 -3
  202. package/dist/start.js.map +1 -1
  203. package/dist/status.d.ts +3 -3
  204. package/dist/status.js +4 -4
  205. package/dist/status.js.map +1 -1
  206. package/dist/surface-gate.d.ts +2 -2
  207. package/dist/surface-gate.d.ts.map +1 -1
  208. package/dist/surface-persist.d.ts +2 -2
  209. package/dist/surface-persist.d.ts.map +1 -1
  210. package/dist/tasker-review-loop.d.ts +8 -8
  211. package/dist/tasker-review-loop.d.ts.map +1 -1
  212. package/dist/tasker-review-loop.js +8 -8
  213. package/dist/tasker-review-loop.js.map +1 -1
  214. package/dist/tasking-eligibility.d.ts +21 -21
  215. package/dist/tasking-eligibility.d.ts.map +1 -1
  216. package/dist/tasking-eligibility.js +10 -10
  217. package/dist/tasking-lock.d.ts +8 -8
  218. package/dist/tasking-lock.d.ts.map +1 -1
  219. package/dist/tasking-lock.js +20 -21
  220. package/dist/tasking-lock.js.map +1 -1
  221. package/dist/tasking.d.ts +33 -33
  222. package/dist/tasking.d.ts.map +1 -1
  223. package/dist/tasking.js +89 -88
  224. package/dist/tasking.js.map +1 -1
  225. package/dist/triage-gate.d.ts +1 -1
  226. package/dist/triage-persist.d.ts +5 -5
  227. package/dist/triage-persist.js +15 -15
  228. package/dist/triage-persist.js.map +1 -1
  229. package/dist/verify-workflow-template.d.ts +1 -1
  230. package/dist/verify-workflow-template.js +2 -2
  231. package/dist/work-layout.d.ts +9 -7
  232. package/dist/work-layout.d.ts.map +1 -1
  233. package/dist/work-layout.js +9 -7
  234. package/dist/work-layout.js.map +1 -1
  235. package/dist/workspace.d.ts +1 -1
  236. package/package.json +1 -1
  237. package/src/advance-ci-template.ts +4 -4
  238. package/src/advance-classify.ts +5 -5
  239. package/src/advance-drivers.ts +10 -10
  240. package/src/advance-isolated.ts +3 -3
  241. package/src/advance-lifecycle-template.ts +9 -9
  242. package/src/advance-loop-driver.ts +3 -3
  243. package/src/advance-treeless-publish.ts +1 -1
  244. package/src/advance.ts +30 -30
  245. package/src/advancing-lock.ts +6 -6
  246. package/src/apply-decide.ts +2 -2
  247. package/src/apply-merge-action.ts +5 -5
  248. package/src/apply-persist.ts +8 -8
  249. package/src/buildable-body.ts +14 -14
  250. package/src/claim-cas.ts +4 -4
  251. package/src/cli.ts +94 -84
  252. package/src/close-job-template.ts +8 -8
  253. package/src/close-job.ts +26 -26
  254. package/src/complete.ts +11 -11
  255. package/src/concurrency.ts +1 -1
  256. package/src/config.ts +37 -37
  257. package/src/continue-branch.ts +1 -1
  258. package/src/cwd-section.ts +1 -1
  259. package/src/decision-engine.ts +3 -3
  260. package/src/do-autopick.ts +9 -9
  261. package/src/do-config.ts +6 -6
  262. package/src/do-remote-auto.ts +2 -2
  263. package/src/do.ts +49 -49
  264. package/src/drop-source.ts +2 -2
  265. package/src/env-config.ts +8 -8
  266. package/src/format.ts +3 -3
  267. package/src/frontmatter.ts +42 -60
  268. package/src/install-ci-branch-protection.ts +1 -1
  269. package/src/install-ci-capabilities/advance-lifecycle.ts +1 -1
  270. package/src/install-ci-capabilities/close-job.ts +1 -1
  271. package/src/install-ci-capabilities/example-noop.ts +1 -1
  272. package/src/install-ci-capabilities/intake.ts +2 -2
  273. package/src/install-ci-capabilities/verify.ts +1 -1
  274. package/src/install-ci-core.ts +4 -4
  275. package/src/install-ci-github.ts +1 -1
  276. package/src/install-ci.ts +4 -4
  277. package/src/intake-event.ts +6 -6
  278. package/src/intake-marker.ts +3 -3
  279. package/src/intake-triage.ts +2 -2
  280. package/src/intake-trigger-template.ts +17 -17
  281. package/src/intake.ts +97 -97
  282. package/src/integration-core.ts +35 -35
  283. package/src/isolation.ts +3 -3
  284. package/src/issue-provider.ts +4 -4
  285. package/src/item-lock.ts +21 -21
  286. package/src/item-path.ts +2 -2
  287. package/src/ledger-lint.ts +9 -9
  288. package/src/ledger-read.ts +81 -81
  289. package/src/ledger-write.ts +3 -3
  290. package/src/lifecycle-gather.ts +16 -16
  291. package/src/lifecycle-pools.ts +4 -4
  292. package/src/merge-question-surfacer.ts +4 -4
  293. package/src/mint-adr.ts +4 -4
  294. package/src/mirror-pool-scan.ts +5 -5
  295. package/src/needs-attention.ts +22 -22
  296. package/src/orphan-sidecar.ts +2 -2
  297. package/src/placement.ts +6 -6
  298. package/src/prd-to-spec.ts +51 -15
  299. package/src/prompt.ts +33 -35
  300. package/src/readiness.ts +1 -1
  301. package/src/recover-isolated.ts +1 -1
  302. package/src/repo-config.ts +12 -12
  303. package/src/review-gate.ts +12 -11
  304. package/src/review-verdict.ts +2 -2
  305. package/src/run.ts +6 -6
  306. package/src/scan.ts +15 -15
  307. package/src/select-order.ts +1 -1
  308. package/src/select-priority.ts +13 -13
  309. package/src/sidecar.ts +3 -3
  310. package/src/slug-namespace.ts +3 -3
  311. package/src/spec-complete.ts +2 -2
  312. package/src/start.ts +4 -4
  313. package/src/status.ts +7 -7
  314. package/src/surface-gate.ts +2 -2
  315. package/src/surface-persist.ts +2 -2
  316. package/src/tasker-review-loop.ts +15 -15
  317. package/src/tasking-eligibility.ts +21 -21
  318. package/src/tasking-lock.ts +27 -28
  319. package/src/tasking.ts +124 -123
  320. package/src/triage-gate.ts +1 -1
  321. package/src/triage-persist.ts +16 -16
  322. package/src/verify-workflow-template.ts +2 -2
  323. package/src/work-layout.ts +9 -7
  324. package/src/workspace.ts +1 -1
@@ -44,45 +44,39 @@ export interface Frontmatter {
44
44
  /** Content-derived slug id (frontmatter `slug:`). */
45
45
  slug: string | undefined;
46
46
  /**
47
- * Source SPEC slug (frontmatter `spec:`); the spec lives at
48
- * `work/specs/ready/<spec>.md`. The `spec` vocabulary name for the parent-spec
49
- * pointer (prd `prd-to-spec-vocabulary-cutover-and-migration-command`). This is
50
- * the EXPAND-step ADDITION beside {@link prd}: `parseFrontmatter` populates BOTH
51
- * from EITHER the `spec:` OR the `prd:` key with the SAME value, so a caller
52
- * reading either sees the parent-spec slug. The migrate batches move `fm.prd`
53
- * reads onto `fm.spec` one at a time; the contract task removes `prd`.
47
+ * Source SPEC slug: the parent-spec pointer this artifact derives from; the
48
+ * spec lives at `work/specs/ready/<spec>.md`. The `spec` vocabulary name (spec
49
+ * `prd-to-spec-vocabulary-cutover-and-migration-command`). `parseFrontmatter`
50
+ * populates it from the canonical `spec:` key ONLY the HARD CUTOVER (the last
51
+ * `prd` back-compat surface removed): the legacy `prd:` KEY read is GONE, so an
52
+ * un-migrated `prd:` field no longer silently resolves. A downstream repo
53
+ * migrates its data with `dorfl prd-to-spec` (a purely TEXTUAL `prd: spec:`
54
+ * rewrite that does NOT go through this parser), after which the field reads
55
+ * canonically. There is no `fm.prd` FIELD.
54
56
  */
55
57
  spec: string | undefined;
56
- /**
57
- * Source spec slug (frontmatter `prd:`); the spec lives at
58
- * `work/specs/ready/<prd>.md`. The LEGACY vocabulary name for the parent-spec
59
- * pointer, kept BESIDE {@link spec} through the expand→migrate→contract cutover
60
- * (prd `prd-to-spec-vocabulary-cutover-and-migration-command`) so every existing
61
- * `fm.prd` reader keeps working; populated from EITHER the `spec:` or `prd:` key.
62
- */
63
- prd: string | undefined;
64
58
  /**
65
59
  * The GitHub issue number an `intake`-emitted artifact was transformed from
66
60
  * (frontmatter `issue:`). Parsed so the `issue: N` intake writes is
67
61
  * MACHINE-READABLE — the close JOB (`runner-in-ci`'s) reaches it to resolve the
68
62
  * issue from folder + field state. Carried on EITHER:
69
63
  *
70
- * - a **prd** (`intake`'s prd outcome) — a fanned task reaches it via
71
- * `task.prd: → work/prds/ready/<prd>.md → prd issue:` (the number lives
72
- * ONLY on the prd, never duplicated across the N fanned tasks); OR
73
- * - a **lone task** (`intake`'s TASK outcome, no `prd:`) — the provider-agnostic
64
+ * - a **spec** (`intake`'s spec outcome) — a fanned task reaches it via
65
+ * `task.spec: → work/specs/ready/<spec>.md → spec issue:` (the number lives
66
+ * ONLY on the spec, never duplicated across the N fanned tasks); OR
67
+ * - a **lone task** (`intake`'s TASK outcome, no `spec:`) — the provider-agnostic
74
68
  * closure link for a task that closes its own issue directly (replaces the old
75
69
  * GitHub-only `Fixes #N` body line, which is now a deferred optimisation).
76
70
  *
77
- * INVARIANT — one closure path per task: a task uses `issue:` XOR `prd:`, never
71
+ * INVARIANT — one closure path per task: a task uses `issue:` XOR `spec:`, never
78
72
  * both. Either it closes its own issue directly (`issue:`) or it contributes to a
79
- * prd that closes the issue (`prd:` → prd `issue:`). This is NOT enforced by a
73
+ * spec that closes the issue (`spec:` → spec `issue:`). This is NOT enforced by a
80
74
  * throwing validator (there is no frontmatter-validation layer): intake never
81
- * emits both — its task / prd dispatch branches are mutually exclusive — so only
82
- * a human hand-edit could produce both, and the precedence rule (`prd:` wins,
75
+ * emits both — its task / spec dispatch branches are mutually exclusive — so only
76
+ * a human hand-edit could produce both, and the precedence rule (`spec:` wins,
83
77
  * `issue:` ignored) is the future close-job's concern (see {@link
84
- * resolveClosingIssue}), degrading a typo to "use the prd's number" rather than
85
- * crashing. `undefined` when omitted (every non-intake prd and most tasks).
78
+ * resolveClosingIssue}), degrading a typo to "use the spec's number" rather than
79
+ * crashing. `undefined` when omitted (every non-intake spec and most tasks).
86
80
  */
87
81
  issue: number | undefined;
88
82
  /**
@@ -112,19 +106,19 @@ export interface Frontmatter {
112
106
  /** Slugs this item is blocked by; `[]` when omitted or empty. */
113
107
  blockedBy: string[];
114
108
  /**
115
- * Prd-only: slugs of prds that must already be TASKED before this prd may be
116
- * tasked (resolved against `work/prds/tasked/` residence, NOT `done/`). `[]` when
109
+ * Spec-only: slugs of prds that must already be TASKED before this spec may be
110
+ * tasked (resolved against `work/specs/tasked/` residence, NOT `done/`). `[]` when
117
111
  * omitted or empty. Parsed here so the auto-tasker can read it; enforcement
118
112
  * lives in the `auto-slice` capability, not in eligibility.
119
113
  */
120
114
  taskedAfter: string[];
121
115
  /**
122
116
  * The per-item override layer for the `promptGuidance` NUDGE namespace
123
- * (task `prompt-guidance-testfirst-item-override`, prd US #5). A task or
124
- * prd may carry one or more `promptGuidance.<member>: true | false`
117
+ * (task `prompt-guidance-testfirst-item-override`, spec US #5). A task or
118
+ * spec may carry one or more `promptGuidance.<member>: true | false`
125
119
  * frontmatter lines to OVERRIDE the resolved repo policy for THAT ITEM only.
126
120
  * Each member is `undefined` when omitted (⇒ inherit the next layer down in
127
- * the precedence chain: per-task > per-prd > repo-resolved). The override
121
+ * the precedence chain: per-task > per-spec > repo-resolved). The override
128
122
  * is honoured at the prompt-assembly seam (`prompt.ts`); it never affects
129
123
  * the `verify` gate.
130
124
  *
@@ -300,12 +294,12 @@ export function setFrontmatterMarker(
300
294
 
301
295
  /**
302
296
  * PROPAGATE the origin-trust PROVENANCE (`origin` + `originTrust`) from a SOURCE
303
- * artifact (a prd) onto a TARGET artifact's content (an emitted task), returning
297
+ * artifact (a spec) onto a TARGET artifact's content (an emitted task), returning
304
298
  * the new content (task `untrusted-origin-forces-build-propose`). The tasker
305
- * calls this so a task born from an untrusted-origin prd carries the stamp the
299
+ * calls this so a task born from an untrusted-origin spec carries the stamp the
306
300
  * BUILD transition reads. IDEMPOTENT: each present source field is written via
307
301
  * {@link setFrontmatterMarker} (replace-or-append). When the source has NO `origin`
308
- * (a human/local-authored prd ⇒ trusted), the target is returned UNCHANGED — the
302
+ * (a human/local-authored spec ⇒ trusted), the target is returned UNCHANGED — the
309
303
  * normal path is never stamped (zero behaviour change). When a stamp IS applied to
310
304
  * a fence-less target, {@link setFrontmatterMarker} now prepends a fence to carry
311
305
  * it (tasks the tasker emits always have a fence, so this is the defensive path).
@@ -334,7 +328,6 @@ export function parseFrontmatter(content: string): Frontmatter {
334
328
  originTrust: undefined,
335
329
  slug: undefined,
336
330
  spec: undefined,
337
- prd: undefined,
338
331
  issue: undefined,
339
332
  humanOnly: undefined,
340
333
  needsAnswers: undefined,
@@ -378,27 +371,16 @@ export function parseFrontmatter(content: string): Frontmatter {
378
371
  result.originTrust = v === 'trusted' || v === 'untrusted' ? v : undefined;
379
372
  } else if (key === 'slug') {
380
373
  result.slug = rawValue === '' ? undefined : unquote(rawValue);
381
- } else if (key === 'spec' || key === 'prd') {
382
- // EXPAND step (prd `prd-to-spec-vocabulary-cutover-and-migration-command`):
383
- // the parent-spec pointer is written under EITHER the new `spec:` key or the
384
- // legacy `prd:` key. Populate BOTH `fm.spec` and `fm.prd` with the same value
385
- // so a caller reading either field sees it. `spec:` wins if both are present
386
- // (the canonical key takes precedence over the legacy alias); an empty value
387
- // on one key does NOT clobber a non-empty value already read from the other.
388
- const value = rawValue === '' ? undefined : unquote(rawValue);
389
- if (key === 'spec') {
390
- // The canonical key wins: overwrite whatever `prd:` may have set.
391
- if (value !== undefined) {
392
- result.spec = value;
393
- result.prd = value;
394
- }
395
- } else if (result.spec === undefined) {
396
- // Legacy `prd:` only fills in when `spec:` has not already set the pair.
397
- result.spec = value;
398
- result.prd = value;
399
- }
374
+ } else if (key === 'spec') {
375
+ // The parent-spec pointer, read from the canonical `spec:` key ONLY into the
376
+ // `fm.spec` field (spec `prd-to-spec-vocabulary-cutover-and-migration-command`,
377
+ // HARD CUTOVER). The legacy `prd:` KEY read is GONE an un-migrated `prd:`
378
+ // field no longer resolves here; a repo converts its data via the TEXTUAL
379
+ // `dorfl prd-to-spec` rewrite (which does not use this parser). An empty value
380
+ // leaves the field undefined.
381
+ result.spec = rawValue === '' ? undefined : unquote(rawValue);
400
382
  } else if (key === 'issue') {
401
- // Integer issue link (`intake`'s prd-emit OR a lone-task emit). A
383
+ // Integer issue link (`intake`'s spec-emit OR a lone-task emit). A
402
384
  // non-integer / empty value reads as undefined (the field is absent rather
403
385
  // than malformed).
404
386
  const n = Number(unquote(rawValue));
@@ -456,15 +438,15 @@ export function parseFrontmatter(content: string): Frontmatter {
456
438
 
457
439
  /**
458
440
  * Resolve, from a parsed artifact's frontmatter, HOW it closes its source issue:
459
- * the `prd:` hop or the lone-task `issue:` field. A PURE helper for the FUTURE
441
+ * the `spec:` hop or the lone-task `issue:` field. A PURE helper for the FUTURE
460
442
  * CI close-job (`runner-in-ci`'s) — it is NOT wired into intake or any reader
461
443
  * today; it merely pins the one-closure-path PRECEDENCE in one place.
462
444
  *
463
- * Encodes the invariant: a task uses `issue:` XOR `prd:`. When (only a human
464
- * hand-edit could) BOTH are present, `prd:` WINS — the close-job hops to the prd's
465
- * `issue:` and IGNORES the task's own `issue:` (the fanned-prd path is the
466
- * authoritative one; a lone `issue:` on a `prd:`-bearing task is a contradiction
467
- * that degrades to "use the prd" rather than crashing).
445
+ * Encodes the invariant: a task uses `issue:` XOR `spec:`. When (only a human
446
+ * hand-edit could) BOTH are present, `spec:` WINS — the close-job hops to the
447
+ * spec's `issue:` and IGNORES the task's own `issue:` (the fanned-spec path is
448
+ * the authoritative one; a lone `issue:` on a `spec:`-bearing task is a
449
+ * contradiction that degrades to "use the spec" rather than crashing).
468
450
  *
469
451
  * Returns:
470
452
  * - `{via: 'spec', spec}` when a `spec:` is present (hop to the spec's `issue:`; the
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Tier-1 GitHub branch-protection STEP for `install-ci` (prd
2
+ * Tier-1 GitHub branch-protection STEP for `install-ci` (spec
3
3
  * `land-time-reverify-and-parallel-merge-ceiling`, task
4
4
  * `install-ci-tier1-branch-protection`; Story 11). Closes the propose-mode
5
5
  * PR-merge-time drift window on a GitHub arbiter: a required `verify` check + a
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The ADVANCE-LIFECYCLE capability emitter (PRD `runner-in-ci`, task
2
+ * The ADVANCE-LIFECYCLE capability emitter (SPEC `runner-in-ci`, task
3
3
  * `install-ci-advance-lifecycle-workflow`; capability C: auto-triage observations
4
4
  * + surface declared blockers + apply committed answers). A SELF-REGISTERING
5
5
  * module: it calls {@link registerCapability} at import time, so
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The CLOSE-JOB capability emitter (PRD `runner-in-ci`, task
2
+ * The CLOSE-JOB capability emitter (SPEC `runner-in-ci`, task
3
3
  * `install-ci-close-job-workflow`; capability E: close issues when their work
4
4
  * lands). A SELF-REGISTERING module: it calls {@link registerCapability} at import
5
5
  * time, so {@link loadCapabilityRegistry} picks it up WITHOUT any edit to a shared
@@ -1,5 +1,5 @@
1
1
  /**
2
- * REFERENCE capability registration (PRD `runner-in-ci`, task
2
+ * REFERENCE capability registration (SPEC `runner-in-ci`, task
3
3
  * `install-ci-core-and-github-adapter`). This file proves the capability-emitter
4
4
  * REGISTRY seam works as a DIRECTORY of self-registering modules: a new capability
5
5
  * is a NEW file in `install-ci-capabilities/` that calls {@link registerCapability}
@@ -1,7 +1,7 @@
1
1
  /**
2
- * The ISSUE-INTAKE capability emitter (PRD `runner-in-ci`, task
2
+ * The ISSUE-INTAKE capability emitter (SPEC `runner-in-ci`, task
3
3
  * `install-ci-intake-trigger-and-review-surface`; capability D: consider incoming
4
- * issues → task/PRD, PLUS insertion point E: surface the review verdict into the
4
+ * issues → task/SPEC, PLUS insertion point E: surface the review verdict into the
5
5
  * issue thread). A SELF-REGISTERING module: it calls {@link registerCapability} at
6
6
  * import time, so {@link loadCapabilityRegistry} picks it up WITHOUT any edit to a
7
7
  * shared central list/switch (the file-orthogonality contract — this task and the
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The VERIFY capability emitter (prd
2
+ * The VERIFY capability emitter (spec
3
3
  * `land-time-reverify-and-parallel-merge-ceiling`, task
4
4
  * `install-ci-tier1-branch-protection`; Story 11 — Tier-1 GitHub ceiling).
5
5
  * A SELF-REGISTERING module: it calls {@link registerCapability} at import
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The provider-agnostic CORE of the `install-ci` scaffolder (prd `runner-in-ci`,
2
+ * The provider-agnostic CORE of the `install-ci` scaffolder (spec `runner-in-ci`,
3
3
  * task `install-ci-core-and-github-adapter`; US #7/#10). `install-ci` is a
4
4
  * human-run, one-time SCAFFOLDER (mirrors whitesmith's `src/providers/github-ci.ts`):
5
5
  * it writes `.github/**` + a composite setup action + secrets so autonomous work
@@ -106,7 +106,7 @@ export interface CIConfigFile {
106
106
  /** API key values keyed by env var name. Only present with `--include-secrets`. */
107
107
  secrets?: Record<string, string>;
108
108
  /**
109
- * The project-setup escape hatch (prd `install-ci-project-provisioning`,
109
+ * The project-setup escape hatch (spec `install-ci-project-provisioning`,
110
110
  * task `install-ci-project-setup-hook`): a PROVIDER-NAMESPACED, OPAQUE,
111
111
  * NATIVE-SYNTAX pass-through map. The key is a provider id (today only
112
112
  * `github`); the value is the user's own project-toolchain snippet in that
@@ -197,7 +197,7 @@ export interface CIProviderContext {
197
197
  /**
198
198
  * OPTIONALLY report whether the configured credential has REPO-ADMIN scope
199
199
  * on the provider (→ can set branch protection / rulesets). Used by the
200
- * Tier-1 branch-protection step (prd `land-time-reverify-and-parallel-
200
+ * Tier-1 branch-protection step (spec `land-time-reverify-and-parallel-
201
201
  * merge-ceiling`, Story 11) to pick `auto-configure` vs `print fallback`.
202
202
  * `true` ⇒ admin, `false` ⇒ explicitly NOT admin, `undefined` ⇒ unknown
203
203
  * (treated as non-admin: never silently attempt a call that would 403).
@@ -809,7 +809,7 @@ ${indent(modelsJsonStr, 8)}
809
809
  }
810
810
 
811
811
  // PREFER-LOCAL RESOLVER (task install-ci-prefer-project-local-dorfl,
812
- // PRD install-ci-project-provisioning axis C1+C3): emit a `dorfl` SHIM
812
+ // SPEC install-ci-project-provisioning axis C1+C3): emit a `dorfl` SHIM
813
813
  // that resolves a project-local `node_modules/.bin/dorfl` FIRST (the repo's
814
814
  // devDep pin, populated by the project-setup hook's `pnpm install` — C3),
815
815
  // and falls back to the global bootstrap dorfl this composite action just
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The thin GitHub adapter for `install-ci` (prd `runner-in-ci`, task
2
+ * The thin GitHub adapter for `install-ci` (spec `runner-in-ci`, task
3
3
  * `install-ci-core-and-github-adapter`). It plugs into the provider-agnostic
4
4
  * {@link CIProviderContext} seam from `install-ci-core.ts`: the core owns the
5
5
  * wizard / config / `models.json` / `--export-config` / `--fake` / secret
package/src/install-ci.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The `install-ci` orchestrator (prd `runner-in-ci`, task
2
+ * The `install-ci` orchestrator (spec `runner-in-ci`, task
3
3
  * `install-ci-core-and-github-adapter`): ties the provider-agnostic core
4
4
  * (`install-ci-core.ts`) to a CI-provider adapter (the first being GitHub,
5
5
  * `install-ci-github.ts`) through the {@link CIProviderContext} seam. It drives
@@ -252,7 +252,7 @@ export async function installCI(
252
252
  }
253
253
 
254
254
  // 5. Assemble + write the artifacts (composite setup action + auth). The
255
- // project-setup escape hatch (prd `install-ci-project-provisioning`) lives
255
+ // project-setup escape hatch (spec `install-ci-project-provisioning`) lives
256
256
  // on `config.projectSetup` as a PROVIDER-NAMESPACED, OPAQUE map; we look up
257
257
  // THIS provider's payload via the seam (`ctx.providerId`) and ask the
258
258
  // adapter to render it to the FIRST-steps fragment (`ctx.renderProjectSetup`).
@@ -275,7 +275,7 @@ export async function installCI(
275
275
  log(` wrote ${path}`);
276
276
  }
277
277
 
278
- // 5b. Tier-1 GitHub branch protection (prd land-time-reverify-and-parallel-
278
+ // 5b. Tier-1 GitHub branch protection (spec land-time-reverify-and-parallel-
279
279
  // merge-ceiling, Story 11). Auto-configures when the credential is admin-
280
280
  // scoped (one `gh api` PUT on the protection endpoint, required check
281
281
  // `verify` + strict: true); prints the exact ready-to-run `gh api` command
@@ -313,7 +313,7 @@ export async function installCI(
313
313
  " DORFL_AUTO_TASK: 'true'",
314
314
  );
315
315
  // Project-toolchain boundary (task install-ci-document-toolchain-boundary,
316
- // PRD install-ci-project-provisioning axis (A)). dorfl declares
316
+ // SPEC install-ci-project-provisioning axis (A)). dorfl declares
317
317
  // engines.node '>=18' and the generated composite action pins Node 22 only
318
318
  // for dorfl's own runtime — it does NOT provision the project's toolchain.
319
319
  // State that boundary explicitly so a maintainer whose project pins a
@@ -1,14 +1,14 @@
1
1
  /**
2
- * **`intake`'s PURE event-classification** (task `intake-event-classification`, prd
2
+ * **`intake`'s PURE event-classification** (task `intake-event-classification`, spec
3
3
  * `issue-intake` US #2 — the resume-on-thread-change behaviour).
4
4
  *
5
5
  * `intake` is a CONVERSATION on an issue thread: a run may ASK a clarifying question
6
- * and STOP, expecting a LATER run to resume from the updated thread (prd "Loop
6
+ * and STOP, expecting a LATER run to resume from the updated thread (spec "Loop
7
7
  * closure" / the decision table's ASK row). This module is the PURE CONTROL-PATH
8
8
  * classifier the re-run depends on: given an issue EVENT, it decides whether `intake`
9
9
  * should RE-EVALUATE the whole thread or IGNORE the event.
10
10
  *
11
- * THE CANONICAL RULE (from prd `issue-intake`, "The engine shape"): *"The loop
11
+ * THE CANONICAL RULE (from spec `issue-intake`, "The engine shape"): *"The loop
12
12
  * re-runs on a new comment OR an issue-body edit (re-evaluate the whole thread); a
13
13
  * buried prior-comment edit is IGNORED."*
14
14
  *
@@ -23,7 +23,7 @@
23
23
  * distinction the rule turns on is "a NEW turn vs an edit of a BURIED prior turn",
24
24
  * NOT "edit vs reply".
25
25
  *
26
- * SCOPE FENCE (prd "Scope: the engine only"): this is ONLY the pure classifier. It is
26
+ * SCOPE FENCE (spec "Scope: the engine only"): this is ONLY the pure classifier. It is
27
27
  * NOT CI's TRIGGER POLICY (command/every-issue, maintainer/anyone) — that is
28
28
  * `runner-in-ci`'s. CI's trigger LATER CONSULTS this classifier, but the policy of
29
29
  * WHO/WHAT may trigger lives in CI, not here. This module touches no seam, no git, no
@@ -69,10 +69,10 @@ export interface IntakeEvent {
69
69
 
70
70
  /**
71
71
  * Classify an issue EVENT into the CONTROL-PATH decision: RE-EVALUATE the whole
72
- * thread, or IGNORE the event. The PURE realisation of the prd's canonical rule
72
+ * thread, or IGNORE the event. The PURE realisation of the spec's canonical rule
73
73
  * (no seam, no git, no `gh`).
74
74
  *
75
- * The table (prd `issue-intake` US #2):
75
+ * The table (spec `issue-intake` US #2):
76
76
  *
77
77
  * | event kind | decision | why |
78
78
  * | ----------------------- | ------------- | -------------------------------------------- |
@@ -2,7 +2,7 @@ import {brand} from './brand.js';
2
2
  import type {IssueComment} from './issue-provider.js';
3
3
 
4
4
  /**
5
- * **The intake MARKER** (task `intake-self-awareness-resumption-tracking`, prd
5
+ * **The intake MARKER** (task `intake-self-awareness-resumption-tracking`, spec
6
6
  * `issue-intake` US #2/#10): the ONE primitive the deterministic pre-decision
7
7
  * TRIAGE GATE is built on. A machine-readable HIDDEN HTML comment intake stamps on
8
8
  * EVERY comment it posts, recording a neutral FACT about what intake did:
@@ -26,7 +26,7 @@ import type {IssueComment} from './issue-provider.js';
26
26
  * TERMINAL is the TRIAGE's interpretation, NEVER data in the marker (no `terminal`
27
27
  * field): if a kind's terminal-ness ever changes that is a triage change and old
28
28
  * markers stay valid.
29
- * - **`slug`** \u2014 present only on `kind=created` (which task/prd intake produced).
29
+ * - **`slug`** \u2014 present only on `kind=created` (which task/spec intake produced).
30
30
  * - **`seen=<id>,\u2026`** \u2014 the per-run DELTA of HUMAN comment ids intake READ this run
31
31
  * (EXCLUDING intake's own marker-comments AND any human id already in a prior
32
32
  * marker's `seen=`). Ids, not a count, because a count cannot distinguish "a new
@@ -47,7 +47,7 @@ export interface IntakeMarker {
47
47
  kind: IntakeMarkerKind;
48
48
  /** The HUMAN comment ids intake READ this run (the per-run delta; may be empty). */
49
49
  seen: string[];
50
- /** The created task/prd slug \u2014 present only on `kind=created`. */
50
+ /** The created task/spec slug \u2014 present only on `kind=created`. */
51
51
  slug?: string;
52
52
  }
53
53
 
@@ -6,7 +6,7 @@ import {
6
6
  } from './intake-marker.js';
7
7
 
8
8
  /**
9
- * **The intake TRIAGE GATE** (task `intake-self-awareness-resumption-tracking`, prd
9
+ * **The intake TRIAGE GATE** (task `intake-self-awareness-resumption-tracking`, spec
10
10
  * `issue-intake` US #2/#10): a DETERMINISTIC pre-decision gate that runs UNDER the
11
11
  * processing lock, BEFORE the decision prompt, deciding whether intake should run
12
12
  * the prompt at all. Built ENTIRELY on the thread MARKER (no sidecar, no cursor, no
@@ -55,7 +55,7 @@ export type IntakeTriageDecision =
55
55
 
56
56
  /**
57
57
  * Run the TRIAGE over the issue's full comment thread (oldest-first, as
58
- * `listComments` returns it). The canonical branches (prd `issue-intake`):
58
+ * `listComments` returns it). The canonical branches (spec `issue-intake`):
59
59
  *
60
60
  * 1. **Last comment is INTAKE's** (carries a marker). Build `seenSet` = the UNION of
61
61
  * every intake marker's `seen=` id-list, then:
@@ -1,7 +1,7 @@
1
1
  /**
2
- * The `install-ci` ISSUE-INTAKE capability (prd `runner-in-ci`, task
2
+ * The `install-ci` ISSUE-INTAKE capability (spec `runner-in-ci`, task
3
3
  * `install-ci-intake-trigger-and-review-surface`; capability D: consider incoming
4
- * issues → task/prd, AND insertion point E: surface the review verdict back into
4
+ * issues → task/spec, AND insertion point E: surface the review verdict back into
5
5
  * the issue thread). This module GENERATES the one fixed intake workflow file and
6
6
  * STRUCTURALLY VALIDATES it, mirroring the snapshot-assertion style of
7
7
  * `advance-lifecycle-template.ts` / `advance-ci-template.ts` (the package depends on
@@ -10,13 +10,13 @@
10
10
  * ({@link deriveIntakeFlags}) — CI's merge-vs-propose POLICY, the load-bearing
11
11
  * testable logic the workflow encodes at runtime.
12
12
  *
13
- * SCOPE FENCE (prd Out-of-Scope): the issue→artifact TRANSFORM engine is
13
+ * SCOPE FENCE (spec Out-of-Scope): the issue→artifact TRANSFORM engine is
14
14
  * `issue-intake`'s (`intake <N>` + its four-outcome dispatch + the per-outcome
15
15
  * KNOBS + the lone-task review that posts to the issue thread). CI only
16
16
  * WIRES/SCHEDULES/INVOKES it and owns the merge-vs-propose POLICY + the delivery
17
17
  * surface. This module emits NO transform; it emits the WORKFLOW that calls it.
18
18
  *
19
- * The discipline (prd capability-D row + the merge-vs-propose POLICY + the two
19
+ * The discipline (spec capability-D row + the merge-vs-propose POLICY + the two
20
20
  * RESOLVED design decisions in the task):
21
21
  *
22
22
  * - TRIGGERS: `issues` opened, `issue_comment` created, and a label
@@ -36,7 +36,7 @@
36
36
  * everywhere" path is a LOUD, NON-DEFAULT opt-in — the default is conservative
37
37
  * (propose / human-in-the-loop).
38
38
  * - INSERTION POINT E (the issue-thread review surface): the review verdict over
39
- * intake's generated prds/tasks is surfaced into the ISSUE THREAD via the
39
+ * intake's generated specs/tasks is surfaced into the ISSUE THREAD via the
40
40
  * `IssueProvider.postIssueComment` seam (issue thread, by NUMBER — NOT the PR
41
41
  * seam `postPRComment`, which is keyed by url). This is REUSED, not new:
42
42
  * `intake <N>` already runs the lone-task review/edit loop and posts its
@@ -65,7 +65,7 @@ export const INTAKE_TRIGGER_CAPABILITY_ID = 'intake';
65
65
 
66
66
  /** The wizard-facing label for the issue-intake capability. */
67
67
  export const INTAKE_TRIGGER_CAPABILITY_LABEL =
68
- 'Consider incoming issues → task/prd + surface the review verdict into the issue thread (the intake trigger: issues / issue_comment / label)';
68
+ 'Consider incoming issues → task/spec + surface the review verdict into the issue thread (the intake trigger: issues / issue_comment / label)';
69
69
 
70
70
  /** The repo-relative path (under the output base) of the emitted workflow. */
71
71
  export const INTAKE_TRIGGER_WORKFLOW_PATH = 'workflows/intake.yml';
@@ -106,7 +106,7 @@ export interface IntakeIntegrationFlags {
106
106
  task: 'merge' | 'propose';
107
107
  /**
108
108
  * The ORIGIN-TRUST verdict CI passes to `intake <N>` via `--origin-trust`
109
- * (task `untrusted-origin-forces-build-propose`) so the emitted prd/task is
109
+ * (task `untrusted-origin-forces-build-propose`) so the emitted spec/task is
110
110
  * STAMPED with how it was born. Derived from the SAME `author_association` case
111
111
  * as the integration flags (it IS `authorTrusted` collapsed to the wire value),
112
112
  * so the stamp and the integration mode CANNOT desync. `intake.ts` writes it
@@ -134,7 +134,7 @@ export interface IntakeGateState {
134
134
 
135
135
  /**
136
136
  * DERIVE the per-outcome merge-vs-propose flags from the gate state COMPOSED with
137
- * author-trust — CI's merge-vs-propose POLICY (prd "merge-vs-propose POLICY" +
137
+ * author-trust — CI's merge-vs-propose POLICY (spec "merge-vs-propose POLICY" +
138
138
  * "Composed with AUTHOR-TRUST"; task Decision 1). This is the load-bearing pure
139
139
  * logic the workflow encodes at runtime (it reads `author_association` off the
140
140
  * event payload and sets the flags accordingly):
@@ -167,9 +167,9 @@ export function deriveIntakeFlags(options: {
167
167
  // ORIGIN-TRUST stamp (task `untrusted-origin-forces-build-propose`): the SAME
168
168
  // author-trust verdict, collapsed to the wire value `intake` stamps onto the
169
169
  // emitted artifact. Derived HERE — next to the integration flags, off the SAME
170
- // `authorTrusted` input — so the stamp and the task/prd modes cannot desync.
170
+ // `authorTrusted` input — so the stamp and the task/spec modes cannot desync.
171
171
  // It is NOT a re-resolution of trust (CI already resolved it); it is the verdict
172
- // being CARRIED so it survives the prd/task merge boundary (the becomes-code
172
+ // being CARRIED so it survives the spec/task merge boundary (the becomes-code
173
173
  // checkpoint is not laundered when the file lands on main).
174
174
  const originTrust: 'trusted' | 'untrusted' = authorTrusted
175
175
  ? 'trusted'
@@ -216,12 +216,12 @@ export function generateIntakeWorkflow(config: ResolvedCIConfig): string {
216
216
  const setupWith = providerSecretsWithBlock(config);
217
217
  return `\
218
218
  # dorfl — the ISSUE INTAKE trigger in CI (capability D: consider incoming
219
- # issues → task/prd, PLUS insertion point E: surface the review verdict into the
220
- # issue thread, prd runner-in-ci). EMITTED by \`dorfl install-ci\`; the human
219
+ # issues → task/spec, PLUS insertion point E: surface the review verdict into the
220
+ # issue thread, spec runner-in-ci). EMITTED by \`dorfl install-ci\`; the human
221
221
  # commits it. DO NOT hand-edit a copy — re-run install-ci to upgrade the shell.
222
222
  #
223
223
  # WHAT IT DOES — \`dorfl intake <N>\` reads issue #N + its comment thread,
224
- # runs a prompt→verdict decision (ask / task / PRD / bounce), and dispatches it.
224
+ # runs a prompt→verdict decision (ask / task / SPEC / bounce), and dispatches it.
225
225
  # CI owns ONLY the trigger + the merge-vs-propose POLICY + the delivery surface;
226
226
  # the TRANSFORM is the engine's (the Out-of-Scope fence — CI re-implements none of
227
227
  # it). The lone-task review/edit loop \`intake\` already runs ALSO surfaces its
@@ -307,7 +307,7 @@ env:
307
307
  # permissive merge side; author-trust then forces propose for a task from an
308
308
  # untrusted author.
309
309
  DORFL_AUTO_BUILD: 'false' # gate: will an agent auto-build the emitted task next?
310
- DORFL_AUTO_TASK: 'false' # gate: will an agent auto-task the emitted prd next?
310
+ DORFL_AUTO_TASK: 'false' # gate: will an agent auto-task the emitted spec next?
311
311
 
312
312
  jobs:
313
313
  intake:
@@ -365,8 +365,8 @@ jobs:
365
365
 
366
366
  # ORIGIN-TRUST stamp (task untrusted-origin-forces-build-propose):
367
367
  # derived from the SAME \${trusted} case above (one author-trust read,
368
- # two consumers — the task/prd modes AND the stamp — so they cannot
369
- # desync). \`intake\` STAMPS this onto the emitted prd/task frontmatter
368
+ # two consumers — the task/spec modes AND the stamp — so they cannot
369
+ # desync). \`intake\` STAMPS this onto the emitted spec/task frontmatter
370
370
  # (origin: issue + originTrust: <value>); it does NOT re-resolve trust
371
371
  # (that is CI's policy, passed IN). The stamp SURVIVES the merge boundary
372
372
  # so a later auto-task/auto-build of an untrusted-origin artifact still
@@ -519,7 +519,7 @@ export function validateIntakeWorkflow(text: string): IntakeTriggerValidation {
519
519
  ), 'the policy derivation must be able to emit `--propose-spec` (autoTask on).');
520
520
  // ORIGIN-TRUST stamp (task untrusted-origin-forces-build-propose): the shell
521
521
  // must derive `--origin-trust <trusted|untrusted>` from the SAME author-trust
522
- // case it uses for the task/PRD modes, and pass it to `intake` so the emitted
522
+ // case it uses for the task/SPEC modes, and pass it to `intake` so the emitted
523
523
  // artifact is stamped (the stamp + the modes cannot desync).
524
524
  require('derives-origin-trust-untrusted', /--origin-trust=untrusted\b/.test(
525
525
  operative,