@bett3r-dev/blueprint-schema 1.6.0 → 1.8.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 (235) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/build/cjs/apply-design.d.ts +5 -5
  3. package/build/cjs/apply-design.d.ts.map +1 -1
  4. package/build/cjs/apply-design.js +21 -5
  5. package/build/cjs/apply-design.js.map +1 -1
  6. package/build/cjs/apply-overrides.d.ts +3 -3
  7. package/build/cjs/apply-overrides.d.ts.map +1 -1
  8. package/build/cjs/apply-overrides.js +5 -1
  9. package/build/cjs/apply-overrides.js.map +1 -1
  10. package/build/cjs/card-channel.d.ts +18 -0
  11. package/build/cjs/card-channel.d.ts.map +1 -0
  12. package/build/cjs/card-channel.js +30 -0
  13. package/build/cjs/card-channel.js.map +1 -0
  14. package/build/cjs/convergence.d.ts +2 -2
  15. package/build/cjs/convergence.d.ts.map +1 -1
  16. package/build/cjs/coverage-links.d.ts +27 -0
  17. package/build/cjs/coverage-links.d.ts.map +1 -0
  18. package/build/cjs/coverage-links.js +117 -0
  19. package/build/cjs/coverage-links.js.map +1 -0
  20. package/build/cjs/design.d.ts +44 -2
  21. package/build/cjs/design.d.ts.map +1 -1
  22. package/build/cjs/design.js +42 -2
  23. package/build/cjs/design.js.map +1 -1
  24. package/build/cjs/diagnostics.d.ts +2 -2
  25. package/build/cjs/diagnostics.d.ts.map +1 -1
  26. package/build/cjs/edge-endpoints.d.ts +33 -0
  27. package/build/cjs/edge-endpoints.d.ts.map +1 -0
  28. package/build/cjs/edge-endpoints.js +83 -0
  29. package/build/cjs/edge-endpoints.js.map +1 -0
  30. package/build/cjs/edges.d.ts +2 -2
  31. package/build/cjs/edges.d.ts.map +1 -1
  32. package/build/cjs/edges.js +2 -1
  33. package/build/cjs/edges.js.map +1 -1
  34. package/build/cjs/effective-design.d.ts +21 -0
  35. package/build/cjs/effective-design.d.ts.map +1 -0
  36. package/build/cjs/effective-design.js +172 -0
  37. package/build/cjs/effective-design.js.map +1 -0
  38. package/build/cjs/entry-points.d.ts +2 -2
  39. package/build/cjs/entry-points.d.ts.map +1 -1
  40. package/build/cjs/find-orphan-nodes.d.ts +3 -3
  41. package/build/cjs/find-orphan-nodes.d.ts.map +1 -1
  42. package/build/cjs/flow-traversal.d.ts +3 -3
  43. package/build/cjs/flow-traversal.d.ts.map +1 -1
  44. package/build/cjs/fork-scenarios.d.ts +44 -0
  45. package/build/cjs/fork-scenarios.d.ts.map +1 -0
  46. package/build/cjs/fork-scenarios.js +83 -0
  47. package/build/cjs/fork-scenarios.js.map +1 -0
  48. package/build/cjs/graph.d.ts +27 -2
  49. package/build/cjs/graph.d.ts.map +1 -1
  50. package/build/cjs/graph.js +36 -0
  51. package/build/cjs/graph.js.map +1 -1
  52. package/build/cjs/handler-scope.d.ts +3 -3
  53. package/build/cjs/handler-scope.d.ts.map +1 -1
  54. package/build/cjs/index.d.ts +9 -0
  55. package/build/cjs/index.d.ts.map +1 -1
  56. package/build/cjs/index.js +9 -0
  57. package/build/cjs/index.js.map +1 -1
  58. package/build/cjs/invariants.d.ts +26 -0
  59. package/build/cjs/invariants.d.ts.map +1 -0
  60. package/build/cjs/invariants.js +39 -0
  61. package/build/cjs/invariants.js.map +1 -0
  62. package/build/cjs/map-links.d.ts +1 -0
  63. package/build/cjs/map-links.d.ts.map +1 -1
  64. package/build/cjs/map-links.js +14 -1
  65. package/build/cjs/map-links.js.map +1 -1
  66. package/build/cjs/map-structure.d.ts +172 -3
  67. package/build/cjs/map-structure.d.ts.map +1 -1
  68. package/build/cjs/map-structure.js +46 -4
  69. package/build/cjs/map-structure.js.map +1 -1
  70. package/build/cjs/map-vocabulary.d.ts +29 -1
  71. package/build/cjs/map-vocabulary.d.ts.map +1 -1
  72. package/build/cjs/map-vocabulary.js +72 -2
  73. package/build/cjs/map-vocabulary.js.map +1 -1
  74. package/build/cjs/nodes.d.ts +11 -1
  75. package/build/cjs/nodes.d.ts.map +1 -1
  76. package/build/cjs/nodes.js +4 -2
  77. package/build/cjs/nodes.js.map +1 -1
  78. package/build/cjs/ops.d.ts +43 -10
  79. package/build/cjs/ops.d.ts.map +1 -1
  80. package/build/cjs/ops.js +1 -1
  81. package/build/cjs/ops.js.map +1 -1
  82. package/build/cjs/overrides.d.ts +5 -2
  83. package/build/cjs/overrides.d.ts.map +1 -1
  84. package/build/cjs/overrides.js.map +1 -1
  85. package/build/cjs/package.json +1 -0
  86. package/build/cjs/reachability.d.ts +4 -4
  87. package/build/cjs/reachability.d.ts.map +1 -1
  88. package/build/cjs/reachability.js +5 -1
  89. package/build/cjs/reachability.js.map +1 -1
  90. package/build/cjs/reality-check.d.ts +4 -4
  91. package/build/cjs/reality-check.d.ts.map +1 -1
  92. package/build/cjs/reality-check.js +52 -9
  93. package/build/cjs/reality-check.js.map +1 -1
  94. package/build/cjs/session-phase.d.ts +80 -0
  95. package/build/cjs/session-phase.d.ts.map +1 -0
  96. package/build/cjs/session-phase.js +97 -0
  97. package/build/cjs/session-phase.js.map +1 -0
  98. package/build/cjs/session.d.ts +21 -0
  99. package/build/cjs/session.d.ts.map +1 -1
  100. package/build/cjs/session.js +19 -0
  101. package/build/cjs/session.js.map +1 -1
  102. package/build/cjs/spec.d.ts +140 -0
  103. package/build/cjs/spec.d.ts.map +1 -0
  104. package/build/cjs/spec.js +514 -0
  105. package/build/cjs/spec.js.map +1 -0
  106. package/build/cjs/topology.d.ts +2 -2
  107. package/build/cjs/topology.d.ts.map +1 -1
  108. package/build/cjs/topology.js +2 -0
  109. package/build/cjs/topology.js.map +1 -1
  110. package/build/cjs/unproduced-events.d.ts +10 -0
  111. package/build/cjs/unproduced-events.d.ts.map +1 -0
  112. package/build/cjs/unproduced-events.js +37 -0
  113. package/build/cjs/unproduced-events.js.map +1 -0
  114. package/build/cjs/validate-design.d.ts +3 -3
  115. package/build/cjs/validate-design.d.ts.map +1 -1
  116. package/build/cjs/validate-design.js +40 -3
  117. package/build/cjs/validate-design.js.map +1 -1
  118. package/build/esm/apply-design.d.ts +5 -5
  119. package/build/esm/apply-design.d.ts.map +1 -1
  120. package/build/esm/apply-design.js +21 -5
  121. package/build/esm/apply-design.js.map +1 -1
  122. package/build/esm/apply-overrides.d.ts +3 -3
  123. package/build/esm/apply-overrides.d.ts.map +1 -1
  124. package/build/esm/apply-overrides.js +5 -1
  125. package/build/esm/apply-overrides.js.map +1 -1
  126. package/build/esm/card-channel.d.ts +18 -0
  127. package/build/esm/card-channel.d.ts.map +1 -0
  128. package/build/esm/card-channel.js +25 -0
  129. package/build/esm/card-channel.js.map +1 -0
  130. package/build/esm/convergence.d.ts +2 -2
  131. package/build/esm/convergence.d.ts.map +1 -1
  132. package/build/esm/coverage-links.d.ts +27 -0
  133. package/build/esm/coverage-links.d.ts.map +1 -0
  134. package/build/esm/coverage-links.js +113 -0
  135. package/build/esm/coverage-links.js.map +1 -0
  136. package/build/esm/design.d.ts +44 -2
  137. package/build/esm/design.d.ts.map +1 -1
  138. package/build/esm/design.js +38 -1
  139. package/build/esm/design.js.map +1 -1
  140. package/build/esm/diagnostics.d.ts +2 -2
  141. package/build/esm/diagnostics.d.ts.map +1 -1
  142. package/build/esm/edge-endpoints.d.ts +33 -0
  143. package/build/esm/edge-endpoints.d.ts.map +1 -0
  144. package/build/esm/edge-endpoints.js +77 -0
  145. package/build/esm/edge-endpoints.js.map +1 -0
  146. package/build/esm/edges.d.ts +2 -2
  147. package/build/esm/edges.d.ts.map +1 -1
  148. package/build/esm/edges.js +2 -1
  149. package/build/esm/edges.js.map +1 -1
  150. package/build/esm/effective-design.d.ts +21 -0
  151. package/build/esm/effective-design.d.ts.map +1 -0
  152. package/build/esm/effective-design.js +169 -0
  153. package/build/esm/effective-design.js.map +1 -0
  154. package/build/esm/entry-points.d.ts +2 -2
  155. package/build/esm/entry-points.d.ts.map +1 -1
  156. package/build/esm/find-orphan-nodes.d.ts +3 -3
  157. package/build/esm/find-orphan-nodes.d.ts.map +1 -1
  158. package/build/esm/flow-traversal.d.ts +3 -3
  159. package/build/esm/flow-traversal.d.ts.map +1 -1
  160. package/build/esm/fork-scenarios.d.ts +44 -0
  161. package/build/esm/fork-scenarios.d.ts.map +1 -0
  162. package/build/esm/fork-scenarios.js +78 -0
  163. package/build/esm/fork-scenarios.js.map +1 -0
  164. package/build/esm/graph.d.ts +27 -2
  165. package/build/esm/graph.d.ts.map +1 -1
  166. package/build/esm/graph.js +33 -0
  167. package/build/esm/graph.js.map +1 -1
  168. package/build/esm/handler-scope.d.ts +3 -3
  169. package/build/esm/handler-scope.d.ts.map +1 -1
  170. package/build/esm/index.d.ts +9 -0
  171. package/build/esm/index.d.ts.map +1 -1
  172. package/build/esm/index.js +9 -0
  173. package/build/esm/index.js.map +1 -1
  174. package/build/esm/invariants.d.ts +26 -0
  175. package/build/esm/invariants.d.ts.map +1 -0
  176. package/build/esm/invariants.js +36 -0
  177. package/build/esm/invariants.js.map +1 -0
  178. package/build/esm/map-links.d.ts +1 -0
  179. package/build/esm/map-links.d.ts.map +1 -1
  180. package/build/esm/map-links.js +14 -1
  181. package/build/esm/map-links.js.map +1 -1
  182. package/build/esm/map-structure.d.ts +172 -3
  183. package/build/esm/map-structure.d.ts.map +1 -1
  184. package/build/esm/map-structure.js +42 -3
  185. package/build/esm/map-structure.js.map +1 -1
  186. package/build/esm/map-vocabulary.d.ts +29 -1
  187. package/build/esm/map-vocabulary.d.ts.map +1 -1
  188. package/build/esm/map-vocabulary.js +64 -1
  189. package/build/esm/map-vocabulary.js.map +1 -1
  190. package/build/esm/nodes.d.ts +11 -1
  191. package/build/esm/nodes.d.ts.map +1 -1
  192. package/build/esm/nodes.js +4 -2
  193. package/build/esm/nodes.js.map +1 -1
  194. package/build/esm/ops.d.ts +43 -10
  195. package/build/esm/ops.d.ts.map +1 -1
  196. package/build/esm/ops.js +1 -1
  197. package/build/esm/ops.js.map +1 -1
  198. package/build/esm/overrides.d.ts +5 -2
  199. package/build/esm/overrides.d.ts.map +1 -1
  200. package/build/esm/overrides.js.map +1 -1
  201. package/build/esm/reachability.d.ts +4 -4
  202. package/build/esm/reachability.d.ts.map +1 -1
  203. package/build/esm/reachability.js +5 -1
  204. package/build/esm/reachability.js.map +1 -1
  205. package/build/esm/reality-check.d.ts +4 -4
  206. package/build/esm/reality-check.d.ts.map +1 -1
  207. package/build/esm/reality-check.js +53 -10
  208. package/build/esm/reality-check.js.map +1 -1
  209. package/build/esm/session-phase.d.ts +80 -0
  210. package/build/esm/session-phase.d.ts.map +1 -0
  211. package/build/esm/session-phase.js +93 -0
  212. package/build/esm/session-phase.js.map +1 -0
  213. package/build/esm/session.d.ts +21 -0
  214. package/build/esm/session.d.ts.map +1 -1
  215. package/build/esm/session.js +17 -0
  216. package/build/esm/session.js.map +1 -1
  217. package/build/esm/spec.d.ts +140 -0
  218. package/build/esm/spec.d.ts.map +1 -0
  219. package/build/esm/spec.js +501 -0
  220. package/build/esm/spec.js.map +1 -0
  221. package/build/esm/topology.d.ts +2 -2
  222. package/build/esm/topology.d.ts.map +1 -1
  223. package/build/esm/topology.js +2 -0
  224. package/build/esm/topology.js.map +1 -1
  225. package/build/esm/unproduced-events.d.ts +10 -0
  226. package/build/esm/unproduced-events.d.ts.map +1 -0
  227. package/build/esm/unproduced-events.js +32 -0
  228. package/build/esm/unproduced-events.js.map +1 -0
  229. package/build/esm/validate-design.d.ts +3 -3
  230. package/build/esm/validate-design.d.ts.map +1 -1
  231. package/build/esm/validate-design.js +41 -4
  232. package/build/esm/validate-design.js.map +1 -1
  233. package/build/tsconfig.tsbuildinfo +1 -1
  234. package/package.json +14 -4
  235. package/schema/map.schema.json +62 -1
@@ -0,0 +1,80 @@
1
+ import type { SessionStage } from './session.js';
2
+ /**
3
+ * What a session is doing now, beside its lifecycle state (active / unanchored / frozen), which says only whether it
4
+ * is anchored. A phase is derived, never stored: the server reads the session's newest facts (its design job, its
5
+ * Design done chain, its implementation dispatch, its agent's commit signals, its branch's merge) and sessionPhaseOf picks
6
+ * the one that describes the present. `merged` is the end: the ticket branch landed and nothing waits on anyone.
7
+ */
8
+ export declare const SESSION_PHASES: readonly ["designing", "design-done", "implementing", "review", "needs-human", "blocked", "merged"];
9
+ export type SessionPhaseName = typeof SESSION_PHASES[number];
10
+ /** Who the session waits on: its agent working, a person acting, a runner claiming a queued job, or nobody (it ended). */
11
+ export declare const SESSION_PHASE_WAITING_ON: readonly ["agent", "you", "runner", "nobody"];
12
+ export type SessionPhaseWaitingOn = typeof SESSION_PHASE_WAITING_ON[number];
13
+ /**
14
+ * The precise situation, each code belonging to one phase (PHASE_OF_CODE). A view words the code; `reason`, `step` and
15
+ * `link` carry what the wording names.
16
+ */
17
+ export declare const SESSION_PHASE_CODES: readonly ["design-queued", "design-running", "agent-replied", "map-ready", "design-ready", "design-failed", "design-finishing", "design-finish-failed", "design-done", "dispatch-queued", "dispatch-starting", "agent-working", "dispatch-failed", "dispatch-refused", "needs-human", "pr-ready", "merged"];
18
+ export type SessionPhaseCode = typeof SESSION_PHASE_CODES[number];
19
+ export declare const PHASE_OF_CODE: Record<SessionPhaseCode, SessionPhaseName>;
20
+ /**
21
+ * A session's phase. `since` is when the deciding fact happened (ISO). `step` is the step a running job or the Design
22
+ * done chain is at; `reason` a failure reason, a refused dispatch's outcome or a signal commit's subject; `link` the
23
+ * implementation agent's live Claude Code session.
24
+ */
25
+ export type SessionPhase = {
26
+ phase: SessionPhaseName;
27
+ code: SessionPhaseCode;
28
+ waitingOn: SessionPhaseWaitingOn;
29
+ since: string;
30
+ step?: string;
31
+ reason?: string;
32
+ link?: string;
33
+ };
34
+ type JobStatus = 'queued' | 'claimed' | 'done' | 'failed';
35
+ /**
36
+ * The facts a phase is derived from, each the session's newest of its kind; `at` is when it last changed (ISO).
37
+ * `designJob.stage` is the stage the job was claimed in, when it recorded one. `merge` is the session's branch merging into
38
+ * `target`, as the runner's merge poll reported it.
39
+ */
40
+ export type SessionPhaseFacts = {
41
+ ticket: boolean;
42
+ stage?: SessionStage;
43
+ designJob?: {
44
+ status: JobStatus;
45
+ step: string | null;
46
+ stage: string | null;
47
+ failureReason: string | null;
48
+ at: string;
49
+ };
50
+ completion?: {
51
+ step: 'bundle' | 'scaffold' | 'transition' | 'done';
52
+ failed: boolean;
53
+ failureReason: string | null;
54
+ at: string;
55
+ };
56
+ dispatch?: {
57
+ outcome: string;
58
+ status: JobStatus | null;
59
+ failureReason: string | null;
60
+ sessionUrl: string | null;
61
+ at: string;
62
+ };
63
+ signal?: {
64
+ value: 'done' | 'needs-human';
65
+ subject: string;
66
+ at: string;
67
+ };
68
+ merge?: {
69
+ target: string;
70
+ at: string;
71
+ };
72
+ };
73
+ /**
74
+ * The session's phase: of its facts, the newest decides. A finished design job (done) never outranks a later stage's
75
+ * fact, so a reply to a board comment during implementation does not read as the session designing again; a design job
76
+ * still queued or running does, while it runs. Undefined for a session with none of the facts.
77
+ */
78
+ export declare const sessionPhaseOf: (facts: SessionPhaseFacts) => SessionPhase | undefined;
79
+ export {};
80
+ //# sourceMappingURL=session-phase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-phase.d.ts","sourceRoot":"","sources":["../../src/session-phase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,qGAAwG,CAAC;AACpI,MAAM,MAAM,gBAAgB,GAAG,OAAO,cAAc,CAAE,MAAM,CAAE,CAAC;AAE/D,0HAA0H;AAC1H,eAAO,MAAM,wBAAwB,+CAAkD,CAAC;AACxF,MAAM,MAAM,qBAAqB,GAAG,OAAO,wBAAwB,CAAE,MAAM,CAAE,CAAC;AAE9E;;;GAGG;AACH,eAAO,MAAM,mBAAmB,6SAKtB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,OAAO,mBAAmB,CAAE,MAAM,CAAE,CAAC;AAEpE,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAkBpE,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1D;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACvH,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAChI,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9H,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACxC,CAAC;AAsCF;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAK,OAAO,iBAAiB,KAAI,YAAY,GAAG,SAa1E,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * What a session is doing now, beside its lifecycle state (active / unanchored / frozen), which says only whether it
3
+ * is anchored. A phase is derived, never stored: the server reads the session's newest facts (its design job, its
4
+ * Design done chain, its implementation dispatch, its agent's commit signals, its branch's merge) and sessionPhaseOf picks
5
+ * the one that describes the present. `merged` is the end: the ticket branch landed and nothing waits on anyone.
6
+ */
7
+ export const SESSION_PHASES = ['designing', 'design-done', 'implementing', 'review', 'needs-human', 'blocked', 'merged'];
8
+ /** Who the session waits on: its agent working, a person acting, a runner claiming a queued job, or nobody (it ended). */
9
+ export const SESSION_PHASE_WAITING_ON = ['agent', 'you', 'runner', 'nobody'];
10
+ /**
11
+ * The precise situation, each code belonging to one phase (PHASE_OF_CODE). A view words the code; `reason`, `step` and
12
+ * `link` carry what the wording names.
13
+ */
14
+ export const SESSION_PHASE_CODES = [
15
+ 'design-queued', 'design-running', 'agent-replied', 'map-ready', 'design-ready', 'design-failed',
16
+ 'design-finishing', 'design-finish-failed', 'design-done',
17
+ 'dispatch-queued', 'dispatch-starting', 'agent-working', 'dispatch-failed', 'dispatch-refused',
18
+ 'needs-human', 'pr-ready', 'merged'
19
+ ];
20
+ export const PHASE_OF_CODE = {
21
+ 'design-queued': 'designing',
22
+ 'design-running': 'designing',
23
+ 'agent-replied': 'designing',
24
+ 'map-ready': 'designing',
25
+ 'design-ready': 'designing',
26
+ 'design-failed': 'blocked',
27
+ 'design-finishing': 'designing',
28
+ 'design-finish-failed': 'blocked',
29
+ 'design-done': 'design-done',
30
+ 'dispatch-queued': 'implementing',
31
+ 'dispatch-starting': 'implementing',
32
+ 'agent-working': 'implementing',
33
+ 'dispatch-failed': 'blocked',
34
+ 'dispatch-refused': 'blocked',
35
+ 'needs-human': 'needs-human',
36
+ 'pr-ready': 'review',
37
+ merged: 'merged'
38
+ };
39
+ const phase = (code, waitingOn, since, extra = {}) => ({
40
+ phase: PHASE_OF_CODE[code], code, waitingOn, since,
41
+ ...Object.fromEntries(Object.entries(extra).filter(([, value]) => value !== undefined && value !== null && value !== ''))
42
+ });
43
+ const designPhase = (facts, job) => {
44
+ const step = job.step ?? undefined;
45
+ if (job.status === 'queued')
46
+ return phase('design-queued', 'runner', job.at);
47
+ if (job.status === 'claimed')
48
+ return phase('design-running', 'agent', job.at, { step });
49
+ if (job.status === 'failed')
50
+ return phase('design-failed', 'you', job.at, { reason: job.failureReason ?? undefined });
51
+ if (!facts.ticket)
52
+ return phase('agent-replied', 'you', job.at);
53
+ return phase((job.stage ?? facts.stage) === 'program' ? 'design-ready' : 'map-ready', 'you', job.at);
54
+ };
55
+ const completionPhase = (completion) => {
56
+ if (completion.step === 'done')
57
+ return phase('design-done', 'you', completion.at);
58
+ if (completion.failed)
59
+ return phase('design-finish-failed', 'you', completion.at, { step: completion.step, reason: completion.failureReason ?? undefined });
60
+ return phase('design-finishing', 'runner', completion.at, { step: completion.step });
61
+ };
62
+ const dispatchPhase = (dispatch) => {
63
+ if (dispatch.outcome !== 'dispatched')
64
+ return phase('dispatch-refused', 'you', dispatch.at, { reason: dispatch.outcome });
65
+ if (dispatch.status === 'done')
66
+ return phase('agent-working', 'agent', dispatch.at, { link: dispatch.sessionUrl ?? undefined });
67
+ if (dispatch.status === 'failed')
68
+ return phase('dispatch-failed', 'you', dispatch.at, { reason: dispatch.failureReason ?? undefined });
69
+ if (dispatch.status === 'claimed')
70
+ return phase('dispatch-starting', 'runner', dispatch.at);
71
+ return phase('dispatch-queued', 'runner', dispatch.at);
72
+ };
73
+ const signalPhase = (signal) => signal.value === 'needs-human'
74
+ ? phase('needs-human', 'you', signal.at, { reason: signal.subject })
75
+ : phase('pr-ready', 'you', signal.at);
76
+ const mergePhase = (merge) => phase('merged', 'nobody', merge.at, { reason: merge.target });
77
+ /**
78
+ * The session's phase: of its facts, the newest decides. A finished design job (done) never outranks a later stage's
79
+ * fact, so a reply to a board comment during implementation does not read as the session designing again; a design job
80
+ * still queued or running does, while it runs. Undefined for a session with none of the facts.
81
+ */
82
+ export const sessionPhaseOf = (facts) => {
83
+ const later = [
84
+ facts.completion && completionPhase(facts.completion),
85
+ facts.dispatch && dispatchPhase(facts.dispatch),
86
+ facts.signal && signalPhase(facts.signal),
87
+ facts.merge && mergePhase(facts.merge)
88
+ ].filter((candidate) => candidate !== undefined);
89
+ const job = facts.designJob;
90
+ const candidates = job === undefined || (job.status === 'done' && later.length > 0) ? later : [...later, designPhase(facts, job)];
91
+ return candidates.reduce((newest, candidate) => newest === undefined || Date.parse(candidate.since) > Date.parse(newest.since) ? candidate : newest, undefined);
92
+ };
93
+ //# sourceMappingURL=session-phase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-phase.js","sourceRoot":"","sources":["../../src/session-phase.ts"],"names":[],"mappings":"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"}
@@ -26,7 +26,17 @@ export type DesignSession = RealityPointer & {
26
26
  frozenFrom?: Exclude<SessionState, 'frozen'>;
27
27
  ticketRefs?: string[];
28
28
  prRef?: string;
29
+ /** ESAS-329 (F6): the stage the session's chain moved it to; absent until a `stage-advance` lands. Read it through stageOf. */
30
+ stage?: SessionStage;
31
+ /** ESAS-329: the Map agreed press that moved a ticket session to the program stage: its op seq, when and by whom. */
32
+ mapAgreed?: {
33
+ seq: number;
34
+ at: string;
35
+ by: ActorId;
36
+ };
29
37
  };
38
+ /** ESAS-329 (F8): a ticket session's stages, in order; Map agreed moves it from the first to the second, irreversibly. */
39
+ export type SessionStage = 'map' | 'program';
30
40
  export type SessionEvent = {
31
41
  type: 'attach';
32
42
  provider: ActorId;
@@ -42,4 +52,15 @@ export type SessionEvent = {
42
52
  };
43
53
  export declare function applySessionEvent(session: DesignSession, event: SessionEvent): DesignSession;
44
54
  export declare function isSessionFrozen(session: Pick<DesignSession, 'state'>): boolean;
55
+ /**
56
+ * ESAS-326 (S1): a ticket session names at least one ticket in `ticketRefs`; a session with none, or an empty list,
57
+ * is not one. The Design done press refuses any other session NOT_A_TICKET_SESSION; it is exported for ESAS-329's
58
+ * stageOf and the web-app to read the same predicate.
59
+ */
60
+ export declare function isTicketSession(session: Pick<DesignSession, 'ticketRefs'>): boolean;
61
+ /**
62
+ * ESAS-329 (F1): the session's stage. The stored stage when a `stage-advance` moved it; otherwise `'map'` for a ticket
63
+ * session, created before ESAS-329 or not; otherwise undefined: a session with no ticket refs runs in no stage.
64
+ */
65
+ export declare function stageOf(session: Pick<DesignSession, 'ticketRefs' | 'stage'>): SessionStage | undefined;
45
66
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAErC,eAAO,MAAM,sBAAsB,EAAE,oBAAwB,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE9D,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAAyC,CAAC;AAE5F,wBAAgB,cAAc,CAAE,KAAK,EAAE,OAAO,GAAI,KAAK,IAAI,YAAY,CAEtE;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAC3C,aAAa,EAAE,oBAAoB,CAAC;IACpC,EAAE,EAAE,SAAS,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAMvB,wBAAgB,iBAAiB,CAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,GAAI,aAAa,CAgC9F;AAED,wBAAgB,eAAe,CAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAI,OAAO,CAEhF"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAErC,eAAO,MAAM,sBAAsB,EAAE,oBAAwB,CAAC;AAE9D,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE9D,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAAyC,CAAC;AAE5F,wBAAgB,cAAc,CAAE,KAAK,EAAE,OAAO,GAAI,KAAK,IAAI,YAAY,CAEtE;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAC3C,aAAa,EAAE,oBAAoB,CAAC;IACpC,EAAE,EAAE,SAAS,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+HAA+H;IAC/H,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,qHAAqH;IACrH,SAAS,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE,CAAC;CACtD,CAAC;AAEF,0HAA0H;AAC1H,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,CAAC;AAE7C,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAMvB,wBAAgB,iBAAiB,CAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,GAAI,aAAa,CAgC9F;AAED,wBAAgB,eAAe,CAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,GAAI,OAAO,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,GAAI,OAAO,CAErF;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,OAAO,CAAC,GAAI,YAAY,GAAG,SAAS,CAGxG"}
@@ -46,4 +46,21 @@ export function applySessionEvent(session, event) {
46
46
  export function isSessionFrozen(session) {
47
47
  return session.state === 'frozen';
48
48
  }
49
+ /**
50
+ * ESAS-326 (S1): a ticket session names at least one ticket in `ticketRefs`; a session with none, or an empty list,
51
+ * is not one. The Design done press refuses any other session NOT_A_TICKET_SESSION; it is exported for ESAS-329's
52
+ * stageOf and the web-app to read the same predicate.
53
+ */
54
+ export function isTicketSession(session) {
55
+ return (session.ticketRefs?.length ?? 0) > 0;
56
+ }
57
+ /**
58
+ * ESAS-329 (F1): the session's stage. The stored stage when a `stage-advance` moved it; otherwise `'map'` for a ticket
59
+ * session, created before ESAS-329 or not; otherwise undefined: a session with no ticket refs runs in no stage.
60
+ */
61
+ export function stageOf(session) {
62
+ if (session.stage !== undefined)
63
+ return session.stage;
64
+ return isTicketSession(session) ? 'map' : undefined;
65
+ }
49
66
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,sBAAsB,GAAyB,CAAC,CAAC;AAQ9D,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAE,CAAC;AAE5F,MAAM,UAAU,cAAc,CAAE,KAAc;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAM,cAAqC,CAAC,QAAQ,CAAE,KAAK,CAAE,CAAC;AAChG,CAAC;AA8BD,SAAS,eAAe,CAAE,YAAgC,EAAE,KAAc;IACxE,OAAO,YAAY,CAAC,QAAQ,CAAE,KAAK,CAAE,CAAC,CAAC,CAAC,CAAE,GAAG,YAAY,CAAE,CAAC,CAAC,CAAC,CAAE,GAAG,YAAY,EAAE,KAAK,CAAE,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAE,OAAsB,EAAE,KAAmB;IAC5E,QAAS,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAK,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAG,OAAO,OAAO,CAAC;YACjD,OAAO;gBACL,GAAG,OAAO;gBACV,KAAK,EAAE,QAAQ;gBACf,eAAe,EAAE,KAAK,CAAC,QAAQ;gBAC/B,UAAU,EAAE,KAAK,CAAC,GAAG;gBACrB,SAAS,EAAE,KAAK,CAAC,EAAE;gBACnB,YAAY,EAAE,eAAe,CAAE,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAE;aACtE,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAK,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAG,OAAO,OAAO,CAAC;YACjD,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAClE,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAK,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAG,OAAO,OAAO,CAAC;YACjD,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QACpE,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAK,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAG,OAAO,OAAO,CAAC;YACjD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;YACxC,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,UAAU,IAAI,YAAY,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,KAAK,CAAC;YACjC,KAAK,WAAW,CAAC;YACjB,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAE,OAAqC;IACpE,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,sBAAsB,GAAyB,CAAC,CAAC;AAQ9D,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAE,CAAC;AAE5F,MAAM,UAAU,cAAc,CAAE,KAAc;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAM,cAAqC,CAAC,QAAQ,CAAE,KAAK,CAAE,CAAC;AAChG,CAAC;AAqCD,SAAS,eAAe,CAAE,YAAgC,EAAE,KAAc;IACxE,OAAO,YAAY,CAAC,QAAQ,CAAE,KAAK,CAAE,CAAC,CAAC,CAAC,CAAE,GAAG,YAAY,CAAE,CAAC,CAAC,CAAC,CAAE,GAAG,YAAY,EAAE,KAAK,CAAE,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAE,OAAsB,EAAE,KAAmB;IAC5E,QAAS,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAK,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAG,OAAO,OAAO,CAAC;YACjD,OAAO;gBACL,GAAG,OAAO;gBACV,KAAK,EAAE,QAAQ;gBACf,eAAe,EAAE,KAAK,CAAC,QAAQ;gBAC/B,UAAU,EAAE,KAAK,CAAC,GAAG;gBACrB,SAAS,EAAE,KAAK,CAAC,EAAE;gBACnB,YAAY,EAAE,eAAe,CAAE,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAE;aACtE,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAK,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAG,OAAO,OAAO,CAAC;YACjD,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAClE,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAK,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAG,OAAO,OAAO,CAAC;YACjD,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QACpE,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAK,OAAO,CAAC,KAAK,KAAK,QAAQ;gBAAG,OAAO,OAAO,CAAC;YACjD,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;YACxC,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,UAAU,IAAI,YAAY,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,KAAK,CAAC;YACjC,KAAK,WAAW,CAAC;YACjB,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAE,OAAqC;IACpE,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAE,OAA0C;IACzE,OAAO,CAAE,OAAO,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAE,GAAG,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAE,OAAoD;IAC3E,IAAK,OAAO,CAAC,KAAK,KAAK,SAAS;QAAG,OAAO,OAAO,CAAC,KAAK,CAAC;IACxD,OAAO,eAAe,CAAE,OAAO,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC"}
@@ -0,0 +1,140 @@
1
+ import { type DesignFile } from './design.js';
2
+ import type { MapEntryId, MapFile } from './map-structure.js';
3
+ import type { Op } from './ops.js';
4
+ export type SpecVersion = 1;
5
+ export declare const SPEC_VERSION: SpecVersion;
6
+ export type SpecEntryId = string;
7
+ export declare const SPEC_SECTION_IDS: readonly ["problem", "solution", "userStories", "decisionTree", "implementationDecisions", "testingDecisions", "risks", "outOfScope", "provenance"];
8
+ export type SpecSectionId = typeof SPEC_SECTION_IDS[number];
9
+ /**
10
+ * F2: a typed entry with a markdown body. `kind` types it within its section (a `story`, a `rationale`, a
11
+ * `tracer-bullet`); `refs` name the map entries it anchors to (a story's impact and actor, a rationale's fork);
12
+ * `fields` hold the few named values its kind requires. The fold keeps what was posted; judging an entry's
13
+ * kind and fields is the completeness check's.
14
+ */
15
+ export type SpecEntry = {
16
+ id: SpecEntryId;
17
+ section: SpecSectionId;
18
+ kind: string;
19
+ title?: string;
20
+ /** Markdown; the prose stays free (F2). */
21
+ body: string;
22
+ refs?: MapEntryId[];
23
+ fields?: Record<string, string>;
24
+ struck?: {
25
+ reason: string;
26
+ };
27
+ };
28
+ export type SpecFile = {
29
+ specVersion: SpecVersion;
30
+ entries: SpecEntry[];
31
+ };
32
+ /** A spec-post as the feed stores it: a batch of entries, each upserted by its id. */
33
+ export type SpecPostOpPayload = {
34
+ entries: Array<Omit<SpecEntry, 'struck'>>;
35
+ };
36
+ export type SpecStrike = {
37
+ id: SpecEntryId;
38
+ reason: string;
39
+ };
40
+ export type SpecStrikeOpPayload = {
41
+ entries: SpecStrike[];
42
+ };
43
+ /** What one spec op folds: the entries it upserts and the ids it strikes. */
44
+ export type SpecBatch = {
45
+ posted: SpecEntry[];
46
+ struck: SpecStrike[];
47
+ };
48
+ export declare function emptySpec(): SpecFile;
49
+ export declare function isSpecSectionId(value: unknown): value is SpecSectionId;
50
+ /** A spec-post's payload as a batch: every readable entry, in payload order. */
51
+ export declare function specPostBatch(payload: unknown): SpecBatch;
52
+ /** A spec-strike's payload as a batch: every readable id with its reason. */
53
+ export declare function specStrikeBatch(payload: unknown): SpecBatch;
54
+ /**
55
+ * The one spec fold, which both replay copies call (F5, F6). A post upserts by id in place, so a re-post keeps
56
+ * the entry's position and clears a strike; a strike of an id the spec does not hold changes nothing.
57
+ */
58
+ export declare function foldSpecBatch(current: SpecFile, batch: SpecBatch): SpecFile;
59
+ export type SpecGapCode = 'fork-open' | 'section-empty' | 'tracer-bullet' | 'element-unlinked' | 'impact-without-story' | 'rationale-missing' | 'ref-struck' | 'owner-changes-unread' | 'question-open' | 'scenario-proposed' | 'deliverable-without-element' | 'element-review-pending' | 'stage-not-program';
60
+ export type SpecGap = {
61
+ code: SpecGapCode;
62
+ section?: SpecSectionId;
63
+ ref?: string;
64
+ message: string;
65
+ };
66
+ export type SpecCheckInput = {
67
+ ops: readonly Op[];
68
+ design: DesignFile;
69
+ map: MapFile;
70
+ spec: SpecFile;
71
+ agentSyncSeq: number | null;
72
+ };
73
+ /** The session a render names in its provenance header; a bundle manifest satisfies it. */
74
+ export type SpecManifest = {
75
+ sessionId: string;
76
+ name: string;
77
+ ticketRefs: readonly string[];
78
+ };
79
+ /** The three folds one replay holds after folding a feed. */
80
+ export type SpecReplayed = {
81
+ design: DesignFile;
82
+ map: MapFile;
83
+ spec: SpecFile;
84
+ };
85
+ /** A replay of the feed: blueprint-store's replayOps or the session engine's; the render folds through it. */
86
+ export type SpecReplay = (ops: readonly Op[]) => SpecReplayed;
87
+ export type SpecRenderInput = {
88
+ ops: readonly Op[];
89
+ manifest: SpecManifest;
90
+ replay: SpecReplay;
91
+ };
92
+ export declare function specSourceSeq(ops: readonly Op[]): number;
93
+ /**
94
+ * F7, F8: blueprint.md, the written sections in spine order with the derived ones (decision tree, scenarios,
95
+ * observations, artifacts) read from the same fold, under a provenance header that prints the source seq.
96
+ * Specification v1: its normative parts, which an implementation agent parses, are the front matter's `key`, the
97
+ * `## Scenarios` (each `- <id> — <title> (<note>)` with its Given, When and Then) and the `## Artifacts` (each node and
98
+ * edge with its id, type and verb); every other section is prose for people.
99
+ */
100
+ export declare function renderBlueprint(input: SpecRenderInput): string;
101
+ /**
102
+ * decisions.md: per fork its question, the chosen option, who decided, why, and every rejected option with its
103
+ * rejectedBecause; an open, moot or locked fork says so instead.
104
+ */
105
+ export declare function renderDecisions(input: SpecRenderInput): string;
106
+ /**
107
+ * F13: the check takes a scope, not a stage. At `map` it asks only for what the map stage writes (the forks,
108
+ * Problem, Solution, the stories and rationales, freshness); at `design` it asks for everything.
109
+ */
110
+ export type SpecCheckScope = 'map' | 'design';
111
+ /** The written sections that must hold a live entry, per scope; User Stories and the rationales have their own codes. */
112
+ export declare const SPEC_REQUIRED_SECTIONS: {
113
+ readonly [Scope in SpecCheckScope]: readonly SpecSectionId[];
114
+ };
115
+ /** The spine's Testing Decisions name exactly one tracer bullet. */
116
+ export declare const TRACER_BULLET_KIND = "tracer-bullet";
117
+ /**
118
+ * ESAS-331 F3, S5: every gap between the session's state and a handoff, in the order SpecGapCode lists the codes.
119
+ * ESAS-330's three codes read the map fold's own agreedAt and review, and joinMapLinks' unserved list.
120
+ */
121
+ export declare function checkSpecCompleteness(input: SpecCheckInput, scope?: SpecCheckScope): {
122
+ complete: boolean;
123
+ gaps: SpecGap[];
124
+ };
125
+ export type BlueprintFiles = {
126
+ 'blueprint.md': string;
127
+ 'decisions.md': string;
128
+ };
129
+ /**
130
+ * F10, F14: the two files Design done's flush commits, or the gaps that refuse it. `replay` is the deviation D2
131
+ * names: blueprint-schema cannot fold design and map, so the caller passes the replay it holds.
132
+ */
133
+ export declare function blueprintFileOf(ops: readonly Op[], manifest: SpecManifest, agentSyncSeq: number | null, replay: SpecReplay): {
134
+ ok: true;
135
+ files: BlueprintFiles;
136
+ } | {
137
+ ok: false;
138
+ gaps: SpecGap[];
139
+ };
140
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/spec.ts"],"names":[],"mappings":"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"}