ex-workflow 0.3.0-stage → 0.6.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 (104) hide show
  1. package/CHANGELOG.md +52 -1
  2. package/README.md +73 -30
  3. package/dist/adapters/index.cjs +1 -1
  4. package/dist/adapters/index.mjs +1 -1
  5. package/dist/{roles-BLBRKhUZ.d.ts → budget-Cx63FX2K.d.ts} +9 -2
  6. package/dist/{roles-aneKYJ3Z.d.cts → budget-JyNKxP5N.d.cts} +9 -2
  7. package/dist/{chunk-7HZXZF3L.cjs → chunk-2OVYXXNV.cjs} +2 -2
  8. package/dist/chunk-2OVYXXNV.cjs.map +1 -0
  9. package/dist/chunk-3CLDZCHN.cjs +2 -0
  10. package/dist/chunk-3CLDZCHN.cjs.map +1 -0
  11. package/dist/chunk-5TXYMLBF.mjs +3 -0
  12. package/dist/chunk-5TXYMLBF.mjs.map +1 -0
  13. package/dist/chunk-7CDGPTEJ.mjs +2 -0
  14. package/dist/chunk-7CDGPTEJ.mjs.map +1 -0
  15. package/dist/chunk-7IG6EQI4.mjs +6 -0
  16. package/dist/chunk-7IG6EQI4.mjs.map +1 -0
  17. package/dist/chunk-GT57PLUT.mjs +2 -0
  18. package/dist/chunk-GT57PLUT.mjs.map +1 -0
  19. package/dist/chunk-IHE5K4X3.mjs +2 -0
  20. package/dist/chunk-IHE5K4X3.mjs.map +1 -0
  21. package/dist/chunk-KF5VQH3M.mjs +2 -0
  22. package/dist/chunk-KF5VQH3M.mjs.map +1 -0
  23. package/dist/chunk-MH66G5KV.cjs +2 -0
  24. package/dist/chunk-MH66G5KV.cjs.map +1 -0
  25. package/dist/chunk-N3QB2S7R.cjs +2 -0
  26. package/dist/chunk-N3QB2S7R.cjs.map +1 -0
  27. package/dist/chunk-NA53TZE4.mjs +2 -0
  28. package/dist/chunk-NA53TZE4.mjs.map +1 -0
  29. package/dist/chunk-TEPK5Y36.mjs +2 -0
  30. package/dist/chunk-TEPK5Y36.mjs.map +1 -0
  31. package/dist/chunk-UBFIKDIP.cjs +2 -0
  32. package/dist/chunk-UBFIKDIP.cjs.map +1 -0
  33. package/dist/chunk-UUOMQMWT.cjs +2 -0
  34. package/dist/chunk-UUOMQMWT.cjs.map +1 -0
  35. package/dist/chunk-WOGK54HB.cjs +3 -0
  36. package/dist/chunk-WOGK54HB.cjs.map +1 -0
  37. package/dist/chunk-YRATJT7P.cjs +6 -0
  38. package/dist/chunk-YRATJT7P.cjs.map +1 -0
  39. package/dist/chunk-Z3PU6EBI.mjs +2 -0
  40. package/dist/chunk-Z3PU6EBI.mjs.map +1 -0
  41. package/dist/chunk-ZTE7LREB.cjs +2 -0
  42. package/dist/chunk-ZTE7LREB.cjs.map +1 -0
  43. package/dist/cli/bin.cjs +1 -1
  44. package/dist/cli/bin.cjs.map +1 -1
  45. package/dist/cli/bin.mjs +1 -1
  46. package/dist/cli/bin.mjs.map +1 -1
  47. package/dist/cli/index.cjs +1 -1
  48. package/dist/cli/index.mjs +1 -1
  49. package/dist/index.cjs +1 -1
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.cts +36 -13
  52. package/dist/index.d.ts +36 -13
  53. package/dist/index.mjs +1 -1
  54. package/dist/index.mjs.map +1 -1
  55. package/dist/kanban/index.cjs +1 -1
  56. package/dist/kanban/index.mjs +1 -1
  57. package/dist/schema/index.cjs +2 -0
  58. package/dist/schema/index.cjs.map +1 -0
  59. package/dist/schema/index.d.cts +57 -0
  60. package/dist/schema/index.d.ts +57 -0
  61. package/dist/schema/index.mjs +2 -0
  62. package/dist/schema/index.mjs.map +1 -0
  63. package/dist/scrum/index.cjs +1 -1
  64. package/dist/scrum/index.d.cts +18 -3
  65. package/dist/scrum/index.d.ts +18 -3
  66. package/dist/scrum/index.mjs +1 -1
  67. package/dist/types.d.cts +32 -3
  68. package/dist/types.d.ts +32 -3
  69. package/dist/waterfall/index.cjs +1 -1
  70. package/dist/waterfall/index.d.cts +2 -0
  71. package/dist/waterfall/index.d.ts +2 -0
  72. package/dist/waterfall/index.mjs +1 -1
  73. package/package.json +18 -2
  74. package/dist/chunk-23P7C25E.cjs +0 -2
  75. package/dist/chunk-23P7C25E.cjs.map +0 -1
  76. package/dist/chunk-2IKIBB73.cjs +0 -2
  77. package/dist/chunk-2IKIBB73.cjs.map +0 -1
  78. package/dist/chunk-4A4TD4MH.cjs +0 -2
  79. package/dist/chunk-4A4TD4MH.cjs.map +0 -1
  80. package/dist/chunk-6R3YFUUV.cjs +0 -6
  81. package/dist/chunk-6R3YFUUV.cjs.map +0 -1
  82. package/dist/chunk-7HZXZF3L.cjs.map +0 -1
  83. package/dist/chunk-AUZIQPFT.cjs +0 -2
  84. package/dist/chunk-AUZIQPFT.cjs.map +0 -1
  85. package/dist/chunk-BJEOTG6P.mjs +0 -2
  86. package/dist/chunk-BJEOTG6P.mjs.map +0 -1
  87. package/dist/chunk-FLCYD2QF.mjs +0 -2
  88. package/dist/chunk-FLCYD2QF.mjs.map +0 -1
  89. package/dist/chunk-NN3XJUHP.cjs +0 -2
  90. package/dist/chunk-NN3XJUHP.cjs.map +0 -1
  91. package/dist/chunk-P4P4JTE5.mjs +0 -2
  92. package/dist/chunk-P4P4JTE5.mjs.map +0 -1
  93. package/dist/chunk-R27STIER.mjs +0 -2
  94. package/dist/chunk-R27STIER.mjs.map +0 -1
  95. package/dist/chunk-TMKCALFT.cjs +0 -2
  96. package/dist/chunk-TMKCALFT.cjs.map +0 -1
  97. package/dist/chunk-UOGNVWVO.mjs +0 -2
  98. package/dist/chunk-UOGNVWVO.mjs.map +0 -1
  99. package/dist/chunk-VGD4V5BA.mjs +0 -6
  100. package/dist/chunk-VGD4V5BA.mjs.map +0 -1
  101. package/dist/chunk-WOKNWJKU.mjs +0 -2
  102. package/dist/chunk-WOKNWJKU.mjs.map +0 -1
  103. package/dist/chunk-ZX4DAMTG.mjs +0 -2
  104. package/dist/chunk-ZX4DAMTG.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/scrum/ceremonies.ts","../src/scrum/config.ts","../src/scrum/metrics.ts","../src/scrum/roles.ts","../src/scrum/rules.ts","../src/scrum/stages.ts","../src/scrum/index.ts"],"names":["STATUSES","velocityOf","state","closed","e","sum","dailyReport","it","openIteration","byStatus","s","blockers","remainingWeight","id","item","b","spent","rem","remaining","velocity","forecast","share","raisedLessons","l","lastClosedIteration","i","closedSeq","backlogOrdered","carry","items","timSort","x","cx","cy","assertCommittable","getItem","fail","assertPolicies","stageOf","attachQuestions","parentIds","iterationId","by","now","q","moveItem","patchItem","setDod","policies","configOf","st","selectAuto","budget","out","tokens","est","estimateTokens","scrumCeremonies","methodology","act","type","input","reduce","applyAction","nowOf","requireCap","split","patch","editItem","sp","n","addItem","appendEvent","goal","cfg","wanted","last","carryover","w","committedWeight","seen","stripItemFields","c","approvers","approverIds","feedback","done","f","closeSprint","closedAt","newLessons","adopt","dismiss","dod","refs","a","dupe","r","ref","adopted","agreements","backlogAdded","dodChanged","applyChange","cur","p","lesson","d","ADD_MODES","validateScrumConfig","raw","add","wip","ratio","num","den","scrumMetrics","counted","doneWeight","increments","withTokens","tokensSpent","scrumRoles","v","rule","severity","message","fix","lastClosed","scrumRules","seq","sev","canDo","scrumStages","config","inProgress","SCRUM_VOCABULARY","toBacklog","open","reason","committed","dropped","carriedQuestions","weightOf","ids","_c","rest","scrum","cap","left","_itemId","isExhausted"],"mappings":"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","file":"chunk-4A4TD4MH.cjs","sourcesContent":["import { timSort } from \"exsorted\";\nimport { estimateTokens, remaining } from \"../budget.ts\";\nimport { fail } from \"../errors.ts\";\nimport {\n addItem,\n editItem,\n getItem,\n moveItem,\n patchItem,\n stageOf,\n stripItemFields,\n type ItemPatch,\n} from \"../items.ts\";\nimport { applyAction } from \"../methodology.ts\";\nimport { assertPolicies } from \"../policies.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport { approverIds, canDo, requireCap } from \"../roles.ts\";\nexport { canDo };\nimport { appendEvent, nowOf } from \"../state.ts\";\nimport type {\n Budget,\n Ceremony,\n CeremonyInput,\n ItemStatus,\n Iteration,\n Lesson,\n LessonChange,\n Methodology,\n NewItem,\n Policy,\n WorkItem,\n WorkflowState,\n} from \"../types.ts\";\nimport { closeSprint, configOf } from \"./index.ts\";\n\nconst STATUSES: ItemStatus[] = [\n \"todo\",\n \"in_progress\",\n \"blocked\",\n \"review\",\n \"awaiting_human\",\n \"done\",\n \"dropped\",\n];\n\nexport interface DailyReport {\n sprint: string | null;\n goal: string | null;\n byStatus: Record<ItemStatus, number>;\n blockers: Array<{ item: string; blocker: string; owner: string; reason: string }>;\n spent: Required<Budget>;\n remaining: Budget;\n remainingWeight: number;\n raisedLessons: number;\n velocity: number | null;\n forecast: \"on-track\" | \"at-risk\" | \"unknown\";\n}\n\nexport function velocityOf(state: WorkflowState): number | null {\n const closed = state.events.filter(\n (e) => e.type === \"sprint.closed\" && (e.payload as { reason: string }).reason !== \"cancel\",\n );\n if (closed.length === 0) return null;\n return (\n closed.reduce((sum, e) => sum + (e.payload as { doneWeight: number }).doneWeight, 0) /\n closed.length\n );\n}\n\nexport function dailyReport(state: WorkflowState): DailyReport {\n const it = openIteration(state);\n const byStatus = Object.fromEntries(STATUSES.map((s) => [s, 0])) as Record<ItemStatus, number>;\n const blockers: DailyReport[\"blockers\"] = [];\n let remainingWeight = 0;\n for (const id of it?.committed ?? []) {\n const item = state.items[id];\n if (!item) continue;\n byStatus[item.status] += 1;\n if (item.status !== \"done\") remainingWeight += item.weight ?? 0;\n for (const b of item.blockers)\n if (!b.clearedAt)\n blockers.push({ item: id, blocker: b.id, owner: b.owner, reason: b.reason });\n }\n const spent = it?.spent ?? { tokens: 0, turns: 0, wallclockMs: 0 };\n const rem = it ? remaining(it.budget, it.spent) : {};\n const velocity = velocityOf(state);\n let forecast: DailyReport[\"forecast\"] = \"unknown\";\n if (it && velocity !== null && it.budget.tokens) {\n const share = (rem.tokens ?? 0) / it.budget.tokens;\n forecast = remainingWeight <= velocity * share ? \"on-track\" : \"at-risk\";\n }\n const raisedLessons = state.lessons.filter((l) => l.status === \"raised\").length;\n return {\n sprint: it?.id ?? null,\n goal: it?.goal ?? null,\n byStatus,\n blockers,\n spent,\n remaining: rem,\n remainingWeight,\n raisedLessons,\n velocity,\n forecast,\n };\n}\n\nfunction lastClosedIteration(state: WorkflowState): Iteration | undefined {\n for (let i = state.iterations.length - 1; i >= 0; i--) {\n const it = state.iterations[i]!;\n if (it.endedAt !== undefined) return it;\n }\n return undefined;\n}\n\n/** Event seq of the sprint.closed event of `id`; infinity when it is missing, so nothing counts as \"after\" it. */\nexport function closedSeq(state: WorkflowState, id: string): number {\n return (\n state.events.find((e) => e.type === \"sprint.closed\" && (e.payload as { id: string }).id === id)\n ?.seq ?? Number.POSITIVE_INFINITY\n );\n}\n\nfunction backlogOrdered(state: WorkflowState): WorkItem[] {\n const carry = new Set(lastClosedIteration(state)?.carryover ?? []);\n const items = Object.values(state.items).filter(\n (i) => i.stage === \"backlog\" && i.status === \"todo\" && i.type !== \"question\",\n );\n return timSort([...items], (x, y) => {\n const cx = carry.has(x.id) ? 1 : 0;\n const cy = carry.has(y.id) ? 1 : 0;\n if (cx !== cy) return cy - cx;\n return (y.priority ?? 0) - (x.priority ?? 0);\n });\n}\n\n/** Throw unless the item sits in the Product Backlog and meets the backlog exit policy. */\nfunction assertCommittable(state: WorkflowState, id: string): void {\n const item = getItem(state, id);\n if (item.stage !== \"backlog\" || item.status !== \"todo\")\n fail(\n \"invalid-input\",\n `item \"${id}\" is not in the Product Backlog (${item.stage}/${item.status})`,\n \"only backlog items can be committed\",\n { items: [id] },\n );\n assertPolicies(state, item, stageOf(state, \"backlog\").exitPolicy, \"enter the Sprint Backlog\");\n}\n\n/** Open questions raised by the given parents travel with them into the sprint (they carry no weight). */\nfunction attachQuestions(\n state: WorkflowState,\n parentIds: string[],\n iterationId: string,\n by: string,\n now: string,\n): WorkflowState {\n let s = state;\n for (const q of Object.values(state.items)) {\n if (\n q.type !== \"question\" ||\n q.parent === undefined ||\n !parentIds.includes(q.parent) ||\n q.status === \"done\" ||\n q.status === \"dropped\"\n )\n continue;\n if (q.stage !== \"sprint\" || q.status !== \"todo\")\n s = moveItem(s, q.id, { stage: \"sprint\", status: \"todo\" }, by, now);\n s = patchItem(s, q.id, (it) => ({ ...it, iteration: iterationId }));\n }\n return s;\n}\n\n/** Set the Definition of Done in the config and on the review stage. */\nfunction setDod(state: WorkflowState, policies: Policy[]): WorkflowState {\n return {\n ...state,\n config: { ...configOf(state), definitionOfDone: policies },\n stages: state.stages.map((st) => (st.id === \"review\" ? { ...st, exitPolicy: policies } : st)),\n };\n}\n\nfunction selectAuto(state: WorkflowState, budget: Budget): string[] {\n const out: string[] = [];\n let tokens = 0;\n for (const item of backlogOrdered(state)) {\n if (budget.tokens !== undefined) {\n const est = estimateTokens(state, item.weight);\n if (tokens + est > budget.tokens) break;\n tokens += est;\n } else if (budget.turns !== undefined && out.length >= budget.turns) break;\n out.push(item.id);\n }\n return out;\n}\n\nexport function scrumCeremonies(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 refine: Ceremony = (state, input) => {\n requireCap(state, input.by, \"define-acceptance\", \"deliver\");\n const items = (input[\"items\"] ?? []) as Array<{ id: string; patch: ItemPatch }>;\n const split = (input[\"split\"] ?? []) as Array<{ from: string; into: NewItem[] }>;\n if (items.length === 0 && split.length === 0)\n fail(\"invalid-input\", \"refine needs items[] or split[]\", \"pass at least one patch or split\");\n return act(state, \"ceremony.refine\", input, (s, now) => {\n for (const { id, patch } of items) s = editItem(s, id, patch, input.by, now);\n for (const sp of split) {\n getItem(s, sp.from);\n for (const n of sp.into) s = addItem(s, { ...n, parent: sp.from }, input.by, now);\n s = moveItem(s, sp.from, { status: \"dropped\" }, input.by, now);\n }\n return appendEvent(\n s,\n \"ceremony.refine\",\n input.by,\n {\n edited: items.map((i) => i.id),\n split: split.map((x) => ({ from: x.from, into: x.into.map((n) => n.id) })),\n },\n now,\n );\n });\n };\n\n const plan: Ceremony = (state, input) => {\n requireCap(state, input.by, \"facilitate\");\n const goal = input[\"goal\"];\n if (typeof goal !== \"string\" || goal.trim() === \"\")\n fail(\n \"invalid-input\",\n \"sprint planning needs a non-empty goal\",\n \"state the Sprint Goal in one sentence\",\n );\n const cfg = configOf(state);\n const budget = (input[\"budget\"] as Budget | undefined) ?? cfg.sprintBudget;\n const wanted =\n input[\"items\"] === \"auto\"\n ? selectAuto(state, budget)\n : (input[\"items\"] as string[] | undefined);\n if (!Array.isArray(wanted))\n fail(\n \"invalid-input\",\n 'sprint planning needs items: string[] or \"auto\"',\n 'pass [\"A\",\"B\"] or \"auto\"',\n );\n if (wanted.length === 0)\n fail(\n \"invalid-input\",\n \"no backlog items fit the sprint\",\n \"refine the backlog (acceptance + estimates) or raise the budget in config\",\n );\n for (const id of wanted) assertCommittable(state, id);\n return act(state, \"ceremony.plan\", input, (s, now) => {\n const id = `S${s.iterations.length + 1}`;\n const last = lastClosedIteration(s);\n const carryover = wanted.filter((w) => last?.carryover.includes(w));\n for (const w of wanted) {\n s = moveItem(s, w, { stage: \"sprint\", status: \"todo\" }, input.by, now);\n s = patchItem(s, w, (it) => ({ ...it, iteration: id }));\n }\n s = attachQuestions(s, wanted, id, input.by, now);\n const committedWeight = wanted.reduce((sum, w) => sum + (s.items[w]?.weight ?? 0), 0);\n s = {\n ...s,\n iterations: [\n ...s.iterations,\n {\n id,\n goal,\n budget,\n spent: { tokens: 0, turns: 0, wallclockMs: 0 },\n startedAt: now,\n committed: [...wanted],\n carryover,\n },\n ],\n };\n return appendEvent(\n s,\n \"sprint.opened\",\n input.by,\n { id, goal, committed: wanted, committedWeight, budget },\n now,\n );\n });\n };\n\n const commit: Ceremony = (state, input) => {\n const it = openIteration(state);\n if (!it) fail(\"invalid-input\", \"no open sprint to commit into\", \"run the plan ceremony first\");\n const items = input[\"items\"] as string[] | undefined;\n if (!Array.isArray(items) || items.length === 0)\n fail(\"invalid-input\", \"commit needs items[]\", 'pass [\"A\"]');\n const seen = new Set<string>();\n for (const id of items) {\n if (seen.has(id))\n fail(\"invalid-input\", `item \"${id}\" appears twice in items[]`, \"list each item once\", {\n items: [id],\n });\n seen.add(id);\n getItem(state, id);\n if (it.committed.includes(id))\n fail(\"invalid-input\", `item \"${id}\" is already committed to ${it.id}`, \"nothing to do\", {\n items: [id],\n });\n assertCommittable(state, id);\n }\n return act(state, \"ceremony.commit\", input, (s, now) => {\n for (const id of items) {\n s = moveItem(s, id, { stage: \"sprint\", status: \"todo\" }, input.by, now);\n s = patchItem(s, id, (x) => ({ ...x, iteration: it.id }));\n }\n s = attachQuestions(s, items, it.id, input.by, now);\n s = {\n ...s,\n iterations: s.iterations.map((x) =>\n x.id === it.id ? { ...x, committed: [...x.committed, ...items] } : x,\n ),\n };\n return appendEvent(\n s,\n \"sprint.committed\",\n input.by,\n { id: it.id, items, goalImpact: input[\"goalImpact\"] ?? null },\n now,\n );\n });\n };\n\n const uncommit: Ceremony = (state, input) => {\n requireCap(state, input.by, \"order-backlog\");\n const it = openIteration(state);\n if (!it) fail(\"invalid-input\", \"no open sprint\", \"nothing to uncommit from\");\n const items = input[\"items\"] as string[] | undefined;\n if (!Array.isArray(items) || items.length === 0)\n fail(\"invalid-input\", \"uncommit needs items[]\", 'pass [\"A\"]');\n for (const id of items) {\n if (getItem(state, id).status === \"done\")\n fail(\"invalid-input\", `item \"${id}\" is done`, \"finished work cannot be uncommitted\", {\n items: [id],\n });\n }\n for (const id of items)\n if (!it.committed.includes(id))\n fail(\n \"invalid-input\",\n `item \"${id}\" is not committed to ${it.id}`,\n `committed: ${it.committed.join(\", \")}`,\n { items: [id] },\n );\n return act(state, \"ceremony.uncommit\", input, (s, now) => {\n for (const id of items) {\n s = moveItem(s, id, { stage: \"backlog\", status: \"todo\" }, input.by, now);\n s = stripItemFields(s, id, [\"iteration\", \"role\"]);\n }\n s = {\n ...s,\n iterations: s.iterations.map((x) =>\n x.id === it.id ? { ...x, committed: x.committed.filter((c) => !items.includes(c)) } : x,\n ),\n };\n return appendEvent(\n s,\n \"sprint.uncommitted\",\n input.by,\n { id: it.id, items, reason: input[\"reason\"] ?? \"\" },\n now,\n );\n });\n };\n\n const daily: Ceremony = (state, input) =>\n act(state, \"ceremony.daily\", input, (s, now) =>\n appendEvent(s, \"daily\", input.by, dailyReport(s), now),\n );\n\n const review: Ceremony = (state, input) => {\n const it = openIteration(state);\n if (!it) fail(\"invalid-input\", \"no open sprint to review\", \"run the plan ceremony first\");\n const approvers = approverIds(state, \"sprint-review\");\n if (input.by !== \"human\" && !approvers.includes(input.by)) {\n fail(\n \"gate-unmet\",\n `\"${input.by}\" may not accept the Sprint Review`,\n `run review as \"human\" or as ${approvers.join(\", \") || \"a role with canApprove sprint-review\"}`,\n { rule: \"sprint-review\" },\n );\n }\n const feedback = (input[\"feedback\"] ?? []) as NewItem[];\n return act(state, \"ceremony.review\", input, (s, now) => {\n for (const n of feedback) s = addItem(s, { ...n, stage: \"backlog\" }, input.by, now);\n const done = it.committed.filter((id) => s.items[id]?.status === \"done\");\n s = appendEvent(\n s,\n \"increment\",\n input.by,\n {\n sprint: it.id,\n done,\n goalMet: input[\"goalMet\"] === true,\n accepted: input[\"accepted\"] === true,\n feedback: feedback.map((f) => f.id),\n },\n now,\n );\n return closeSprint(s, \"review\", now);\n });\n };\n\n const retro: Ceremony = (state, input) => {\n requireCap(state, input.by, \"facilitate\");\n const last = lastClosedIteration(state);\n if (!last)\n fail(\n \"invalid-input\",\n \"no closed sprint to retrospect\",\n \"close the sprint (review or cancel) first\",\n );\n if (openIteration(state))\n fail(\n \"invalid-input\",\n \"a sprint is still open\",\n \"retro runs between sprints; review or cancel the open one\",\n );\n const closedAt = closedSeq(state, last.id);\n if (state.events.some((e) => e.type === \"retro\" && e.seq > closedAt))\n fail(\n \"invalid-input\",\n `sprint ${last.id} already has a retrospective`,\n \"plan the next sprint\",\n );\n const newLessons = (input[\"lessons\"] ?? []) as Array<{\n text: string;\n scope: Lesson[\"scope\"];\n suggestedChange?: LessonChange;\n }>;\n const adopt = (input[\"adopt\"] ?? []) as Array<{ id: string; suggestedChange?: LessonChange }>;\n const dismiss = (input[\"dismiss\"] ?? []) as string[];\n const dod = input[\"dodChanges\"] as Policy[] | undefined;\n const refs = [...adopt.map((a) => a.id), ...dismiss];\n const dupe = refs.find((r, i) => refs.indexOf(r) !== i);\n if (dupe)\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 return act(state, \"ceremony.retro\", input, (s, now) => {\n const adopted: string[] = [];\n const agreements: string[] = [];\n const backlogAdded: string[] = [];\n let dodChanged = false;\n const applyChange = (c: LessonChange | undefined) => {\n if (!c) return;\n if (c.kind === \"agreement\") {\n if (!s.agreements.includes(c.text)) s = { ...s, agreements: [...s.agreements, c.text] };\n agreements.push(c.text);\n } else if (c.kind === \"dod\") {\n const cur = configOf(s).definitionOfDone;\n if (!cur.some((p) => JSON.stringify(p) === JSON.stringify(c.policy))) {\n dodChanged = true;\n s = setDod(s, [...cur, c.policy]);\n }\n } else if (c.kind === \"backlog\") {\n s = addItem(\n s,\n { ...c.item, stage: \"backlog\", tags: [...(c.item.tags ?? []), \"retro\"] },\n input.by,\n now,\n );\n backlogAdded.push(c.item.id);\n }\n };\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 adopted.push(id);\n applyChange(l.suggestedChange);\n }\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 applyChange(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) => (x.id === d ? { ...x, status: \"dismissed\" as const } : x)),\n };\n if (dod) {\n dodChanged = true;\n s = setDod(s, dod);\n }\n return appendEvent(\n s,\n \"retro\",\n input.by,\n {\n sprint: last.id,\n adopted,\n dismissed: dismiss,\n agreements,\n dodChanged,\n backlogAdded,\n },\n now,\n );\n });\n };\n\n const cancel: Ceremony = (state, input) => {\n requireCap(state, input.by, \"order-backlog\");\n const it = openIteration(state);\n if (!it) fail(\"invalid-input\", \"no open sprint to cancel\", \"nothing to do\");\n return act(state, \"ceremony.cancel\", input, (s, now) => {\n s = appendEvent(\n s,\n \"sprint.cancelled\",\n input.by,\n { id: it.id, reason: input[\"reason\"] ?? \"\" },\n now,\n );\n return closeSprint(s, \"cancel\", now);\n });\n };\n\n return { refine, plan, commit, uncommit, daily, review, retro, cancel };\n}\n","import { fail } from \"../errors.ts\";\nimport type { Budget, Policy } from \"../types.ts\";\n\nexport interface ScrumConfig {\n sprintBudget: Budget;\n productGoal: string;\n definitionOfDone: Policy[];\n refinementSharePct: number;\n allowMidSprintAdd: \"never\" | \"po-only\" | \"any\";\n inProgressWipLimit?: number;\n}\n\nconst ADD_MODES = new Set([\"never\", \"po-only\", \"any\"]);\n\nexport function validateScrumConfig(raw: unknown): ScrumConfig {\n const c = (raw ?? {}) as Record<string, unknown>;\n const budget = c[\"sprintBudget\"] as Budget | undefined;\n if (\n !budget ||\n typeof budget !== \"object\" ||\n (budget.tokens === undefined && budget.turns === undefined && budget.wallclockMs === undefined)\n ) {\n fail(\n \"config-invalid\",\n \"scrum config.sprintBudget must define tokens, turns or wallclockMs\",\n 'e.g. { \"sprintBudget\": { \"tokens\": 400000, \"turns\": 60 } }',\n );\n }\n if (typeof c[\"productGoal\"] !== \"string\" || c[\"productGoal\"].trim() === \"\")\n fail(\n \"config-invalid\",\n \"scrum config.productGoal must be a non-empty string\",\n \"state the Product Goal in one sentence\",\n );\n if (!Array.isArray(c[\"definitionOfDone\"]))\n fail(\n \"config-invalid\",\n \"scrum config.definitionOfDone must be a Policy[]\",\n 'e.g. [{ \"kind\": \"evidence\", \"evidenceKind\": \"test-output\" }]',\n );\n const share = c[\"refinementSharePct\"] ?? 10;\n if (typeof share !== \"number\" || share < 0 || share > 100)\n fail(\n \"config-invalid\",\n \"scrum config.refinementSharePct must be 0..100\",\n \"omit it for the default 10\",\n );\n const add = c[\"allowMidSprintAdd\"] ?? \"po-only\";\n if (typeof add !== \"string\" || !ADD_MODES.has(add))\n fail(\n \"config-invalid\",\n `scrum config.allowMidSprintAdd must be never | po-only | any (got ${JSON.stringify(add)})`,\n 'use \"po-only\" unless you have a reason',\n );\n const wip = c[\"inProgressWipLimit\"];\n if (wip !== undefined && (typeof wip !== \"number\" || wip < 1))\n fail(\n \"config-invalid\",\n \"scrum config.inProgressWipLimit must be a positive number\",\n \"omit it for no limit\",\n );\n const out: ScrumConfig = {\n sprintBudget: budget,\n productGoal: c[\"productGoal\"],\n definitionOfDone: c[\"definitionOfDone\"] as Policy[],\n refinementSharePct: share,\n allowMidSprintAdd: add as ScrumConfig[\"allowMidSprintAdd\"],\n };\n if (wip !== undefined) out.inProgressWipLimit = wip as number;\n return out;\n}\n","import type { Budget, WorkflowState } from \"../types.ts\";\n\ninterface Closed {\n reason: string;\n done: string[];\n carryover: string[];\n doneWeight: number;\n committedWeight: number;\n spent: Required<Budget>;\n budget: Budget;\n}\n\nexport interface ScrumMetrics {\n velocity: number[];\n meanVelocity: number;\n burndown: number[];\n commitmentReliability: number;\n sprintGoalHitRate: number;\n carryoverRatio: number;\n budgetUtilisation: number;\n costPerPoint: number;\n}\n\nconst ratio = (num: number, den: number) => (den === 0 ? 0 : num / den);\n\nexport function scrumMetrics(state: WorkflowState): ScrumMetrics {\n const closed = state.events\n .filter((e) => e.type === \"sprint.closed\")\n .map((e) => e.payload as Closed);\n const counted = closed.filter((c) => c.reason !== \"cancel\");\n const velocity = counted.map((c) => c.doneWeight);\n const doneWeight = counted.reduce((s, c) => s + c.doneWeight, 0);\n const committedWeight = counted.reduce((s, c) => s + c.committedWeight, 0);\n const increments = state.events\n .filter((e) => e.type === \"increment\")\n .map((e) => e.payload as { goalMet: boolean });\n const withTokens = closed.filter((c) => c.budget.tokens !== undefined);\n const tokensSpent = counted.reduce((s, c) => s + c.spent.tokens, 0);\n return {\n velocity,\n meanVelocity: ratio(\n velocity.reduce((s, x) => s + x, 0),\n velocity.length,\n ),\n burndown: state.events\n .filter((e) => e.type === \"daily\")\n .map((e) => (e.payload as { remainingWeight: number }).remainingWeight),\n commitmentReliability: ratio(doneWeight, committedWeight),\n sprintGoalHitRate: ratio(increments.filter((i) => i.goalMet).length, increments.length),\n carryoverRatio: ratio(\n closed.reduce((s, c) => s + c.carryover.length, 0),\n closed.reduce((s, c) => s + c.done.length + c.carryover.length, 0),\n ),\n budgetUtilisation: ratio(\n withTokens.reduce((s, c) => s + c.spent.tokens, 0),\n withTokens.reduce((s, c) => s + (c.budget.tokens ?? 0), 0),\n ),\n costPerPoint: ratio(tokensSpent, doneWeight), // cost per delivered point over completed sprints\n };\n}\n","import type { Role } from \"../types.ts\";\n\nexport function scrumRoles(): Role[] {\n return [\n {\n id: \"product-owner\",\n name: \"Product Owner\",\n modelTier: \"large\",\n capabilities: [\"order-backlog\", \"define-acceptance\", \"escalate\"],\n canApprove: [\"sprint-review\"],\n inputs: [\"stakeholder-needs\", \"product-goal\"],\n outputs: [\"ordered-backlog\", \"acceptance-criteria\"],\n do_not: [\"do not implement items yourself\"],\n },\n {\n id: \"scrum-master\",\n name: \"Scrum Master\",\n modelTier: \"large\",\n capabilities: [\"facilitate\", \"escalate\"],\n canApprove: [],\n inputs: [\"board\", \"blockers\"],\n outputs: [\"ceremony-records\", \"lessons\"],\n do_not: [\"do not reorder the Product Backlog\", \"do not assign work; the planner pulls\"],\n },\n {\n id: \"developer\",\n name: \"Developer\",\n modelTier: \"small\",\n capabilities: [\"deliver\", \"review\", \"verify\"],\n canApprove: [],\n inputs: [\"brief\"],\n outputs: [\"code\", \"test-output\"],\n do_not: [\"do not change acceptance criteria\", \"do not touch items outside your brief\"],\n },\n ];\n}\n","import { openIteration } from \"../planner.ts\";\nimport type { Budget, Iteration, Rule, Violation, WorkflowState } from \"../types.ts\";\nimport type { ItemPatch } from \"../items.ts\";\nimport { canDo, closedSeq } from \"./ceremonies.ts\";\nimport { configOf } from \"./index.ts\";\n\nconst v = (\n rule: string,\n severity: Violation[\"severity\"],\n message: string,\n fix: string,\n item?: string,\n): Violation => (item ? { rule, severity, item, message, fix } : { rule, severity, message, fix });\n\nfunction lastClosed(state: WorkflowState): Iteration | undefined {\n for (let i = state.iterations.length - 1; i >= 0; i--) {\n const it = state.iterations[i]!;\n if (it.endedAt !== undefined) return it;\n }\n return undefined;\n}\nexport function scrumRules(): Rule[] {\n const oneOpen: Rule = {\n id: \"one-open-sprint\",\n severity: \"error\",\n check: (s, a) =>\n a.type === \"ceremony.plan\" && openIteration(s)\n ? [\n v(\n \"one-open-sprint\",\n \"error\",\n `sprint ${openIteration(s)!.id} is still open`,\n \"review or cancel it before planning the next sprint\",\n ),\n ]\n : [],\n };\n\n const retroFirst: Rule = {\n id: \"retro-before-plan\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.plan\") return [];\n const last = lastClosed(s);\n if (!last) return [];\n const seq = closedSeq(s, last.id);\n if (s.events.some((e) => e.type === \"retro\" && e.seq > seq)) return [];\n const sev = last.outcome === \"cancelled\" ? \"warning\" : \"error\";\n return [\n v(\n \"retro-before-plan\",\n sev,\n `sprint ${last.id} has no retrospective yet`,\n \"run the retro ceremony first (lessons may be empty)\",\n ),\n ];\n },\n };\n\n const budgetFixed: Rule = {\n id: \"sprint-budget-fixed\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.plan\") return [];\n const b = (a.payload as { budget?: Budget } | undefined)?.budget;\n if (b === undefined || JSON.stringify(b) === JSON.stringify(configOf(s).sprintBudget))\n return [];\n return [\n v(\n \"sprint-budget-fixed\",\n \"error\",\n \"sprint length is fixed by config.sprintBudget\",\n \"change sprintBudget in the config between sprints instead of per plan\",\n ),\n ];\n },\n };\n\n const scope: Rule = {\n id: \"scope-protects-goal\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.commit\") return [];\n const cfg = configOf(s);\n const p = (a.payload ?? {}) as { goalImpact?: string };\n if (cfg.allowMidSprintAdd === \"never\")\n return [\n v(\n \"scope-protects-goal\",\n \"error\",\n \"mid-sprint additions are disabled\",\n 'set allowMidSprintAdd to \"po-only\" or wait for the next sprint',\n ),\n ];\n if (cfg.allowMidSprintAdd === \"po-only\" && !canDo(s, a.by, \"order-backlog\"))\n return [\n v(\n \"scope-protects-goal\",\n \"error\",\n `\"${a.by}\" may not add work mid-sprint`,\n \"ask the Product Owner (order-backlog) to commit it\",\n ),\n ];\n if (p.goalImpact !== \"none\")\n return [\n v(\n \"scope-protects-goal\",\n \"error\",\n `adding work with goalImpact \"${p.goalImpact ?? \"unset\"}\" endangers the Sprint Goal`,\n 'only commit items with goalImpact: \"none\"; otherwise cancel and re-plan',\n ),\n ];\n return [];\n },\n };\n\n const poOrders: Rule = {\n id: \"po-orders-backlog\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.refine\" || canDo(s, a.by, \"order-backlog\")) return [];\n const items =\n ((a.payload ?? {}) as { items?: Array<{ id: string; patch: ItemPatch }> }).items ?? [];\n return items\n .filter((i) => i.patch.priority !== undefined)\n .map((i) =>\n v(\n \"po-orders-backlog\",\n \"error\",\n `\"${a.by}\" may not change the priority of \"${i.id}\"`,\n \"only the Product Owner orders the backlog; drop priority from the patch\",\n i.id,\n ),\n );\n },\n };\n\n const dod: Rule = {\n id: \"dod-not-weakened\",\n severity: \"error\",\n check: (s, a) =>\n a.type === \"ceremony.retro\" &&\n (a.payload as { dodChanges?: unknown } | undefined)?.dodChanges !== undefined &&\n openIteration(s)\n ? [\n v(\n \"dod-not-weakened\",\n \"error\",\n \"Definition of Done cannot change while a sprint is open\",\n \"close the sprint first; DoD changes apply to the next sprint\",\n ),\n ]\n : [],\n };\n\n const carry: Rule = {\n id: \"carryover-reestimated\",\n severity: \"error\",\n check: (s, a) => {\n if (a.type !== \"ceremony.plan\") return [];\n const items = (a.payload as { items?: string[] | \"auto\" } | undefined)?.items;\n if (!Array.isArray(items)) return [];\n const last = lastClosed(s);\n if (!last) return [];\n const seq = closedSeq(s, last.id);\n return items\n .filter(\n (id) =>\n last.carryover.includes(id) &&\n !s.events.some(\n (e) =>\n e.type === \"item.edited\" &&\n e.seq > seq &&\n (e.payload as { id: string; changed: string[] }).id === id &&\n (e.payload as { changed: string[] }).changed.includes(\"weight\"),\n ),\n )\n .map((id) =>\n v(\n \"carryover-reestimated\",\n \"error\",\n `carried-over item \"${id}\" was not re-estimated after ${last.id}`,\n \"refine it with a new weight before committing\",\n id,\n ),\n );\n },\n };\n\n return [oneOpen, retroFirst, budgetFixed, scope, poOrders, dod, carry];\n}\n","import type { Stage } from \"../types.ts\";\nimport type { ScrumConfig } from \"./config.ts\";\n\nexport function scrumStages(config: ScrumConfig): Stage[] {\n const inProgress: Stage = {\n id: \"in_progress\",\n name: \"In progress\",\n entryPolicy: [{ kind: \"dependencies-done\" }],\n exitPolicy: [],\n };\n if (config.inProgressWipLimit !== undefined) inProgress.wipLimit = config.inProgressWipLimit;\n return [\n {\n id: \"backlog\",\n name: \"Product Backlog\",\n entryPolicy: [],\n exitPolicy: [{ kind: \"acceptance-written\" }, { kind: \"estimate-present\" }],\n },\n { id: \"sprint\", name: \"Sprint Backlog\", entryPolicy: [], exitPolicy: [] },\n inProgress,\n {\n id: \"review\",\n name: \"Review\",\n entryPolicy: [],\n exitPolicy: config.definitionOfDone,\n review: true,\n },\n { id: \"done\", name: \"Increment\", entryPolicy: [], exitPolicy: [] },\n ];\n}\n","import { isExhausted, remaining } from \"../budget.ts\";\nimport { getItem, moveItem, patchItem, stripItemFields } from \"../items.ts\";\nimport { openIteration } from \"../planner.ts\";\nimport { appendEvent } from \"../state.ts\";\nimport type { CoreTerm, Methodology, PlannerOptions, WorkItem, WorkflowState } from \"../types.ts\";\nimport { scrumCeremonies } from \"./ceremonies.ts\";\nimport { validateScrumConfig, type ScrumConfig } from \"./config.ts\";\nimport { scrumMetrics, type ScrumMetrics } from \"./metrics.ts\";\nimport { scrumRoles } from \"./roles.ts\";\nimport { scrumRules } from \"./rules.ts\";\nimport { scrumStages } from \"./stages.ts\";\n\nexport { validateScrumConfig, scrumRoles, scrumRules, scrumStages, scrumMetrics };\nexport type { ScrumMetrics };\nexport type { ScrumConfig };\nexport { scrumCeremonies, dailyReport, canDo } from \"./ceremonies.ts\";\nexport type { DailyReport } from \"./ceremonies.ts\";\n\nexport const SCRUM_VOCABULARY: Record<CoreTerm, string> = {\n backlog: \"Product Backlog\",\n item: \"Product Backlog Item\",\n stage: \"Column\",\n iteration: \"Sprint\",\n increment: \"Increment\",\n ceremony: \"Scrum Event\",\n gate: \"Sprint Review\",\n};\n\n/** Advanced; used by ceremonies. */\nexport function configOf(state: WorkflowState): ScrumConfig {\n return state.config as ScrumConfig;\n}\n\n/** Send an item back to the backlog: clear its open blockers and pending decisions, strip iteration and role. */\nfunction toBacklog(state: WorkflowState, id: string, now: string): WorkflowState {\n let s = state;\n const open = getItem(s, id).blockers.filter((b) => !b.clearedAt);\n if (open.length) {\n s = patchItem(s, id, (it) => ({\n ...it,\n blockers: it.blockers.map((b) => (b.clearedAt ? b : { ...b, clearedAt: now })),\n }));\n for (const b of open)\n s = appendEvent(\n s,\n \"blocker.cleared\",\n \"system\",\n { id, blocker: b.id, reason: \"sprint closed\" },\n now,\n );\n }\n for (const p of s.pending.filter((x) => x.item === id)) {\n s = { ...s, pending: s.pending.filter((x) => x.id !== p.id) };\n s = appendEvent(\n s,\n \"pending.dropped\",\n \"system\",\n { id: p.id, item: id, reason: \"sprint closed\" },\n now,\n );\n }\n const cur = getItem(s, id);\n if (cur.stage !== \"backlog\" || cur.status !== \"todo\")\n s = moveItem(s, id, { stage: \"backlog\", status: \"todo\" }, \"system\", now);\n // a question keeps its role: only the escalation target can answer it\n return stripItemFields(s, id, cur.type === \"question\" ? [\"iteration\"] : [\"iteration\", \"role\"]);\n}\n\n/** Advanced; used by ceremonies. Closes the open sprint and returns unfinished work (and its open questions) to the backlog. */\nexport function closeSprint(\n state: WorkflowState,\n reason: \"budget\" | \"review\" | \"cancel\",\n now: string,\n): WorkflowState {\n const it = openIteration(state);\n if (!it) return state;\n const committed = it.committed.map((id) => getItem(state, id));\n const done = committed.filter((i) => i.status === \"done\").map((i) => i.id);\n const dropped = committed.filter((i) => i.status === \"dropped\").map((i) => i.id);\n const carryover = committed\n .filter((i) => i.status !== \"done\" && i.status !== \"dropped\")\n .map((i) => i.id);\n const carriedQuestions = Object.values(state.items)\n .filter(\n (i) =>\n i.type === \"question\" &&\n i.parent !== undefined &&\n carryover.includes(i.parent) &&\n i.status !== \"done\" &&\n i.status !== \"dropped\",\n )\n .map((i) => i.id);\n let s: WorkflowState = state;\n for (const id of [...carryover, ...carriedQuestions]) s = toBacklog(s, id, now);\n const weightOf = (ids: string[]) =>\n ids.reduce((sum, id) => sum + (state.items[id]?.weight ?? 0), 0);\n s = {\n ...s,\n iterations: s.iterations.map((x) => {\n if (x.id !== it.id) return x;\n const { closing: _c, ...rest } = x;\n return {\n ...rest,\n endedAt: now,\n outcome: reason === \"cancel\" ? \"cancelled\" : \"completed\",\n carryover,\n };\n }),\n };\n return appendEvent(\n s,\n \"sprint.closed\",\n \"system\",\n {\n id: it.id,\n reason,\n done,\n carryover,\n carriedQuestions,\n dropped,\n doneWeight: weightOf(done),\n committedWeight: weightOf(it.committed),\n spent: it.spent,\n budget: it.budget,\n },\n now,\n );\n}\n\nexport function scrum(): Methodology<ScrumConfig> {\n return {\n name: \"scrum\",\n vocabulary: SCRUM_VOCABULARY,\n validateConfig: validateScrumConfig,\n defaultStages: scrumStages,\n defaultRoles: scrumRoles,\n requiredCapabilities: [\"order-backlog\", \"facilitate\", \"deliver\"],\n exclusiveCapabilities: [\"order-backlog\"],\n plannerOptions(state): PlannerOptions {\n const cap = configOf(state).inProgressWipLimit;\n return cap === undefined\n ? { schedulerMode: \"level\", dispatchStage: \"in_progress\" }\n : { schedulerMode: \"level\", dispatchStage: \"in_progress\", concurrencyCap: cap };\n },\n candidates(state): WorkItem[] {\n const it = openIteration(state);\n if (!it || it.closing) return [];\n return Object.values(state.items).filter(\n (i) =>\n i.iteration === it.id &&\n (i.status === \"todo\" || i.status === \"review\") &&\n (i.stage === \"sprint\" || i.stage === \"review\"),\n );\n },\n invariants(state, item): string[] {\n const it = openIteration(state);\n const cfg = configOf(state);\n const left = it ? remaining(it.budget, it.spent) : {};\n return [\n `Sprint Goal: ${it?.goal ?? \"(no open sprint)\"}; Product Goal: ${cfg.productGoal}`,\n `Budget remaining: ${JSON.stringify(left)}; stop and hand off when it is gone`,\n `Definition of Done: ${cfg.definitionOfDone.map((p) => (p.kind === \"evidence\" ? `evidence ${p.evidenceKind}` : p.kind)).join(\", \") || \"(none)\"}`,\n `Do not change the scope of \"${item.id}\" or its acceptance criteria; raise open_questions instead`,\n ];\n },\n ceremonies: scrumCeremonies(scrum),\n rules: scrumRules(),\n metrics: (state) => ({ ...scrumMetrics(state) }),\n humanDefaults: { gates: [\"sprint-review\"] },\n afterComplete(state, _itemId, now) {\n const it = openIteration(state);\n if (!it || (!it.closing && !isExhausted(it.budget, it.spent))) return state;\n const inFlight = Object.values(state.items).some(\n (i) => i.iteration === it.id && i.status === \"in_progress\",\n );\n if (!inFlight) return closeSprint(state, \"budget\", now);\n if (it.closing) return state;\n return appendEvent(\n {\n ...state,\n iterations: state.iterations.map((x) => (x.id === it.id ? { ...x, closing: true } : x)),\n },\n \"sprint.closing\",\n \"system\",\n { id: it.id },\n now,\n );\n },\n };\n}\n"]}
@@ -1,6 +0,0 @@
1
- 'use strict';var chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),promises=require('fs/promises'),crypto=require('crypto'),n=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var n__default=/*#__PURE__*/_interopDefault(n);var c=".workflow";function y(t){return n__default.default.join(t,c,"state.json")}async function g(t,e){let i=`${t}.tmp-${process.pid}-${crypto.randomBytes(4).toString("hex")}`;try{await promises.mkdir(n__default.default.dirname(t),{recursive:!0}),await promises.writeFile(i,e,"utf8"),await promises.rename(i,t);}catch(r){await promises.unlink(i).catch(()=>{}),chunkS3BXVHO7_cjs.b("invalid-input",`cannot write ${t}: ${r.message}`,"check the directory exists and is writable");}}async function E(t,e,i={}){let{retries:r=40,intervalMs:d=50,staleMs:m=6e4}=i,a=n__default.default.join(t,c,"state.lock");await promises.mkdir(n__default.default.dirname(a),{recursive:true});let u=false;for(let f=0;!u;f++)try{let s=await promises.open(a,"wx");await s.writeFile(`${process.pid} ${new Date().toISOString()}
2
- `),await s.close(),u=!0;}catch(s){if(s.code!=="EEXIST")throw s;if(await promises.stat(a).then(w=>Date.now()-w.mtimeMs,()=>0)>m){await promises.unlink(a).catch(()=>{});continue}f>=r&&chunkS3BXVHO7_cjs.b("invalid-input","another exwf command holds .workflow/state.lock","retry, or delete the file if no exwf process is running"),await new Promise(w=>setTimeout(w,d));}try{return await e()}finally{await promises.unlink(a).catch(()=>{});}}async function D(t,e){await g(y(t),JSON.stringify(e,null,2)+`
3
- `);}async function M(t){let e=y(t),i;try{i=await promises.readFile(e,"utf8");}catch{chunkS3BXVHO7_cjs.b("invalid-input",`no workflow state at ${e}`,"run `exwf init <scrum|kanban|waterfall> --config <file>` in this directory first");}let r;try{r=JSON.parse(i);}catch(f){chunkS3BXVHO7_cjs.b("invalid-input",`${e} is not valid JSON: ${f.message}`,"restore it from git or re-run exwf init");}(typeof r!="object"||r===null||Array.isArray(r))&&chunkS3BXVHO7_cjs.b("invalid-input",`${e} does not contain a workflow state object`,"restore it from git or re-run exwf init");let d=r;d.version!==1&&chunkS3BXVHO7_cjs.b("state-version",`${e} has schema version ${String(d.version)}; this ex-workflow reads version 1`,"upgrade ex-workflow, or run the migration this version documents in its changelog");let m=n__default.default.join(t,c,"roles"),a=[];try{a=(await promises.readdir(m)).filter(f=>f.endsWith(".json"));}catch{}let u={...d.roles};for(let f of a){let s=n__default.default.join(m,f),l;try{l=JSON.parse(await promises.readFile(s,"utf8"));}catch(w){chunkS3BXVHO7_cjs.b("invalid-input",`role manifest ${s} is not valid JSON: ${w.message}`,"fix or delete that manifest");}(typeof l!="object"||l===null||typeof l.id!="string")&&chunkS3BXVHO7_cjs.b("invalid-input",`role manifest ${s} is not an object with a string id`,"a role manifest needs at least an id"),u[l.id]||(u[l.id]=l);}return {...d,roles:u}}function k(t,e){return n__default.default.resolve(e).startsWith(n__default.default.resolve(t,c)+n__default.default.sep)||chunkS3BXVHO7_cjs.b("invalid-input",`${e} resolves outside ${c}/`,"use a plain item id (letters, digits, - _ .)"),e}async function R(t,e){let i=k(t,n__default.default.join(t,c,"briefs",`${e.item.id}.json`));return await g(i,JSON.stringify(e,null,2)+`
4
- `),i}async function T(t,e,i){let r=k(t,n__default.default.join(t,c,"handoffs",`${e.item}-${i}.json`));return await g(r,JSON.stringify(e,null,2)+`
5
- `),r}exports.a=c;exports.b=y;exports.c=E;exports.d=D;exports.e=M;exports.f=R;exports.g=T;//# sourceMappingURL=chunk-6R3YFUUV.cjs.map
6
- //# sourceMappingURL=chunk-6R3YFUUV.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/adapters/file.ts"],"names":["WORKFLOW_DIR","statePath","root","path","writeAtomic","file","content","tmp","randomBytes","mkdir","writeFile","rename","e","unlink","fail","withStateLock","fn","opts","retries","intervalMs","staleMs","lock","held","attempt","fh","open","stat","st","resolve","saveState","state","loadState","raw","readFile","parsed","rolesDir","manifests","readdir","roles","manifestPath","role","inWorkflowDir","saveBrief","brief","saveHandoff","handoff","seq"],"mappings":"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","file":"chunk-6R3YFUUV.cjs","sourcesContent":["import { mkdir, open, readFile, readdir, rename, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { randomBytes } from \"node:crypto\";\nimport path from \"node:path\";\nimport { fail } from \"../errors.ts\";\nimport type { Brief, Handoff, Role, WorkflowState } from \"../types.ts\";\n\nexport const WORKFLOW_DIR = \".workflow\";\n\nexport function statePath(root: string): string {\n return path.join(root, WORKFLOW_DIR, \"state.json\");\n}\n\nasync function writeAtomic(file: string, content: string): Promise<void> {\n const tmp = `${file}.tmp-${process.pid}-${randomBytes(4).toString(\"hex\")}`;\n try {\n await mkdir(path.dirname(file), { recursive: true });\n await writeFile(tmp, content, \"utf8\");\n await rename(tmp, file);\n } catch (e) {\n // best effort: remove the temp file if it was created; ignore failure\n await unlink(tmp).catch(() => undefined);\n fail(\n \"invalid-input\",\n `cannot write ${file}: ${(e as Error).message}`,\n \"check the directory exists and is writable\",\n );\n }\n}\n\nexport interface LockOptions {\n retries?: number;\n intervalMs?: number;\n staleMs?: number;\n}\n\n/** Run `fn` while holding `.workflow/state.lock`, so concurrent exwf commands cannot lose each other's updates. */\nexport async function withStateLock<T>(\n root: string,\n fn: () => Promise<T>,\n opts: LockOptions = {},\n): Promise<T> {\n const { retries = 40, intervalMs = 50, staleMs = 60_000 } = opts;\n const lock = path.join(root, WORKFLOW_DIR, \"state.lock\");\n await mkdir(path.dirname(lock), { recursive: true });\n let held = false;\n for (let attempt = 0; !held; attempt++) {\n try {\n const fh = await open(lock, \"wx\");\n await fh.writeFile(`${process.pid} ${new Date().toISOString()}\\n`);\n await fh.close();\n held = true;\n } catch (e) {\n if ((e as NodeJS.ErrnoException).code !== \"EEXIST\") throw e;\n const age = await stat(lock).then(\n (st) => Date.now() - st.mtimeMs,\n () => 0,\n );\n if (age > staleMs) {\n await unlink(lock).catch(() => undefined);\n continue;\n }\n if (attempt >= retries)\n fail(\n \"invalid-input\",\n \"another exwf command holds .workflow/state.lock\",\n \"retry, or delete the file if no exwf process is running\",\n );\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n }\n try {\n return await fn();\n } finally {\n await unlink(lock).catch(() => undefined);\n }\n}\n\nexport async function saveState(root: string, state: WorkflowState): Promise<void> {\n await writeAtomic(statePath(root), JSON.stringify(state, null, 2) + \"\\n\");\n}\n\nexport async function loadState(root: string): Promise<WorkflowState> {\n const file = statePath(root);\n let raw: string;\n try {\n raw = await readFile(file, \"utf8\");\n } catch {\n fail(\n \"invalid-input\",\n `no workflow state at ${file}`,\n \"run `exwf init <scrum|kanban|waterfall> --config <file>` in this directory first\",\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n fail(\n \"invalid-input\",\n `${file} is not valid JSON: ${(e as Error).message}`,\n \"restore it from git or re-run exwf init\",\n );\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n fail(\n \"invalid-input\",\n `${file} does not contain a workflow state object`,\n \"restore it from git or re-run exwf init\",\n );\n }\n const state = parsed as WorkflowState;\n if (state.version !== 1)\n fail(\n \"state-version\",\n `${file} has schema version ${String(state.version)}; this ex-workflow reads version 1`,\n \"upgrade ex-workflow, or run the migration this version documents in its changelog\",\n );\n const rolesDir = path.join(root, WORKFLOW_DIR, \"roles\");\n let manifests: string[] = [];\n try {\n manifests = (await readdir(rolesDir)).filter((f) => f.endsWith(\".json\"));\n } catch {\n /* no extra roles */\n }\n const roles = { ...state.roles };\n for (const f of manifests) {\n const manifestPath = path.join(rolesDir, f);\n let role: Role;\n try {\n role = JSON.parse(await readFile(manifestPath, \"utf8\")) as Role;\n } catch (e) {\n fail(\n \"invalid-input\",\n `role manifest ${manifestPath} is not valid JSON: ${(e as Error).message}`,\n \"fix or delete that manifest\",\n );\n }\n if (typeof role !== \"object\" || role === null || typeof role.id !== \"string\") {\n fail(\n \"invalid-input\",\n `role manifest ${manifestPath} is not an object with a string id`,\n \"a role manifest needs at least an id\",\n );\n }\n if (!roles[role.id]) roles[role.id] = role;\n }\n return { ...state, roles };\n}\n\nfunction inWorkflowDir(root: string, file: string): string {\n if (!path.resolve(file).startsWith(path.resolve(root, WORKFLOW_DIR) + path.sep))\n fail(\n \"invalid-input\",\n `${file} resolves outside ${WORKFLOW_DIR}/`,\n \"use a plain item id (letters, digits, - _ .)\",\n );\n return file;\n}\n\nexport async function saveBrief(root: string, brief: Brief): Promise<string> {\n const file = inWorkflowDir(\n root,\n path.join(root, WORKFLOW_DIR, \"briefs\", `${brief.item.id}.json`),\n );\n await writeAtomic(file, JSON.stringify(brief, null, 2) + \"\\n\");\n return file;\n}\n\nexport async function saveHandoff(root: string, handoff: Handoff, seq: number): Promise<string> {\n const file = inWorkflowDir(\n root,\n path.join(root, WORKFLOW_DIR, \"handoffs\", `${handoff.item}-${seq}.json`),\n );\n await writeAtomic(file, JSON.stringify(handoff, null, 2) + \"\\n\");\n return file;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/kanban/columns.ts","../src/kanban/config.ts","../src/kanban/board.ts","../src/kanban/replay.ts","../src/kanban/metrics.ts","../src/kanban/reports.ts","../src/kanban/ceremonies.ts","../src/kanban/roles.ts","../src/kanban/rules.ts","../src/kanban/stages.ts","../src/kanban/index.ts"],"names":["ACTIVE","OPEN","optionsColumn","state","first","fail","commitmentColumn","st","s","deliveryColumn","columnIndex","stageId","stageOf","onBoard","item","idx","activeExpedites","i","enteredStageAt","t","KANBAN_CADENCES","CLASSES","DAY_MS","configOf","DEFAULT_COLUMNS","isObj","x","positive","v","field","fix","min","BARE_POLICY_KINDS","nonEmpty","validatePolicies","raw","out","p","at","column","assertId","id","wip","flag","validateKanbanConfig","c","columns","seen","col","classesOfService","cos","k","entry","bypass","sle","target","f","rounds","fairness","cadences","cad","every","addedAt","e","cardAge","now","board","here","cards","timSort","b","a","active","queued","CADENCE_EVENT","cadencesDue","cfg","lastSeq","lastAt","turnsSince","everyTurns","ms","from","to","carried","replay","events","commitment","delivery","items","blockers","stamp","it","stage","applyTransition","ev","list","percentile","values","sorted","rank","ratio","num","den","boardOf","staysOf","r","columnStays","kanbanMetrics","index","delivered","y","leadTimeMs","cycleTimeMsByColumn","commits","throughput","start","lo","n","wipByColumn","agingWipMs","firstEntry","per","days","cumulativeFlow","day","sleCompliance","cls","mine","blockerTimeMs","opsReport","stays","aging","history","p85Ms","ageMs","committedAt","commit","riskReport","staleAfterMs","lead","pLead","fixedDate","staleBlockers","elapsed","projectedRemainingMs","timeLeftMs","wantItems","input","cadence","dupe","getItem","validLevel","withWip","limit","_w","rest","kanbanCeremonies","methodology","act","type","reduce","applyAction","nowOf","requireCap","options","assertPolicies","moveItem","appendEvent","last","policies","checked","level","stages","wipChanges","policyChanges","sleChanges","before","gated","_old","assign","patchItem","stale","patch","merged","next","mix","kanbanRoles","rule","severity","message","payloadOf","itemsOf","activeIn","kanbanRules","delivers","ci","di","open","fresh","already","max","kanbanStages","config","after","KANBAN_VOCABULARY","RANK","rankOf","BAND","AGE_STEP","clamp","hi","priorityByClass","ctx","aged","offset","promoted","byClassThenAge","ageA","ageB","ta","tb","describePolicies","kanban","times","resolvedBefore","added","deferralsSince","mid","po","since","slots","all","expedites"],"mappings":"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","file":"chunk-7HZXZF3L.cjs","sourcesContent":["import { fail } from \"../errors.ts\";\nimport { stageOf } from \"../items.ts\";\nimport type { ItemStatus, Stage, WorkItem, WorkflowState } from \"../types.ts\";\n\n/** Statuses that hold a WIP slot. */\nexport const ACTIVE: ReadonlySet<ItemStatus> = new Set([\n \"in_progress\",\n \"blocked\",\n \"awaiting_human\",\n]);\n/** Every status but done and dropped: the cards on the board. */\nexport const OPEN: ReadonlySet<ItemStatus> = new Set([\n \"todo\",\n \"in_progress\",\n \"blocked\",\n \"review\",\n \"awaiting_human\",\n]);\n\nexport function optionsColumn(state: WorkflowState): Stage {\n const first = state.stages[0];\n if (!first)\n fail(\n \"config-invalid\",\n \"kanban board has no columns\",\n \"init with at least options, a commitment column and a delivery column\",\n );\n return first;\n}\n\nexport function commitmentColumn(state: WorkflowState): Stage {\n const st = state.stages.find((s) => s.commitmentPoint);\n if (!st)\n fail(\n \"config-invalid\",\n \"no column is the commitment point\",\n \"set commitmentPoint: true on exactly one column\",\n );\n return st;\n}\n\nexport function deliveryColumn(state: WorkflowState): Stage {\n const st = state.stages.find((s) => s.deliveryPoint);\n if (!st)\n fail(\n \"config-invalid\",\n \"no column is the delivery point\",\n \"set deliveryPoint: true on the last column\",\n );\n return st;\n}\n\nexport function columnIndex(state: WorkflowState, stageId: string): number {\n stageOf(state, stageId);\n return state.stages.findIndex((s) => s.id === stageId);\n}\n\n/** Committed and not yet delivered: column index in [commitment, delivery). */\nexport function onBoard(state: WorkflowState, item: WorkItem): boolean {\n const idx = columnIndex(state, item.stage);\n return (\n idx >= columnIndex(state, commitmentColumn(state).id) &&\n idx < columnIndex(state, deliveryColumn(state).id)\n );\n}\n\nexport function activeExpedites(state: WorkflowState): string[] {\n return Object.values(state.items)\n .filter((i) => i.classOfService === \"expedite\" && ACTIVE.has(i.status) && onBoard(state, i))\n .map((i) => i.id);\n}\n\n/** ISO time the item last entered its current column; undefined when it was added there and never moved. */\nexport function enteredStageAt(item: WorkItem): string | undefined {\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.stage === item.stage && t.from.stage !== item.stage) return t.at;\n }\n return undefined;\n}\n","import { assertId, fail } from \"../errors.ts\";\nimport type { ClassOfService, Policy, WorkflowState } from \"../types.ts\";\n\nexport type KanbanCadence =\n | \"replenishment\"\n | \"delivery-planning\"\n | \"service-delivery-review\"\n | \"operations-review\"\n | \"risk-review\"\n | \"strategy-review\";\nexport const KANBAN_CADENCES: readonly KanbanCadence[] = [\n \"replenishment\",\n \"delivery-planning\",\n \"service-delivery-review\",\n \"operations-review\",\n \"risk-review\",\n \"strategy-review\",\n];\nexport const CLASSES: readonly ClassOfService[] = [\n \"expedite\",\n \"fixed-date\",\n \"standard\",\n \"intangible\",\n];\nexport const DAY_MS = 86_400_000;\n\nexport interface KanbanColumn {\n id: string;\n name: string;\n wipLimit?: number;\n /** Explicit policies a card must satisfy before it LEAVES the column (checked by complete()). */\n policies: Policy[];\n commitmentPoint?: boolean;\n deliveryPoint?: boolean;\n /** Cards entering this column wait for a reviewer (status \"review\"). */\n review?: boolean;\n}\nexport interface ServiceLevel {\n percentile: number;\n targetMs: number;\n}\nexport interface ClassConfig {\n wipBypass?: number;\n sle?: ServiceLevel;\n}\nexport interface KanbanConfig {\n columns: KanbanColumn[];\n classesOfService: Partial<Record<ClassOfService, ClassConfig>>;\n fairness: { aging: boolean; maxDeferralRounds: number };\n cadences: Partial<Record<KanbanCadence, { everyTurns?: number }>>;\n throughputWindowMs: number;\n maxExpedite: number;\n}\n\nexport function configOf(state: WorkflowState): KanbanConfig {\n return state.config as KanbanConfig;\n}\n\nexport const DEFAULT_COLUMNS: KanbanColumn[] = [\n { id: \"options\", name: \"Options\", policies: [{ kind: \"acceptance-written\" }] },\n {\n id: \"ready\",\n name: \"Ready\",\n wipLimit: 4,\n commitmentPoint: true,\n policies: [{ kind: \"dependencies-done\" }],\n },\n {\n id: \"dev\",\n name: \"Development\",\n wipLimit: 3,\n policies: [{ kind: \"evidence\", evidenceKind: \"test-output\" }],\n },\n {\n id: \"review\",\n name: \"Review\",\n wipLimit: 2,\n review: true,\n policies: [{ kind: \"no-open-blockers\" }],\n },\n { id: \"done\", name: \"Done\", deliveryPoint: true, policies: [] },\n];\n\nconst isObj = (x: unknown): x is Record<string, unknown> =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n\nfunction positive(v: unknown, field: string, fix: string, min = 1): number | undefined {\n if (v === undefined) return undefined;\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < min)\n fail(\n \"config-invalid\",\n `kanban config.${field} must be a number >= ${min} (got ${JSON.stringify(v)})`,\n fix,\n );\n return v;\n}\n\nconst BARE_POLICY_KINDS = [\n \"acceptance-written\",\n \"estimate-present\",\n \"no-open-blockers\",\n \"dependencies-done\",\n];\n\nconst nonEmpty = (x: unknown): boolean => typeof x === \"string\" && x.trim() !== \"\";\n\n/** Validate a Policy[]: every entry must be a core Policy object. Returns a fresh array. */\nexport function validatePolicies(raw: unknown, field: string): Policy[] {\n if (!Array.isArray(raw))\n fail(\n \"config-invalid\",\n `kanban config.${field} must be an array of Policy objects`,\n 'e.g. [{ \"kind\": \"evidence\", \"evidenceKind\": \"test-output\" }]',\n );\n const out: Policy[] = [];\n raw.forEach((p: unknown, i: number) => {\n const at = `kanban config.${field}[${i}]`;\n const ok =\n isObj(p) &&\n (p[\"kind\"] === \"evidence\"\n ? nonEmpty(p[\"evidenceKind\"])\n : p[\"kind\"] === \"custom\"\n ? nonEmpty(p[\"id\"]) && nonEmpty(p[\"description\"])\n : typeof p[\"kind\"] === \"string\" && BARE_POLICY_KINDS.includes(p[\"kind\"]));\n if (!ok)\n fail(\n \"config-invalid\",\n `${at} must be a Policy`,\n `use a Policy such as { \"kind\": \"evidence\", \"evidenceKind\": \"test-output\" }, { \"kind\": \"custom\", \"id\": \"x\", \"description\": \"...\" } or one of: ${BARE_POLICY_KINDS.join(\", \")}`,\n );\n out.push(p as Policy);\n });\n return out;\n}\n\nfunction column(raw: unknown, i: number): KanbanColumn {\n if (!isObj(raw))\n fail(\n \"config-invalid\",\n `kanban config.columns[${i}] must be an object`,\n 'e.g. { \"id\": \"dev\", \"policies\": [] }',\n );\n assertId(raw[\"id\"], `kanban config.columns[${i}].id`);\n const id = raw[\"id\"] as string;\n if (!Array.isArray(raw[\"policies\"]))\n fail(\n \"config-invalid\",\n `kanban config.columns[${i}] (\"${id}\") needs policies: Policy[]`,\n 'every column states its policies explicitly, e.g. [{ \"kind\": \"acceptance-written\" }]',\n );\n const out: KanbanColumn = {\n id,\n name: typeof raw[\"name\"] === \"string\" && raw[\"name\"].trim() !== \"\" ? raw[\"name\"] : id,\n policies: validatePolicies(raw[\"policies\"], `columns[${i}].policies`),\n };\n const wip = positive(raw[\"wipLimit\"], `columns[${i}].wipLimit`, \"omit wipLimit for no limit\");\n if (wip !== undefined) out.wipLimit = wip;\n for (const flag of [\"commitmentPoint\", \"deliveryPoint\", \"review\"] as const) {\n if (raw[flag] === undefined) continue;\n if (typeof raw[flag] !== \"boolean\")\n fail(\n \"config-invalid\",\n `kanban config.columns[${i}].${flag} must be a boolean`,\n `set ${flag}: true or omit it`,\n );\n if (raw[flag]) out[flag] = true;\n }\n return out;\n}\n\nexport function validateKanbanConfig(raw: unknown): KanbanConfig {\n const c = (raw ?? {}) as Record<string, unknown>;\n if (c[\"columns\"] !== undefined && !Array.isArray(c[\"columns\"]))\n fail(\n \"config-invalid\",\n \"kanban config.columns must be an array of columns\",\n \"omit columns for the default board (options, ready, dev, review, done)\",\n );\n const columns =\n c[\"columns\"] === undefined\n ? DEFAULT_COLUMNS.map((x) => ({ ...x }))\n : (c[\"columns\"] as unknown[]).map(column);\n const seen = new Set<string>();\n for (const col of columns) {\n if (seen.has(col.id))\n fail(\"config-invalid\", `duplicate column id \"${col.id}\"`, \"give every column a unique id\");\n seen.add(col.id);\n }\n const classesOfService: KanbanConfig[\"classesOfService\"] = {};\n const cos = c[\"classesOfService\"] ?? {};\n if (!isObj(cos))\n fail(\n \"config-invalid\",\n \"kanban config.classesOfService must be an object keyed by class\",\n 'e.g. { \"expedite\": { \"wipBypass\": 1 } }',\n );\n for (const [k, v] of Object.entries(cos)) {\n if (!(CLASSES as readonly string[]).includes(k))\n fail(\n \"config-invalid\",\n `kanban config.classesOfService.${k} is not a class of service`,\n `use one of: ${CLASSES.join(\", \")}`,\n );\n if (!isObj(v))\n fail(\n \"config-invalid\",\n `kanban config.classesOfService.${k} must be an object`,\n 'e.g. { \"wipBypass\": 1, \"sle\": { \"percentile\": 85, \"targetMs\": 604800000 } }',\n );\n const entry: ClassConfig = {};\n const bypass = positive(\n v[\"wipBypass\"],\n `classesOfService.${k}.wipBypass`,\n \"omit it for the default 1\",\n 0,\n );\n if (bypass !== undefined) entry.wipBypass = bypass;\n if (v[\"sle\"] !== undefined) {\n const sle = v[\"sle\"];\n if (\n !isObj(sle) ||\n typeof sle[\"percentile\"] !== \"number\" ||\n sle[\"percentile\"] < 0 ||\n sle[\"percentile\"] > 100\n )\n fail(\n \"config-invalid\",\n `kanban config.classesOfService.${k}.sle.percentile must be 0..100`,\n 'e.g. { \"percentile\": 85, \"targetMs\": 604800000 }',\n );\n const target = positive(\n sle[\"targetMs\"],\n `classesOfService.${k}.sle.targetMs`,\n \"state the service level target in milliseconds\",\n );\n if (target === undefined)\n fail(\n \"config-invalid\",\n `kanban config.classesOfService.${k}.sle.targetMs is required`,\n \"state the service level target in milliseconds\",\n );\n entry.sle = { percentile: sle[\"percentile\"], targetMs: target };\n }\n classesOfService[k as ClassOfService] = entry;\n }\n const f = c[\"fairness\"] ?? {};\n if (!isObj(f) || (f[\"aging\"] !== undefined && typeof f[\"aging\"] !== \"boolean\"))\n fail(\n \"config-invalid\",\n \"kanban config.fairness must be { aging: boolean, maxDeferralRounds?: number }\",\n \"omit it for aging on\",\n );\n const rounds = positive(\n f[\"maxDeferralRounds\"],\n \"fairness.maxDeferralRounds\",\n \"omit it for 5 rounds\",\n );\n const fairness: KanbanConfig[\"fairness\"] = {\n aging: f[\"aging\"] === undefined ? true : (f[\"aging\"] as boolean),\n maxDeferralRounds: rounds ?? 5,\n };\n const cadences: KanbanConfig[\"cadences\"] = {};\n const cad = c[\"cadences\"] ?? {};\n if (!isObj(cad))\n fail(\n \"config-invalid\",\n \"kanban config.cadences must be an object keyed by cadence\",\n 'e.g. { \"replenishment\": { \"everyTurns\": 10 } }',\n );\n for (const [k, v] of Object.entries(cad)) {\n if (!(KANBAN_CADENCES as readonly string[]).includes(k))\n fail(\n \"config-invalid\",\n `kanban config.cadences.${k} is not a cadence`,\n `use one of: ${KANBAN_CADENCES.join(\", \")}`,\n );\n if (!isObj(v))\n fail(\n \"config-invalid\",\n `kanban config.cadences.${k} must be an object`,\n 'e.g. { \"everyTurns\": 10 }',\n );\n const every = positive(\n v[\"everyTurns\"],\n `cadences.${k}.everyTurns`,\n \"omit it when the cadence is run by hand\",\n );\n cadences[k as KanbanCadence] = every === undefined ? {} : { everyTurns: every };\n }\n return {\n columns,\n classesOfService,\n fairness,\n cadences,\n throughputWindowMs:\n positive(c[\"throughputWindowMs\"], \"throughputWindowMs\", \"omit it for one week\") ?? 7 * DAY_MS,\n maxExpedite: positive(c[\"maxExpedite\"], \"maxExpedite\", \"omit it for 1\") ?? 1,\n };\n}\n","import { timSort } from \"exsorted\";\nimport type { ItemStatus, WorkItem, WorkflowState } from \"../types.ts\";\nimport { ACTIVE, enteredStageAt } from \"./columns.ts\";\nimport { configOf, KANBAN_CADENCES, type KanbanCadence } from \"./config.ts\";\n\nexport interface BoardCard {\n id: string;\n title: string;\n type: string;\n status: ItemStatus;\n classOfService: string;\n role: string | null;\n ageMs: number;\n blocked: boolean;\n deadline: string | null;\n}\nexport interface BoardColumn {\n id: string;\n name: string;\n wipLimit: number | null;\n active: number;\n queued: number;\n overLimit: boolean;\n commitmentPoint: boolean;\n deliveryPoint: boolean;\n cards: BoardCard[];\n}\n\n/** Time the item was added (its item.added event), else the first event's time. */\nexport function addedAt(state: WorkflowState, id: string): string {\n const ev = state.events.find(\n (e) => e.type === \"item.added\" && (e.payload as { id: string }).id === id,\n );\n return ev?.at ?? state.events[0]!.at;\n}\n\nexport function cardAge(state: WorkflowState, item: WorkItem, now: string): number {\n return Date.parse(now) - Date.parse(enteredStageAt(item) ?? addedAt(state, item.id));\n}\n\nexport function board(state: WorkflowState, now: string): BoardColumn[] {\n return state.stages.map((st) => {\n const here = Object.values(state.items).filter(\n (i) => i.stage === st.id && i.status !== \"dropped\",\n );\n const cards: BoardCard[] = timSort(\n here.map((i) => ({\n id: i.id,\n title: i.title,\n type: i.type,\n status: i.status,\n classOfService: i.classOfService ?? \"standard\",\n role: i.role ?? null,\n ageMs: cardAge(state, i, now),\n blocked: i.blockers.some((b) => !b.clearedAt),\n deadline: i.deadline ?? null,\n })),\n (a, b) => b.ageMs - a.ageMs || (a.id < b.id ? -1 : 1),\n );\n const active = cards.filter((c) => ACTIVE.has(c.status)).length;\n const queued = cards.filter((c) => c.status === \"todo\" || c.status === \"review\").length;\n return {\n id: st.id,\n name: st.name,\n wipLimit: st.wipLimit ?? null,\n active,\n queued,\n overLimit: st.wipLimit !== undefined && active > st.wipLimit,\n commitmentPoint: st.commitmentPoint === true,\n deliveryPoint: st.deliveryPoint === true,\n cards,\n };\n });\n}\n\nexport const CADENCE_EVENT = (c: KanbanCadence): string => `cadence.${c}`;\n\nexport interface CadenceStatus {\n cadence: KanbanCadence;\n everyTurns: number | null;\n lastAt: string | null;\n turnsSince: number;\n due: boolean;\n}\n\nexport function cadencesDue(state: WorkflowState): CadenceStatus[] {\n const cfg = configOf(state);\n return KANBAN_CADENCES.map((c) => {\n let lastSeq = 0;\n let lastAt: string | null = null;\n for (const e of state.events) {\n if (e.type === CADENCE_EVENT(c)) {\n lastSeq = e.seq;\n lastAt = e.at;\n }\n }\n const turnsSince = state.events.filter(\n (e) => e.type === \"item.completed\" && e.seq > lastSeq,\n ).length;\n const everyTurns = cfg.cadences[c]?.everyTurns ?? null;\n return {\n cadence: c,\n everyTurns,\n lastAt,\n turnsSince,\n due: everyTurns !== null && turnsSince >= everyTurns,\n };\n });\n}\n","import type { ClassOfService, Event, ItemStatus } from \"../types.ts\";\n\nexport interface Stay {\n stage: string;\n enteredAt: string;\n leftAt?: string;\n}\nexport interface ReplayedItem {\n id: string;\n /** item type from item.added; \"question\" items are escalations, not deliveries */\n type: string;\n stage: string;\n status: ItemStatus;\n /** one entry per contiguous visit to a column; status changes inside a column do not end a stay */\n stays: Stay[];\n /** first entry into the commitment column */\n committedAt?: string;\n /** first entry into the delivery column */\n deliveredAt?: string;\n /** from the replenishment payload; \"standard\" when never replenished */\n classOfService: ClassOfService;\n deadline?: string;\n /** closed in_progress intervals */\n activeMs: number;\n /** closed blocked intervals */\n blockedMs: number;\n /** the open status interval */\n since: { status: ItemStatus; at: string };\n}\nexport interface ReplayedBlocker {\n item: string;\n blocker: string;\n raisedAt: string;\n clearedAt?: string;\n}\nexport interface Replay {\n items: Map<string, ReplayedItem>;\n blockers: ReplayedBlocker[];\n /** time of the last event: the clock every \"still open\" measurement uses */\n lastAt: string;\n}\n\nconst ms = (from: string, to: string) => Date.parse(to) - Date.parse(from);\n\nconst carried = (p: Record<string, unknown>) =>\n (p[\"transition\"] ?? null) as { to: { stage: string; status: ItemStatus } } | null;\n\nexport function replay(events: Event[], commitment: string, delivery: string): Replay {\n const items = new Map<string, ReplayedItem>();\n const blockers: ReplayedBlocker[] = [];\n let lastAt = events[0]?.at ?? \"1970-01-01T00:00:00.000Z\";\n const stamp = (it: ReplayedItem, stage: string, at: string) => {\n if (stage === commitment && it.committedAt === undefined) it.committedAt = at;\n if (stage === delivery && it.deliveredAt === undefined) it.deliveredAt = at;\n };\n /** the one place a transition (from item.transition or carried by a blocker event) is applied */\n const applyTransition = (\n it: ReplayedItem,\n to: { stage: string; status: ItemStatus },\n at: string,\n ) => {\n if (it.since.status === \"in_progress\") it.activeMs += ms(it.since.at, at);\n if (it.since.status === \"blocked\") it.blockedMs += ms(it.since.at, at);\n it.since = { status: to.status, at };\n if (to.stage !== it.stage) {\n it.stays[it.stays.length - 1]!.leftAt = at;\n it.stays.push({ stage: to.stage, enteredAt: at });\n stamp(it, to.stage, at);\n }\n it.stage = to.stage;\n it.status = to.status;\n };\n for (const ev of events) {\n lastAt = ev.at;\n const p = (ev.payload ?? {}) as Record<string, unknown>;\n switch (ev.type) {\n case \"item.added\": {\n const id = p[\"id\"] as string;\n const stage = p[\"stage\"] as string;\n const it: ReplayedItem = {\n id,\n type: typeof p[\"type\"] === \"string\" ? p[\"type\"] : \"task\",\n stage,\n status: \"todo\",\n stays: [{ stage, enteredAt: ev.at }],\n classOfService: \"standard\",\n activeMs: 0,\n blockedMs: 0,\n since: { status: \"todo\", at: ev.at },\n };\n stamp(it, stage, ev.at);\n items.set(id, it);\n break;\n }\n case \"item.transition\": {\n const it = items.get(p[\"id\"] as string);\n if (!it) break;\n applyTransition(it, p[\"to\"] as { stage: string; status: ItemStatus }, ev.at);\n break;\n }\n case \"cadence.replenishment\": {\n const list = (p[\"items\"] ?? []) as Array<{\n id: string;\n classOfService: ClassOfService;\n deadline: string | null;\n }>;\n for (const c of list) {\n const it = items.get(c.id);\n if (!it) continue;\n it.classOfService = c.classOfService;\n if (c.deadline) it.deadline = c.deadline;\n else delete it.deadline;\n }\n break;\n }\n case \"blocker.raised\": {\n blockers.push({\n item: p[\"id\"] as string,\n blocker: p[\"blocker\"] as string,\n raisedAt: ev.at,\n });\n const it = items.get(p[\"id\"] as string);\n const t = carried(p);\n if (it && t) applyTransition(it, t.to, ev.at);\n break;\n }\n case \"blocker.cleared\": {\n const b = blockers.find(\n (x) => x.item === p[\"id\"] && x.blocker === p[\"blocker\"] && x.clearedAt === undefined,\n );\n if (b) b.clearedAt = ev.at;\n const it = items.get(p[\"id\"] as string);\n const t = carried(p);\n if (it && t) applyTransition(it, t.to, ev.at);\n break;\n }\n default:\n break;\n }\n }\n return { items, blockers, lastAt };\n}\n","import { timSort } from \"exsorted\";\nimport type { WorkflowState } from \"../types.ts\";\nimport { OPEN } from \"./columns.ts\";\nimport { configOf } from \"./config.ts\";\nimport { replay, type Replay } from \"./replay.ts\";\n\nexport interface KanbanMetrics {\n leadTimeMs: number[];\n leadTimeP50: number;\n leadTimeP85: number;\n cycleTimeMsByColumn: Record<string, number>;\n throughput: number[];\n wipByColumn: Record<string, number>;\n flowEfficiency: number;\n agingWipMs: Record<string, number>;\n cumulativeFlow: Record<string, number>;\n sleCompliance: Record<string, number>;\n blockerTimeMs: number;\n meanBlockerTimeMs: number;\n}\n\n/** Nearest-rank percentile; 0 for an empty list. */\nexport function percentile(values: number[], p: number): number {\n if (values.length === 0) return 0;\n const sorted = timSort([...values], (a, b) => a - b);\n const rank = Math.min(sorted.length, Math.max(1, Math.ceil((p / 100) * sorted.length)));\n return sorted[rank - 1]!;\n}\n\nconst ms = (from: string, to: string) => Date.parse(to) - Date.parse(from);\nconst ratio = (num: number, den: number) => (den === 0 ? 0 : num / den);\n\nfunction boardOf(state: WorkflowState) {\n const commitment = state.stages.find((s) => s.commitmentPoint)?.id ?? \"\";\n const delivery = state.stages.find((s) => s.deliveryPoint)?.id ?? \"\";\n return {\n commitment,\n delivery,\n ci: state.stages.findIndex((s) => s.id === commitment),\n di: state.stages.findIndex((s) => s.id === delivery),\n };\n}\n\nfunction staysOf(r: Replay): Record<string, number[]> {\n const out: Record<string, number[]> = {};\n for (const it of r.items.values())\n for (const st of it.stays)\n if (st.leftAt !== undefined) (out[st.stage] ??= []).push(ms(st.enteredAt, st.leftAt));\n return out;\n}\n\n/** Completed stay durations per column. */\nexport function columnStays(state: WorkflowState): Record<string, number[]> {\n const b = boardOf(state);\n return staysOf(replay(state.events, b.commitment, b.delivery));\n}\n\nexport function kanbanMetrics(state: WorkflowState): KanbanMetrics {\n const cfg = configOf(state);\n const b = boardOf(state);\n const r = replay(state.events, b.commitment, b.delivery);\n const items = [...r.items.values()];\n const columns = state.stages.map((s) => s.id);\n const index = new Map(columns.map((id, i) => [id, i] as const));\n\n // questions (escalations) are born on the board and answered, never delivered\n const delivered = timSort(\n items.filter(\n (i) => i.type !== \"question\" && i.committedAt !== undefined && i.deliveredAt !== undefined,\n ),\n (x, y) => Date.parse(x.deliveredAt!) - Date.parse(y.deliveredAt!),\n );\n const leadTimeMs = delivered.map((i) => ms(i.committedAt!, i.deliveredAt!));\n\n const cycleTimeMsByColumn: Record<string, number> = {};\n for (const [col, list] of Object.entries(staysOf(r)))\n cycleTimeMsByColumn[col] = list.reduce((s, x) => s + x, 0) / list.length;\n\n const commits = items\n .filter((i) => i.type !== \"question\" && i.committedAt !== undefined)\n .map((i) => Date.parse(i.committedAt!));\n let throughput: number[] = [];\n if (commits.length > 0) {\n const start = commits.reduce((lo, x) => (x < lo ? x : lo), commits[0]!);\n const n = Math.floor((Date.parse(r.lastAt) - start) / cfg.throughputWindowMs) + 1;\n throughput = Array.from({ length: n }, () => 0);\n for (const i of delivered) {\n const idx = Math.floor((Date.parse(i.deliveredAt!) - start) / cfg.throughputWindowMs);\n if (idx >= 0 && idx < n) throughput[idx]! += 1;\n }\n }\n\n const wipByColumn: Record<string, number> = Object.fromEntries(columns.map((c) => [c, 0]));\n const agingWipMs: Record<string, number> = {};\n for (const i of items) {\n if (!OPEN.has(i.status)) continue;\n if (Object.hasOwn(wipByColumn, i.stage)) wipByColumn[i.stage]! += 1;\n const idx = index.get(i.stage);\n if (idx !== undefined && idx >= b.ci && idx < b.di)\n agingWipMs[i.id] = ms(i.stays[i.stays.length - 1]!.enteredAt, r.lastAt);\n }\n\n const firstEntry = new Map<string, Map<string, string>>();\n for (const i of items)\n for (const st of i.stays) {\n const per = firstEntry.get(st.stage) ?? new Map<string, string>();\n if (!per.has(i.id)) per.set(i.id, st.enteredAt);\n firstEntry.set(st.stage, per);\n }\n const days = timSort([...new Set(state.events.map((e) => e.at.slice(0, 10)))], (x, y) =>\n x < y ? -1 : x > y ? 1 : 0,\n );\n const cumulativeFlow: Record<string, number> = {};\n for (const day of days)\n for (const col of columns)\n cumulativeFlow[`${day}:${col}`] = [...(firstEntry.get(col)?.values() ?? [])].filter(\n (at) => at.slice(0, 10) <= day,\n ).length;\n\n const sleCompliance: Record<string, number> = {};\n for (const [cls, entry] of Object.entries(cfg.classesOfService)) {\n if (!entry?.sle) continue;\n const mine = delivered.filter((i) => i.classOfService === cls);\n if (mine.length === 0) continue;\n sleCompliance[cls] =\n mine.filter((i) => ms(i.committedAt!, i.deliveredAt!) <= entry.sle!.targetMs).length /\n mine.length;\n }\n\n const blockerTimeMs = r.blockers.reduce((s, x) => s + ms(x.raisedAt, x.clearedAt ?? r.lastAt), 0);\n\n return {\n leadTimeMs,\n leadTimeP50: percentile(leadTimeMs, 50),\n leadTimeP85: percentile(leadTimeMs, 85),\n cycleTimeMsByColumn,\n throughput,\n wipByColumn,\n flowEfficiency: ratio(\n delivered.reduce((s, i) => s + i.activeMs, 0),\n leadTimeMs.reduce((s, x) => s + x, 0),\n ),\n agingWipMs,\n cumulativeFlow,\n sleCompliance,\n blockerTimeMs,\n meanBlockerTimeMs: ratio(blockerTimeMs, r.blockers.length),\n };\n}\n","import { timSort } from \"exsorted\";\nimport type { WorkflowState } from \"../types.ts\";\nimport { addedAt, cardAge } from \"./board.ts\";\nimport { ACTIVE, OPEN, activeExpedites, commitmentColumn, onBoard } from \"./columns.ts\";\nimport { configOf } from \"./config.ts\";\nimport { columnStays, kanbanMetrics, percentile } from \"./metrics.ts\";\n\nexport interface OpsReport {\n blockers: Array<{ item: string; blocker: string; owner: string; reason: string; ageMs: number }>;\n agingWip: Array<{\n item: string;\n column: string;\n status: string;\n ageMs: number;\n p85Ms: number | null;\n overP85: boolean;\n }>;\n queued: Record<string, number>;\n active: Record<string, number>;\n}\n\nexport function opsReport(state: WorkflowState, now: string): OpsReport {\n const t = Date.parse(now);\n const stays = columnStays(state);\n const blockers: OpsReport[\"blockers\"] = [];\n const aging: OpsReport[\"agingWip\"] = [];\n const queued: Record<string, number> = Object.fromEntries(state.stages.map((s) => [s.id, 0]));\n const active: Record<string, number> = Object.fromEntries(state.stages.map((s) => [s.id, 0]));\n for (const it of Object.values(state.items)) {\n for (const b of it.blockers)\n if (!b.clearedAt)\n blockers.push({\n item: it.id,\n blocker: b.id,\n owner: b.owner,\n reason: b.reason,\n ageMs: t - Date.parse(b.raisedAt),\n });\n if (ACTIVE.has(it.status)) active[it.stage] = (active[it.stage] ?? 0) + 1;\n else if (it.status === \"todo\" || it.status === \"review\")\n queued[it.stage] = (queued[it.stage] ?? 0) + 1;\n if (OPEN.has(it.status) && onBoard(state, it)) {\n const history = stays[it.stage] ?? [];\n const p85Ms = history.length ? percentile(history, 85) : null;\n const ageMs = cardAge(state, it, now);\n aging.push({\n item: it.id,\n column: it.stage,\n status: it.status,\n ageMs,\n p85Ms,\n overP85: p85Ms !== null && ageMs > p85Ms,\n });\n }\n }\n return {\n blockers,\n agingWip: timSort(aging, (a, b) => b.ageMs - a.ageMs || (a.item < b.item ? -1 : 1)),\n queued,\n active,\n };\n}\n\nexport interface RiskReport {\n fixedDate: Array<{\n item: string;\n deadline: string;\n timeLeftMs: number;\n projectedRemainingMs: number | null;\n atRisk: boolean;\n }>;\n staleBlockers: Array<{ item: string; blocker: string; owner: string; ageMs: number }>;\n expediteActive: string[];\n}\n\n/** Time the item entered the commitment column (its first transition there), else when it was added. */\nfunction committedAt(state: WorkflowState, id: string): string {\n const commit = commitmentColumn(state).id;\n const it = state.items[id]!;\n const t = it.transitions.find((x) => x.to.stage === commit && x.from.stage !== commit);\n return t?.at ?? addedAt(state, id);\n}\n\nexport function riskReport(state: WorkflowState, now: string, staleAfterMs: number): RiskReport {\n const t = Date.parse(now);\n const cfg = configOf(state);\n const lead = kanbanMetrics(state).leadTimeMs;\n const p = cfg.classesOfService[\"fixed-date\"]?.sle?.percentile ?? 85;\n const pLead = lead.length ? percentile(lead, p) : null;\n const fixedDate: RiskReport[\"fixedDate\"] = [];\n const staleBlockers: RiskReport[\"staleBlockers\"] = [];\n for (const it of Object.values(state.items)) {\n for (const b of it.blockers) {\n const ageMs = b.clearedAt ? 0 : t - Date.parse(b.raisedAt);\n if (!b.clearedAt && ageMs > staleAfterMs)\n staleBlockers.push({ item: it.id, blocker: b.id, owner: b.owner, ageMs });\n }\n if (\n it.classOfService !== \"fixed-date\" ||\n !it.deadline ||\n !OPEN.has(it.status) ||\n !onBoard(state, it)\n )\n continue;\n const elapsed = t - Date.parse(committedAt(state, it.id));\n const projectedRemainingMs = pLead === null ? null : Math.max(0, pLead - elapsed);\n const timeLeftMs = Date.parse(it.deadline) - t;\n fixedDate.push({\n item: it.id,\n deadline: it.deadline,\n timeLeftMs,\n projectedRemainingMs,\n atRisk:\n timeLeftMs < 0 || (projectedRemainingMs !== null && projectedRemainingMs > timeLeftMs),\n });\n }\n return { fixedDate, staleBlockers, expediteActive: activeExpedites(state) };\n}\n","import { fail } from \"../errors.ts\";\nimport { getItem, moveItem, patchItem, stageOf } from \"../items.ts\";\nimport { applyAction } from \"../methodology.ts\";\nimport { assertPolicies } from \"../policies.ts\";\nimport { requireCap } from \"../roles.ts\";\nimport { appendEvent, nowOf } from \"../state.ts\";\nimport type {\n Ceremony,\n CeremonyInput,\n ClassOfService,\n Methodology,\n Policy,\n Stage,\n WorkflowState,\n} from \"../types.ts\";\nimport { OPEN, commitmentColumn, deliveryColumn, onBoard, optionsColumn } from \"./columns.ts\";\nimport {\n CLASSES,\n DAY_MS,\n configOf,\n validateKanbanConfig,\n validatePolicies,\n type ClassConfig,\n type KanbanColumn,\n type ServiceLevel,\n} from \"./config.ts\";\nimport { opsReport, riskReport } from \"./reports.ts\";\n\nconst isObj = (x: unknown): x is Record<string, unknown> =>\n typeof x === \"object\" && x !== null && !Array.isArray(x);\n\n/** input.items as a non-empty, duplicate-free string[] of existing item ids. */\nexport function wantItems(state: WorkflowState, input: CeremonyInput, cadence: string): string[] {\n const items = input[\"items\"];\n if (!Array.isArray(items) || items.length === 0 || !items.every((x) => typeof x === \"string\"))\n fail(\"invalid-input\", `${cadence} needs items: string[]`, 'pass [\"A\", \"B\"]');\n const dupe = items.find((id, i) => items.indexOf(id) !== i);\n if (dupe !== undefined)\n fail(\"invalid-input\", `item \"${dupe}\" appears twice in items[]`, \"list each item once\", {\n items: [dupe],\n });\n for (const id of items) getItem(state, id);\n return items;\n}\n\nfunction validLevel(x: unknown): x is ServiceLevel {\n return (\n isObj(x) &&\n typeof x[\"percentile\"] === \"number\" &&\n x[\"percentile\"] >= 0 &&\n x[\"percentile\"] <= 100 &&\n typeof x[\"targetMs\"] === \"number\" &&\n Number.isFinite(x[\"targetMs\"]) &&\n x[\"targetMs\"] > 0\n );\n}\n\nfunction withWip<T extends Stage | KanbanColumn>(x: T, limit: number | null): T {\n const { wipLimit: _w, ...rest } = x;\n return (limit === null ? rest : { ...rest, wipLimit: limit }) as T;\n}\n\nexport function kanbanCeremonies(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 replenishment: Ceremony = (state, input) => {\n requireCap(state, input.by, \"order-backlog\", \"manage-flow\");\n const items = wantItems(state, input, \"replenishment\");\n const target = commitmentColumn(state);\n const options = optionsColumn(state);\n for (const id of items)\n assertPolicies(state, getItem(state, id), options.exitPolicy, `leave \"${options.id}\"`);\n return act(state, \"ceremony.replenishment\", input, (s, now) => {\n for (const id of items)\n s = moveItem(s, id, { stage: target.id, status: \"todo\" }, input.by, now);\n return appendEvent(\n s,\n \"cadence.replenishment\",\n input.by,\n {\n column: target.id,\n items: items.map((id) => {\n const it = getItem(s, id);\n return {\n id,\n classOfService: it.classOfService ?? \"standard\",\n deadline: it.deadline ?? null,\n };\n }),\n },\n now,\n );\n });\n };\n\n const deliveryPlanning: Ceremony = (state, input) => {\n requireCap(state, input.by, \"facilitate\", \"manage-flow\");\n const items = wantItems(state, input, \"delivery-planning\");\n const delivery = deliveryColumn(state);\n const last = state.stages[state.stages.findIndex((st) => st.id === delivery.id) - 1]!;\n for (const id of items) {\n const it = getItem(state, id);\n if (it.stage !== last.id && it.stage !== delivery.id)\n fail(\n \"invalid-input\",\n `item \"${id}\" is in \"${it.stage}\", not ready for delivery`,\n `only cards in \"${last.id}\" or \"${delivery.id}\" can be planned for delivery`,\n { items: [id] },\n );\n }\n return act(state, \"ceremony.delivery-planning\", input, (s, now) =>\n appendEvent(\n s,\n \"cadence.delivery-planning\",\n input.by,\n {\n items,\n window: typeof input[\"window\"] === \"string\" ? input[\"window\"] : null,\n delivered: items.filter((id) => getItem(s, id).status === \"done\"),\n },\n now,\n ),\n );\n };\n\n const serviceDeliveryReview: Ceremony = (state, input) => {\n requireCap(state, input.by, \"manage-flow\");\n const wip = input[\"wip\"] ?? {};\n const policies = input[\"policies\"] ?? {};\n const sle = input[\"sle\"] ?? {};\n if (!isObj(wip) || !isObj(policies) || !isObj(sle))\n fail(\n \"invalid-input\",\n \"service-delivery-review takes wip, policies and sle objects keyed by column or class\",\n 'e.g. { \"wip\": { \"dev\": 2 }, \"policies\": { \"dev\": [{ \"kind\": \"no-open-blockers\" }] }, \"sle\": { \"standard\": { \"percentile\": 85, \"targetMs\": 604800000 } } }',\n );\n for (const [id, limit] of Object.entries(wip)) {\n stageOf(state, id);\n if (limit !== null && (typeof limit !== \"number\" || !Number.isFinite(limit) || limit < 1))\n fail(\n \"invalid-input\",\n `wip.${id} must be a positive number or null`,\n \"null removes the limit\",\n );\n }\n const checked: Record<string, Policy[]> = {};\n for (const [id, p] of Object.entries(policies)) {\n stageOf(state, id);\n checked[id] = validatePolicies(p, `policies.${id}`);\n }\n for (const [cls, level] of Object.entries(sle)) {\n if (!(CLASSES as readonly string[]).includes(cls))\n fail(\n \"invalid-input\",\n `sle.${cls} is not a class of service`,\n `use one of: ${CLASSES.join(\", \")}`,\n );\n if (level !== null && !validLevel(level))\n fail(\n \"invalid-input\",\n `sle.${cls} must be { percentile: 0..100, targetMs: > 0 } or null`,\n \"null removes the service level\",\n );\n }\n return act(state, \"ceremony.service-delivery-review\", input, (s, now) => {\n const cfg = configOf(s);\n let stages = s.stages;\n let columns = cfg.columns;\n let classesOfService = { ...cfg.classesOfService };\n const wipChanges: Array<{ column: string; before: number | null; after: number | null }> = [];\n const policyChanges: Array<{ column: string; before: Policy[]; after: Policy[] }> = [];\n const sleChanges: Array<{\n classOfService: string;\n before: ServiceLevel | null;\n after: ServiceLevel | null;\n }> = [];\n for (const [id, limit] of Object.entries(wip) as Array<[string, number | null]>) {\n const before = stages.find((st) => st.id === id)!.wipLimit ?? null;\n if (before === limit) continue;\n wipChanges.push({ column: id, before, after: limit });\n stages = stages.map((st) => (st.id === id ? withWip(st, limit) : st));\n columns = columns.map((col) => (col.id === id ? withWip(col, limit) : col));\n }\n for (const [id, p] of Object.entries(checked)) {\n const before = stages.find((st) => st.id === id)!.exitPolicy;\n if (JSON.stringify(before) === JSON.stringify(p)) continue;\n policyChanges.push({ column: id, before, after: p });\n const at = stages.findIndex((st) => st.id === id);\n // the commitment column's policies also gate the pull out of it: the next column's entry policy\n const gated = stages[at]!.commitmentPoint ? stages[at + 1]?.id : undefined;\n stages = stages.map((st) =>\n st.id === id\n ? { ...st, exitPolicy: p }\n : st.id === gated\n ? { ...st, entryPolicy: p }\n : st,\n );\n columns = columns.map((col) => (col.id === id ? { ...col, policies: p } : col));\n }\n for (const [cls, level] of Object.entries(sle) as Array<\n [ClassOfService, ServiceLevel | null]\n >) {\n const before = classesOfService[cls]?.sle ?? null;\n if (JSON.stringify(before) === JSON.stringify(level)) continue;\n sleChanges.push({ classOfService: cls, before, after: level });\n const { sle: _old, ...rest } = classesOfService[cls] ?? {};\n classesOfService = {\n ...classesOfService,\n [cls]: level === null ? rest : { ...rest, sle: level },\n };\n }\n s = { ...s, stages, config: { ...cfg, columns, classesOfService } };\n return appendEvent(\n s,\n \"cadence.service-delivery-review\",\n input.by,\n { wip: wipChanges, policies: policyChanges, sle: sleChanges },\n now,\n );\n });\n };\n\n const operationsReview: Ceremony = (state, input) => {\n requireCap(state, input.by, \"facilitate\", \"manage-flow\");\n const assign = (input[\"assign\"] ?? []) as Array<{\n item: string;\n blocker: string;\n owner: string;\n }>;\n if (\n !Array.isArray(assign) ||\n !assign.every(\n (x) => isObj(x) && typeof x[\"item\"] === \"string\" && typeof x[\"blocker\"] === \"string\",\n )\n )\n fail(\n \"invalid-input\",\n \"operations-review.assign must be [{ item, blocker, owner }]\",\n 'e.g. { \"assign\": [{ \"item\": \"A\", \"blocker\": \"A-b1\", \"owner\": \"service-delivery-manager\" }] }',\n );\n for (const x of assign) {\n const it = getItem(state, x.item);\n if (!it.blockers.some((b) => b.id === x.blocker && !b.clearedAt))\n fail(\n \"invalid-input\",\n `item \"${x.item}\" has no open blocker \"${x.blocker}\"`,\n `open blockers: ${\n it.blockers\n .filter((b) => !b.clearedAt)\n .map((b) => b.id)\n .join(\", \") || \"(none)\"\n }`,\n { items: [x.item] },\n );\n }\n return act(state, \"ceremony.operations-review\", input, (s, now) => {\n for (const x of assign) {\n const from = getItem(s, x.item).blockers.find((b) => b.id === x.blocker)!.owner;\n s = patchItem(s, x.item, (it) => ({\n ...it,\n blockers: it.blockers.map((b) => (b.id === x.blocker ? { ...b, owner: x.owner } : b)),\n }));\n s = appendEvent(\n s,\n \"blocker.reassigned\",\n input.by,\n { id: x.item, blocker: x.blocker, from, to: x.owner },\n now,\n );\n }\n return appendEvent(s, \"cadence.operations-review\", input.by, opsReport(s, now), now);\n });\n };\n\n const riskReview: Ceremony = (state, input) => {\n requireCap(state, input.by, \"facilitate\", \"manage-flow\");\n const stale = input[\"staleAfterMs\"] ?? 7 * DAY_MS;\n if (typeof stale !== \"number\" || !Number.isFinite(stale) || stale < 0)\n fail(\n \"invalid-input\",\n \"risk-review.staleAfterMs must be a non-negative number of milliseconds\",\n \"omit it for one week\",\n );\n return act(state, \"ceremony.risk-review\", input, (s, now) =>\n appendEvent(s, \"cadence.risk-review\", input.by, riskReport(s, now, stale), now),\n );\n };\n\n const strategyReview: Ceremony = (state, input) => {\n requireCap(state, input.by, \"manage-flow\");\n const cfg = configOf(state);\n const patch = input[\"classesOfService\"] ?? {};\n if (!isObj(patch))\n fail(\n \"invalid-input\",\n \"strategy-review.classesOfService must be an object keyed by class\",\n 'e.g. { \"expedite\": { \"wipBypass\": 2 }, \"intangible\": null }',\n );\n const merged: Record<string, ClassConfig> = { ...cfg.classesOfService } as Record<\n string,\n ClassConfig\n >;\n for (const [cls, entry] of Object.entries(patch)) {\n if (!(CLASSES as readonly string[]).includes(cls))\n fail(\n \"invalid-input\",\n `classesOfService.${cls} is not a class of service`,\n `use one of: ${CLASSES.join(\", \")}`,\n );\n if (entry === null) delete merged[cls];\n else merged[cls] = entry as ClassConfig;\n }\n const next = validateKanbanConfig({\n ...cfg,\n classesOfService: merged,\n maxExpedite: input[\"maxExpedite\"] ?? cfg.maxExpedite,\n });\n return act(state, \"ceremony.strategy-review\", input, (s, now) => {\n const mix: Record<string, number> = Object.fromEntries(CLASSES.map((k) => [k, 0]));\n for (const it of Object.values(s.items))\n if (OPEN.has(it.status) && onBoard(s, it)) mix[it.classOfService ?? \"standard\"]! += 1;\n s = {\n ...s,\n config: {\n ...configOf(s),\n classesOfService: next.classesOfService,\n maxExpedite: next.maxExpedite,\n },\n };\n return appendEvent(\n s,\n \"cadence.strategy-review\",\n input.by,\n {\n mix,\n before: { classesOfService: cfg.classesOfService, maxExpedite: cfg.maxExpedite },\n after: { classesOfService: next.classesOfService, maxExpedite: next.maxExpedite },\n },\n now,\n );\n });\n };\n\n return {\n replenishment,\n \"delivery-planning\": deliveryPlanning,\n \"service-delivery-review\": serviceDeliveryReview,\n \"operations-review\": operationsReview,\n \"risk-review\": riskReview,\n \"strategy-review\": strategyReview,\n };\n}\n","import type { Role } from \"../types.ts\";\n\nexport function kanbanRoles(): Role[] {\n return [\n {\n id: \"service-request-manager\",\n name: \"Service Request Manager\",\n modelTier: \"large\",\n capabilities: [\"order-backlog\", \"define-acceptance\", \"manage-flow\", \"escalate\"],\n canApprove: [],\n inputs: [\"stakeholder-requests\", \"options\"],\n outputs: [\"ordered-options\", \"acceptance-criteria\", \"classes-of-service\"],\n do_not: [\n \"do not implement items yourself\",\n \"do not push work past the commitment point outside replenishment\",\n ],\n },\n {\n id: \"service-delivery-manager\",\n name: \"Service Delivery Manager\",\n modelTier: \"large\",\n capabilities: [\"facilitate\", \"manage-flow\", \"escalate\"],\n canApprove: [],\n inputs: [\"board\", \"flow-metrics\", \"blockers\"],\n outputs: [\"cadence-records\", \"wip-and-policy-changes\", \"lessons\"],\n do_not: [\"do not reorder the options\", \"do not assign work; the planner pulls\"],\n },\n {\n id: \"worker\",\n name: \"Worker\",\n modelTier: \"small\",\n capabilities: [\"deliver\", \"review\", \"verify\"],\n canApprove: [],\n inputs: [\"brief\"],\n outputs: [\"code\", \"test-output\"],\n do_not: [\n \"do not change acceptance criteria\",\n \"do not pull more work while your card is open\",\n ],\n },\n ];\n}\n","import type { Action, Policy, Rule, Violation, WorkflowState } from \"../types.ts\";\nimport { ACTIVE, OPEN, onBoard } from \"./columns.ts\";\nimport { configOf } from \"./config.ts\";\n\nconst v = (\n rule: string,\n severity: Violation[\"severity\"],\n message: string,\n fix: string,\n item?: string,\n): Violation => (item ? { rule, severity, item, message, fix } : { rule, severity, message, fix });\n\nconst payloadOf = (a: Action): Record<string, unknown> =>\n (a.payload ?? {}) as Record<string, unknown>;\nconst itemsOf = (a: Action): string[] => {\n const items = payloadOf(a)[\"items\"];\n return Array.isArray(items) ? (items as string[]) : [];\n};\nconst activeIn = (s: WorkflowState, column: string) =>\n Object.values(s.items).filter((i) => i.stage === column && ACTIVE.has(i.status)).length;\n\nexport function kanbanRules(): Rule[] {\n const policyExplicit: Rule = {\n id: \"policy-explicit\",\n severity: \"error\",\n check(s, a) {\n const delivery = s.stages.find((st) => st.deliveryPoint)?.id;\n if (a.type === \"init\")\n return s.stages\n .filter((st) => st.id !== delivery && st.exitPolicy.length === 0)\n .map((st) =>\n v(\n \"policy-explicit\",\n \"error\",\n `column \"${st.id}\" has no explicit policy`,\n `give column \"${st.id}\" at least one policy, e.g. { \"kind\": \"acceptance-written\" }`,\n ),\n );\n if (a.type === \"ceremony.service-delivery-review\") {\n const policies = (payloadOf(a)[\"policies\"] ?? {}) as Record<string, Policy[]>;\n return Object.entries(policies)\n .filter(([id, p]) => id !== delivery && Array.isArray(p) && p.length === 0)\n .map(([id]) =>\n v(\n \"policy-explicit\",\n \"error\",\n `column \"${id}\" would be left without a policy`,\n \"keep at least one policy per column; Kanban policies are explicit\",\n ),\n );\n }\n return [];\n },\n };\n\n const commitmentOnce: Rule = {\n id: \"commitment-point-once\",\n severity: \"error\",\n check(s, a) {\n if (a.type !== \"init\") return [];\n const out: Violation[] = [];\n const commits = s.stages.filter((st) => st.commitmentPoint);\n const delivers = s.stages.filter((st) => st.deliveryPoint);\n if (commits.length !== 1)\n out.push(\n v(\n \"commitment-point-once\",\n \"error\",\n `${commits.length} columns are marked commitmentPoint (${commits.map((c) => c.id).join(\", \") || \"none\"})`,\n \"mark exactly one column commitmentPoint: true\",\n ),\n );\n if (delivers.length !== 1)\n out.push(\n v(\n \"commitment-point-once\",\n \"error\",\n `${delivers.length} columns are marked deliveryPoint (${delivers.map((c) => c.id).join(\", \") || \"none\"})`,\n \"mark exactly one column deliveryPoint: true\",\n ),\n );\n if (commits.length === 1 && delivers.length === 1) {\n const ci = s.stages.indexOf(commits[0]!);\n const di = s.stages.indexOf(delivers[0]!);\n if (di !== s.stages.length - 1)\n out.push(\n v(\n \"commitment-point-once\",\n \"error\",\n `delivery column \"${delivers[0]!.id}\" is not the last column`,\n \"move the delivery column to the end; finished cards leave the board there\",\n ),\n );\n if (ci === 0)\n out.push(\n v(\n \"commitment-point-once\",\n \"error\",\n `commitment column \"${commits[0]!.id}\" is the first column`,\n \"keep an Options column before the commitment point; replenishment pulls from it\",\n ),\n );\n else if (ci >= di)\n out.push(\n v(\n \"commitment-point-once\",\n \"error\",\n `commitment column \"${commits[0]!.id}\" comes after the delivery column`,\n \"order columns options → commitment → … → delivery\",\n ),\n );\n }\n return out;\n },\n };\n\n const wipRespected: Rule = {\n id: \"wip-respected\",\n severity: \"error\",\n check(s, a) {\n if (a.type === \"ceremony.replenishment\") {\n const target = s.stages.find((st) => st.commitmentPoint);\n if (!target || target.wipLimit === undefined) return [];\n const items = itemsOf(a);\n const open = Object.values(s.items).filter(\n (i) => i.stage === target.id && OPEN.has(i.status),\n ).length;\n const bypass = items.some((id) => s.items[id]?.classOfService === \"expedite\")\n ? (configOf(s).classesOfService.expedite?.wipBypass ?? 1)\n : 0;\n const limit = target.wipLimit + bypass;\n if (open + items.length <= limit) return [];\n return [\n v(\n \"wip-respected\",\n \"error\",\n `column \"${target.id}\" holds ${open} card(s); pulling ${items.length} more exceeds its WIP limit of ${target.wipLimit}${bypass ? ` (+${bypass} expedite bypass)` : \"\"}`,\n `pull at most ${Math.max(0, limit - open)} card(s) now, or raise the limit in a service-delivery-review`,\n ),\n ];\n }\n if (a.type === \"ceremony.service-delivery-review\") {\n const wip = (payloadOf(a)[\"wip\"] ?? {}) as Record<string, number | null>;\n const out: Violation[] = [];\n for (const [id, limit] of Object.entries(wip)) {\n if (typeof limit !== \"number\") continue;\n const active = activeIn(s, id);\n if (active > limit)\n out.push(\n v(\n \"wip-respected\",\n \"warning\",\n `column \"${id}\" has ${active} active card(s), above the new limit of ${limit}`,\n \"nothing new is pulled into it until it drains; finish or move cards\",\n ),\n );\n }\n return out;\n }\n return [];\n },\n };\n\n const pullNotPush: Rule = {\n id: \"pull-not-push\",\n severity: \"error\",\n check(s, a) {\n if (a.type !== \"ceremony.replenishment\") return [];\n const options = s.stages[0];\n const commit = s.stages.find((st) => st.commitmentPoint);\n if (!options || !commit) return [];\n const out: Violation[] = [];\n const column = payloadOf(a)[\"column\"];\n if (column !== undefined && column !== commit.id)\n out.push(\n v(\n \"pull-not-push\",\n \"error\",\n `replenishment may only pull into the commitment column \"${commit.id}\", not \"${String(column)}\"`,\n \"drop column or set it to the commitment column; later columns are pulled by the planner\",\n ),\n );\n for (const id of itemsOf(a)) {\n const it = s.items[id];\n if (!it) continue;\n if (it.stage !== options.id || it.status !== \"todo\")\n out.push(\n v(\n \"pull-not-push\",\n \"error\",\n `item \"${id}\" is ${it.status} in \"${it.stage}\", not an option`,\n `only todo cards in \"${options.id}\" can be pulled; cards already on the board flow by pull`,\n id,\n ),\n );\n }\n return out;\n },\n };\n\n const blockerHasOwner: Rule = {\n id: \"blocker-has-owner\",\n severity: \"error\",\n check(s, a) {\n if (!a.type.startsWith(\"ceremony.\")) return [];\n const out: Violation[] = [];\n if (a.type === \"ceremony.operations-review\") {\n const assign = (payloadOf(a)[\"assign\"] ?? []) as Array<{\n item: string;\n blocker: string;\n owner: string;\n }>;\n for (const x of assign)\n if (typeof x.owner !== \"string\" || x.owner.trim() === \"\")\n out.push(\n v(\n \"blocker-has-owner\",\n \"error\",\n `blocker \"${x.blocker}\" on \"${x.item}\" would have no owner`,\n \"name the role or person who clears it\",\n x.item,\n ),\n );\n }\n for (const it of Object.values(s.items))\n for (const b of it.blockers)\n if (!b.clearedAt && b.owner.trim() === \"\")\n out.push(\n v(\n \"blocker-has-owner\",\n \"warning\",\n `blocker \"${b.id}\" on \"${it.id}\" has no owner`,\n `assign one in operations-review: { \"assign\": [{ \"item\": \"${it.id}\", \"blocker\": \"${b.id}\", \"owner\": \"<who>\" }] }`,\n it.id,\n ),\n );\n return out;\n },\n };\n\n const oneExpedite: Rule = {\n id: \"one-expedite\",\n severity: \"error\",\n check(s, a) {\n if (a.type !== \"ceremony.replenishment\") return [];\n const fresh = itemsOf(a).filter((id) => s.items[id]?.classOfService === \"expedite\");\n if (fresh.length === 0) return [];\n const already = Object.values(s.items)\n .filter((i) => i.classOfService === \"expedite\" && OPEN.has(i.status) && onBoard(s, i))\n .map((i) => i.id);\n const max = configOf(s).maxExpedite;\n if (already.length + fresh.length <= max) return [];\n return [\n v(\n \"one-expedite\",\n \"error\",\n `${already.length} expedite card(s) already on the board (${already.join(\", \") || \"none\"}); pulling ${fresh.join(\", \")} exceeds maxExpedite ${max}`,\n \"deliver the current expedite first, reclassify the new card, or raise maxExpedite in a strategy-review\",\n ),\n ];\n },\n };\n\n const fixedDate: Rule = {\n id: \"fixed-date-needs-deadline\",\n severity: \"error\",\n check(s, a) {\n if (a.type !== \"ceremony.replenishment\") return [];\n return itemsOf(a)\n .filter((id) => {\n const it = s.items[id];\n return (\n it?.classOfService === \"fixed-date\" &&\n !(it.deadline && Number.isFinite(Date.parse(it.deadline)))\n );\n })\n .map((id) =>\n v(\n \"fixed-date-needs-deadline\",\n \"error\",\n `fixed-date item \"${id}\" has no deadline`,\n `editItem(\"${id}\", { deadline: \"<ISO date>\" }) before pulling it`,\n id,\n ),\n );\n },\n };\n\n return [\n policyExplicit,\n commitmentOnce,\n wipRespected,\n pullNotPush,\n blockerHasOwner,\n oneExpedite,\n fixedDate,\n ];\n}\n","import type { Stage } from \"../types.ts\";\nimport type { KanbanConfig } from \"./config.ts\";\n\nexport function kanbanStages(config: KanbanConfig): Stage[] {\n const stages = config.columns.map((c) => {\n const st: Stage = { id: c.id, name: c.name, entryPolicy: [], exitPolicy: c.policies };\n if (c.wipLimit !== undefined) st.wipLimit = c.wipLimit;\n if (c.commitmentPoint) st.commitmentPoint = true;\n if (c.deliveryPoint) st.deliveryPoint = true;\n if (c.review) st.review = true;\n return st;\n });\n // the commitment column's policies also gate the pull out of it: the next column's entry policy\n const at = stages.findIndex((s) => s.commitmentPoint);\n const after = at >= 0 ? stages[at + 1] : undefined;\n if (after) after.entryPolicy = stages[at]!.exitPolicy;\n return stages;\n}\n","import { timSort } from \"exsorted\";\nimport type { CoreTerm, Methodology, PlannerOptions, Policy, WorkItem } from \"../types.ts\";\nimport { cadencesDue } from \"./board.ts\";\nimport { kanbanCeremonies } from \"./ceremonies.ts\";\nimport { ACTIVE, activeExpedites, commitmentColumn, enteredStageAt, onBoard } from \"./columns.ts\";\nimport { configOf, validateKanbanConfig, type KanbanConfig } from \"./config.ts\";\nimport { kanbanMetrics } from \"./metrics.ts\";\nimport { kanbanRoles } from \"./roles.ts\";\nimport { kanbanRules } from \"./rules.ts\";\nimport { kanbanStages } from \"./stages.ts\";\n\nexport {\n validateKanbanConfig,\n DEFAULT_COLUMNS,\n KANBAN_CADENCES,\n CLASSES,\n DAY_MS,\n} from \"./config.ts\";\nexport { kanbanRoles } from \"./roles.ts\";\nexport { kanbanStages } from \"./stages.ts\";\nexport { kanbanRules } from \"./rules.ts\";\nexport { kanbanCeremonies, wantItems } from \"./ceremonies.ts\";\nexport type {\n KanbanConfig,\n KanbanColumn,\n KanbanCadence,\n ClassConfig,\n ServiceLevel,\n} from \"./config.ts\";\nexport {\n ACTIVE,\n OPEN,\n optionsColumn,\n commitmentColumn,\n deliveryColumn,\n columnIndex,\n onBoard,\n activeExpedites,\n enteredStageAt,\n} from \"./columns.ts\";\n\nexport const KANBAN_VOCABULARY: Record<CoreTerm, string> = {\n backlog: \"Options\",\n item: \"Work Item\",\n stage: \"Column\",\n iteration: \"Cadence\",\n increment: \"Delivery\",\n ceremony: \"Cadence\",\n gate: \"Policy\",\n};\n\nexport { configOf } from \"./config.ts\";\nexport { board, cardAge, addedAt, cadencesDue, CADENCE_EVENT } from \"./board.ts\";\nexport type { BoardCard, BoardColumn, CadenceStatus } from \"./board.ts\";\nexport { opsReport, riskReport } from \"./reports.ts\";\nexport type { OpsReport, RiskReport } from \"./reports.ts\";\nexport { replay } from \"./replay.ts\";\nexport { kanbanMetrics, percentile, columnStays } from \"./metrics.ts\";\nexport type { KanbanMetrics } from \"./metrics.ts\";\nexport type { Replay, ReplayedItem, ReplayedBlocker, Stay } from \"./replay.ts\";\n\nconst RANK: Record<string, number> = { expedite: 0, \"fixed-date\": 1, standard: 2, intangible: 3 };\nconst rankOf = (item: WorkItem) => RANK[item.classOfService ?? \"standard\"] ?? 2;\n\n/** What the priority function needs besides the card: how long it has been passed over, and the fairness config. */\nexport interface PriorityContext {\n /** next() rounds that resolved since the card entered its column */\n deferrals: number;\n aging: boolean;\n maxDeferralRounds: number;\n}\n\nconst BAND = 1e15;\nconst AGE_STEP = 4e9;\nconst clamp = (n: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, n));\n\n/**\n * Class band x 1e15 + an in-band offset. Bands: question 5, expedite 4, fixed-date 3, standard 2,\n * intangible 1. Fixed-date: earlier deadline = larger offset. Others: own priority (clamped to +-1e9)\n * plus, with aging, 4e9 per full window of maxDeferralRounds deferrals (priority decides within a window). An intangible card deferred that many\n * times is scored in the standard band, so it overtakes fresh standard cards.\n */\nexport function priorityByClass(item: WorkItem, ctx: PriorityContext): number {\n const cos = item.classOfService ?? \"standard\";\n if (item.type === \"question\") return 5 * BAND;\n if (cos === \"fixed-date\" && item.deadline !== undefined) {\n const t = Date.parse(item.deadline);\n if (Number.isFinite(t)) return 3 * BAND + 1e10 - Math.floor(t / 1000);\n }\n const aged = ctx.aging ? Math.floor(ctx.deferrals / ctx.maxDeferralRounds) : 0;\n const offset = clamp(item.priority ?? 0, -1e9, 1e9) + aged * AGE_STEP;\n const promoted = ctx.aging && ctx.deferrals >= ctx.maxDeferralRounds;\n const band =\n cos === \"expedite\" ? 4 : cos === \"fixed-date\" ? 3 : cos === \"intangible\" && !promoted ? 1 : 2;\n return band * BAND + offset;\n}\n\n/** Class rank, then the card that has waited longest in its column, then id (FIFO by aging). */\nexport function byClassThenAge(a: WorkItem, b: WorkItem): number {\n const r = rankOf(a) - rankOf(b);\n if (r !== 0) return r;\n const ageA = enteredStageAt(a);\n const ageB = enteredStageAt(b);\n const ta = ageA === undefined ? 0 : Date.parse(ageA);\n const tb = ageB === undefined ? 0 : Date.parse(ageB);\n if (ta !== tb) return ta - tb;\n return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;\n}\n\nfunction describePolicies(policies: Policy[]): string {\n return (\n policies\n .map((p) =>\n p.kind === \"evidence\"\n ? `evidence ${p.evidenceKind}`\n : p.kind === \"custom\"\n ? `${p.id}: ${p.description}`\n : p.kind,\n )\n .join(\", \") || \"(none)\"\n );\n}\n\nexport function kanban(): Methodology<KanbanConfig> {\n return {\n name: \"kanban\",\n vocabulary: KANBAN_VOCABULARY,\n validateConfig: validateKanbanConfig,\n defaultStages: kanbanStages,\n defaultRoles: kanbanRoles,\n requiredCapabilities: [\"manage-flow\", \"deliver\"],\n exclusiveCapabilities: [],\n plannerOptions(state): PlannerOptions {\n const cfg = configOf(state);\n const commit = commitmentColumn(state);\n const after = state.stages[state.stages.findIndex((s) => s.id === commit.id) + 1];\n const bypass = cfg.classesOfService.expedite?.wipBypass ?? 1;\n // one pass over the events: times, planner.resolved prefix counts and item.added times\n const times: number[] = [];\n const resolvedBefore: number[] = [0]; // resolvedBefore[i] = resolved events among events[0..i)\n const added = new Map<string, string>();\n for (const e of state.events) {\n times.push(Date.parse(e.at));\n resolvedBefore.push(\n resolvedBefore[resolvedBefore.length - 1]! + (e.type === \"planner.resolved\" ? 1 : 0),\n );\n if (e.type === \"item.added\") added.set((e.payload as { id: string }).id, e.at);\n }\n /** planner.resolved events after the last event at or before `t` (events are time-ordered). */\n const deferralsSince = (t: number): number => {\n let lo = 0;\n let hi = times.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (times[mid]! <= t) lo = mid + 1;\n else hi = mid;\n }\n return resolvedBefore[times.length]! - resolvedBefore[lo]!;\n };\n const po: PlannerOptions = {\n schedulerMode: \"throughput\",\n fairnessPolicy: cfg.fairness.aging ? \"aging\" : \"none\",\n deadlineStrategy: \"earliest-first\",\n dispatchStage: (item) => (item.stage === commit.id && after ? after.id : undefined),\n priorityOf: (item) => {\n const since = Date.parse(enteredStageAt(item) ?? added.get(item.id) ?? \"\");\n return priorityByClass(item, {\n deferrals: deferralsSince(Number.isFinite(since) ? since : 0),\n aging: cfg.fairness.aging,\n maxDeferralRounds: cfg.fairness.maxDeferralRounds,\n });\n },\n tieBreaker: byClassThenAge,\n wipCounts: [...ACTIVE],\n wipLimitOf: (stage, item) =>\n stage.wipLimit === undefined\n ? undefined\n : item.classOfService === \"expedite\"\n ? stage.wipLimit + bypass\n : stage.wipLimit,\n };\n po.maxDeferralRounds = cfg.fairness.maxDeferralRounds;\n return po;\n },\n candidates(state): WorkItem[] {\n // at most maxExpedite expedite cards may be active; the free slots go to the oldest waiting expedites\n const slots = Math.max(0, configOf(state).maxExpedite - activeExpedites(state).length);\n const all = Object.values(state.items).filter(\n (i) => (i.status === \"todo\" || i.status === \"review\") && onBoard(state, i),\n );\n const expedites = timSort(\n all.filter((i) => i.classOfService === \"expedite\"),\n byClassThenAge,\n ).slice(0, slots);\n return all.filter((i) => i.classOfService !== \"expedite\" || expedites.includes(i));\n },\n invariants(state, item): string[] {\n const cfg = configOf(state);\n const st = state.stages.find((s) => s.id === item.stage)!;\n const cos = item.classOfService ?? \"standard\";\n const sle = cfg.classesOfService[cos]?.sle;\n const active = Object.values(state.items).filter(\n (i) => i.stage === st.id && ACTIVE.has(i.status),\n ).length;\n return [\n `Column \"${st.name}\" exit policies: ${describePolicies(st.exitPolicy)}`,\n `Class of service: ${cos}${item.deadline ? `; deadline ${item.deadline}` : \"\"}${sle ? `; service level p${sle.percentile} <= ${sle.targetMs} ms` : \"\"}`,\n `WIP limit of \"${st.name}\": ${st.wipLimit ?? \"none\"} (active now: ${active}); finish this card before pulling another`,\n `Do not change the scope of \"${item.id}\" or its acceptance criteria; raise open_questions instead`,\n ];\n },\n ceremonies: kanbanCeremonies(kanban),\n rules: kanbanRules(),\n metrics: (state) => ({ ...kanbanMetrics(state) }),\n humanDefaults: { gates: \"none\" },\n report: (state) => ({ cadencesDue: cadencesDue(state) }),\n };\n}\n"]}
@@ -1,2 +0,0 @@
1
- 'use strict';var chunkNN3XJUHP_cjs=require('./chunk-NN3XJUHP.cjs'),chunk4A4TD4MH_cjs=require('./chunk-4A4TD4MH.cjs'),chunk7HZXZF3L_cjs=require('./chunk-7HZXZF3L.cjs'),chunkTMKCALFT_cjs=require('./chunk-TMKCALFT.cjs'),chunk2IKIBB73_cjs=require('./chunk-2IKIBB73.cjs'),chunk23P7C25E_cjs=require('./chunk-23P7C25E.cjs'),chunk6R3YFUUV_cjs=require('./chunk-6R3YFUUV.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),promises=require('fs/promises'),w=require('path');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var w__default=/*#__PURE__*/_interopDefault(w);var v={scrum:chunk4A4TD4MH_cjs.k,kanban:chunk7HZXZF3L_cjs.I,waterfall:chunkTMKCALFT_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 B(r){let t=[],f={};for(let i=0;i<r.length;i++){let k=r[i];if(k.startsWith("--")){let o=k.slice(2),u=r[i+1];u!==void 0&&!u.startsWith("--")?(f[o]=u,i++):f[o]="true";}else t.push(k);}return {positional:t,flags:f}}async function x(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(v,r.methodology)?v[r.methodology]:void 0;return t||chunkS3BXVHO7_cjs.b("config-invalid",`methodology "${r.methodology}" is not available in this build`,`available: ${Object.keys(v).join(", ")}`),t()}function O(r,t){let f=Number(r[t]);return Number.isFinite(f)||chunkS3BXVHO7_cjs.b("invalid-input",`--${t} must be a number (got ${JSON.stringify(r[t])})`,`pass --${t} <n>`),f}var z=new Set(["init","add","edit","next","complete","ceremony","decide"]);async function ut(r,t){let[f,i]=B(r).positional,k=f!==void 0&&(z.has(f)||f==="role"&&i==="add");try{return k?await chunk6R3YFUUV_cjs.c(t,()=>_(r,t)):await _(r,t)}catch(o){if(o instanceof chunkS3BXVHO7_cjs.a)return {exit:1,out:{ok:false,error:o.toJSON()}};throw o}}async function _(r,t){let{positional:f,flags:i}=B(r),[k,...o]=f,u=i.by??"human",m=new Date().toISOString();switch(k){case "init":{let[e]=o,n=e&&Object.hasOwn(v,e)?v[e]:void 0;if(!n||!i.config)return {exit:2,out:{ok:false,usage:g}};try{await promises.stat(chunk6R3YFUUV_cjs.b(t)),chunkS3BXVHO7_cjs.b("invalid-input",`${chunk6R3YFUUV_cjs.b(t)} already exists`,"delete .workflow/state.json to start over");}catch(d){if(d instanceof chunkS3BXVHO7_cjs.a||d.code!=="ENOENT")throw d}let s=await x(w__default.default.resolve(t,i.config)),a=i.roles?await x(w__default.default.resolve(t,i.roles)):void 0,c=chunk23P7C25E_cjs.N(a?{methodology:n(),config:s,roles:a,by:u,now:m}:{methodology:n(),config:s,by:u,now:m});return await chunk6R3YFUUV_cjs.d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,state:{methodology:c.state.methodology,stages:c.state.stages.map(d=>d.id),roles:Object.keys(c.state.roles)}}}}case "add":{if(!o[0])return {exit:2,out:{ok:false,usage:g}};let e=await chunk6R3YFUUV_cjs.e(t),n=await x(w__default.default.resolve(t,o[0])),s=chunk23P7C25E_cjs.M(e,h(e),{type:"item.add",by:u,payload:{item:n}},a=>chunk23P7C25E_cjs.v(a,n,u,m));return await chunk6R3YFUUV_cjs.d(t,s.state),{exit:0,out:{ok:true,warnings:s.warnings,item:chunk23P7C25E_cjs.u(s.state,n.id)}}}case "edit":{if(!o[0]||!o[1])return {exit:2,out:{ok:false,usage:g}};let e=await chunk6R3YFUUV_cjs.e(t),n=o[0],s=await x(w__default.default.resolve(t,o[1])),a=chunk23P7C25E_cjs.M(e,h(e),{type:"item.edit",by:u,payload:{id:n,patch:s}},c=>chunk23P7C25E_cjs.w(c,n,s,u,m));return await chunk6R3YFUUV_cjs.d(t,a.state),{exit:0,out:{ok:true,warnings:a.warnings,item:chunk23P7C25E_cjs.u(a.state,n)}}}case "next":{let e=await chunk6R3YFUUV_cjs.e(t),n=i.max?{max:O(i,"max"),now:m}:{now:m},s=chunkNN3XJUHP_cjs.b(e,h(e),n);await chunk6R3YFUUV_cjs.d(t,s.state);for(let a of s.briefs)await chunk6R3YFUUV_cjs.f(t,a);return {exit:0,out:{ok:true,reason:s.reason??null,skipped:s.skipped,briefs:s.briefs}}}case "complete":{if(!o[0]||!o[1])return {exit:2,out:{ok:false,usage:g}};let e=await chunk6R3YFUUV_cjs.e(t),n=await x(w__default.default.resolve(t,o[1]));n.item!==o[0]&&chunkS3BXVHO7_cjs.b("handoff-invalid",`handoff.item "${n.item}" differs from the command's item "${o[0]}"`,"make them match");let s=i.role??n.role,a=O(i,"duration-ms"),c={item:o[0],role:s,model:i.model??"",tokensIn:O(i,"tokens-in"),tokensOut:O(i,"tokens-out"),durationMs:a,startedAt:new Date(Date.parse(m)-a).toISOString(),endedAt:m},d=chunkNN3XJUHP_cjs.c(e,h(e),{...n,role:s},c,m);return await chunk6R3YFUUV_cjs.d(t,d.state),await chunk6R3YFUUV_cjs.g(t,n,d.state.events.length),{exit:0,out:{ok:true,warnings:d.warnings,item:chunk23P7C25E_cjs.u(d.state,o[0])}}}case "ceremony":{if(!o[0])return {exit:2,out:{ok:false,usage:g}};let e=await chunk6R3YFUUV_cjs.e(t),n=h(e),s=Object.hasOwn(n.ceremonies,o[0])?n.ceremonies[o[0]]:void 0;s||chunkS3BXVHO7_cjs.b("unknown-ceremony",`"${o[0]}" is not a ${n.name} ceremony`,`available: ${Object.keys(n.ceremonies).join(", ")}`);let a=o[1]?await x(w__default.default.resolve(t,o[1])):{},c=s(e,{...a,by:u,now:m});return await chunk6R3YFUUV_cjs.d(t,c.state),{exit:0,out:{ok:true,warnings:c.warnings,lastEvent:chunk23P7C25E_cjs.d(c.state)}}}case "decide":{if(!o[0]||o[1]!=="approve"&&o[1]!=="reject")return {exit:2,out:{ok:false,usage:g}};let e=await chunk6R3YFUUV_cjs.e(t),n=e.pending.find(a=>a.id===o[0]),s=chunk23P7C25E_cjs.J(e,o[0],o[1],u,i.note??"",m,h(e));return await chunk6R3YFUUV_cjs.d(t,s),{exit:0,out:{ok:true,item:n?.item?chunk23P7C25E_cjs.u(s,n.item):null}}}case "status":{let e=await chunk6R3YFUUV_cjs.e(t),n=h(e),s={todo:0,in_progress:0,blocked:0,review:0,awaiting_human:0,done:0,dropped:0};for(let a of Object.values(e.items))s[a.status]+=1;return {exit:0,out:{ok:true,methodology:e.methodology,openIteration:chunk2IKIBB73_cjs.f(e)??null,counts:s,pending:e.pending,lastEvent:chunk23P7C25E_cjs.d(e),report:n.report?n.report(e):null}}}case "board":{let e=await chunk6R3YFUUV_cjs.e(t);return {exit:0,out:{ok:true,columns:e.stages.map(s=>({stage:s.id,wipLimit:s.wipLimit??null,items:Object.values(e.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(m)-Date.parse(a.transitions[a.transitions.length-1].at):null}))}))}}}case "metrics":{let e=await chunk6R3YFUUV_cjs.e(t);return {exit:0,out:{ok:true,metrics:h(e).metrics(e)}}}case "pending":return {exit:0,out:{ok:true,pending:(await chunk6R3YFUUV_cjs.e(t)).pending}};case "lessons":return {exit:0,out:{ok:true,lessons:(await chunk6R3YFUUV_cjs.e(t)).lessons}};case "validate":{if(!o[0])return {exit:2,out:{ok:false,usage:g}};let e=await chunk6R3YFUUV_cjs.e(t),n=await x(w__default.default.resolve(t,o[0]));return {exit:0,out:{ok:true,violations:chunk23P7C25E_cjs.L(e,h(e),n)}}}case "role":{let e=await chunk6R3YFUUV_cjs.e(t);if(o[0]==="list")return {exit:0,out:{ok:true,roles:Object.keys(e.roles),detail:e.roles}};if(o[0]==="add"&&o[1]){let n=chunk23P7C25E_cjs.f(e,await x(w__default.default.resolve(t,o[1])),u,m);return await chunk6R3YFUUV_cjs.d(t,n),{exit:0,out:{ok:true,roles:Object.keys(n.roles)}}}return {exit:2,out:{ok:false,usage:g}}}default:return {exit:2,out:{ok:false,usage:g}}}}exports.a=g;exports.b=B;exports.c=ut;//# sourceMappingURL=chunk-AUZIQPFT.cjs.map
2
- //# sourceMappingURL=chunk-AUZIQPFT.cjs.map