ex-workflow 0.2.0-stage → 0.4.0-stage

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 (87) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/README.md +54 -12
  3. package/dist/adapters/index.cjs +1 -1
  4. package/dist/adapters/index.mjs +1 -1
  5. package/dist/chunk-36M6OVUJ.mjs +2 -0
  6. package/dist/chunk-36M6OVUJ.mjs.map +1 -0
  7. package/dist/{chunk-472WEDPJ.cjs → chunk-7KF5K3L7.cjs} +2 -2
  8. package/dist/{chunk-472WEDPJ.cjs.map → chunk-7KF5K3L7.cjs.map} +1 -1
  9. package/dist/chunk-CWBH7H52.cjs +2 -0
  10. package/dist/chunk-CWBH7H52.cjs.map +1 -0
  11. package/dist/chunk-DXC2RSN5.cjs +3 -0
  12. package/dist/chunk-DXC2RSN5.cjs.map +1 -0
  13. package/dist/{chunk-XSXHEEJX.mjs → chunk-GATJZYTB.mjs} +2 -2
  14. package/dist/{chunk-XSXHEEJX.mjs.map → chunk-GATJZYTB.mjs.map} +1 -1
  15. package/dist/chunk-GFH2FEZH.mjs +2 -0
  16. package/dist/chunk-GFH2FEZH.mjs.map +1 -0
  17. package/dist/{chunk-DBR24RTX.cjs → chunk-HHC5EZ54.cjs} +2 -2
  18. package/dist/{chunk-DBR24RTX.cjs.map → chunk-HHC5EZ54.cjs.map} +1 -1
  19. package/dist/chunk-KSKEFYY7.cjs +2 -0
  20. package/dist/chunk-KSKEFYY7.cjs.map +1 -0
  21. package/dist/chunk-KUUIAKEJ.cjs +2 -0
  22. package/dist/chunk-KUUIAKEJ.cjs.map +1 -0
  23. package/dist/{chunk-IBRC36PE.mjs → chunk-L2ZN6HEL.mjs} +2 -2
  24. package/dist/{chunk-IBRC36PE.mjs.map → chunk-L2ZN6HEL.mjs.map} +1 -1
  25. package/dist/chunk-NDORREWR.mjs +2 -0
  26. package/dist/chunk-NDORREWR.mjs.map +1 -0
  27. package/dist/{chunk-VN2UYV2O.mjs → chunk-NZ2DIDOD.mjs} +2 -2
  28. package/dist/{chunk-VN2UYV2O.mjs.map → chunk-NZ2DIDOD.mjs.map} +1 -1
  29. package/dist/chunk-OHSQ52DW.mjs +6 -0
  30. package/dist/chunk-OHSQ52DW.mjs.map +1 -0
  31. package/dist/chunk-RSKZVOYC.cjs +6 -0
  32. package/dist/chunk-RSKZVOYC.cjs.map +1 -0
  33. package/dist/chunk-S22CPYXJ.mjs +3 -0
  34. package/dist/chunk-S22CPYXJ.mjs.map +1 -0
  35. package/dist/chunk-SHAPFMVP.mjs +2 -0
  36. package/dist/chunk-SHAPFMVP.mjs.map +1 -0
  37. package/dist/chunk-SJRRQZ3R.cjs +2 -0
  38. package/dist/chunk-SJRRQZ3R.cjs.map +1 -0
  39. package/dist/{chunk-D4HNETUL.cjs → chunk-UM5X2JHB.cjs} +2 -2
  40. package/dist/{chunk-D4HNETUL.cjs.map → chunk-UM5X2JHB.cjs.map} +1 -1
  41. package/dist/cli/bin.cjs +1 -1
  42. package/dist/cli/bin.cjs.map +1 -1
  43. package/dist/cli/bin.mjs +1 -1
  44. package/dist/cli/bin.mjs.map +1 -1
  45. package/dist/cli/index.cjs +1 -1
  46. package/dist/cli/index.mjs +1 -1
  47. package/dist/index.cjs +1 -1
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.cts +8 -8
  50. package/dist/index.d.ts +8 -8
  51. package/dist/index.mjs +1 -1
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/kanban/index.cjs +1 -1
  54. package/dist/kanban/index.mjs +1 -1
  55. package/dist/schema/index.cjs +2 -0
  56. package/dist/schema/index.cjs.map +1 -0
  57. package/dist/schema/index.d.cts +57 -0
  58. package/dist/schema/index.d.ts +57 -0
  59. package/dist/schema/index.mjs +2 -0
  60. package/dist/schema/index.mjs.map +1 -0
  61. package/dist/scrum/index.cjs +1 -1
  62. package/dist/scrum/index.mjs +1 -1
  63. package/dist/types.d.cts +38 -2
  64. package/dist/types.d.ts +38 -2
  65. package/dist/waterfall/index.cjs +2 -0
  66. package/dist/waterfall/index.cjs.map +1 -0
  67. package/dist/waterfall/index.d.cts +148 -0
  68. package/dist/waterfall/index.d.ts +148 -0
  69. package/dist/waterfall/index.mjs +2 -0
  70. package/dist/waterfall/index.mjs.map +1 -0
  71. package/package.json +31 -2
  72. package/dist/chunk-6R3YFUUV.cjs +0 -6
  73. package/dist/chunk-6R3YFUUV.cjs.map +0 -1
  74. package/dist/chunk-JDVE7DQR.cjs +0 -2
  75. package/dist/chunk-JDVE7DQR.cjs.map +0 -1
  76. package/dist/chunk-NQU5TH3A.mjs +0 -2
  77. package/dist/chunk-NQU5TH3A.mjs.map +0 -1
  78. package/dist/chunk-NRAPI3GV.cjs +0 -2
  79. package/dist/chunk-NRAPI3GV.cjs.map +0 -1
  80. package/dist/chunk-PD5FBDN7.mjs +0 -2
  81. package/dist/chunk-PD5FBDN7.mjs.map +0 -1
  82. package/dist/chunk-QDT35LXB.cjs +0 -2
  83. package/dist/chunk-QDT35LXB.cjs.map +0 -1
  84. package/dist/chunk-VGD4V5BA.mjs +0 -6
  85. package/dist/chunk-VGD4V5BA.mjs.map +0 -1
  86. package/dist/chunk-YJNDBKIG.mjs +0 -2
  87. package/dist/chunk-YJNDBKIG.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/waterfall/config.ts","../src/waterfall/phases.ts","../src/waterfall/baseline.ts","../src/waterfall/change.ts","../src/waterfall/retro.ts","../src/waterfall/traceability.ts","../src/waterfall/ceremonies.ts","../src/waterfall/metrics.ts","../src/waterfall/roles.ts","../src/waterfall/rules.ts","../src/waterfall/stages.ts","../src/waterfall/index.ts"],"names":["DEFAULT_PHASE_IDS","DEFAULT_DELIVERABLES","DEFAULT_DELIVER_BY","GATE_ID","id","CHANGE_GATE","CAPABILITIES","title","defaultPhases","p","by","configOf","state","isObj","x","strings","s","budget","raw","where","fail","out","k","v","requirements","q","phase","i","human","assertId","deliverables","gate","g","evidence","b","validateWaterfallConfig","c","hg","phases","ids","dupe","cc","changeControl","tr","traceability","to","t","WORK","REVIEW","DONE","phasesOf","ph","withPhases","phaseIndex","idx","getPhase","phaseOf","item","seen","cur","itemsInPhase","phaseId","openPhase","currentPhase","isFrozen","producedKinds","kinds","it","e","missingDeliverables","extra","have","wanted","lastToPhase","order","a","closeIteration","prefix","outcome","now","openIteration","baselinePhase","approvedBy","items","itemSnapshot","earlier","baseline","appendEvent","reopenPhases","reopened","suspended","earliest","open","approveChange","changeId","note","cr","getItem","ia","r","moveItem","rejectChange","LESSON_SCOPES","validLessons","l","assertRefs","adopt","dismiss","refs","ref","phaseRetrospective","methodology","input","requireCap","wantPhase","newLessons","d","applyAction","s0","nowOf","agreements","agree","ch","created","lesson","adopted","byId","artefacts","timSort","linked","traceabilityMatrix","cfg","rows","f","links","missing","m","missingTraces","toPhase","ceremony","recordDeliverable","kind","waterfallCeremonies","act","type","reduce","version","ZERO_SPENT","approvers","approverIds","already","given","raisePending","pending","decision","canDo","rolesWith","needsHuman","waterfallAfterDecide","entry","reviewer","waterfallMetrics","zero","total","done","planned","spent","defects","typeOf","status","traced","reqTotal","changeRequests","approved","rejected","reworkWeight","phasesReopened","counted","ev","was","completion","variance","n","decided","waterfallRoles","config","gates","rule","message","fix","payloadOf","phaseArg","phaseById","phaseIds","itemById","phaseOfNew","parent","governed","frozenFix","changeOf","waterfallRules","patch","approve","mine","authorOf","others","added","waterfallStages","_config","WATERFALL_VOCABULARY","deliverRoleFor","phaseReport","waterfall","frozen","itemId","_now","acc","addSpent"],"mappings":"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","file":"chunk-KSKEFYY7.cjs","sourcesContent":["import { assertId, fail } from \"../errors.ts\";\nimport type { Budget, Gate, GateRequirement, WorkflowState } from \"../types.ts\";\n\nexport interface WaterfallPhaseConfig {\n id: string;\n name: string;\n deliverables: string[];\n gate: Gate;\n budget?: Budget;\n /** role id that delivers this phase's items; default: the first role with \"deliver\" */\n deliverBy?: string;\n}\nexport interface WaterfallConfig {\n phases: WaterfallPhaseConfig[];\n changeControl: { requiresImpactAnalysis: boolean; approvers: GateRequirement[] };\n /** phase ids: every item of `from` must trace to an item of each `to` phase before that phase's gate */\n traceability: { from: string; to: string[] };\n humanGates: \"all\" | string[];\n}\n\nexport const DEFAULT_PHASE_IDS: readonly string[] = [\n \"requirements\",\n \"design\",\n \"implementation\",\n \"verification\",\n \"deployment\",\n \"maintenance\",\n];\nexport const DEFAULT_DELIVERABLES: Record<string, string[]> = {\n requirements: [\"srs\"],\n design: [\"design-doc\", \"interface-spec\"],\n implementation: [\"code-baseline\"],\n verification: [\"test-report\", \"traceability-matrix\"],\n deployment: [\"release-notes\", \"deployment-record\"],\n maintenance: [\"change-log\"],\n};\nexport const DEFAULT_DELIVER_BY: Record<string, string> = {\n requirements: \"business-analyst\",\n design: \"architect\",\n deployment: \"release-manager\",\n};\nexport const GATE_ID = (id: string): string => `${id}-gate`;\nexport const CHANGE_GATE = \"change-control\";\nexport const CAPABILITIES: readonly string[] = [\n \"order-backlog\",\n \"define-acceptance\",\n \"facilitate\",\n \"deliver\",\n \"review\",\n \"verify\",\n \"approve-gate\",\n \"manage-flow\",\n \"control-change\",\n \"escalate\",\n];\n\nconst title = (id: string) => id.charAt(0).toUpperCase() + id.slice(1);\n\nexport function defaultPhases(): WaterfallPhaseConfig[] {\n return DEFAULT_PHASE_IDS.map((id) => {\n const p: WaterfallPhaseConfig = {\n id,\n name: title(id),\n deliverables: [...(DEFAULT_DELIVERABLES[id] ?? [])],\n gate: {\n id: GATE_ID(id),\n requires: [{ capability: \"approve-gate\" }],\n evidence: [],\n onFail: { action: \"block\" },\n },\n };\n const by = DEFAULT_DELIVER_BY[id];\n if (by !== undefined) p.deliverBy = by;\n return p;\n });\n}\n\nexport function configOf(state: WorkflowState): WaterfallConfig {\n return state.config as WaterfallConfig;\n}\n\nconst isObj = (x: unknown): x is Record<string, unknown> =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\nconst strings = (x: unknown): x is string[] =>\n Array.isArray(x) && x.every((s) => typeof s === \"string\" && s.trim() !== \"\");\n\nfunction budget(raw: unknown, where: string): Budget | undefined {\n if (raw === undefined) return undefined;\n if (!isObj(raw))\n fail(\"config-invalid\", `${where}.budget must be an object`, 'e.g. { \"tokens\": 400000 }');\n const out: Budget = {};\n for (const k of [\"tokens\", \"turns\", \"wallclockMs\"] as const) {\n const v = raw[k];\n if (v === undefined) continue;\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < 0)\n fail(\n \"config-invalid\",\n `${where}.budget.${k} must be a non-negative number`,\n \"omit it for no limit\",\n );\n out[k] = v;\n }\n return out;\n}\n\nfunction requirements(raw: unknown, where: string): GateRequirement[] {\n if (!Array.isArray(raw) || raw.length === 0)\n fail(\n \"config-invalid\",\n `${where} must be a non-empty array of \"human\" | { capability }`,\n 'e.g. [\"human\", { \"capability\": \"approve-gate\" }]',\n );\n return raw.map((q: unknown): GateRequirement => {\n if (q === \"human\") return \"human\";\n if (isObj(q) && typeof q[\"capability\"] === \"string\" && CAPABILITIES.includes(q[\"capability\"]))\n return { capability: q[\"capability\"] };\n return fail(\n \"config-invalid\",\n `${where} entry ${JSON.stringify(q)} is not \"human\" or a known capability`,\n `use \"human\" or { \"capability\": one of ${CAPABILITIES.join(\", \")} }`,\n );\n });\n}\n\nfunction phase(raw: unknown, i: number, human: (id: string) => boolean): WaterfallPhaseConfig {\n const where = `waterfall config.phases[${i}]`;\n if (!isObj(raw)) fail(\"config-invalid\", `${where} must be an object`, 'e.g. { \"id\": \"design\" }');\n assertId(raw[\"id\"], `${where}.id`);\n const id = raw[\"id\"] as string;\n const deliverables = raw[\"deliverables\"] ?? DEFAULT_DELIVERABLES[id] ?? [];\n if (!strings(deliverables))\n fail(\n \"config-invalid\",\n `${where}.deliverables must be a string[] of evidence kinds`,\n 'e.g. [\"srs\"]',\n );\n let gate: Gate;\n if (raw[\"gate\"] === undefined) {\n gate = {\n id: GATE_ID(id),\n requires: [{ capability: \"approve-gate\" }],\n evidence: [],\n onFail: { action: \"block\" },\n };\n } else {\n const g = raw[\"gate\"];\n if (!isObj(g) || typeof g[\"id\"] !== \"string\" || g[\"id\"].trim() === \"\")\n fail(\n \"config-invalid\",\n `${where}.gate must be a Gate with an id`,\n 'e.g. { \"id\": \"design-gate\", \"requires\": [{ \"capability\": \"approve-gate\" }], \"evidence\": [] }',\n );\n const evidence = g[\"evidence\"] ?? [];\n if (!strings(evidence))\n fail(\n \"config-invalid\",\n `${where}.gate.evidence must be a string[]`,\n \"list evidence kinds or omit it\",\n );\n gate = {\n id: g[\"id\"],\n requires: requirements(\n g[\"requires\"] ?? [{ capability: \"approve-gate\" }],\n `${where}.gate.requires`,\n ),\n evidence: [...evidence],\n onFail: { action: \"block\" },\n };\n }\n if (human(id) && !gate.requires.includes(\"human\")) gate.requires = [\"human\", ...gate.requires];\n const out: WaterfallPhaseConfig = {\n id,\n name: typeof raw[\"name\"] === \"string\" && raw[\"name\"].trim() !== \"\" ? raw[\"name\"] : title(id),\n deliverables: [...deliverables],\n gate,\n };\n const b = budget(raw[\"budget\"], where);\n if (b !== undefined) out.budget = b;\n const by = raw[\"deliverBy\"] ?? DEFAULT_DELIVER_BY[id];\n if (by !== undefined) {\n if (typeof by !== \"string\" || by.trim() === \"\")\n fail(\n \"config-invalid\",\n `${where}.deliverBy must be a role id`,\n \"name the role that delivers this phase or omit it\",\n );\n out.deliverBy = by;\n }\n return out;\n}\n\nexport function validateWaterfallConfig(raw: unknown): WaterfallConfig {\n const c = (raw ?? {}) as Record<string, unknown>;\n if (c[\"phases\"] !== undefined && !Array.isArray(c[\"phases\"]))\n fail(\n \"config-invalid\",\n \"waterfall config.phases must be an array of phases\",\n \"omit phases for the six classic phases\",\n );\n const hg = c[\"humanGates\"] ?? \"all\";\n if (hg !== \"all\" && !strings(hg))\n fail(\n \"config-invalid\",\n 'waterfall config.humanGates must be \"all\" or a string[] of phase ids',\n 'omit it for \"all\"',\n );\n const human = hg === \"all\" ? () => true : (id: string) => (hg as string[]).includes(id);\n const phases =\n c[\"phases\"] === undefined\n ? defaultPhases().map((p, i) => phase(p, i, human))\n : (c[\"phases\"] as unknown[]).map((p, i) => phase(p, i, human));\n if (phases.length === 0)\n fail(\n \"config-invalid\",\n \"waterfall config.phases needs at least one phase\",\n 'e.g. [{ \"id\": \"requirements\" }]',\n );\n const ids = phases.map((p) => p.id);\n const dupe = ids.find((id, i) => ids.indexOf(id) !== i);\n if (dupe !== undefined)\n fail(\"config-invalid\", `duplicate phase id \"${dupe}\"`, \"give every phase a unique id\");\n if (hg !== \"all\")\n for (const id of hg as string[])\n if (!ids.includes(id))\n fail(\n \"config-invalid\",\n `waterfall config.humanGates names unknown phase \"${id}\"`,\n `phases are: ${ids.join(\", \")}`,\n );\n const cc = c[\"changeControl\"] ?? {};\n if (!isObj(cc))\n fail(\n \"config-invalid\",\n \"waterfall config.changeControl must be an object\",\n 'e.g. { \"requiresImpactAnalysis\": true, \"approvers\": [\"human\"] }',\n );\n if (\n cc[\"requiresImpactAnalysis\"] !== undefined &&\n typeof cc[\"requiresImpactAnalysis\"] !== \"boolean\"\n )\n fail(\n \"config-invalid\",\n \"waterfall config.changeControl.requiresImpactAnalysis must be a boolean\",\n \"omit it for true\",\n );\n const changeControl: WaterfallConfig[\"changeControl\"] = {\n requiresImpactAnalysis:\n cc[\"requiresImpactAnalysis\"] === undefined ? true : (cc[\"requiresImpactAnalysis\"] as boolean),\n approvers: requirements(\n cc[\"approvers\"] ?? [\"human\", { capability: \"control-change\" }],\n \"waterfall config.changeControl.approvers\",\n ),\n };\n const tr = c[\"traceability\"];\n let traceability: WaterfallConfig[\"traceability\"];\n if (tr === undefined) {\n traceability =\n ids.includes(\"requirements\") && ids.includes(\"design\") && ids.includes(\"verification\")\n ? { from: \"requirements\", to: [\"design\", \"verification\"] }\n : { from: ids[0]!, to: [] };\n } else {\n if (!isObj(tr) || typeof tr[\"from\"] !== \"string\" || !ids.includes(tr[\"from\"]))\n fail(\n \"config-invalid\",\n \"waterfall config.traceability.from must be a phase id\",\n `phases are: ${ids.join(\", \")}`,\n );\n const to = tr[\"to\"] ?? [];\n if (!strings(to))\n fail(\n \"config-invalid\",\n \"waterfall config.traceability.to must be a string[] of phase ids\",\n `phases are: ${ids.join(\", \")}`,\n );\n for (const t of to) {\n if (!ids.includes(t))\n fail(\n \"config-invalid\",\n `waterfall config.traceability.to names unknown phase \"${t}\"`,\n `phases are: ${ids.join(\", \")}`,\n );\n if (ids.indexOf(t) <= ids.indexOf(tr[\"from\"]))\n fail(\n \"config-invalid\",\n `waterfall config.traceability.to phase \"${t}\" must come after \"${tr[\"from\"]}\"`,\n \"trace forward only: from an earlier phase to later ones\",\n );\n }\n traceability = { from: tr[\"from\"], to: [...to] };\n }\n return {\n phases,\n changeControl,\n traceability,\n humanGates: hg === \"all\" ? \"all\" : [...(hg as string[])],\n };\n}\n","import { fail } from \"../errors.ts\";\nimport type { Phase, WorkItem, WorkflowState } from \"../types.ts\";\nimport { configOf } from \"./config.ts\";\n\nexport const WORK = \"work\";\nexport const REVIEW = \"review\";\nexport const DONE = \"done\";\n\n/** state.phases, or the config phases as pending (before the first ceremony touches them). */\nexport function phasesOf(state: WorkflowState): Phase[] {\n if (state.phases) return state.phases;\n return configOf(state).phases.map((p) => {\n const ph: Phase = {\n id: p.id,\n name: p.name,\n deliverables: [...p.deliverables],\n gate: p.gate,\n status: \"pending\",\n };\n if (p.budget) ph.budget = p.budget;\n return ph;\n });\n}\n\nexport function withPhases(state: WorkflowState, phases: Phase[]): WorkflowState {\n return { ...state, phases };\n}\n\nexport function phaseIndex(state: WorkflowState, id: string): number {\n const idx = phasesOf(state).findIndex((p) => p.id === id);\n if (idx < 0)\n fail(\n \"config-invalid\",\n `unknown phase \"${id}\"`,\n `phases are: ${phasesOf(state)\n .map((p) => p.id)\n .join(\" → \")}`,\n );\n return idx;\n}\n\nexport function getPhase(state: WorkflowState, id: string): Phase {\n return phasesOf(state)[phaseIndex(state, id)]!;\n}\n\n/** The item's phase, inherited from its parent chain (questions, follow-ups, retro items). */\nexport function phaseOf(state: WorkflowState, item: WorkItem): string | undefined {\n const seen = new Set<string>();\n let cur: WorkItem | undefined = item;\n while (cur && !seen.has(cur.id)) {\n if (cur.phase !== undefined) return cur.phase;\n seen.add(cur.id);\n cur =\n cur.parent !== undefined && Object.hasOwn(state.items, cur.parent)\n ? state.items[cur.parent]\n : undefined;\n }\n return undefined;\n}\n\nexport function itemsInPhase(state: WorkflowState, phaseId: string): WorkItem[] {\n return Object.values(state.items).filter(\n (i) => i.status !== \"dropped\" && phaseOf(state, i) === phaseId,\n );\n}\n\nexport function openPhase(state: WorkflowState): Phase | undefined {\n return phasesOf(state).find((p) => p.status === \"open\");\n}\n\n/** First phase in order that is not baselined: the one to kick off (or the open one). */\nexport function currentPhase(state: WorkflowState): Phase | undefined {\n return phasesOf(state).find((p) => p.status !== \"baselined\");\n}\n\nexport function isFrozen(state: WorkflowState, item: WorkItem): boolean {\n const id = phaseOf(state, item);\n return id !== undefined && phasesOf(state).find((p) => p.id === id)?.status === \"baselined\";\n}\n\nexport function producedKinds(state: WorkflowState, phase: Phase): Set<string> {\n const kinds = new Set<string>((phase.produced ?? []).map((p) => p.kind));\n for (const it of itemsInPhase(state, phase.id)) for (const e of it.evidence) kinds.add(e.kind);\n return kinds;\n}\n\n/** Deliverables (and gate evidence kinds) still missing, in declaration order. */\nexport function missingDeliverables(\n state: WorkflowState,\n phase: Phase,\n extra: string[] = [],\n): string[] {\n const have = producedKinds(state, phase);\n for (const k of extra) have.add(k);\n const wanted: string[] = [];\n for (const k of [...phase.deliverables, ...phase.gate.evidence])\n if (!wanted.includes(k)) wanted.push(k);\n return wanted.filter((k) => !have.has(k));\n}\n\n/** The traceability `to` phase that comes last in phase order (where the matrix must be complete). */\nexport function lastToPhase(state: WorkflowState): string | undefined {\n const order = phasesOf(state).map((p) => p.id);\n const to = configOf(state).traceability.to.filter((t) => order.includes(t));\n if (to.length === 0) return undefined;\n return to.reduce((a, b) => (order.indexOf(a) >= order.indexOf(b) ? a : b));\n}\n","import { fail } from \"../errors.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport { appendEvent } from \"../state.ts\";\nimport type { Baseline, WorkItem, WorkflowState } from \"../types.ts\";\nimport { getPhase, itemsInPhase, phaseIndex, phasesOf, withPhases } from \"./phases.ts\";\n\nfunction closeIteration(\n state: WorkflowState,\n prefix: string,\n outcome: \"completed\" | \"cancelled\",\n now: string,\n): WorkflowState {\n const it = openIteration(state);\n if (!it || !it.id.startsWith(`${prefix}#`)) return state;\n return {\n ...state,\n iterations: state.iterations.map((x) => (x.id === it.id ? { ...x, endedAt: now, outcome } : x)),\n };\n}\n\n/** Pass the phase gate: freeze its items, record the baseline, close its iteration. */\nexport function baselinePhase(\n state: WorkflowState,\n phaseId: string,\n approvedBy: string[],\n now: string,\n): WorkflowState {\n const phase = getPhase(state, phaseId);\n if (phase.status !== \"open\")\n fail(\n \"invalid-transition\",\n `phase \"${phaseId}\" is ${phase.status}, not open`,\n phase.status === \"baselined\"\n ? \"it is already baselined; a change-request reopens it\"\n : \"kickoff the phase first\",\n );\n const items = itemsInPhase(state, phaseId);\n const itemSnapshot: Record<string, WorkItem> = {};\n for (const it of items) itemSnapshot[it.id] = it;\n const earlier = (state.baselines ?? []).filter((b) => b.phase === phaseId).length;\n const baseline: Baseline = {\n phase: phaseId,\n version: earlier + 1,\n at: now,\n approvedBy,\n itemSnapshot,\n };\n let s = withPhases(\n state,\n phasesOf(state).map((p) => (p.id === phaseId ? { ...p, status: \"baselined\" as const } : p)),\n );\n s = { ...s, baseline, baselines: [...(s.baselines ?? []), baseline] };\n s = closeIteration(s, phaseId, \"completed\", now);\n return appendEvent(\n s,\n \"phase.baselined\",\n approvedBy[approvedBy.length - 1] ?? \"system\",\n { phase: phaseId, version: baseline.version, approvedBy, items: items.map((i) => i.id) },\n now,\n );\n}\n\nexport interface ReopenResult {\n state: WorkflowState;\n reopened: string[];\n suspended: string | null;\n}\n\n/** Change-control approval: reopen the listed baselined phases; a later open phase is suspended until they are re-baselined. */\nexport function reopenPhases(state: WorkflowState, ids: string[], now: string): ReopenResult {\n const reopened: string[] = [];\n for (const id of ids) {\n const p = getPhase(state, id);\n if (p.status === \"pending\")\n fail(\n \"invalid-input\",\n `phase \"${id}\" was never baselined; there is nothing to reopen`,\n \"remove it from impactAnalysis.reopen\",\n );\n if (p.status === \"baselined\" && !reopened.includes(id)) reopened.push(id);\n }\n let phases = phasesOf(state).map((p) =>\n reopened.includes(p.id) ? { ...p, status: \"reopened\" as const } : p,\n );\n let suspended: string | null = null;\n let s = state;\n if (reopened.length) {\n const earliest = Math.min(...reopened.map((id) => phaseIndex(state, id)));\n const open = phases.find((p, i) => p.status === \"open\" && i > earliest);\n if (open) {\n suspended = open.id;\n phases = phases.map((p) => (p.id === open.id ? { ...p, status: \"reopened\" as const } : p));\n s = closeIteration(s, open.id, \"cancelled\", now);\n }\n }\n return { state: withPhases(s, phases), reopened, suspended };\n}\n","import { getItem, moveItem } from \"../items.ts\";\nimport { appendEvent } from \"../state.ts\";\nimport type { WorkflowState } from \"../types.ts\";\nimport { reopenPhases } from \"./baseline.ts\";\nimport { DONE } from \"./phases.ts\";\n\nexport function approveChange(\n state: WorkflowState,\n changeId: string,\n by: string,\n note: string,\n now: string,\n): WorkflowState {\n const cr = getItem(state, changeId);\n const ia = cr.impactAnalysis;\n const r = reopenPhases(state, ia?.reopen ?? [], now);\n let s = moveItem(r.state, changeId, { stage: DONE, status: \"done\" }, by, now);\n for (const phase of r.reopened)\n s = appendEvent(s, \"phase.reopened\", by, { phase, change: changeId }, now);\n if (r.suspended !== null)\n s = appendEvent(s, \"phase.suspended\", by, { phase: r.suspended, change: changeId }, now);\n return appendEvent(\n s,\n \"change.decided\",\n by,\n {\n change: changeId,\n decision: \"approve\",\n by,\n note,\n reopened: r.reopened,\n suspended: r.suspended,\n weight: ia?.weight ?? 0,\n affects: cr.affects ?? [],\n },\n now,\n );\n}\n\nexport function rejectChange(\n state: WorkflowState,\n changeId: string,\n by: string,\n note: string,\n now: string,\n): WorkflowState {\n const cr = getItem(state, changeId);\n const s = moveItem(state, changeId, { status: \"dropped\" }, by, now);\n return appendEvent(\n s,\n \"change.decided\",\n by,\n {\n change: changeId,\n decision: \"reject\",\n by,\n note,\n reopened: [],\n suspended: null,\n weight: 0,\n affects: cr.affects ?? [],\n },\n now,\n );\n}\n","import { fail } from \"../errors.ts\";\nimport { applyAction } from \"../methodology.ts\";\nimport { requireCap } from \"../roles.ts\";\nimport { appendEvent, nowOf } from \"../state.ts\";\nimport type { Ceremony, Lesson, LessonChange, Methodology, WorkflowState } from \"../types.ts\";\nimport { wantPhase } from \"./ceremonies.ts\";\n\nconst LESSON_SCOPES: readonly string[] = [\"policy\", \"skill\", \"memory\", \"spec\", \"review\"];\nconst isObj = (x: unknown): x is Record<string, unknown> =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n\ntype NewLesson = { text: string; scope: Lesson[\"scope\"]; suggestedChange?: LessonChange };\ntype Adopt = { id: string; suggestedChange?: LessonChange };\n\nfunction validLessons(x: unknown): x is NewLesson[] {\n return (\n Array.isArray(x) &&\n x.every(\n (l) =>\n isObj(l) &&\n typeof l[\"text\"] === \"string\" &&\n l[\"text\"].trim() !== \"\" &&\n LESSON_SCOPES.includes(l[\"scope\"] as string),\n )\n );\n}\n\nfunction assertRefs(state: WorkflowState, adopt: Adopt[], dismiss: string[]): void {\n const refs = [...adopt.map((a) => a.id), ...dismiss];\n const dupe = refs.find((r, i) => refs.indexOf(r) !== i);\n if (dupe !== undefined)\n fail(\n \"invalid-input\",\n `lesson \"${dupe}\" is referenced more than once`,\n \"adopt or dismiss each lesson once\",\n );\n for (const ref of refs) {\n const l = state.lessons.find((x) => x.id === ref);\n if (!l)\n fail(\n \"invalid-input\",\n `no lesson \"${ref}\"`,\n `raised lessons: ${\n state.lessons\n .filter((x) => x.status === \"raised\")\n .map((x) => x.id)\n .join(\", \") || \"(none)\"\n }`,\n );\n if (l.status !== \"raised\")\n fail(\n \"invalid-input\",\n `lesson \"${ref}\" is already ${l.status}`,\n \"only raised lessons can be adopted or dismissed\",\n );\n }\n}\n\n/** Lessons, adoptions and agreements; never touches items, config or baselines. */\nexport function phaseRetrospective(methodology: () => Methodology): Ceremony {\n return (state, input) => {\n requireCap(state, input.by, \"facilitate\");\n const phase =\n input[\"phase\"] === undefined ? undefined : wantPhase(state, input, \"phaseRetrospective\");\n const newLessons = input[\"lessons\"] ?? [];\n if (!validLessons(newLessons))\n fail(\n \"invalid-input\",\n \"phaseRetrospective.lessons entries need a text and a scope\",\n `scope is one of: ${LESSON_SCOPES.join(\", \")}`,\n );\n const adopt = (input[\"adopt\"] ?? []) as Adopt[];\n const dismiss = (input[\"dismiss\"] ?? []) as string[];\n if (\n !Array.isArray(adopt) ||\n !adopt.every((a) => isObj(a) && typeof a[\"id\"] === \"string\") ||\n !Array.isArray(dismiss) ||\n !dismiss.every((d) => typeof d === \"string\")\n )\n fail(\n \"invalid-input\",\n \"phaseRetrospective.adopt must be [{ id, suggestedChange? }] and dismiss a string[]\",\n 'e.g. { \"adopt\": [{ \"id\": \"L1\" }], \"dismiss\": [\"L2\"] }',\n );\n assertRefs(state, adopt, dismiss);\n return applyAction(\n state,\n methodology(),\n { type: \"ceremony.phaseRetrospective\", by: input.by, payload: input },\n (s0) => {\n let s = s0;\n const now = nowOf(input.now);\n const agreements: string[] = [];\n const agree = (ch: LessonChange | undefined) => {\n if (!ch || ch.kind !== \"agreement\") return;\n if (!s.agreements.includes(ch.text)) s = { ...s, agreements: [...s.agreements, ch.text] };\n agreements.push(ch.text);\n };\n const created: string[] = [];\n for (const l of newLessons) {\n const id = `L${s.lessons.length + 1}`;\n const lesson: Lesson = {\n id,\n at: now,\n text: l.text,\n scope: l.scope,\n status: \"adopted\",\n from: input.by,\n };\n if (l.suggestedChange) lesson.suggestedChange = l.suggestedChange;\n s = { ...s, lessons: [...s.lessons, lesson] };\n created.push(id);\n agree(l.suggestedChange);\n }\n const adopted: string[] = [];\n for (const a of adopt) {\n s = {\n ...s,\n lessons: s.lessons.map((x) =>\n x.id === a.id\n ? {\n ...x,\n status: \"adopted\" as const,\n ...(a.suggestedChange ? { suggestedChange: a.suggestedChange } : {}),\n }\n : x,\n ),\n };\n adopted.push(a.id);\n agree(a.suggestedChange ?? s.lessons.find((x) => x.id === a.id)?.suggestedChange);\n }\n for (const d of dismiss)\n s = {\n ...s,\n lessons: s.lessons.map((x) =>\n x.id === d ? { ...x, status: \"dismissed\" as const } : x,\n ),\n };\n return appendEvent(\n s,\n \"phase.retrospective\",\n input.by,\n { phase: phase?.id ?? null, lessons: created, adopted, dismissed: dismiss, agreements },\n now,\n );\n },\n );\n };\n}\n","import { timSort } from \"exsorted\";\nimport type { WorkItem, WorkflowState } from \"../types.ts\";\nimport { configOf } from \"./config.ts\";\nimport { itemsInPhase, phasesOf } from \"./phases.ts\";\n\nexport interface TraceRow {\n item: string;\n /** to-phase id → ids of linked items in that phase */\n links: Record<string, string[]>;\n}\nexport interface TraceabilityMatrix {\n from: string;\n to: string[];\n rows: TraceRow[];\n missing: Array<{ item: string; phases: string[] }>;\n coverage: { traced: number; total: number };\n}\n\nconst byId = (a: WorkItem, b: WorkItem) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0);\nconst artefacts = (state: WorkflowState, phase: string) =>\n timSort(\n itemsInPhase(state, phase).filter((i) => i.type !== \"question\"),\n byId,\n );\n\n/** A link exists when either side's `traces` names the other. */\nconst linked = (a: WorkItem, b: WorkItem) =>\n (a.traces ?? []).includes(b.id) || (b.traces ?? []).includes(a.id);\n\nexport function traceabilityMatrix(state: WorkflowState): TraceabilityMatrix {\n const cfg = configOf(state).traceability;\n const order = phasesOf(state).map((p) => p.id);\n const to = cfg.to.filter((t) => order.includes(t));\n const rows: TraceRow[] = artefacts(state, cfg.from).map((f) => {\n const links: Record<string, string[]> = {};\n for (const t of to)\n links[t] = artefacts(state, t)\n .filter((x) => linked(f, x))\n .map((x) => x.id);\n return { item: f.id, links };\n });\n const missing = rows\n .map((r) => ({ item: r.item, phases: to.filter((t) => r.links[t]!.length === 0) }))\n .filter((m) => m.phases.length > 0);\n return {\n from: cfg.from,\n to,\n rows,\n missing,\n coverage: { traced: rows.length - missing.length, total: rows.length },\n };\n}\n\n/** Ids of `from` items with no link into `toPhase`. */\nexport function missingTraces(state: WorkflowState, toPhase: string): string[] {\n return traceabilityMatrix(state)\n .rows.filter((r) => (r.links[toPhase] ?? []).length === 0)\n .map((r) => r.item);\n}\n","import { ZERO_SPENT } from \"../budget.ts\";\nimport { fail } from \"../errors.ts\";\nimport { raisePending } from \"../gates.ts\";\nimport { applyAction } from \"../methodology.ts\";\nimport { getItem } from \"../items.ts\";\nimport { approverIds, canDo, requireCap, rolesWith } from \"../roles.ts\";\nimport { appendEvent, nowOf } from \"../state.ts\";\nimport type {\n Capability,\n Ceremony,\n CeremonyInput,\n Methodology,\n PendingHuman,\n Phase,\n WorkflowState,\n} from \"../types.ts\";\nimport { baselinePhase } from \"./baseline.ts\";\nimport { approveChange, rejectChange } from \"./change.ts\";\nimport { configOf } from \"./config.ts\";\nimport { getPhase, itemsInPhase, lastToPhase, phasesOf, withPhases } from \"./phases.ts\";\nimport { phaseRetrospective } from \"./retro.ts\";\nimport { traceabilityMatrix } from \"./traceability.ts\";\n\nconst isObj = (x: unknown): x is Record<string, unknown> =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n\n/** input.phase as an existing phase. */\nexport function wantPhase(state: WorkflowState, input: CeremonyInput, ceremony: string): Phase {\n const id = input[\"phase\"];\n if (typeof id !== \"string\" || id.trim() === \"\")\n fail(\n \"invalid-input\",\n `${ceremony} needs phase: string`,\n `pass one of: ${phasesOf(state)\n .map((p) => p.id)\n .join(\", \")}`,\n );\n return getPhase(state, id);\n}\n\n/** Append a deliverable to the phase and record it. */\nfunction recordDeliverable(\n state: WorkflowState,\n phaseId: string,\n kind: string,\n ref: string,\n by: string,\n now: string,\n): WorkflowState {\n const s = withPhases(\n state,\n phasesOf(state).map((p) =>\n p.id === phaseId\n ? { ...p, produced: [...(p.produced ?? []), { kind, ref, by, at: now }] }\n : p,\n ),\n );\n return appendEvent(s, \"phase.deliverable\", by, { phase: phaseId, kind, ref }, now);\n}\n\nexport { approveChange, rejectChange } from \"./change.ts\";\n\nexport function waterfallCeremonies(methodology: () => Methodology): Record<string, Ceremony> {\n const act = (\n state: WorkflowState,\n type: string,\n input: CeremonyInput,\n reduce: (s: WorkflowState, now: string) => WorkflowState,\n ) =>\n applyAction(state, methodology(), { type, by: input.by, payload: input }, (s) =>\n reduce(s, nowOf(input.now)),\n );\n\n const kickoff: Ceremony = (state, input) => {\n requireCap(state, input.by, \"facilitate\");\n const phase = wantPhase(state, input, \"kickoff\");\n return act(state, \"ceremony.kickoff\", input, (s, now) => {\n const version =\n s.events.filter(\n (e) => e.type === \"phase.opened\" && (e.payload as { phase: string }).phase === phase.id,\n ).length + 1;\n const items = itemsInPhase(s, phase.id)\n .filter((i) => i.status !== \"done\")\n .map((i) => i.id);\n s = withPhases(\n s,\n phasesOf(s).map((p) => (p.id === phase.id ? { ...p, status: \"open\" as const } : p)),\n );\n const budget = phase.budget ?? {};\n s = {\n ...s,\n iterations: [\n ...s.iterations,\n {\n id: `${phase.id}#${version}`,\n goal: phase.name,\n budget,\n spent: ZERO_SPENT,\n startedAt: now,\n committed: items,\n carryover: [],\n },\n ],\n };\n return appendEvent(\n s,\n \"phase.opened\",\n input.by,\n { phase: phase.id, version, items, budget },\n now,\n );\n });\n };\n\n const gateReview: Ceremony = (state, input) => {\n const phase = wantPhase(state, input, \"gateReview\");\n if (phase.status !== \"open\")\n fail(\n \"invalid-transition\",\n `phase \"${phase.id}\" is ${phase.status}, not open`,\n phase.status === \"baselined\"\n ? \"it is already baselined; a change-request reopens it\"\n : `kickoff \"${phase.id}\" first`,\n );\n const gate = phase.gate;\n const approvers = approverIds(state, gate.id, \"approve-gate\");\n if (input.by !== \"human\" && !approvers.includes(input.by))\n fail(\n \"gate-unmet\",\n `\"${input.by}\" may not review gate \"${gate.id}\"`,\n `review as one of: human${approvers.map((r) => `, ${r}`).join(\"\")}`,\n { rule: \"gate\" },\n );\n const already = state.pending.find(\n (p) => p.kind === \"gate\" && p.item === undefined && p.gate === gate.id,\n );\n if (already)\n fail(\n \"no-op\",\n `gate \"${gate.id}\" is already awaiting a decision (${already.id})`,\n `decide ${already.id} approve|reject`,\n );\n const given = input[\"deliverables\"] ?? [];\n if (\n !Array.isArray(given) ||\n !given.every(\n (d) =>\n isObj(d) &&\n typeof d[\"kind\"] === \"string\" &&\n d[\"kind\"].trim() !== \"\" &&\n typeof d[\"ref\"] === \"string\",\n )\n )\n fail(\n \"invalid-input\",\n \"gateReview.deliverables must be [{ kind, ref }]\",\n 'e.g. { \"deliverables\": [{ \"kind\": \"srs\", \"ref\": \"docs/srs.md\" }] }',\n );\n const deliverables = given as Array<{ kind: string; ref: string }>;\n return act(state, \"ceremony.gateReview\", input, (s, now) => {\n for (const d of deliverables)\n s = recordDeliverable(s, phase.id, d.kind, d.ref, input.by, now);\n if (configOf(s).traceability.to.includes(phase.id)) {\n const m = traceabilityMatrix(s);\n s = appendEvent(\n s,\n \"traceability.computed\",\n input.by,\n {\n phase: phase.id,\n from: m.from,\n to: m.to,\n coverage: m.coverage,\n missing: m.missing,\n rows: m.rows,\n },\n now,\n );\n if (phase.id === lastToPhase(s) && m.missing.length === 0)\n s = recordDeliverable(\n s,\n phase.id,\n \"traceability-matrix\",\n `traceability.computed#${s.events[s.events.length - 1]!.seq}`,\n input.by,\n now,\n );\n }\n if (gate.requires.includes(\"human\") && input.by !== \"human\") {\n s = raisePending(\n s,\n {\n kind: \"gate\",\n gate: gate.id,\n question: `Approve gate \"${gate.id}\" and baseline phase \"${phase.name}\"?`,\n },\n now,\n );\n const pending = s.pending[s.pending.length - 1]!.id;\n return appendEvent(\n s,\n \"phase.gate-pending\",\n input.by,\n { phase: phase.id, gate: gate.id, by: input.by, pending },\n now,\n );\n }\n return baselinePhase(s, phase.id, [input.by], now);\n });\n };\n\n const changeControlBoard: Ceremony = (state, input) => {\n requireCap(state, input.by, \"control-change\");\n const id = input[\"change\"];\n if (typeof id !== \"string\" || id.trim() === \"\")\n fail(\n \"invalid-input\",\n \"changeControlBoard needs change: string (a change-request id)\",\n 'e.g. { \"change\": \"CR-1\", \"decision\": \"approve\", \"note\": \"why\" }',\n );\n const cr = getItem(state, id);\n if (cr.type !== \"change-request\")\n fail(\n \"invalid-input\",\n `item \"${id}\" is a ${cr.type}, not a change-request`,\n \"only change-request items go through the board\",\n { items: [id] },\n );\n if (cr.status === \"done\" || cr.status === \"dropped\")\n fail(\n \"invalid-transition\",\n `change \"${id}\" is already ${cr.status === \"done\" ? \"approved\" : \"rejected\"}`,\n \"raise a new change-request\",\n { items: [id] },\n );\n if (cr.status === \"awaiting_human\") {\n const p = state.pending.find((x) => x.item === id);\n fail(\n \"no-op\",\n `change \"${id}\" is awaiting the human decision${p ? ` (${p.id})` : \"\"}`,\n `decide ${p?.id ?? \"<pending id>\"} approve|reject`,\n { items: [id] },\n );\n }\n const decision = input[\"decision\"];\n if (decision !== \"approve\" && decision !== \"reject\")\n fail(\n \"invalid-input\",\n 'changeControlBoard.decision must be \"approve\" or \"reject\"',\n \"state the board's decision\",\n );\n const note = typeof input[\"note\"] === \"string\" ? input[\"note\"] : \"\";\n const approvers = configOf(state).changeControl.approvers;\n for (const q of approvers) {\n if (\n q === \"human\" ||\n input.by === \"human\" ||\n canDo(state, input.by, q.capability as Capability)\n )\n continue;\n fail(\n \"gate-unmet\",\n `\"${input.by}\" lacks capability \"${q.capability}\" required by change control`,\n `decide as one of: human${rolesWith(state, q.capability as Capability)\n .map((r) => `, ${r.id}`)\n .join(\"\")}`,\n { rule: \"change-control\", items: [id] },\n );\n }\n const needsHuman = approvers.includes(\"human\") && input.by !== \"human\";\n return act(state, \"ceremony.changeControlBoard\", input, (s, now) => {\n if (needsHuman) {\n s = raisePending(\n s,\n {\n kind: \"decision\",\n item: id,\n question: `Change \"${id}\" (${cr.title}): the board (${input.by}) recommends ${decision}${note ? `: ${note}` : \"\"}. Approve or reject the change?`,\n },\n now,\n );\n const pending = s.pending[s.pending.length - 1]!.id;\n return appendEvent(\n s,\n \"change.recommended\",\n input.by,\n { change: id, decision, note, pending },\n now,\n );\n }\n return decision === \"approve\"\n ? approveChange(s, id, input.by, note, now)\n : rejectChange(s, id, input.by, note, now);\n });\n };\n\n return {\n kickoff,\n gateReview,\n changeControlBoard,\n phaseRetrospective: phaseRetrospective(methodology),\n };\n}\n\n/** decide() hook: a phase gate's human decision baselines the phase or records the failure. */\nexport function waterfallAfterDecide(\n state: WorkflowState,\n entry: PendingHuman,\n decision: \"approve\" | \"reject\",\n by: string,\n note: string,\n now: string,\n): WorkflowState {\n if (entry.kind === \"gate\" && entry.item === undefined && entry.gate !== undefined) {\n const phase = phasesOf(state).find((p) => p.gate.id === entry.gate);\n if (!phase) return state;\n // core decide() checks the decider only for item gates; a phase gate pending exists because the gate requires a human\n if (by !== \"human\")\n fail(\n \"gate-unmet\",\n `\"${by}\" may not decide phase gate \"${entry.gate}\" (${entry.id}); it awaits a human`,\n `decide ${entry.id} as human`,\n { rule: \"gate\" },\n );\n let reviewer: string | undefined;\n for (let i = state.events.length - 1; i >= 0; i--) {\n const e = state.events[i]!;\n if (\n e.type === \"phase.gate-pending\" &&\n (e.payload as { pending: string }).pending === entry.id\n ) {\n reviewer = e.by;\n break;\n }\n }\n const approvedBy = reviewer !== undefined && reviewer !== by ? [reviewer, by] : [by];\n if (decision === \"approve\") return baselinePhase(state, phase.id, approvedBy, now);\n return appendEvent(\n state,\n \"phase.gate-failed\",\n by,\n { phase: phase.id, gate: entry.gate, note },\n now,\n );\n }\n if (\n entry.kind === \"decision\" &&\n entry.item !== undefined &&\n Object.hasOwn(state.items, entry.item)\n ) {\n const item = state.items[entry.item]!;\n if (item.type !== \"change-request\") return state;\n if (by !== \"human\")\n fail(\n \"gate-unmet\",\n `\"${by}\" may not decide change \"${item.id}\" (${entry.id}); change control awaits a human`,\n `decide ${entry.id} as human`,\n { rule: \"change-control\", items: [item.id] },\n );\n return decision === \"approve\"\n ? approveChange(state, item.id, by, note, now)\n : rejectChange(state, item.id, by, note, now);\n }\n return state;\n}\n","import type { WorkflowState } from \"../types.ts\";\nimport { configOf } from \"./config.ts\";\n\nexport interface WaterfallMetrics {\n phaseCompletion: Record<string, number>;\n budgetPlanned: Record<string, number>;\n budgetSpent: Record<string, number>;\n scheduleVariance: Record<string, number>;\n requirementCoverage: number;\n requirementsTraced: number;\n requirementsTotal: number;\n defectsPerPhase: Record<string, number>;\n changeRequests: number;\n changesApproved: number;\n changesRejected: number;\n changeApprovalRate: number;\n reworkWeight: number;\n phasesReopened: number;\n}\n\ntype Added = { id: string; type: string; phase: string | null; parent: string | null };\n\n/** Phase metrics replayed from events alone (membership from item.added, spend from item.completed). */\nexport function waterfallMetrics(state: WorkflowState): WaterfallMetrics {\n const phases = configOf(state).phases.map((p) => p.id);\n const zero = () => Object.fromEntries(phases.map((p) => [p, 0])) as Record<string, number>;\n const total = zero();\n const done = zero();\n const planned = zero();\n const spent = zero();\n const defects = zero();\n const phaseOf = new Map<string, string | undefined>();\n const typeOf = new Map<string, string>();\n const status = new Map<string, string>();\n let traced = 0;\n let reqTotal = 0;\n let changeRequests = 0;\n let approved = 0;\n let rejected = 0;\n let reworkWeight = 0;\n let phasesReopened = 0;\n const counted = (id: string) => {\n const t = typeOf.get(id);\n const p = phaseOf.get(id);\n return t !== \"question\" && t !== \"change-request\" && p !== undefined && p in total;\n };\n for (const ev of state.events) {\n const p = (ev.payload ?? {}) as Record<string, unknown>;\n switch (ev.type) {\n case \"item.added\": {\n const a = p as Added;\n const phase = a.phase ?? (a.parent !== null ? phaseOf.get(a.parent) : undefined);\n phaseOf.set(a.id, phase);\n typeOf.set(a.id, a.type);\n status.set(a.id, \"todo\");\n if (a.type === \"change-request\") changeRequests += 1;\n if (counted(a.id)) {\n total[phase!]! += 1;\n if (a.type === \"bug\") defects[phase!]! += 1;\n }\n break;\n }\n case \"item.transition\": {\n const id = p[\"id\"] as string;\n const to = (p[\"to\"] as { status: string }).status;\n const was = status.get(id);\n status.set(id, to);\n if (!counted(id)) break;\n const phase = phaseOf.get(id)!;\n if (to === \"done\" && was !== \"done\") done[phase]! += 1;\n if (to === \"dropped\") {\n total[phase]! -= 1;\n if (was === \"done\") done[phase]! -= 1;\n }\n break;\n }\n case \"item.completed\": {\n const phase = phaseOf.get(p[\"id\"] as string);\n if (phase !== undefined && phase in spent) spent[phase]! += (p[\"tokens\"] as number) ?? 0;\n break;\n }\n case \"phase.opened\": {\n const phase = p[\"phase\"] as string;\n if (phase in planned)\n planned[phase] = ((p[\"budget\"] as { tokens?: number }) ?? {}).tokens ?? 0;\n break;\n }\n case \"traceability.computed\": {\n const c = p[\"coverage\"] as { traced: number; total: number };\n traced = c.traced;\n reqTotal = c.total;\n break;\n }\n case \"change.decided\": {\n if (p[\"decision\"] === \"approve\") {\n approved += 1;\n reworkWeight += (p[\"weight\"] as number) ?? 0;\n phasesReopened += ((p[\"reopened\"] as string[]) ?? []).length;\n } else rejected += 1;\n break;\n }\n default:\n break;\n }\n }\n const completion = zero();\n const variance = zero();\n for (const ph of phases) {\n const n = total[ph] ?? 0;\n completion[ph] = n === 0 ? 0 : ((done[ph] ?? 0) / n) * 100;\n variance[ph] = spent[ph]! - planned[ph]!;\n }\n const decided = approved + rejected;\n return {\n phaseCompletion: completion,\n budgetPlanned: planned,\n budgetSpent: spent,\n scheduleVariance: variance,\n requirementCoverage: reqTotal === 0 ? 0 : traced / reqTotal,\n requirementsTraced: traced,\n requirementsTotal: reqTotal,\n defectsPerPhase: defects,\n changeRequests,\n changesApproved: approved,\n changesRejected: rejected,\n changeApprovalRate: decided === 0 ? 0 : approved / decided,\n reworkWeight,\n phasesReopened,\n };\n}\n","import type { Role } from \"../types.ts\";\nimport { CHANGE_GATE, type WaterfallConfig } from \"./config.ts\";\n\n/** Order matters: the first role with \"deliver\" is the fallback deliverer for phases without deliverBy. */\nexport function waterfallRoles(config: WaterfallConfig): Role[] {\n const gates = config.phases.map((p) => p.gate.id);\n return [\n {\n id: \"project-manager\",\n name: \"Project Manager\",\n modelTier: \"large\",\n capabilities: [\"facilitate\", \"control-change\", \"approve-gate\", \"escalate\"],\n canApprove: [...gates, CHANGE_GATE],\n inputs: [\"phase-plan\", \"deliverables\", \"change-requests\"],\n outputs: [\"gate-decisions\", \"baselines\", \"change-decisions\"],\n do_not: [\n \"do not implement items yourself\",\n \"do not reopen a phase without an approved change-request\",\n ],\n },\n {\n id: \"developer\",\n name: \"Developer\",\n modelTier: \"small\",\n capabilities: [\"deliver\"],\n canApprove: [],\n inputs: [\"design-doc\", \"interface-spec\", \"brief\"],\n outputs: [\"code\", \"code-baseline\", \"test-output\"],\n do_not: [\n \"do not change requirements or designs; raise a change-request\",\n \"do not approve your own work\",\n ],\n },\n {\n id: \"business-analyst\",\n name: \"Business Analyst\",\n modelTier: \"medium\",\n capabilities: [\"define-acceptance\", \"deliver\"],\n canApprove: [],\n inputs: [\"stakeholder-needs\"],\n outputs: [\"srs\", \"acceptance-criteria\"],\n do_not: [\n \"do not design or implement\",\n \"do not edit a baselined requirement; raise a change-request\",\n ],\n },\n {\n id: \"architect\",\n name: \"Architect\",\n modelTier: \"medium\",\n capabilities: [\"deliver\"],\n canApprove: [],\n inputs: [\"srs\"],\n outputs: [\"design-doc\", \"interface-spec\"],\n do_not: [\"do not change requirements; raise a change-request\", \"do not implement\"],\n },\n {\n id: \"qa\",\n name: \"QA\",\n modelTier: \"small\",\n capabilities: [\"verify\", \"review\"],\n canApprove: [],\n inputs: [\"srs\", \"design-doc\", \"code-baseline\"],\n outputs: [\"test-report\", \"review-notes\"],\n do_not: [\"do not fix defects yourself; raise bugs\", \"do not approve phase gates\"],\n },\n {\n id: \"release-manager\",\n name: \"Release Manager\",\n modelTier: \"small\",\n capabilities: [\"deliver\"],\n canApprove: [],\n inputs: [\"code-baseline\", \"test-report\"],\n outputs: [\"release-notes\", \"deployment-record\"],\n do_not: [\"do not deploy an unbaselined verification phase\"],\n },\n ];\n}\n","import { authorOf } from \"../gates.ts\";\nimport { approverIds, rolesWith } from \"../roles.ts\";\nimport type {\n Action,\n ImpactAnalysis,\n NewItem,\n Phase,\n Rule,\n Violation,\n WorkflowState,\n} from \"../types.ts\";\nimport { configOf } from \"./config.ts\";\nimport {\n itemsInPhase,\n lastToPhase,\n missingDeliverables,\n openPhase,\n phaseOf,\n phasesOf,\n} from \"./phases.ts\";\nimport { missingTraces } from \"./traceability.ts\";\n\nconst v = (rule: string, message: string, fix: string, item?: string): Violation =>\n item\n ? { rule, severity: \"error\", item, message, fix }\n : { rule, severity: \"error\", message, fix };\nconst payloadOf = (a: Action): Record<string, unknown> =>\n (a.payload ?? {}) as Record<string, unknown>;\nconst isObj = (x: unknown): x is Record<string, unknown> =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\nconst phaseArg = (a: Action): string | undefined => {\n const p = payloadOf(a)[\"phase\"];\n return typeof p === \"string\" ? p : undefined;\n};\nconst phaseById = (s: WorkflowState, id: string): Phase | undefined =>\n phasesOf(s).find((p) => p.id === id);\nconst phaseIds = (s: WorkflowState) =>\n phasesOf(s)\n .map((p) => p.id)\n .join(\", \");\nconst itemById = (s: WorkflowState, id: unknown) =>\n typeof id === \"string\" && Object.hasOwn(s.items, id) ? s.items[id] : undefined;\n\n/** Phase a NewItem would land in: its own, else its parent's. */\nfunction phaseOfNew(s: WorkflowState, item: NewItem): string | undefined {\n if (item.phase !== undefined) return item.phase;\n const parent = itemById(s, item.parent);\n return parent ? phaseOf(s, parent) : undefined;\n}\nconst governed = (item: NewItem) => item.type !== \"change-request\" && item.type !== \"question\";\n\nconst frozenFix = (item: string, phase: string) =>\n `raise a change-request: addItem({ type: \"change-request\", affects: [\"${item}\"], impactAnalysis: { summary, reopen: [\"${phase}\"], weight } }) and decide it in changeControlBoard`;\n\nfunction changeOf(s: WorkflowState, a: Action) {\n const item = itemById(s, payloadOf(a)[\"change\"]);\n return item && item.type === \"change-request\" ? item : undefined;\n}\n\nexport function waterfallRules(): Rule[] {\n const sequential: Rule = {\n id: \"phase-sequential\",\n severity: \"error\",\n check(s, a) {\n const out: Violation[] = [];\n if (a.type === \"ceremony.kickoff\") {\n const id = phaseArg(a);\n const p = id === undefined ? undefined : phaseById(s, id);\n if (!p) return [];\n if (p.status === \"open\")\n out.push(\n v(\n \"phase-sequential\",\n `phase \"${p.id}\" is already open`,\n `gateReview \"${p.id}\" when its work is done`,\n ),\n );\n if (p.status === \"baselined\")\n out.push(\n v(\n \"phase-sequential\",\n `phase \"${p.id}\" is baselined`,\n \"only an approved change-request reopens a baselined phase\",\n ),\n );\n const open = openPhase(s);\n if (open && open.id !== p.id)\n out.push(\n v(\n \"phase-sequential\",\n `phase \"${open.id}\" is still open`,\n `pass its gate (gateReview \"${open.id}\") before opening \"${p.id}\"`,\n ),\n );\n } else if (a.type === \"item.add\") {\n const item = payloadOf(a)[\"item\"] as NewItem | undefined;\n if (!isObj(item) || !governed(item)) return [];\n const phase = phaseOfNew(s, item);\n if (phase === undefined)\n out.push(\n v(\n \"phase-sequential\",\n `item \"${item.id}\" belongs to no phase`,\n `set phase to one of: ${phaseIds(s)}`,\n item.id,\n ),\n );\n else if (!phaseById(s, phase))\n out.push(\n v(\n \"phase-sequential\",\n `item \"${item.id}\" names unknown phase \"${phase}\"`,\n `phases are: ${phaseIds(s)}`,\n item.id,\n ),\n );\n } else if (a.type === \"item.edit\") {\n const id = payloadOf(a)[\"id\"];\n const patch = payloadOf(a)[\"patch\"];\n const item = itemById(s, id);\n if (!item || !isObj(patch) || patch[\"phase\"] === undefined || patch[\"phase\"] === item.phase)\n return [];\n out.push(\n v(\n \"phase-sequential\",\n `item \"${item.id}\" cannot move from phase \"${item.phase ?? \"(none)\"}\" to \"${String(patch[\"phase\"])}\"`,\n `drop \"${item.id}\" and add a new item in phase \"${String(patch[\"phase\"])}\"`,\n item.id,\n ),\n );\n }\n return out;\n },\n };\n\n const gateBefore: Rule = {\n id: \"gate-before-next-phase\",\n severity: \"error\",\n check(s, a) {\n if (a.type !== \"ceremony.kickoff\") return [];\n const id = phaseArg(a);\n const phases = phasesOf(s);\n const idx = id === undefined ? -1 : phases.findIndex((p) => p.id === id);\n if (idx < 0) return [];\n const earlier = phases\n .slice(0, idx)\n .filter((p) => p.status !== \"baselined\")\n .map((p) => p.id);\n if (earlier.length === 0) return [];\n return [\n v(\n \"gate-before-next-phase\",\n `phase(s) ${earlier.join(\", \")} before \"${id}\" are not baselined`,\n `kickoff and gateReview them in order, starting with \"${earlier[0]}\"`,\n ),\n ];\n },\n };\n\n const immutable: Rule = {\n id: \"baseline-immutable\",\n severity: \"error\",\n check(s, a) {\n const version = (phase: string) =>\n (s.baselines ?? []).filter((b) => b.phase === phase).length || 1;\n if (a.type === \"item.edit\") {\n const item = itemById(s, payloadOf(a)[\"id\"]);\n if (!item) return [];\n const phase = phaseOf(s, item);\n if (phase === undefined || phaseById(s, phase)?.status !== \"baselined\") return [];\n return [\n v(\n \"baseline-immutable\",\n `item \"${item.id}\" is frozen: phase \"${phase}\" is baselined (v${version(phase)})`,\n frozenFix(item.id, phase),\n item.id,\n ),\n ];\n }\n if (a.type === \"item.add\") {\n const item = payloadOf(a)[\"item\"] as NewItem | undefined;\n if (!isObj(item) || !governed(item)) return [];\n const phase = phaseOfNew(s, item);\n if (phase === undefined || phaseById(s, phase)?.status !== \"baselined\") return [];\n return [\n v(\n \"baseline-immutable\",\n `cannot add \"${item.id}\" to baselined phase \"${phase}\" (v${version(phase)})`,\n frozenFix(item.id, phase),\n item.id,\n ),\n ];\n }\n return [];\n },\n };\n\n const impact: Rule = {\n id: \"change-needs-impact-analysis\",\n severity: \"error\",\n check(s, a) {\n if (a.type !== \"ceremony.changeControlBoard\") return [];\n const cr = changeOf(s, a);\n if (!cr) return [];\n const cfg = configOf(s).changeControl;\n const ia = cr.impactAnalysis as ImpactAnalysis | undefined;\n const fix = `editItem(\"${cr.id}\", { impactAnalysis: { summary: \"what changes and why\", reopen: [\"<phase>\"], weight: <points> } })`;\n if (ia === undefined) {\n return cfg.requiresImpactAnalysis\n ? [\n v(\n \"change-needs-impact-analysis\",\n `change \"${cr.id}\" has no impact analysis`,\n fix,\n cr.id,\n ),\n ]\n : [];\n }\n const out: Violation[] = [];\n if (!isObj(ia) || typeof ia.summary !== \"string\" || ia.summary.trim() === \"\")\n out.push(\n v(\n \"change-needs-impact-analysis\",\n `change \"${cr.id}\" impactAnalysis.summary is empty`,\n fix,\n cr.id,\n ),\n );\n if (!Array.isArray(ia.reopen) || !ia.reopen.every((x) => typeof x === \"string\"))\n out.push(\n v(\n \"change-needs-impact-analysis\",\n `change \"${cr.id}\" impactAnalysis.reopen must be a string[] of phase ids`,\n fix,\n cr.id,\n ),\n );\n if (typeof ia.weight !== \"number\" || !Number.isFinite(ia.weight) || ia.weight < 0)\n out.push(\n v(\n \"change-needs-impact-analysis\",\n `change \"${cr.id}\" impactAnalysis.weight must be a non-negative number`,\n fix,\n cr.id,\n ),\n );\n if (out.length) return out;\n const approve = payloadOf(a)[\"decision\"] === \"approve\";\n for (const id of ia.reopen) {\n const p = phaseById(s, id);\n if (!p)\n out.push(\n v(\n \"change-needs-impact-analysis\",\n `change \"${cr.id}\" impactAnalysis.reopen names unknown phase \"${id}\"`,\n `phases are: ${phaseIds(s)}`,\n cr.id,\n ),\n );\n else if (approve && p.status === \"pending\")\n out.push(\n v(\n \"change-needs-impact-analysis\",\n `phase \"${id}\" was never baselined; it cannot be reopened`,\n `remove \"${id}\" from impactAnalysis.reopen`,\n cr.id,\n ),\n );\n }\n return out;\n },\n };\n\n const traced: Rule = {\n id: \"requirement-traced\",\n severity: \"error\",\n check(s, a) {\n if (a.type !== \"ceremony.gateReview\") return [];\n const id = phaseArg(a);\n const cfg = configOf(s).traceability;\n if (id === undefined || !cfg.to.includes(id) || !phaseById(s, id)) return [];\n return missingTraces(s, id).map((item) =>\n v(\n \"requirement-traced\",\n `item \"${item}\" of phase \"${cfg.from}\" has no trace into \"${id}\"`,\n `editItem a \"${id}\" item with traces: [\"${item}\"] (or editItem(\"${item}\", { traces: [...] }) while \"${cfg.from}\" is not baselined)`,\n item,\n ),\n );\n },\n };\n\n const deliverables: Rule = {\n id: \"deliverables-present\",\n severity: \"error\",\n check(s, a) {\n if (a.type !== \"ceremony.gateReview\") return [];\n const id = phaseArg(a);\n const p = id === undefined ? undefined : phaseById(s, id);\n if (!p) return [];\n const out: Violation[] = [];\n const open = itemsInPhase(s, p.id)\n .filter((i) => i.status !== \"done\")\n .map((i) => i.id);\n if (open.length)\n out.push(\n v(\n \"deliverables-present\",\n `${open.length} item(s) in phase \"${p.id}\" are not done: ${open.join(\", \")}`,\n \"finish them (next/complete) or drop them before the gate\",\n ),\n );\n const given = payloadOf(a)[\"deliverables\"];\n const extra = Array.isArray(given)\n ? given\n .filter((d) => isObj(d) && typeof d[\"kind\"] === \"string\")\n .map((d) => (d as { kind: string }).kind)\n : [];\n if (p.id === lastToPhase(s)) extra.push(\"traceability-matrix\");\n for (const kind of missingDeliverables(s, p, extra))\n out.push(\n v(\n \"deliverables-present\",\n `phase \"${p.id}\" has no deliverable \"${kind}\"`,\n `pass deliverables: [{ \"kind\": \"${kind}\", \"ref\": \"<where it lives>\" }] to gateReview, or attach evidence of kind \"${kind}\" on an item of the phase`,\n ),\n );\n return out;\n },\n };\n\n const notAuthor: Rule = {\n id: \"approver-not-author\",\n severity: \"error\",\n check(s, a) {\n if (a.by === \"human\") return [];\n if (a.type === \"ceremony.gateReview\") {\n const id = phaseArg(a);\n const p = id === undefined ? undefined : phaseById(s, id);\n if (!p) return [];\n const mine = itemsInPhase(s, p.id)\n .filter((i) => authorOf(s, i) === a.by)\n .map((i) => i.id);\n if (mine.length === 0) return [];\n const others = approverIds(s, p.gate.id, \"approve-gate\", a.by);\n return [\n v(\n \"approver-not-author\",\n `\"${a.by}\" authored ${mine.join(\", \")} in phase \"${p.id}\" and may not approve its gate`,\n `review the gate as one of: human${others.map((r) => `, ${r}`).join(\"\")}`,\n ),\n ];\n }\n if (a.type === \"ceremony.changeControlBoard\") {\n const cr = changeOf(s, a);\n if (!cr) return [];\n const added = s.events.find(\n (e) => e.type === \"item.added\" && (e.payload as { id: string }).id === cr.id,\n );\n if (!added || added.by !== a.by) return [];\n const others = rolesWith(s, \"control-change\")\n .map((r) => r.id)\n .filter((r) => r !== a.by);\n return [\n v(\n \"approver-not-author\",\n `\"${a.by}\" raised change \"${cr.id}\" and may not decide it`,\n `decide as human${others.map((r) => `, ${r}`).join(\"\")}`,\n cr.id,\n ),\n ];\n }\n return [];\n },\n };\n\n return [sequential, gateBefore, immutable, impact, traced, deliverables, notAuthor];\n}\n","import type { Stage } from \"../types.ts\";\nimport type { WaterfallConfig } from \"./config.ts\";\nimport { DONE, REVIEW, WORK } from \"./phases.ts\";\n\n/** Every phase's items share the same three steps; the phase is the unit of governance. */\nexport function waterfallStages(_config: WaterfallConfig): Stage[] {\n return [\n { id: WORK, name: \"Work\", entryPolicy: [{ kind: \"dependencies-done\" }], exitPolicy: [] },\n {\n id: REVIEW,\n name: \"Review\",\n entryPolicy: [],\n exitPolicy: [{ kind: \"no-open-blockers\" }],\n review: true,\n },\n { id: DONE, name: \"Done\", entryPolicy: [], exitPolicy: [] },\n ];\n}\n","import { addSpent } from \"../budget.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport type { CoreTerm, Methodology, PlannerOptions, WorkItem, WorkflowState } from \"../types.ts\";\nimport { configOf, validateWaterfallConfig, type WaterfallConfig } from \"./config.ts\";\nimport {\n REVIEW,\n WORK,\n currentPhase,\n itemsInPhase,\n missingDeliverables,\n openPhase,\n phaseIndex,\n phaseOf,\n phasesOf,\n} from \"./phases.ts\";\nimport { waterfallAfterDecide, waterfallCeremonies } from \"./ceremonies.ts\";\nimport { waterfallMetrics } from \"./metrics.ts\";\nimport { waterfallRoles } from \"./roles.ts\";\nimport { waterfallRules } from \"./rules.ts\";\nimport { waterfallStages } from \"./stages.ts\";\nimport { traceabilityMatrix } from \"./traceability.ts\";\n\nexport {\n validateWaterfallConfig,\n configOf,\n defaultPhases,\n DEFAULT_PHASE_IDS,\n DEFAULT_DELIVERABLES,\n DEFAULT_DELIVER_BY,\n GATE_ID,\n CHANGE_GATE,\n} from \"./config.ts\";\nexport type { WaterfallConfig, WaterfallPhaseConfig } from \"./config.ts\";\nexport {\n WORK,\n REVIEW,\n DONE,\n phasesOf,\n withPhases,\n getPhase,\n phaseIndex,\n phaseOf,\n itemsInPhase,\n openPhase,\n currentPhase,\n isFrozen,\n producedKinds,\n missingDeliverables,\n lastToPhase,\n} from \"./phases.ts\";\nexport { waterfallStages } from \"./stages.ts\";\nexport { waterfallRoles } from \"./roles.ts\";\nexport { waterfallRules } from \"./rules.ts\";\nexport { waterfallMetrics } from \"./metrics.ts\";\nexport type { WaterfallMetrics } from \"./metrics.ts\";\nexport {\n waterfallCeremonies,\n waterfallAfterDecide,\n wantPhase,\n approveChange,\n rejectChange,\n} from \"./ceremonies.ts\";\nexport { traceabilityMatrix, missingTraces } from \"./traceability.ts\";\nexport type { TraceabilityMatrix, TraceRow } from \"./traceability.ts\";\nexport { baselinePhase, reopenPhases } from \"./baseline.ts\";\nexport type { ReopenResult } from \"./baseline.ts\";\n\nexport const WATERFALL_VOCABULARY: Record<CoreTerm, string> = {\n backlog: \"Requirements Baseline\",\n item: \"Work Package\",\n stage: \"Step\",\n iteration: \"Phase\",\n increment: \"Deliverable\",\n ceremony: \"Review\",\n gate: \"Phase Gate\",\n};\n\n/** The role that delivers the item's phase (config deliverBy); undefined = the planner's default deliverer. */\nexport function deliverRoleFor(state: WorkflowState, item: WorkItem): string | undefined {\n const id = phaseOf(state, item);\n if (id === undefined) return undefined;\n return configOf(state).phases.find((p) => p.id === id)?.deliverBy;\n}\n\nexport interface PhaseReportRow {\n id: string;\n name: string;\n status: string;\n items: number;\n done: number;\n missingDeliverables: string[];\n readyForGate: boolean;\n}\nexport interface PhaseReport {\n phases: PhaseReportRow[];\n current: string | null;\n open: string | null;\n pendingGates: Array<{ pending: string; gate: string }>;\n}\n\nexport function phaseReport(state: WorkflowState): PhaseReport {\n const phases = phasesOf(state).map((p) => {\n const items = itemsInPhase(state, p.id);\n const done = items.filter((i) => i.status === \"done\").length;\n const missing = missingDeliverables(state, p);\n return {\n id: p.id,\n name: p.name,\n status: p.status,\n items: items.length,\n done,\n missingDeliverables: missing,\n readyForGate: p.status === \"open\" && done === items.length && missing.length === 0,\n };\n });\n return {\n phases,\n current: currentPhase(state)?.id ?? null,\n open: openPhase(state)?.id ?? null,\n pendingGates: state.pending\n .filter((p) => p.kind === \"gate\" && p.item === undefined && p.gate !== undefined)\n .map((p) => ({ pending: p.id, gate: p.gate! })),\n };\n}\n\nexport function waterfall(): Methodology<WaterfallConfig> {\n return {\n name: \"waterfall\",\n vocabulary: WATERFALL_VOCABULARY,\n validateConfig: validateWaterfallConfig,\n defaultStages: waterfallStages,\n defaultRoles: waterfallRoles,\n requiredCapabilities: [\"facilitate\", \"control-change\", \"approve-gate\", \"deliver\", \"verify\"],\n exclusiveCapabilities: [],\n plannerOptions(state): PlannerOptions {\n return {\n schedulerMode: \"level\",\n // questions keep the escalation role core gave them; reviews use the planner's reviewer logic\n roleFor: (item) =>\n item.status === \"todo\" && item.type !== \"question\"\n ? deliverRoleFor(state, item)\n : undefined,\n };\n },\n candidates(state): WorkItem[] {\n const open = openPhase(state);\n if (!open) return [];\n return Object.values(state.items).filter(\n (i) =>\n (i.status === \"todo\" || i.status === \"review\") &&\n (i.stage === WORK || i.stage === REVIEW) &&\n i.type !== \"change-request\" &&\n phaseOf(state, i) === open.id,\n );\n },\n invariants(state, item): string[] {\n const cfg = configOf(state);\n const phases = phasesOf(state);\n const id = phaseOf(state, item);\n const p = id === undefined ? undefined : phases[phaseIndex(state, id)];\n const frozen = phases.filter((x) => x.status === \"baselined\").map((x) => x.id);\n const human = p?.gate.requires.includes(\"human\");\n return [\n p\n ? `Phase \"${p.name}\" (${phaseIndex(state, p.id) + 1}/${phases.length}); deliverables: ${p.deliverables.join(\", \") || \"(none)\"}; gate \"${p.gate.id}\"${human ? \" needs human approval\" : \"\"}`\n : \"This item belongs to no phase; it is dispatched only through its parent's phase\",\n `Baselined phases are frozen: ${frozen.join(\", \") || \"(none yet)\"}; to change their items, raise a change-request with an impact analysis`,\n cfg.traceability.to.length\n ? `Traceability: every item of phase \"${cfg.traceability.from}\" must trace to an item in ${cfg.traceability.to.join(\", \")} (set traces on either side)`\n : \"Traceability: none configured\",\n `Do not change the scope of \"${item.id}\" or its acceptance criteria; raise open_questions instead`,\n ];\n },\n ceremonies: waterfallCeremonies(waterfall),\n rules: waterfallRules(),\n metrics: (state) => ({ ...waterfallMetrics(state) }),\n humanDefaults: { gates: \"all\" },\n report: (state) => ({ ...phaseReport(state), coverage: traceabilityMatrix(state).coverage }),\n afterDecide: waterfallAfterDecide,\n afterComplete(state, itemId, _now) {\n // an item added to the phase after kickoff is not in the iteration's committed list: count its spend now\n const it = openIteration(state);\n const open = openPhase(state);\n if (!it || !open || it.committed.includes(itemId)) return state;\n const item = state.items[itemId];\n if (!item || phaseOf(state, item) !== open.id) return state;\n const acc = state.accounting[state.accounting.length - 1];\n if (!acc || acc.item !== itemId) return state;\n return {\n ...state,\n iterations: state.iterations.map((x) =>\n x.id === it.id\n ? { ...x, committed: [...x.committed, itemId], spent: addSpent(x.spent, acc) }\n : x,\n ),\n };\n },\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ 'use strict';var chunkHHC5EZ54_cjs=require('./chunk-HHC5EZ54.cjs'),chunk7KF5K3L7_cjs=require('./chunk-7KF5K3L7.cjs'),chunkUM5X2JHB_cjs=require('./chunk-UM5X2JHB.cjs'),chunkKSKEFYY7_cjs=require('./chunk-KSKEFYY7.cjs'),chunkCWBH7H52_cjs=require('./chunk-CWBH7H52.cjs'),chunkSJRRQZ3R_cjs=require('./chunk-SJRRQZ3R.cjs'),chunkRSKZVOYC_cjs=require('./chunk-RSKZVOYC.cjs'),chunkDXC2RSN5_cjs=require('./chunk-DXC2RSN5.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),promises=require('fs/promises'),x=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var x__default=/*#__PURE__*/_interopDefault(x);var O={scrum:chunk7KF5K3L7_cjs.k,kanban:chunkUM5X2JHB_cjs.I,waterfall:chunkKSKEFYY7_cjs.N},g=["exwf init <scrum|kanban|waterfall> --config <file> [--roles <file>]","exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]","exwf next [--max n] exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m","exwf ceremony <name> [input.json] [--by who]","exwf decide <pendingId> approve|reject [--by who] [--note text]","exwf status | board | metrics | pending | lessons","exwf validate <action.json> exwf role add <manifest.json> | role list"];function K(r){let t=[],d={};for(let i=0;i<r.length;i++){let y=r[i];if(y.startsWith("--")){let e=y.slice(2),m=r[i+1];m!==void 0&&!m.startsWith("--")?(d[e]=m,i++):d[e]="true";}else t.push(y);}return {positional:t,flags:d}}async function k(r){try{return JSON.parse(await promises.readFile(r,"utf8"))}catch(t){return chunkS3BXVHO7_cjs.b("invalid-input",`cannot read JSON from ${r}: ${t.message}`,"check the path and that the file is valid JSON")}}function h(r){let t=Object.hasOwn(O,r.methodology)?O[r.methodology]:void 0;return t||chunkS3BXVHO7_cjs.b("config-invalid",`methodology "${r.methodology}" is not available in this build`,`available: ${Object.keys(O).join(", ")}`),t()}function S(r,t){let d=Number(r[t]);return Number.isFinite(d)||chunkS3BXVHO7_cjs.b("invalid-input",`--${t} must be a number (got ${JSON.stringify(r[t])})`,`pass --${t} <n>`),d}var Y=new Set(["init","add","edit","next","complete","ceremony","decide"]);async function gt(r,t){let[d,i]=K(r).positional,y=d!==void 0&&(Y.has(d)||d==="role"&&i==="add");try{return y?await chunkRSKZVOYC_cjs.c(t,()=>z(r,t)):await z(r,t)}catch(e){if(e instanceof chunkS3BXVHO7_cjs.a)return {exit:1,out:{ok:false,error:e.toJSON()}};throw e}}async function z(r,t){let{positional:d,flags:i}=K(r),[y,...e]=d,m=i.by??"human",u=new Date().toISOString();switch(y){case "init":{let[o]=e,n=o&&Object.hasOwn(O,o)?O[o]:void 0;if(!n||!i.config)return {exit:2,out:{ok:false,usage:g}};try{await promises.stat(chunkRSKZVOYC_cjs.b(t)),chunkS3BXVHO7_cjs.b("invalid-input",`${chunkRSKZVOYC_cjs.b(t)} already exists`,"delete .workflow/state.json to start over");}catch(f){if(f instanceof chunkS3BXVHO7_cjs.a||f.code!=="ENOENT")throw f}let s=await k(x__default.default.resolve(t,i.config)),a=i.roles?await k(x__default.default.resolve(t,i.roles)):void 0;if(a!==void 0){Array.isArray(a)||chunkS3BXVHO7_cjs.b("invalid-input",`roles file ${i.roles} must contain an array of role manifests`,"wrap the manifests in [ ... ]");for(let f of a)chunkDXC2RSN5_cjs.b(chunkDXC2RSN5_cjs.e,f,`roles file ${i.roles}`);}let c=chunkSJRRQZ3R_cjs.N(a?{methodology:n(),config:s,roles:a,by:m,now:u}:{methodology:n(),config:s,by:m,now:u});return await chunkRSKZVOYC_cjs.d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,state:{methodology:c.state.methodology,stages:c.state.stages.map(f=>f.id),roles:Object.keys(c.state.roles)}}}}case "add":{if(!e[0])return {exit:2,out:{ok:false,usage:g}};let o=await chunkRSKZVOYC_cjs.e(t),n=await k(x__default.default.resolve(t,e[0]));chunkDXC2RSN5_cjs.b(chunkDXC2RSN5_cjs.f,n,`item file ${e[0]}`);let s=chunkSJRRQZ3R_cjs.M(o,h(o),{type:"item.add",by:m,payload:{item:n}},a=>chunkSJRRQZ3R_cjs.v(a,n,m,u));return await chunkRSKZVOYC_cjs.d(t,s.state),{exit:0,out:{ok:true,warnings:s.warnings,item:chunkSJRRQZ3R_cjs.u(s.state,n.id)}}}case "edit":{if(!e[0]||!e[1])return {exit:2,out:{ok:false,usage:g}};let o=await chunkRSKZVOYC_cjs.e(t),n=e[0],s=await k(x__default.default.resolve(t,e[1]));chunkDXC2RSN5_cjs.b(chunkDXC2RSN5_cjs.g,s,`patch file ${e[1]}`);let a=chunkSJRRQZ3R_cjs.M(o,h(o),{type:"item.edit",by:m,payload:{id:n,patch:s}},c=>chunkSJRRQZ3R_cjs.w(c,n,s,m,u));return await chunkRSKZVOYC_cjs.d(t,a.state),{exit:0,out:{ok:true,warnings:a.warnings,item:chunkSJRRQZ3R_cjs.u(a.state,n)}}}case "next":{let o=await chunkRSKZVOYC_cjs.e(t),n=i.max?{max:S(i,"max"),now:u}:{now:u},s=chunkHHC5EZ54_cjs.b(o,h(o),n);await chunkRSKZVOYC_cjs.d(t,s.state);for(let a of s.briefs)await chunkRSKZVOYC_cjs.f(t,a);return {exit:0,out:{ok:true,reason:s.reason??null,skipped:s.skipped,briefs:s.briefs}}}case "complete":{if(!e[0]||!e[1])return {exit:2,out:{ok:false,usage:g}};let o=await chunkRSKZVOYC_cjs.e(t),n=await k(x__default.default.resolve(t,e[1]));chunkDXC2RSN5_cjs.b(chunkDXC2RSN5_cjs.h,n,`handoff file ${e[1]}`),n.item!==e[0]&&chunkS3BXVHO7_cjs.b("handoff-invalid",`handoff.item "${n.item}" differs from the command's item "${e[0]}"`,"make them match");let s=i.role??n.role,a=S(i,"duration-ms"),c={item:e[0],role:s,model:i.model??"",tokensIn:S(i,"tokens-in"),tokensOut:S(i,"tokens-out"),durationMs:a,startedAt:new Date(Date.parse(u)-a).toISOString(),endedAt:u},f=chunkHHC5EZ54_cjs.c(o,h(o),{...n,role:s},c,u);return await chunkRSKZVOYC_cjs.d(t,f.state),await chunkRSKZVOYC_cjs.g(t,n,f.state.events.length),{exit:0,out:{ok:true,warnings:f.warnings,item:chunkSJRRQZ3R_cjs.u(f.state,e[0])}}}case "ceremony":{if(!e[0])return {exit:2,out:{ok:false,usage:g}};let o=await chunkRSKZVOYC_cjs.e(t),n=h(o),s=Object.hasOwn(n.ceremonies,e[0])?n.ceremonies[e[0]]:void 0;s||chunkS3BXVHO7_cjs.b("unknown-ceremony",`"${e[0]}" is not a ${n.name} ceremony`,`available: ${Object.keys(n.ceremonies).join(", ")}`);let a=e[1]?await k(x__default.default.resolve(t,e[1])):{},c=s(o,{...a,by:m,now:u});return await chunkRSKZVOYC_cjs.d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,lastEvent:chunkSJRRQZ3R_cjs.d(c.state)}}}case "decide":{if(!e[0]||e[1]!=="approve"&&e[1]!=="reject")return {exit:2,out:{ok:false,usage:g}};let o=await chunkRSKZVOYC_cjs.e(t),n=o.pending.find(a=>a.id===e[0]),s=chunkSJRRQZ3R_cjs.J(o,e[0],e[1],m,i.note??"",u,h(o));return await chunkRSKZVOYC_cjs.d(t,s),{exit:0,out:{ok:true,item:n?.item?chunkSJRRQZ3R_cjs.u(s,n.item):null}}}case "status":{let o=await chunkRSKZVOYC_cjs.e(t),n=h(o),s={todo:0,in_progress:0,blocked:0,review:0,awaiting_human:0,done:0,dropped:0};for(let a of Object.values(o.items))s[a.status]+=1;return {exit:0,out:{ok:true,methodology:o.methodology,openIteration:chunkCWBH7H52_cjs.f(o)??null,counts:s,pending:o.pending,lastEvent:chunkSJRRQZ3R_cjs.d(o),report:n.report?n.report(o):null}}}case "board":{let o=await chunkRSKZVOYC_cjs.e(t);return {exit:0,out:{ok:true,columns:o.stages.map(s=>({stage:s.id,wipLimit:s.wipLimit??null,items:Object.values(o.items).filter(a=>a.stage===s.id&&a.status!=="dropped").map(a=>({id:a.id,title:a.title,status:a.status,role:a.role??null,age:a.transitions.length?Date.parse(u)-Date.parse(a.transitions[a.transitions.length-1].at):null}))}))}}}case "metrics":{let o=await chunkRSKZVOYC_cjs.e(t);return {exit:0,out:{ok:true,metrics:h(o).metrics(o)}}}case "pending":return {exit:0,out:{ok:true,pending:(await chunkRSKZVOYC_cjs.e(t)).pending}};case "lessons":return {exit:0,out:{ok:true,lessons:(await chunkRSKZVOYC_cjs.e(t)).lessons}};case "validate":{if(!e[0])return {exit:2,out:{ok:false,usage:g}};let o=await chunkRSKZVOYC_cjs.e(t),n=await k(x__default.default.resolve(t,e[0]));return {exit:0,out:{ok:true,violations:chunkSJRRQZ3R_cjs.L(o,h(o),n)}}}case "role":{let o=await chunkRSKZVOYC_cjs.e(t);if(e[0]==="list")return {exit:0,out:{ok:true,roles:Object.keys(o.roles),detail:o.roles}};if(e[0]==="add"&&e[1]){let n=await k(x__default.default.resolve(t,e[1]));chunkDXC2RSN5_cjs.b(chunkDXC2RSN5_cjs.e,n,`role manifest ${e[1]}`);let s=chunkSJRRQZ3R_cjs.f(o,n,m,u);return await chunkRSKZVOYC_cjs.d(t,s),{exit:0,out:{ok:true,roles:Object.keys(s.roles)}}}return {exit:2,out:{ok:false,usage:g}}}default:return {exit:2,out:{ok:false,usage:g}}}}exports.a=g;exports.b=K;exports.c=gt;//# sourceMappingURL=chunk-KUUIAKEJ.cjs.map
2
+ //# sourceMappingURL=chunk-KUUIAKEJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands.ts"],"names":["METHODOLOGIES","scrum","kanban","waterfall","USAGE","parseArgs","argv","positional","flags","a","key","val","readJson","file","readFile","e","fail","methodologyOf","state","f","num","v","WRITERS","runCommand","cwd","cmd","sub","writes","withStateLock","execute","WorkflowError","rest","by","now","name","stat","statePath","config","path","roles","r","assertValid","roleSchema","res","init","saveState","s","loadState","item","newItemSchema","applyAction","addItem","getItem","id","patch","itemPatchSchema","editItem","opts","next","b","saveBrief","handoff","handoffSchema","role","durationMs","acc","complete","saveHandoff","m","c","input","lastEvent","entry","p","s2","decide","counts","i","openIteration","st","action","validateAction","manifest","registerRole"],"mappings":"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","file":"chunk-KUUIAKEJ.cjs","sourcesContent":["import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n loadState,\n saveBrief,\n saveHandoff,\n saveState,\n statePath,\n withStateLock,\n} from \"../adapters/file.ts\";\nimport { next as planNext } from \"../brief.ts\";\nimport { complete } from \"../complete.ts\";\nimport { WorkflowError, fail } from \"../errors.ts\";\nimport { decide } from \"../gates.ts\";\nimport { addItem, editItem, getItem, type ItemPatch } from \"../items.ts\";\nimport { applyAction, init, validateAction } from \"../methodology.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport { registerRole } from \"../roles.ts\";\nimport {\n assertValid,\n handoffSchema,\n itemPatchSchema,\n newItemSchema,\n roleSchema,\n} from \"../schema/index.ts\";\nimport { lastEvent } from \"../state.ts\";\nimport { scrum } from \"../scrum/index.ts\";\nimport { kanban } from \"../kanban/index.ts\";\nimport { waterfall } from \"../waterfall/index.ts\";\nimport type {\n Accounting,\n Action,\n Handoff,\n ItemStatus,\n Methodology,\n NewItem,\n Role,\n WorkflowState,\n} from \"../types.ts\";\n\nconst METHODOLOGIES: Record<string, () => Methodology> = {\n scrum: scrum as () => Methodology,\n kanban: kanban as () => Methodology,\n waterfall: waterfall as () => Methodology,\n};\n\nexport const USAGE = [\n \"exwf init <scrum|kanban|waterfall> --config <file> [--roles <file>]\",\n \"exwf add <item.json> [--by who] exwf edit <id> <patch.json> [--by who]\",\n \"exwf next [--max n] exwf complete <id> <handoff.json> --tokens-in n --tokens-out n --duration-ms n --model m\",\n \"exwf ceremony <name> [input.json] [--by who]\",\n \"exwf decide <pendingId> approve|reject [--by who] [--note text]\",\n \"exwf status | board | metrics | pending | lessons\",\n \"exwf validate <action.json> exwf role add <manifest.json> | role list\",\n];\n\nexport interface Parsed {\n positional: string[];\n flags: Record<string, string>;\n}\nexport function parseArgs(argv: string[]): Parsed {\n const positional: string[] = [];\n const flags: Record<string, string> = {};\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i]!;\n if (a.startsWith(\"--\")) {\n const key = a.slice(2);\n const val = argv[i + 1];\n if (val !== undefined && !val.startsWith(\"--\")) {\n flags[key] = val;\n i++;\n } else flags[key] = \"true\";\n } else positional.push(a);\n }\n return { positional, flags };\n}\n\nasync function readJson<T>(file: string): Promise<T> {\n try {\n return JSON.parse(await readFile(file, \"utf8\")) as T;\n } catch (e) {\n return fail(\n \"invalid-input\",\n `cannot read JSON from ${file}: ${(e as Error).message}`,\n \"check the path and that the file is valid JSON\",\n );\n }\n}\n\nfunction methodologyOf(state: WorkflowState): Methodology {\n const f = Object.hasOwn(METHODOLOGIES, state.methodology)\n ? METHODOLOGIES[state.methodology]\n : undefined;\n if (!f)\n fail(\n \"config-invalid\",\n `methodology \"${state.methodology}\" is not available in this build`,\n `available: ${Object.keys(METHODOLOGIES).join(\", \")}`,\n );\n return f();\n}\n\nfunction num(flags: Record<string, string>, key: string): number {\n const v = Number(flags[key]);\n if (!Number.isFinite(v))\n fail(\n \"invalid-input\",\n `--${key} must be a number (got ${JSON.stringify(flags[key])})`,\n `pass --${key} <n>`,\n );\n return v;\n}\n\nexport interface CommandResult {\n exit: 0 | 1 | 2;\n out: unknown;\n}\n\n/** Commands that load, change and save the state: they run under .workflow/state.lock. */\nconst WRITERS = new Set([\"init\", \"add\", \"edit\", \"next\", \"complete\", \"ceremony\", \"decide\"]);\n\nexport async function runCommand(argv: string[], cwd: string): Promise<CommandResult> {\n const [cmd, sub] = parseArgs(argv).positional;\n const writes = cmd !== undefined && (WRITERS.has(cmd) || (cmd === \"role\" && sub === \"add\"));\n try {\n return writes ? await withStateLock(cwd, () => execute(argv, cwd)) : await execute(argv, cwd);\n } catch (e) {\n if (e instanceof WorkflowError) return { exit: 1, out: { ok: false, error: e.toJSON() } };\n throw e;\n }\n}\n\nasync function execute(argv: string[], cwd: string): Promise<CommandResult> {\n const { positional, flags } = parseArgs(argv);\n const [cmd, ...rest] = positional;\n const by = flags[\"by\"] ?? \"human\";\n const now = new Date().toISOString();\n switch (cmd) {\n case \"init\": {\n const [name] = rest;\n const f = name && Object.hasOwn(METHODOLOGIES, name) ? METHODOLOGIES[name] : undefined;\n if (!f || !flags[\"config\"]) return { exit: 2, out: { ok: false, usage: USAGE } };\n try {\n await stat(statePath(cwd));\n fail(\n \"invalid-input\",\n `${statePath(cwd)} already exists`,\n \"delete .workflow/state.json to start over\",\n );\n } catch (e) {\n if (e instanceof WorkflowError) throw e;\n if ((e as NodeJS.ErrnoException).code !== \"ENOENT\") throw e;\n }\n const config = await readJson<unknown>(path.resolve(cwd, flags[\"config\"]));\n const roles = flags[\"roles\"]\n ? await readJson<Role[]>(path.resolve(cwd, flags[\"roles\"]))\n : undefined;\n if (roles !== undefined) {\n if (!Array.isArray(roles))\n fail(\n \"invalid-input\",\n `roles file ${flags[\"roles\"]} must contain an array of role manifests`,\n \"wrap the manifests in [ ... ]\",\n );\n for (const r of roles) assertValid(roleSchema, r, `roles file ${flags[\"roles\"]}`);\n }\n const res = init(\n roles\n ? { methodology: f(), config, roles, by, now }\n : { methodology: f(), config, by, now },\n );\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: {\n ok: true,\n warnings: res.warnings,\n state: {\n methodology: res.state.methodology,\n stages: res.state.stages.map((s) => s.id),\n roles: Object.keys(res.state.roles),\n },\n },\n };\n }\n case \"add\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const item = await readJson<NewItem>(path.resolve(cwd, rest[0]));\n assertValid(newItemSchema, item, `item file ${rest[0]}`);\n const res = applyAction(\n state,\n methodologyOf(state),\n { type: \"item.add\", by, payload: { item } },\n (s) => addItem(s, item, by, now),\n );\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, item: getItem(res.state, item.id) },\n };\n }\n case \"edit\": {\n if (!rest[0] || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const id = rest[0];\n const patch = await readJson<ItemPatch>(path.resolve(cwd, rest[1]));\n assertValid(itemPatchSchema, patch, `patch file ${rest[1]}`);\n const res = applyAction(\n state,\n methodologyOf(state),\n { type: \"item.edit\", by, payload: { id, patch } },\n (s) => editItem(s, id, patch, by, now),\n );\n await saveState(cwd, res.state);\n return { exit: 0, out: { ok: true, warnings: res.warnings, item: getItem(res.state, id) } };\n }\n case \"next\": {\n const state = await loadState(cwd);\n const opts = flags[\"max\"] ? { max: num(flags, \"max\"), now } : { now };\n const res = planNext(state, methodologyOf(state), opts);\n await saveState(cwd, res.state);\n for (const b of res.briefs) await saveBrief(cwd, b);\n return {\n exit: 0,\n out: { ok: true, reason: res.reason ?? null, skipped: res.skipped, briefs: res.briefs },\n };\n }\n case \"complete\": {\n if (!rest[0] || !rest[1]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const handoff = await readJson<Handoff>(path.resolve(cwd, rest[1]));\n assertValid(handoffSchema, handoff, `handoff file ${rest[1]}`);\n if (handoff.item !== rest[0])\n fail(\n \"handoff-invalid\",\n `handoff.item \"${handoff.item}\" differs from the command's item \"${rest[0]}\"`,\n \"make them match\",\n );\n const role = flags[\"role\"] ?? handoff.role;\n const durationMs = num(flags, \"duration-ms\");\n const acc: Accounting = {\n item: rest[0],\n role,\n model: flags[\"model\"] ?? \"\",\n tokensIn: num(flags, \"tokens-in\"),\n tokensOut: num(flags, \"tokens-out\"),\n durationMs,\n startedAt: new Date(Date.parse(now) - durationMs).toISOString(),\n endedAt: now,\n };\n const res = complete(state, methodologyOf(state), { ...handoff, role }, acc, now);\n await saveState(cwd, res.state);\n await saveHandoff(cwd, handoff, res.state.events.length);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, item: getItem(res.state, rest[0]) },\n };\n }\n case \"ceremony\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const c = Object.hasOwn(m.ceremonies, rest[0]) ? m.ceremonies[rest[0]] : undefined;\n if (!c)\n fail(\n \"unknown-ceremony\",\n `\"${rest[0]}\" is not a ${m.name} ceremony`,\n `available: ${Object.keys(m.ceremonies).join(\", \")}`,\n );\n const input = rest[1]\n ? await readJson<Record<string, unknown>>(path.resolve(cwd, rest[1]))\n : {};\n const res = c(state, { ...input, by, now });\n await saveState(cwd, res.state);\n return {\n exit: 0,\n out: { ok: true, warnings: res.warnings, lastEvent: lastEvent(res.state) },\n };\n }\n case \"decide\": {\n if (!rest[0] || (rest[1] !== \"approve\" && rest[1] !== \"reject\"))\n return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const entry = state.pending.find((p) => p.id === rest[0]);\n const s2 = decide(\n state,\n rest[0],\n rest[1],\n by,\n flags[\"note\"] ?? \"\",\n now,\n methodologyOf(state),\n );\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, item: entry?.item ? getItem(s2, entry.item) : null } };\n }\n case \"status\": {\n const state = await loadState(cwd);\n const m = methodologyOf(state);\n const counts: Record<ItemStatus, number> = {\n todo: 0,\n in_progress: 0,\n blocked: 0,\n review: 0,\n awaiting_human: 0,\n done: 0,\n dropped: 0,\n };\n for (const i of Object.values(state.items)) counts[i.status] += 1;\n return {\n exit: 0,\n out: {\n ok: true,\n methodology: state.methodology,\n openIteration: openIteration(state) ?? null,\n counts,\n pending: state.pending,\n lastEvent: lastEvent(state),\n report: m.report ? m.report(state) : null,\n },\n };\n }\n case \"board\": {\n const state = await loadState(cwd);\n const columns = state.stages.map((st) => ({\n stage: st.id,\n wipLimit: st.wipLimit ?? null,\n items: Object.values(state.items)\n .filter((i) => i.stage === st.id && i.status !== \"dropped\")\n .map((i) => ({\n id: i.id,\n title: i.title,\n status: i.status,\n role: i.role ?? null,\n age: i.transitions.length\n ? Date.parse(now) - Date.parse(i.transitions[i.transitions.length - 1]!.at)\n : null,\n })),\n }));\n return { exit: 0, out: { ok: true, columns } };\n }\n case \"metrics\": {\n const state = await loadState(cwd);\n return { exit: 0, out: { ok: true, metrics: methodologyOf(state).metrics(state) } };\n }\n case \"pending\":\n return { exit: 0, out: { ok: true, pending: (await loadState(cwd)).pending } };\n case \"lessons\":\n return { exit: 0, out: { ok: true, lessons: (await loadState(cwd)).lessons } };\n case \"validate\": {\n if (!rest[0]) return { exit: 2, out: { ok: false, usage: USAGE } };\n const state = await loadState(cwd);\n const action = await readJson<Action>(path.resolve(cwd, rest[0]));\n return {\n exit: 0,\n out: { ok: true, violations: validateAction(state, methodologyOf(state), action) },\n };\n }\n case \"role\": {\n const state = await loadState(cwd);\n if (rest[0] === \"list\")\n return {\n exit: 0,\n out: { ok: true, roles: Object.keys(state.roles), detail: state.roles },\n };\n if (rest[0] === \"add\" && rest[1]) {\n const manifest = await readJson<Role>(path.resolve(cwd, rest[1]));\n assertValid(roleSchema, manifest, `role manifest ${rest[1]}`);\n const s2 = registerRole(state, manifest, by, now);\n await saveState(cwd, s2);\n return { exit: 0, out: { ok: true, roles: Object.keys(s2.roles) } };\n }\n return { exit: 2, out: { ok: false, usage: USAGE } };\n }\n default:\n return { exit: 2, out: { ok: false, usage: USAGE } };\n }\n}\n"]}
@@ -1,2 +1,2 @@
1
- import {f,c,d,e}from'./chunk-PD5FBDN7.mjs';import {o,j,u,n,c as c$1,M,a,v,x,t,s,w,E,p}from'./chunk-NQU5TH3A.mjs';import {b}from'./chunk-2FRRD6A3.mjs';import {timSort}from'exsorted';var ue=["todo","in_progress","blocked","review","awaiting_human","done","dropped"];function fe(o){let t=o.events.filter(r=>r.type==="sprint.closed"&&r.payload.reason!=="cancel");return t.length===0?null:t.reduce((r,i)=>r+i.payload.doneWeight,0)/t.length}function ie(o){let t=f(o),r=Object.fromEntries(ue.map(n=>[n,0])),i=[],y=0;for(let n of t?.committed??[]){let e=o.items[n];if(e){r[e.status]+=1,e.status!=="done"&&(y+=e.weight??0);for(let a of e.blockers)a.clearedAt||i.push({item:n,blocker:a.id,owner:a.owner,reason:a.reason});}}let u=t?.spent??{tokens:0,turns:0,wallclockMs:0},g=t?c(t.budget,t.spent):{},m=fe(o),h="unknown";if(t&&m!==null&&t.budget.tokens){let n=(g.tokens??0)/t.budget.tokens;h=y<=m*n?"on-track":"at-risk";}let s=o.lessons.filter(n=>n.status==="raised").length;return {sprint:t?.id??null,goal:t?.goal??null,byStatus:r,blockers:i,spent:u,remaining:g,remainingWeight:y,raisedLessons:s,velocity:m,forecast:h}}function V(o){for(let t=o.iterations.length-1;t>=0;t--){let r=o.iterations[t];if(r.endedAt!==void 0)return r}}function F(o,t){return o.events.find(r=>r.type==="sprint.closed"&&r.payload.id===t)?.seq??Number.POSITIVE_INFINITY}function ge(o){let t=new Set(V(o)?.carryover??[]),r=Object.values(o.items).filter(i=>i.stage==="backlog"&&i.status==="todo"&&i.type!=="question");return timSort([...r],(i,y)=>{let u=t.has(i.id)?1:0,g=t.has(y.id)?1:0;return u!==g?g-u:(y.priority??0)-(i.priority??0)})}function ne(o,t){let r=u(o,t);(r.stage!=="backlog"||r.status!=="todo")&&b("invalid-input",`item "${t}" is not in the Product Backlog (${r.stage}/${r.status})`,"only backlog items can be committed",{items:[t]}),E(o,r,p(o,"backlog").exitPolicy,"enter the Sprint Backlog");}function oe(o,t,r,i,y){let u=o;for(let g of Object.values(o.items))g.type!=="question"||g.parent===void 0||!t.includes(g.parent)||g.status==="done"||g.status==="dropped"||((g.stage!=="sprint"||g.status!=="todo")&&(u=x(u,g.id,{stage:"sprint",status:"todo"},i,y)),u=s(u,g.id,m=>({...m,iteration:r})));return u}function re(o,t){return {...o,config:{...O(o),definitionOfDone:t},stages:o.stages.map(r=>r.id==="review"?{...r,exitPolicy:t}:r)}}function ye(o,t){let r=[],i=0;for(let y of ge(o)){if(t.tokens!==void 0){let u=e(o,y.weight);if(i+u>t.tokens)break;i+=u;}else if(t.turns!==void 0&&r.length>=t.turns)break;r.push(y.id);}return r}function J(o$1){let t$1=(n,e,a$1,l)=>M(n,o$1(),{type:e,by:a$1.by,payload:a$1},p=>l(p,a(a$1.now)));return {refine:(n,e)=>{o(n,e.by,"define-acceptance","deliver");let a=e.items??[],l=e.split??[];return a.length===0&&l.length===0&&b("invalid-input","refine needs items[] or split[]","pass at least one patch or split"),t$1(n,"ceremony.refine",e,(p,c)=>{for(let{id:d,patch:v}of a)p=w(p,d,v,e.by,c);for(let d of l){u(p,d.from);for(let v$1 of d.into)p=v(p,{...v$1,parent:d.from},e.by,c);p=x(p,d.from,{status:"dropped"},e.by,c);}return c$1(p,"ceremony.refine",e.by,{edited:a.map(d=>d.id),split:l.map(d=>({from:d.from,into:d.into.map(v=>v.id)}))},c)})},plan:(n,e)=>{o(n,e.by,"facilitate");let a=e.goal;(typeof a!="string"||a.trim()==="")&&b("invalid-input","sprint planning needs a non-empty goal","state the Sprint Goal in one sentence");let l=O(n),p=e.budget??l.sprintBudget,c=e.items==="auto"?ye(n,p):e.items;Array.isArray(c)||b("invalid-input",'sprint planning needs items: string[] or "auto"','pass ["A","B"] or "auto"'),c.length===0&&b("invalid-input","no backlog items fit the sprint","refine the backlog (acceptance + estimates) or raise the budget in config");for(let d of c)ne(n,d);return t$1(n,"ceremony.plan",e,(d,v)=>{let w=`S${d.iterations.length+1}`,q=V(d),f=c.filter(S=>q?.carryover.includes(S));for(let S of c)d=x(d,S,{stage:"sprint",status:"todo"},e.by,v),d=s(d,S,B=>({...B,iteration:w}));d=oe(d,c,w,e.by,v);let W=c.reduce((S,B)=>S+(d.items[B]?.weight??0),0);return d={...d,iterations:[...d.iterations,{id:w,goal:a,budget:p,spent:{tokens:0,turns:0,wallclockMs:0},startedAt:v,committed:[...c],carryover:f}]},c$1(d,"sprint.opened",e.by,{id:w,goal:a,committed:c,committedWeight:W,budget:p},v)})},commit:(n,e)=>{let a=f(n);a||b("invalid-input","no open sprint to commit into","run the plan ceremony first");let l=e.items;(!Array.isArray(l)||l.length===0)&&b("invalid-input","commit needs items[]",'pass ["A"]');let p=new Set;for(let c of l)p.has(c)&&b("invalid-input",`item "${c}" appears twice in items[]`,"list each item once",{items:[c]}),p.add(c),u(n,c),a.committed.includes(c)&&b("invalid-input",`item "${c}" is already committed to ${a.id}`,"nothing to do",{items:[c]}),ne(n,c);return t$1(n,"ceremony.commit",e,(c,d)=>{for(let v of l)c=x(c,v,{stage:"sprint",status:"todo"},e.by,d),c=s(c,v,w=>({...w,iteration:a.id}));return c=oe(c,l,a.id,e.by,d),c={...c,iterations:c.iterations.map(v=>v.id===a.id?{...v,committed:[...v.committed,...l]}:v)},c$1(c,"sprint.committed",e.by,{id:a.id,items:l,goalImpact:e.goalImpact??null},d)})},uncommit:(n,e)=>{o(n,e.by,"order-backlog");let a=f(n);a||b("invalid-input","no open sprint","nothing to uncommit from");let l=e.items;(!Array.isArray(l)||l.length===0)&&b("invalid-input","uncommit needs items[]",'pass ["A"]');for(let p of l)u(n,p).status==="done"&&b("invalid-input",`item "${p}" is done`,"finished work cannot be uncommitted",{items:[p]});for(let p of l)a.committed.includes(p)||b("invalid-input",`item "${p}" is not committed to ${a.id}`,`committed: ${a.committed.join(", ")}`,{items:[p]});return t$1(n,"ceremony.uncommit",e,(p,c)=>{for(let d of l)p=x(p,d,{stage:"backlog",status:"todo"},e.by,c),p=t(p,d,["iteration","role"]);return p={...p,iterations:p.iterations.map(d=>d.id===a.id?{...d,committed:d.committed.filter(v=>!l.includes(v))}:d)},c$1(p,"sprint.uncommitted",e.by,{id:a.id,items:l,reason:e.reason??""},c)})},daily:(n,e)=>t$1(n,"ceremony.daily",e,(a,l)=>c$1(a,"daily",e.by,ie(a),l)),review:(n,e)=>{let a=f(n);a||b("invalid-input","no open sprint to review","run the plan ceremony first");let l=j(n,"sprint-review");e.by!=="human"&&!l.includes(e.by)&&b("gate-unmet",`"${e.by}" may not accept the Sprint Review`,`run review as "human" or as ${l.join(", ")||"a role with canApprove sprint-review"}`,{rule:"sprint-review"});let p=e.feedback??[];return t$1(n,"ceremony.review",e,(c,d)=>{for(let w of p)c=v(c,{...w,stage:"backlog"},e.by,d);let v$1=a.committed.filter(w=>c.items[w]?.status==="done");return c=c$1(c,"increment",e.by,{sprint:a.id,done:v$1,goalMet:e.goalMet===true,accepted:e.accepted===true,feedback:p.map(w=>w.id)},d),T(c,"review",d)})},retro:(n,e)=>{o(n,e.by,"facilitate");let a=V(n);a||b("invalid-input","no closed sprint to retrospect","close the sprint (review or cancel) first"),f(n)&&b("invalid-input","a sprint is still open","retro runs between sprints; review or cancel the open one");let l=F(n,a.id);n.events.some(f=>f.type==="retro"&&f.seq>l)&&b("invalid-input",`sprint ${a.id} already has a retrospective`,"plan the next sprint");let p=e.lessons??[],c=e.adopt??[],d=e.dismiss??[],v$1=e.dodChanges,w=[...c.map(f=>f.id),...d],q=w.find((f,W)=>w.indexOf(f)!==W);q&&b("invalid-input",`lesson "${q}" is referenced more than once`,"adopt or dismiss each lesson once");for(let f of w){let W=n.lessons.find(S=>S.id===f);W||b("invalid-input",`no lesson "${f}"`,`raised lessons: ${n.lessons.filter(S=>S.status==="raised").map(S=>S.id).join(", ")||"(none)"}`),W.status!=="raised"&&b("invalid-input",`lesson "${f}" is already ${W.status}`,"only raised lessons can be adopted or dismissed");}return t$1(n,"ceremony.retro",e,(f,W)=>{let S=[],B=[],U=[],E=false,H=k=>{if(k)if(k.kind==="agreement")f.agreements.includes(k.text)||(f={...f,agreements:[...f.agreements,k.text]}),B.push(k.text);else if(k.kind==="dod"){let I=O(f).definitionOfDone;I.some(_=>JSON.stringify(_)===JSON.stringify(k.policy))||(E=true,f=re(f,[...I,k.policy]));}else k.kind==="backlog"&&(f=v(f,{...k.item,stage:"backlog",tags:[...k.item.tags??[],"retro"]},e.by,W),U.push(k.item.id));};for(let k of p){let I=`L${f.lessons.length+1}`,_={id:I,at:W,text:k.text,scope:k.scope,status:"adopted",from:e.by};k.suggestedChange&&(_.suggestedChange=k.suggestedChange),f={...f,lessons:[...f.lessons,_]},S.push(I),H(k.suggestedChange);}for(let k of c)f={...f,lessons:f.lessons.map(I=>I.id===k.id?{...I,status:"adopted",...k.suggestedChange?{suggestedChange:k.suggestedChange}:{}}:I)},S.push(k.id),H(k.suggestedChange??f.lessons.find(I=>I.id===k.id)?.suggestedChange);for(let k of d)f={...f,lessons:f.lessons.map(I=>I.id===k?{...I,status:"dismissed"}:I)};return v$1&&(E=true,f=re(f,v$1)),c$1(f,"retro",e.by,{sprint:a.id,adopted:S,dismissed:d,agreements:B,dodChanged:E,backlogAdded:U},W)})},cancel:(n,e)=>{o(n,e.by,"order-backlog");let a=f(n);return a||b("invalid-input","no open sprint to cancel","nothing to do"),t$1(n,"ceremony.cancel",e,(l,p)=>(l=c$1(l,"sprint.cancelled",e.by,{id:a.id,reason:e.reason??""},p),T(l,"cancel",p)))}}}var he=new Set(["never","po-only","any"]);function se(o){let t=o??{},r=t.sprintBudget;(!r||typeof r!="object"||r.tokens===void 0&&r.turns===void 0&&r.wallclockMs===void 0)&&b("config-invalid","scrum config.sprintBudget must define tokens, turns or wallclockMs",'e.g. { "sprintBudget": { "tokens": 400000, "turns": 60 } }'),(typeof t.productGoal!="string"||t.productGoal.trim()==="")&&b("config-invalid","scrum config.productGoal must be a non-empty string","state the Product Goal in one sentence"),Array.isArray(t.definitionOfDone)||b("config-invalid","scrum config.definitionOfDone must be a Policy[]",'e.g. [{ "kind": "evidence", "evidenceKind": "test-output" }]');let i=t.refinementSharePct??10;(typeof i!="number"||i<0||i>100)&&b("config-invalid","scrum config.refinementSharePct must be 0..100","omit it for the default 10");let y=t.allowMidSprintAdd??"po-only";(typeof y!="string"||!he.has(y))&&b("config-invalid",`scrum config.allowMidSprintAdd must be never | po-only | any (got ${JSON.stringify(y)})`,'use "po-only" unless you have a reason');let u=t.inProgressWipLimit;u!==void 0&&(typeof u!="number"||u<1)&&b("config-invalid","scrum config.inProgressWipLimit must be a positive number","omit it for no limit");let g={sprintBudget:r,productGoal:t.productGoal,definitionOfDone:t.definitionOfDone,refinementSharePct:i,allowMidSprintAdd:y};return u!==void 0&&(g.inProgressWipLimit=u),g}var D=(o,t)=>t===0?0:o/t;function ae(o){let t=o.events.filter(s=>s.type==="sprint.closed").map(s=>s.payload),r=t.filter(s=>s.reason!=="cancel"),i=r.map(s=>s.doneWeight),y=r.reduce((s,n)=>s+n.doneWeight,0),u=r.reduce((s,n)=>s+n.committedWeight,0),g=o.events.filter(s=>s.type==="increment").map(s=>s.payload),m=t.filter(s=>s.budget.tokens!==void 0),h=r.reduce((s,n)=>s+n.spent.tokens,0);return {velocity:i,meanVelocity:D(i.reduce((s,n)=>s+n,0),i.length),burndown:o.events.filter(s=>s.type==="daily").map(s=>s.payload.remainingWeight),commitmentReliability:D(y,u),sprintGoalHitRate:D(g.filter(s=>s.goalMet).length,g.length),carryoverRatio:D(t.reduce((s,n)=>s+n.carryover.length,0),t.reduce((s,n)=>s+n.done.length+n.carryover.length,0)),budgetUtilisation:D(m.reduce((s,n)=>s+n.spent.tokens,0),m.reduce((s,n)=>s+(n.budget.tokens??0),0)),costPerPoint:D(h,y)}}function ce(){return [{id:"product-owner",name:"Product Owner",modelTier:"large",capabilities:["order-backlog","define-acceptance","escalate"],canApprove:["sprint-review"],inputs:["stakeholder-needs","product-goal"],outputs:["ordered-backlog","acceptance-criteria"],do_not:["do not implement items yourself"]},{id:"scrum-master",name:"Scrum Master",modelTier:"large",capabilities:["facilitate","escalate"],canApprove:[],inputs:["board","blockers"],outputs:["ceremony-records","lessons"],do_not:["do not reorder the Product Backlog","do not assign work; the planner pulls"]},{id:"developer",name:"Developer",modelTier:"small",capabilities:["deliver","review","verify"],canApprove:[],inputs:["brief"],outputs:["code","test-output"],do_not:["do not change acceptance criteria","do not touch items outside your brief"]}]}var R=(o,t,r,i,y)=>y?{rule:o,severity:t,item:y,message:r,fix:i}:{rule:o,severity:t,message:r,fix:i};function de(o){for(let t=o.iterations.length-1;t>=0;t--){let r=o.iterations[t];if(r.endedAt!==void 0)return r}}function le(){return [{id:"one-open-sprint",severity:"error",check:(m,h)=>h.type==="ceremony.plan"&&f(m)?[R("one-open-sprint","error",`sprint ${f(m).id} is still open`,"review or cancel it before planning the next sprint")]:[]},{id:"retro-before-plan",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.plan")return [];let s=de(m);if(!s)return [];let n=F(m,s.id);if(m.events.some(a=>a.type==="retro"&&a.seq>n))return [];let e=s.outcome==="cancelled"?"warning":"error";return [R("retro-before-plan",e,`sprint ${s.id} has no retrospective yet`,"run the retro ceremony first (lessons may be empty)")]}},{id:"sprint-budget-fixed",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.plan")return [];let s=h.payload?.budget;return s===void 0||JSON.stringify(s)===JSON.stringify(O(m).sprintBudget)?[]:[R("sprint-budget-fixed","error","sprint length is fixed by config.sprintBudget","change sprintBudget in the config between sprints instead of per plan")]}},{id:"scope-protects-goal",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.commit")return [];let s=O(m),n$1=h.payload??{};return s.allowMidSprintAdd==="never"?[R("scope-protects-goal","error","mid-sprint additions are disabled",'set allowMidSprintAdd to "po-only" or wait for the next sprint')]:s.allowMidSprintAdd==="po-only"&&!n(m,h.by,"order-backlog")?[R("scope-protects-goal","error",`"${h.by}" may not add work mid-sprint`,"ask the Product Owner (order-backlog) to commit it")]:n$1.goalImpact!=="none"?[R("scope-protects-goal","error",`adding work with goalImpact "${n$1.goalImpact??"unset"}" endangers the Sprint Goal`,'only commit items with goalImpact: "none"; otherwise cancel and re-plan')]:[]}},{id:"po-orders-backlog",severity:"error",check:(m,h)=>h.type!=="ceremony.refine"||n(m,h.by,"order-backlog")?[]:((h.payload??{}).items??[]).filter(n=>n.patch.priority!==void 0).map(n=>R("po-orders-backlog","error",`"${h.by}" may not change the priority of "${n.id}"`,"only the Product Owner orders the backlog; drop priority from the patch",n.id))},{id:"dod-not-weakened",severity:"error",check:(m,h)=>h.type==="ceremony.retro"&&h.payload?.dodChanges!==void 0&&f(m)?[R("dod-not-weakened","error","Definition of Done cannot change while a sprint is open","close the sprint first; DoD changes apply to the next sprint")]:[]},{id:"carryover-reestimated",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.plan")return [];let s=h.payload?.items;if(!Array.isArray(s))return [];let n=de(m);if(!n)return [];let e=F(m,n.id);return s.filter(a=>n.carryover.includes(a)&&!m.events.some(l=>l.type==="item.edited"&&l.seq>e&&l.payload.id===a&&l.payload.changed.includes("weight"))).map(a=>R("carryover-reestimated","error",`carried-over item "${a}" was not re-estimated after ${n.id}`,"refine it with a new weight before committing",a))}}]}function me(o){let t={id:"in_progress",name:"In progress",entryPolicy:[{kind:"dependencies-done"}],exitPolicy:[]};return o.inProgressWipLimit!==void 0&&(t.wipLimit=o.inProgressWipLimit),[{id:"backlog",name:"Product Backlog",entryPolicy:[],exitPolicy:[{kind:"acceptance-written"},{kind:"estimate-present"}]},{id:"sprint",name:"Sprint Backlog",entryPolicy:[],exitPolicy:[]},t,{id:"review",name:"Review",entryPolicy:[],exitPolicy:o.definitionOfDone,review:true},{id:"done",name:"Increment",entryPolicy:[],exitPolicy:[]}]}var be={backlog:"Product Backlog",item:"Product Backlog Item",stage:"Column",iteration:"Sprint",increment:"Increment",ceremony:"Scrum Event",gate:"Sprint Review"};function O(o){return o.config}function ke(o,t$1,r){let i=o,y=u(i,t$1).blockers.filter(g=>!g.clearedAt);if(y.length){i=s(i,t$1,g=>({...g,blockers:g.blockers.map(m=>m.clearedAt?m:{...m,clearedAt:r})}));for(let g of y)i=c$1(i,"blocker.cleared","system",{id:t$1,blocker:g.id,reason:"sprint closed"},r);}for(let g of i.pending.filter(m=>m.item===t$1))i={...i,pending:i.pending.filter(m=>m.id!==g.id)},i=c$1(i,"pending.dropped","system",{id:g.id,item:t$1,reason:"sprint closed"},r);let u$1=u(i,t$1);return (u$1.stage!=="backlog"||u$1.status!=="todo")&&(i=x(i,t$1,{stage:"backlog",status:"todo"},"system",r)),t(i,t$1,u$1.type==="question"?["iteration"]:["iteration","role"])}function T(o,t,r){let i=f(o);if(!i)return o;let y=i.committed.map(e=>u(o,e)),u$1=y.filter(e=>e.status==="done").map(e=>e.id),g=y.filter(e=>e.status==="dropped").map(e=>e.id),m=y.filter(e=>e.status!=="done"&&e.status!=="dropped").map(e=>e.id),h=Object.values(o.items).filter(e=>e.type==="question"&&e.parent!==void 0&&m.includes(e.parent)&&e.status!=="done"&&e.status!=="dropped").map(e=>e.id),s=o;for(let e of [...m,...h])s=ke(s,e,r);let n=e=>e.reduce((a,l)=>a+(o.items[l]?.weight??0),0);return s={...s,iterations:s.iterations.map(e=>{if(e.id!==i.id)return e;let{closing:a,...l}=e;return {...l,endedAt:r,outcome:t==="cancel"?"cancelled":"completed",carryover:m}})},c$1(s,"sprint.closed","system",{id:i.id,reason:t,done:u$1,carryover:m,carriedQuestions:h,dropped:g,doneWeight:n(u$1),committedWeight:n(i.committed),spent:i.spent,budget:i.budget},r)}function ve(){return {name:"scrum",vocabulary:be,validateConfig:se,defaultStages:me,defaultRoles:ce,requiredCapabilities:["order-backlog","facilitate","deliver"],exclusiveCapabilities:["order-backlog"],plannerOptions(o){let t=O(o).inProgressWipLimit;return t===void 0?{schedulerMode:"level",dispatchStage:"in_progress"}:{schedulerMode:"level",dispatchStage:"in_progress",concurrencyCap:t}},candidates(o){let t=f(o);return !t||t.closing?[]:Object.values(o.items).filter(r=>r.iteration===t.id&&(r.status==="todo"||r.status==="review")&&(r.stage==="sprint"||r.stage==="review"))},invariants(o,t){let r=f(o),i=O(o),y=r?c(r.budget,r.spent):{};return [`Sprint Goal: ${r?.goal??"(no open sprint)"}; Product Goal: ${i.productGoal}`,`Budget remaining: ${JSON.stringify(y)}; stop and hand off when it is gone`,`Definition of Done: ${i.definitionOfDone.map(u=>u.kind==="evidence"?`evidence ${u.evidenceKind}`:u.kind).join(", ")||"(none)"}`,`Do not change the scope of "${t.id}" or its acceptance criteria; raise open_questions instead`]},ceremonies:J(ve),rules:le(),metrics:o=>({...ae(o)}),humanDefaults:{gates:["sprint-review"]},afterComplete(o,t,r){let i=f(o);return !i||!i.closing&&!d(i.budget,i.spent)?o:Object.values(o.items).some(u=>u.iteration===i.id&&u.status==="in_progress")?i.closing?o:c$1({...o,iterations:o.iterations.map(u=>u.id===i.id?{...u,closing:true}:u)},"sprint.closing","system",{id:i.id},r):T(o,"budget",r)}}}export{ie as a,J as b,se as c,ae as d,ce as e,le as f,me as g,be as h,O as i,T as j,ve as k};//# sourceMappingURL=chunk-IBRC36PE.mjs.map
2
- //# sourceMappingURL=chunk-IBRC36PE.mjs.map
1
+ import {f,c,d,e}from'./chunk-GFH2FEZH.mjs';import {o,j,u,n,c as c$1,M,a,v,x,t,s,w,E,p}from'./chunk-SHAPFMVP.mjs';import {b}from'./chunk-2FRRD6A3.mjs';import {timSort}from'exsorted';var ue=["todo","in_progress","blocked","review","awaiting_human","done","dropped"];function fe(o){let t=o.events.filter(r=>r.type==="sprint.closed"&&r.payload.reason!=="cancel");return t.length===0?null:t.reduce((r,i)=>r+i.payload.doneWeight,0)/t.length}function ie(o){let t=f(o),r=Object.fromEntries(ue.map(n=>[n,0])),i=[],y=0;for(let n of t?.committed??[]){let e=o.items[n];if(e){r[e.status]+=1,e.status!=="done"&&(y+=e.weight??0);for(let a of e.blockers)a.clearedAt||i.push({item:n,blocker:a.id,owner:a.owner,reason:a.reason});}}let u=t?.spent??{tokens:0,turns:0,wallclockMs:0},g=t?c(t.budget,t.spent):{},m=fe(o),h="unknown";if(t&&m!==null&&t.budget.tokens){let n=(g.tokens??0)/t.budget.tokens;h=y<=m*n?"on-track":"at-risk";}let s=o.lessons.filter(n=>n.status==="raised").length;return {sprint:t?.id??null,goal:t?.goal??null,byStatus:r,blockers:i,spent:u,remaining:g,remainingWeight:y,raisedLessons:s,velocity:m,forecast:h}}function V(o){for(let t=o.iterations.length-1;t>=0;t--){let r=o.iterations[t];if(r.endedAt!==void 0)return r}}function F(o,t){return o.events.find(r=>r.type==="sprint.closed"&&r.payload.id===t)?.seq??Number.POSITIVE_INFINITY}function ge(o){let t=new Set(V(o)?.carryover??[]),r=Object.values(o.items).filter(i=>i.stage==="backlog"&&i.status==="todo"&&i.type!=="question");return timSort([...r],(i,y)=>{let u=t.has(i.id)?1:0,g=t.has(y.id)?1:0;return u!==g?g-u:(y.priority??0)-(i.priority??0)})}function ne(o,t){let r=u(o,t);(r.stage!=="backlog"||r.status!=="todo")&&b("invalid-input",`item "${t}" is not in the Product Backlog (${r.stage}/${r.status})`,"only backlog items can be committed",{items:[t]}),E(o,r,p(o,"backlog").exitPolicy,"enter the Sprint Backlog");}function oe(o,t,r,i,y){let u=o;for(let g of Object.values(o.items))g.type!=="question"||g.parent===void 0||!t.includes(g.parent)||g.status==="done"||g.status==="dropped"||((g.stage!=="sprint"||g.status!=="todo")&&(u=x(u,g.id,{stage:"sprint",status:"todo"},i,y)),u=s(u,g.id,m=>({...m,iteration:r})));return u}function re(o,t){return {...o,config:{...O(o),definitionOfDone:t},stages:o.stages.map(r=>r.id==="review"?{...r,exitPolicy:t}:r)}}function ye(o,t){let r=[],i=0;for(let y of ge(o)){if(t.tokens!==void 0){let u=e(o,y.weight);if(i+u>t.tokens)break;i+=u;}else if(t.turns!==void 0&&r.length>=t.turns)break;r.push(y.id);}return r}function J(o$1){let t$1=(n,e,a$1,l)=>M(n,o$1(),{type:e,by:a$1.by,payload:a$1},p=>l(p,a(a$1.now)));return {refine:(n,e)=>{o(n,e.by,"define-acceptance","deliver");let a=e.items??[],l=e.split??[];return a.length===0&&l.length===0&&b("invalid-input","refine needs items[] or split[]","pass at least one patch or split"),t$1(n,"ceremony.refine",e,(p,c)=>{for(let{id:d,patch:v}of a)p=w(p,d,v,e.by,c);for(let d of l){u(p,d.from);for(let v$1 of d.into)p=v(p,{...v$1,parent:d.from},e.by,c);p=x(p,d.from,{status:"dropped"},e.by,c);}return c$1(p,"ceremony.refine",e.by,{edited:a.map(d=>d.id),split:l.map(d=>({from:d.from,into:d.into.map(v=>v.id)}))},c)})},plan:(n,e)=>{o(n,e.by,"facilitate");let a=e.goal;(typeof a!="string"||a.trim()==="")&&b("invalid-input","sprint planning needs a non-empty goal","state the Sprint Goal in one sentence");let l=O(n),p=e.budget??l.sprintBudget,c=e.items==="auto"?ye(n,p):e.items;Array.isArray(c)||b("invalid-input",'sprint planning needs items: string[] or "auto"','pass ["A","B"] or "auto"'),c.length===0&&b("invalid-input","no backlog items fit the sprint","refine the backlog (acceptance + estimates) or raise the budget in config");for(let d of c)ne(n,d);return t$1(n,"ceremony.plan",e,(d,v)=>{let w=`S${d.iterations.length+1}`,q=V(d),f=c.filter(S=>q?.carryover.includes(S));for(let S of c)d=x(d,S,{stage:"sprint",status:"todo"},e.by,v),d=s(d,S,B=>({...B,iteration:w}));d=oe(d,c,w,e.by,v);let W=c.reduce((S,B)=>S+(d.items[B]?.weight??0),0);return d={...d,iterations:[...d.iterations,{id:w,goal:a,budget:p,spent:{tokens:0,turns:0,wallclockMs:0},startedAt:v,committed:[...c],carryover:f}]},c$1(d,"sprint.opened",e.by,{id:w,goal:a,committed:c,committedWeight:W,budget:p},v)})},commit:(n,e)=>{let a=f(n);a||b("invalid-input","no open sprint to commit into","run the plan ceremony first");let l=e.items;(!Array.isArray(l)||l.length===0)&&b("invalid-input","commit needs items[]",'pass ["A"]');let p=new Set;for(let c of l)p.has(c)&&b("invalid-input",`item "${c}" appears twice in items[]`,"list each item once",{items:[c]}),p.add(c),u(n,c),a.committed.includes(c)&&b("invalid-input",`item "${c}" is already committed to ${a.id}`,"nothing to do",{items:[c]}),ne(n,c);return t$1(n,"ceremony.commit",e,(c,d)=>{for(let v of l)c=x(c,v,{stage:"sprint",status:"todo"},e.by,d),c=s(c,v,w=>({...w,iteration:a.id}));return c=oe(c,l,a.id,e.by,d),c={...c,iterations:c.iterations.map(v=>v.id===a.id?{...v,committed:[...v.committed,...l]}:v)},c$1(c,"sprint.committed",e.by,{id:a.id,items:l,goalImpact:e.goalImpact??null},d)})},uncommit:(n,e)=>{o(n,e.by,"order-backlog");let a=f(n);a||b("invalid-input","no open sprint","nothing to uncommit from");let l=e.items;(!Array.isArray(l)||l.length===0)&&b("invalid-input","uncommit needs items[]",'pass ["A"]');for(let p of l)u(n,p).status==="done"&&b("invalid-input",`item "${p}" is done`,"finished work cannot be uncommitted",{items:[p]});for(let p of l)a.committed.includes(p)||b("invalid-input",`item "${p}" is not committed to ${a.id}`,`committed: ${a.committed.join(", ")}`,{items:[p]});return t$1(n,"ceremony.uncommit",e,(p,c)=>{for(let d of l)p=x(p,d,{stage:"backlog",status:"todo"},e.by,c),p=t(p,d,["iteration","role"]);return p={...p,iterations:p.iterations.map(d=>d.id===a.id?{...d,committed:d.committed.filter(v=>!l.includes(v))}:d)},c$1(p,"sprint.uncommitted",e.by,{id:a.id,items:l,reason:e.reason??""},c)})},daily:(n,e)=>t$1(n,"ceremony.daily",e,(a,l)=>c$1(a,"daily",e.by,ie(a),l)),review:(n,e)=>{let a=f(n);a||b("invalid-input","no open sprint to review","run the plan ceremony first");let l=j(n,"sprint-review");e.by!=="human"&&!l.includes(e.by)&&b("gate-unmet",`"${e.by}" may not accept the Sprint Review`,`run review as "human" or as ${l.join(", ")||"a role with canApprove sprint-review"}`,{rule:"sprint-review"});let p=e.feedback??[];return t$1(n,"ceremony.review",e,(c,d)=>{for(let w of p)c=v(c,{...w,stage:"backlog"},e.by,d);let v$1=a.committed.filter(w=>c.items[w]?.status==="done");return c=c$1(c,"increment",e.by,{sprint:a.id,done:v$1,goalMet:e.goalMet===true,accepted:e.accepted===true,feedback:p.map(w=>w.id)},d),T(c,"review",d)})},retro:(n,e)=>{o(n,e.by,"facilitate");let a=V(n);a||b("invalid-input","no closed sprint to retrospect","close the sprint (review or cancel) first"),f(n)&&b("invalid-input","a sprint is still open","retro runs between sprints; review or cancel the open one");let l=F(n,a.id);n.events.some(f=>f.type==="retro"&&f.seq>l)&&b("invalid-input",`sprint ${a.id} already has a retrospective`,"plan the next sprint");let p=e.lessons??[],c=e.adopt??[],d=e.dismiss??[],v$1=e.dodChanges,w=[...c.map(f=>f.id),...d],q=w.find((f,W)=>w.indexOf(f)!==W);q&&b("invalid-input",`lesson "${q}" is referenced more than once`,"adopt or dismiss each lesson once");for(let f of w){let W=n.lessons.find(S=>S.id===f);W||b("invalid-input",`no lesson "${f}"`,`raised lessons: ${n.lessons.filter(S=>S.status==="raised").map(S=>S.id).join(", ")||"(none)"}`),W.status!=="raised"&&b("invalid-input",`lesson "${f}" is already ${W.status}`,"only raised lessons can be adopted or dismissed");}return t$1(n,"ceremony.retro",e,(f,W)=>{let S=[],B=[],U=[],E=false,H=k=>{if(k)if(k.kind==="agreement")f.agreements.includes(k.text)||(f={...f,agreements:[...f.agreements,k.text]}),B.push(k.text);else if(k.kind==="dod"){let I=O(f).definitionOfDone;I.some(_=>JSON.stringify(_)===JSON.stringify(k.policy))||(E=true,f=re(f,[...I,k.policy]));}else k.kind==="backlog"&&(f=v(f,{...k.item,stage:"backlog",tags:[...k.item.tags??[],"retro"]},e.by,W),U.push(k.item.id));};for(let k of p){let I=`L${f.lessons.length+1}`,_={id:I,at:W,text:k.text,scope:k.scope,status:"adopted",from:e.by};k.suggestedChange&&(_.suggestedChange=k.suggestedChange),f={...f,lessons:[...f.lessons,_]},S.push(I),H(k.suggestedChange);}for(let k of c)f={...f,lessons:f.lessons.map(I=>I.id===k.id?{...I,status:"adopted",...k.suggestedChange?{suggestedChange:k.suggestedChange}:{}}:I)},S.push(k.id),H(k.suggestedChange??f.lessons.find(I=>I.id===k.id)?.suggestedChange);for(let k of d)f={...f,lessons:f.lessons.map(I=>I.id===k?{...I,status:"dismissed"}:I)};return v$1&&(E=true,f=re(f,v$1)),c$1(f,"retro",e.by,{sprint:a.id,adopted:S,dismissed:d,agreements:B,dodChanged:E,backlogAdded:U},W)})},cancel:(n,e)=>{o(n,e.by,"order-backlog");let a=f(n);return a||b("invalid-input","no open sprint to cancel","nothing to do"),t$1(n,"ceremony.cancel",e,(l,p)=>(l=c$1(l,"sprint.cancelled",e.by,{id:a.id,reason:e.reason??""},p),T(l,"cancel",p)))}}}var he=new Set(["never","po-only","any"]);function se(o){let t=o??{},r=t.sprintBudget;(!r||typeof r!="object"||r.tokens===void 0&&r.turns===void 0&&r.wallclockMs===void 0)&&b("config-invalid","scrum config.sprintBudget must define tokens, turns or wallclockMs",'e.g. { "sprintBudget": { "tokens": 400000, "turns": 60 } }'),(typeof t.productGoal!="string"||t.productGoal.trim()==="")&&b("config-invalid","scrum config.productGoal must be a non-empty string","state the Product Goal in one sentence"),Array.isArray(t.definitionOfDone)||b("config-invalid","scrum config.definitionOfDone must be a Policy[]",'e.g. [{ "kind": "evidence", "evidenceKind": "test-output" }]');let i=t.refinementSharePct??10;(typeof i!="number"||i<0||i>100)&&b("config-invalid","scrum config.refinementSharePct must be 0..100","omit it for the default 10");let y=t.allowMidSprintAdd??"po-only";(typeof y!="string"||!he.has(y))&&b("config-invalid",`scrum config.allowMidSprintAdd must be never | po-only | any (got ${JSON.stringify(y)})`,'use "po-only" unless you have a reason');let u=t.inProgressWipLimit;u!==void 0&&(typeof u!="number"||u<1)&&b("config-invalid","scrum config.inProgressWipLimit must be a positive number","omit it for no limit");let g={sprintBudget:r,productGoal:t.productGoal,definitionOfDone:t.definitionOfDone,refinementSharePct:i,allowMidSprintAdd:y};return u!==void 0&&(g.inProgressWipLimit=u),g}var D=(o,t)=>t===0?0:o/t;function ae(o){let t=o.events.filter(s=>s.type==="sprint.closed").map(s=>s.payload),r=t.filter(s=>s.reason!=="cancel"),i=r.map(s=>s.doneWeight),y=r.reduce((s,n)=>s+n.doneWeight,0),u=r.reduce((s,n)=>s+n.committedWeight,0),g=o.events.filter(s=>s.type==="increment").map(s=>s.payload),m=t.filter(s=>s.budget.tokens!==void 0),h=r.reduce((s,n)=>s+n.spent.tokens,0);return {velocity:i,meanVelocity:D(i.reduce((s,n)=>s+n,0),i.length),burndown:o.events.filter(s=>s.type==="daily").map(s=>s.payload.remainingWeight),commitmentReliability:D(y,u),sprintGoalHitRate:D(g.filter(s=>s.goalMet).length,g.length),carryoverRatio:D(t.reduce((s,n)=>s+n.carryover.length,0),t.reduce((s,n)=>s+n.done.length+n.carryover.length,0)),budgetUtilisation:D(m.reduce((s,n)=>s+n.spent.tokens,0),m.reduce((s,n)=>s+(n.budget.tokens??0),0)),costPerPoint:D(h,y)}}function ce(){return [{id:"product-owner",name:"Product Owner",modelTier:"large",capabilities:["order-backlog","define-acceptance","escalate"],canApprove:["sprint-review"],inputs:["stakeholder-needs","product-goal"],outputs:["ordered-backlog","acceptance-criteria"],do_not:["do not implement items yourself"]},{id:"scrum-master",name:"Scrum Master",modelTier:"large",capabilities:["facilitate","escalate"],canApprove:[],inputs:["board","blockers"],outputs:["ceremony-records","lessons"],do_not:["do not reorder the Product Backlog","do not assign work; the planner pulls"]},{id:"developer",name:"Developer",modelTier:"small",capabilities:["deliver","review","verify"],canApprove:[],inputs:["brief"],outputs:["code","test-output"],do_not:["do not change acceptance criteria","do not touch items outside your brief"]}]}var R=(o,t,r,i,y)=>y?{rule:o,severity:t,item:y,message:r,fix:i}:{rule:o,severity:t,message:r,fix:i};function de(o){for(let t=o.iterations.length-1;t>=0;t--){let r=o.iterations[t];if(r.endedAt!==void 0)return r}}function le(){return [{id:"one-open-sprint",severity:"error",check:(m,h)=>h.type==="ceremony.plan"&&f(m)?[R("one-open-sprint","error",`sprint ${f(m).id} is still open`,"review or cancel it before planning the next sprint")]:[]},{id:"retro-before-plan",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.plan")return [];let s=de(m);if(!s)return [];let n=F(m,s.id);if(m.events.some(a=>a.type==="retro"&&a.seq>n))return [];let e=s.outcome==="cancelled"?"warning":"error";return [R("retro-before-plan",e,`sprint ${s.id} has no retrospective yet`,"run the retro ceremony first (lessons may be empty)")]}},{id:"sprint-budget-fixed",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.plan")return [];let s=h.payload?.budget;return s===void 0||JSON.stringify(s)===JSON.stringify(O(m).sprintBudget)?[]:[R("sprint-budget-fixed","error","sprint length is fixed by config.sprintBudget","change sprintBudget in the config between sprints instead of per plan")]}},{id:"scope-protects-goal",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.commit")return [];let s=O(m),n$1=h.payload??{};return s.allowMidSprintAdd==="never"?[R("scope-protects-goal","error","mid-sprint additions are disabled",'set allowMidSprintAdd to "po-only" or wait for the next sprint')]:s.allowMidSprintAdd==="po-only"&&!n(m,h.by,"order-backlog")?[R("scope-protects-goal","error",`"${h.by}" may not add work mid-sprint`,"ask the Product Owner (order-backlog) to commit it")]:n$1.goalImpact!=="none"?[R("scope-protects-goal","error",`adding work with goalImpact "${n$1.goalImpact??"unset"}" endangers the Sprint Goal`,'only commit items with goalImpact: "none"; otherwise cancel and re-plan')]:[]}},{id:"po-orders-backlog",severity:"error",check:(m,h)=>h.type!=="ceremony.refine"||n(m,h.by,"order-backlog")?[]:((h.payload??{}).items??[]).filter(n=>n.patch.priority!==void 0).map(n=>R("po-orders-backlog","error",`"${h.by}" may not change the priority of "${n.id}"`,"only the Product Owner orders the backlog; drop priority from the patch",n.id))},{id:"dod-not-weakened",severity:"error",check:(m,h)=>h.type==="ceremony.retro"&&h.payload?.dodChanges!==void 0&&f(m)?[R("dod-not-weakened","error","Definition of Done cannot change while a sprint is open","close the sprint first; DoD changes apply to the next sprint")]:[]},{id:"carryover-reestimated",severity:"error",check:(m,h)=>{if(h.type!=="ceremony.plan")return [];let s=h.payload?.items;if(!Array.isArray(s))return [];let n=de(m);if(!n)return [];let e=F(m,n.id);return s.filter(a=>n.carryover.includes(a)&&!m.events.some(l=>l.type==="item.edited"&&l.seq>e&&l.payload.id===a&&l.payload.changed.includes("weight"))).map(a=>R("carryover-reestimated","error",`carried-over item "${a}" was not re-estimated after ${n.id}`,"refine it with a new weight before committing",a))}}]}function me(o){let t={id:"in_progress",name:"In progress",entryPolicy:[{kind:"dependencies-done"}],exitPolicy:[]};return o.inProgressWipLimit!==void 0&&(t.wipLimit=o.inProgressWipLimit),[{id:"backlog",name:"Product Backlog",entryPolicy:[],exitPolicy:[{kind:"acceptance-written"},{kind:"estimate-present"}]},{id:"sprint",name:"Sprint Backlog",entryPolicy:[],exitPolicy:[]},t,{id:"review",name:"Review",entryPolicy:[],exitPolicy:o.definitionOfDone,review:true},{id:"done",name:"Increment",entryPolicy:[],exitPolicy:[]}]}var be={backlog:"Product Backlog",item:"Product Backlog Item",stage:"Column",iteration:"Sprint",increment:"Increment",ceremony:"Scrum Event",gate:"Sprint Review"};function O(o){return o.config}function ke(o,t$1,r){let i=o,y=u(i,t$1).blockers.filter(g=>!g.clearedAt);if(y.length){i=s(i,t$1,g=>({...g,blockers:g.blockers.map(m=>m.clearedAt?m:{...m,clearedAt:r})}));for(let g of y)i=c$1(i,"blocker.cleared","system",{id:t$1,blocker:g.id,reason:"sprint closed"},r);}for(let g of i.pending.filter(m=>m.item===t$1))i={...i,pending:i.pending.filter(m=>m.id!==g.id)},i=c$1(i,"pending.dropped","system",{id:g.id,item:t$1,reason:"sprint closed"},r);let u$1=u(i,t$1);return (u$1.stage!=="backlog"||u$1.status!=="todo")&&(i=x(i,t$1,{stage:"backlog",status:"todo"},"system",r)),t(i,t$1,u$1.type==="question"?["iteration"]:["iteration","role"])}function T(o,t,r){let i=f(o);if(!i)return o;let y=i.committed.map(e=>u(o,e)),u$1=y.filter(e=>e.status==="done").map(e=>e.id),g=y.filter(e=>e.status==="dropped").map(e=>e.id),m=y.filter(e=>e.status!=="done"&&e.status!=="dropped").map(e=>e.id),h=Object.values(o.items).filter(e=>e.type==="question"&&e.parent!==void 0&&m.includes(e.parent)&&e.status!=="done"&&e.status!=="dropped").map(e=>e.id),s=o;for(let e of [...m,...h])s=ke(s,e,r);let n=e=>e.reduce((a,l)=>a+(o.items[l]?.weight??0),0);return s={...s,iterations:s.iterations.map(e=>{if(e.id!==i.id)return e;let{closing:a,...l}=e;return {...l,endedAt:r,outcome:t==="cancel"?"cancelled":"completed",carryover:m}})},c$1(s,"sprint.closed","system",{id:i.id,reason:t,done:u$1,carryover:m,carriedQuestions:h,dropped:g,doneWeight:n(u$1),committedWeight:n(i.committed),spent:i.spent,budget:i.budget},r)}function ve(){return {name:"scrum",vocabulary:be,validateConfig:se,defaultStages:me,defaultRoles:ce,requiredCapabilities:["order-backlog","facilitate","deliver"],exclusiveCapabilities:["order-backlog"],plannerOptions(o){let t=O(o).inProgressWipLimit;return t===void 0?{schedulerMode:"level",dispatchStage:"in_progress"}:{schedulerMode:"level",dispatchStage:"in_progress",concurrencyCap:t}},candidates(o){let t=f(o);return !t||t.closing?[]:Object.values(o.items).filter(r=>r.iteration===t.id&&(r.status==="todo"||r.status==="review")&&(r.stage==="sprint"||r.stage==="review"))},invariants(o,t){let r=f(o),i=O(o),y=r?c(r.budget,r.spent):{};return [`Sprint Goal: ${r?.goal??"(no open sprint)"}; Product Goal: ${i.productGoal}`,`Budget remaining: ${JSON.stringify(y)}; stop and hand off when it is gone`,`Definition of Done: ${i.definitionOfDone.map(u=>u.kind==="evidence"?`evidence ${u.evidenceKind}`:u.kind).join(", ")||"(none)"}`,`Do not change the scope of "${t.id}" or its acceptance criteria; raise open_questions instead`]},ceremonies:J(ve),rules:le(),metrics:o=>({...ae(o)}),humanDefaults:{gates:["sprint-review"]},afterComplete(o,t,r){let i=f(o);return !i||!i.closing&&!d(i.budget,i.spent)?o:Object.values(o.items).some(u=>u.iteration===i.id&&u.status==="in_progress")?i.closing?o:c$1({...o,iterations:o.iterations.map(u=>u.id===i.id?{...u,closing:true}:u)},"sprint.closing","system",{id:i.id},r):T(o,"budget",r)}}}export{ie as a,J as b,se as c,ae as d,ce as e,le as f,me as g,be as h,O as i,T as j,ve as k};//# sourceMappingURL=chunk-L2ZN6HEL.mjs.map
2
+ //# sourceMappingURL=chunk-L2ZN6HEL.mjs.map