ex-workflow 0.2.0-stage → 0.3.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.
- package/CHANGELOG.md +10 -1
- package/README.md +39 -10
- package/dist/chunk-23P7C25E.cjs +2 -0
- package/dist/chunk-23P7C25E.cjs.map +1 -0
- package/dist/chunk-2IKIBB73.cjs +2 -0
- package/dist/chunk-2IKIBB73.cjs.map +1 -0
- package/dist/{chunk-472WEDPJ.cjs → chunk-4A4TD4MH.cjs} +2 -2
- package/dist/{chunk-472WEDPJ.cjs.map → chunk-4A4TD4MH.cjs.map} +1 -1
- package/dist/{chunk-D4HNETUL.cjs → chunk-7HZXZF3L.cjs} +2 -2
- package/dist/{chunk-D4HNETUL.cjs.map → chunk-7HZXZF3L.cjs.map} +1 -1
- package/dist/chunk-AUZIQPFT.cjs +2 -0
- package/dist/chunk-AUZIQPFT.cjs.map +1 -0
- package/dist/chunk-BJEOTG6P.mjs +2 -0
- package/dist/chunk-BJEOTG6P.mjs.map +1 -0
- package/dist/chunk-FLCYD2QF.mjs +2 -0
- package/dist/chunk-FLCYD2QF.mjs.map +1 -0
- package/dist/{chunk-DBR24RTX.cjs → chunk-NN3XJUHP.cjs} +2 -2
- package/dist/{chunk-DBR24RTX.cjs.map → chunk-NN3XJUHP.cjs.map} +1 -1
- package/dist/chunk-P4P4JTE5.mjs +2 -0
- package/dist/chunk-P4P4JTE5.mjs.map +1 -0
- package/dist/{chunk-IBRC36PE.mjs → chunk-R27STIER.mjs} +2 -2
- package/dist/{chunk-IBRC36PE.mjs.map → chunk-R27STIER.mjs.map} +1 -1
- package/dist/chunk-TMKCALFT.cjs +2 -0
- package/dist/chunk-TMKCALFT.cjs.map +1 -0
- package/dist/{chunk-XSXHEEJX.mjs → chunk-UOGNVWVO.mjs} +2 -2
- package/dist/{chunk-XSXHEEJX.mjs.map → chunk-UOGNVWVO.mjs.map} +1 -1
- package/dist/{chunk-VN2UYV2O.mjs → chunk-WOKNWJKU.mjs} +2 -2
- package/dist/{chunk-VN2UYV2O.mjs.map → chunk-WOKNWJKU.mjs.map} +1 -1
- package/dist/chunk-ZX4DAMTG.mjs +2 -0
- package/dist/chunk-ZX4DAMTG.mjs.map +1 -0
- package/dist/cli/bin.cjs +1 -1
- package/dist/cli/bin.cjs.map +1 -1
- package/dist/cli/bin.mjs +1 -1
- package/dist/cli/bin.mjs.map +1 -1
- package/dist/cli/index.cjs +1 -1
- package/dist/cli/index.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/kanban/index.cjs +1 -1
- package/dist/kanban/index.mjs +1 -1
- package/dist/scrum/index.cjs +1 -1
- package/dist/scrum/index.mjs +1 -1
- package/dist/types.d.cts +30 -1
- package/dist/types.d.ts +30 -1
- package/dist/waterfall/index.cjs +2 -0
- package/dist/waterfall/index.cjs.map +1 -0
- package/dist/waterfall/index.d.cts +148 -0
- package/dist/waterfall/index.d.ts +148 -0
- package/dist/waterfall/index.mjs +2 -0
- package/dist/waterfall/index.mjs.map +1 -0
- package/package.json +14 -1
- package/dist/chunk-JDVE7DQR.cjs +0 -2
- package/dist/chunk-JDVE7DQR.cjs.map +0 -1
- package/dist/chunk-NQU5TH3A.mjs +0 -2
- package/dist/chunk-NQU5TH3A.mjs.map +0 -1
- package/dist/chunk-NRAPI3GV.cjs +0 -2
- package/dist/chunk-NRAPI3GV.cjs.map +0 -1
- package/dist/chunk-PD5FBDN7.mjs +0 -2
- package/dist/chunk-PD5FBDN7.mjs.map +0 -1
- package/dist/chunk-QDT35LXB.cjs +0 -2
- package/dist/chunk-QDT35LXB.cjs.map +0 -1
- package/dist/chunk-YJNDBKIG.mjs +0 -2
- package/dist/chunk-YJNDBKIG.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
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-IBRC36PE.mjs","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
|
+
{"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-R27STIER.mjs","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"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunk2IKIBB73_cjs=require('./chunk-2IKIBB73.cjs'),chunk23P7C25E_cjs=require('./chunk-23P7C25E.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),exsorted=require('exsorted');var je=["requirements","design","implementation","verification","deployment","maintenance"],se={requirements:["srs"],design:["design-doc","interface-spec"],implementation:["code-baseline"],verification:["test-report","traceability-matrix"],deployment:["release-notes","deployment-record"],maintenance:["change-log"]},oe={requirements:"business-analyst",design:"architect",deployment:"release-manager"},ae=e=>`${e}-gate`,de="change-control",Ie=["order-backlog","define-acceptance","facilitate","deliver","review","verify","approve-gate","manage-flow","control-change","escalate"],Ee=e=>e.charAt(0).toUpperCase()+e.slice(1);function Te(){return je.map(e=>{let t={id:e,name:Ee(e),deliverables:[...se[e]??[]],gate:{id:ae(e),requires:[{capability:"approve-gate"}],evidence:[],onFail:{action:"block"}}},i=oe[e];return i!==void 0&&(t.deliverBy=i),t})}function k(e){return e.config}var j=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),X=e=>Array.isArray(e)&&e.every(t=>typeof t=="string"&&t.trim()!=="");function Ke(e,t){if(e===void 0)return;j(e)||chunkS3BXVHO7_cjs.b("config-invalid",`${t}.budget must be an object`,'e.g. { "tokens": 400000 }');let i={};for(let s of ["tokens","turns","wallclockMs"]){let f=e[s];f!==void 0&&((typeof f!="number"||!Number.isFinite(f)||f<0)&&chunkS3BXVHO7_cjs.b("config-invalid",`${t}.budget.${s} must be a non-negative number`,"omit it for no limit"),i[s]=f);}return i}function De(e,t){return (!Array.isArray(e)||e.length===0)&&chunkS3BXVHO7_cjs.b("config-invalid",`${t} must be a non-empty array of "human" | { capability }`,'e.g. ["human", { "capability": "approve-gate" }]'),e.map(i=>i==="human"?"human":j(i)&&typeof i.capability=="string"&&Ie.includes(i.capability)?{capability:i.capability}:chunkS3BXVHO7_cjs.b("config-invalid",`${t} entry ${JSON.stringify(i)} is not "human" or a known capability`,`use "human" or { "capability": one of ${Ie.join(", ")} }`))}function Oe(e,t,i){let s=`waterfall config.phases[${t}]`;j(e)||chunkS3BXVHO7_cjs.b("config-invalid",`${s} must be an object`,'e.g. { "id": "design" }'),chunkS3BXVHO7_cjs.c(e.id,`${s}.id`);let f=e.id,d=e.deliverables??se[f]??[];X(d)||chunkS3BXVHO7_cjs.b("config-invalid",`${s}.deliverables must be a string[] of evidence kinds`,'e.g. ["srs"]');let a;if(e.gate===void 0)a={id:ae(f),requires:[{capability:"approve-gate"}],evidence:[],onFail:{action:"block"}};else {let c=e.gate;(!j(c)||typeof c.id!="string"||c.id.trim()==="")&&chunkS3BXVHO7_cjs.b("config-invalid",`${s}.gate must be a Gate with an id`,'e.g. { "id": "design-gate", "requires": [{ "capability": "approve-gate" }], "evidence": [] }');let l=c.evidence??[];X(l)||chunkS3BXVHO7_cjs.b("config-invalid",`${s}.gate.evidence must be a string[]`,"list evidence kinds or omit it"),a={id:c.id,requires:De(c.requires??[{capability:"approve-gate"}],`${s}.gate.requires`),evidence:[...l],onFail:{action:"block"}};}i(f)&&!a.requires.includes("human")&&(a.requires=["human",...a.requires]);let n={id:f,name:typeof e.name=="string"&&e.name.trim()!==""?e.name:Ee(f),deliverables:[...d],gate:a},r=Ke(e.budget,s);r!==void 0&&(n.budget=r);let o=e.deliverBy??oe[f];return o!==void 0&&((typeof o!="string"||o.trim()==="")&&chunkS3BXVHO7_cjs.b("config-invalid",`${s}.deliverBy must be a role id`,"name the role that delivers this phase or omit it"),n.deliverBy=o),n}function ce(e){let t=e??{};t.phases!==void 0&&!Array.isArray(t.phases)&&chunkS3BXVHO7_cjs.b("config-invalid","waterfall config.phases must be an array of phases","omit phases for the six classic phases");let i=t.humanGates??"all";i!=="all"&&!X(i)&&chunkS3BXVHO7_cjs.b("config-invalid",'waterfall config.humanGates must be "all" or a string[] of phase ids','omit it for "all"');let s=i==="all"?()=>true:l=>i.includes(l),f=t.phases===void 0?Te().map((l,u)=>Oe(l,u,s)):t.phases.map((l,u)=>Oe(l,u,s));f.length===0&&chunkS3BXVHO7_cjs.b("config-invalid","waterfall config.phases needs at least one phase",'e.g. [{ "id": "requirements" }]');let d=f.map(l=>l.id),a=d.find((l,u)=>d.indexOf(l)!==u);if(a!==void 0&&chunkS3BXVHO7_cjs.b("config-invalid",`duplicate phase id "${a}"`,"give every phase a unique id"),i!=="all")for(let l of i)d.includes(l)||chunkS3BXVHO7_cjs.b("config-invalid",`waterfall config.humanGates names unknown phase "${l}"`,`phases are: ${d.join(", ")}`);let n=t.changeControl??{};j(n)||chunkS3BXVHO7_cjs.b("config-invalid","waterfall config.changeControl must be an object",'e.g. { "requiresImpactAnalysis": true, "approvers": ["human"] }'),n.requiresImpactAnalysis!==void 0&&typeof n.requiresImpactAnalysis!="boolean"&&chunkS3BXVHO7_cjs.b("config-invalid","waterfall config.changeControl.requiresImpactAnalysis must be a boolean","omit it for true");let r={requiresImpactAnalysis:n.requiresImpactAnalysis===void 0?true:n.requiresImpactAnalysis,approvers:De(n.approvers??["human",{capability:"control-change"}],"waterfall config.changeControl.approvers")},o=t.traceability,c;if(o===void 0)c=d.includes("requirements")&&d.includes("design")&&d.includes("verification")?{from:"requirements",to:["design","verification"]}:{from:d[0],to:[]};else {(!j(o)||typeof o.from!="string"||!d.includes(o.from))&&chunkS3BXVHO7_cjs.b("config-invalid","waterfall config.traceability.from must be a phase id",`phases are: ${d.join(", ")}`);let l=o.to??[];X(l)||chunkS3BXVHO7_cjs.b("config-invalid","waterfall config.traceability.to must be a string[] of phase ids",`phases are: ${d.join(", ")}`);for(let u of l)d.includes(u)||chunkS3BXVHO7_cjs.b("config-invalid",`waterfall config.traceability.to names unknown phase "${u}"`,`phases are: ${d.join(", ")}`),d.indexOf(u)<=d.indexOf(o.from)&&chunkS3BXVHO7_cjs.b("config-invalid",`waterfall config.traceability.to phase "${u}" must come after "${o.from}"`,"trace forward only: from an earlier phase to later ones");c={from:o.from,to:[...l]};}return {phases:f,changeControl:r,traceability:c,humanGates:i==="all"?"all":[...i]}}var L="work",_="review",M="done";function b(e){return e.phases?e.phases:k(e).phases.map(t=>{let i={id:t.id,name:t.name,deliverables:[...t.deliverables],gate:t.gate,status:"pending"};return t.budget&&(i.budget=t.budget),i})}function S(e,t){return {...e,phases:t}}function I(e,t){let i=b(e).findIndex(s=>s.id===t);return i<0&&chunkS3BXVHO7_cjs.b("config-invalid",`unknown phase "${t}"`,`phases are: ${b(e).map(s=>s.id).join(" \u2192 ")}`),i}function E(e,t){return b(e)[I(e,t)]}function R(e,t){let i=new Set,s=t;for(;s&&!i.has(s.id);){if(s.phase!==void 0)return s.phase;i.add(s.id),s=s.parent!==void 0&&Object.hasOwn(e.items,s.parent)?e.items[s.parent]:void 0;}}function A(e,t){return Object.values(e.items).filter(i=>i.status!=="dropped"&&R(e,i)===t)}function O(e){return b(e).find(t=>t.status==="open")}function le(e){return b(e).find(t=>t.status!=="baselined")}function Ye(e,t){let i=R(e,t);return i!==void 0&&b(e).find(s=>s.id===i)?.status==="baselined"}function Be(e,t){let i=new Set((t.produced??[]).map(s=>s.kind));for(let s of A(e,t.id))for(let f of s.evidence)i.add(f.kind);return i}function G(e,t,i=[]){let s=Be(e,t);for(let d of i)s.add(d);let f=[];for(let d of [...t.deliverables,...t.gate.evidence])f.includes(d)||f.push(d);return f.filter(d=>!s.has(d))}function N(e){let t=b(e).map(s=>s.id),i=k(e).traceability.to.filter(s=>t.includes(s));if(i.length!==0)return i.reduce((s,f)=>t.indexOf(s)>=t.indexOf(f)?s:f)}function Le(e,t,i,s){let f=chunk2IKIBB73_cjs.f(e);return !f||!f.id.startsWith(`${t}#`)?e:{...e,iterations:e.iterations.map(d=>d.id===f.id?{...d,endedAt:s,outcome:i}:d)}}function ee(e,t,i,s){let f=E(e,t);f.status!=="open"&&chunkS3BXVHO7_cjs.b("invalid-transition",`phase "${t}" is ${f.status}, not open`,f.status==="baselined"?"it is already baselined; a change-request reopens it":"kickoff the phase first");let d=A(e,t),a={};for(let c of d)a[c.id]=c;let n=(e.baselines??[]).filter(c=>c.phase===t).length,r={phase:t,version:n+1,at:s,approvedBy:i,itemSnapshot:a},o=S(e,b(e).map(c=>c.id===t?{...c,status:"baselined"}:c));return o={...o,baseline:r,baselines:[...o.baselines??[],r]},o=Le(o,t,"completed",s),chunk23P7C25E_cjs.c(o,"phase.baselined",i[i.length-1]??"system",{phase:t,version:r.version,approvedBy:i,items:d.map(c=>c.id)},s)}function pe(e,t,i){let s=[];for(let n of t){let r=E(e,n);r.status==="pending"&&chunkS3BXVHO7_cjs.b("invalid-input",`phase "${n}" was never baselined; there is nothing to reopen`,"remove it from impactAnalysis.reopen"),r.status==="baselined"&&!s.includes(n)&&s.push(n);}let f=b(e).map(n=>s.includes(n.id)?{...n,status:"reopened"}:n),d=null,a=e;if(s.length){let n=Math.min(...s.map(o=>I(e,o))),r=f.find((o,c)=>o.status==="open"&&c>n);r&&(d=r.id,f=f.map(o=>o.id===r.id?{...o,status:"reopened"}:o),a=Le(a,r.id,"cancelled",i));}return {state:S(a,f),reopened:s,suspended:d}}function F(e,t,i,s,f){let d=chunk23P7C25E_cjs.u(e,t),a=d.impactAnalysis,n=pe(e,a?.reopen??[],f),r=chunk23P7C25E_cjs.x(n.state,t,{stage:M,status:"done"},i,f);for(let o of n.reopened)r=chunk23P7C25E_cjs.c(r,"phase.reopened",i,{phase:o,change:t},f);return n.suspended!==null&&(r=chunk23P7C25E_cjs.c(r,"phase.suspended",i,{phase:n.suspended,change:t},f)),chunk23P7C25E_cjs.c(r,"change.decided",i,{change:t,decision:"approve",by:i,note:s,reopened:n.reopened,suspended:n.suspended,weight:a?.weight??0,affects:d.affects??[]},f)}function V(e,t,i,s,f){let d=chunk23P7C25E_cjs.u(e,t),a=chunk23P7C25E_cjs.x(e,t,{status:"dropped"},i,f);return chunk23P7C25E_cjs.c(a,"change.decided",i,{change:t,decision:"reject",by:i,note:s,reopened:[],suspended:null,weight:0,affects:d.affects??[]},f)}var _e=["policy","skill","memory","spec","review"],Me=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function Je(e){return Array.isArray(e)&&e.every(t=>Me(t)&&typeof t.text=="string"&&t.text.trim()!==""&&_e.includes(t.scope))}function Qe(e,t,i){let s=[...t.map(d=>d.id),...i],f=s.find((d,a)=>s.indexOf(d)!==a);f!==void 0&&chunkS3BXVHO7_cjs.b("invalid-input",`lesson "${f}" is referenced more than once`,"adopt or dismiss each lesson once");for(let d of s){let a=e.lessons.find(n=>n.id===d);a||chunkS3BXVHO7_cjs.b("invalid-input",`no lesson "${d}"`,`raised lessons: ${e.lessons.filter(n=>n.status==="raised").map(n=>n.id).join(", ")||"(none)"}`),a.status!=="raised"&&chunkS3BXVHO7_cjs.b("invalid-input",`lesson "${d}" is already ${a.status}`,"only raised lessons can be adopted or dismissed");}}function Ge(e){return (t,i)=>{chunk23P7C25E_cjs.o(t,i.by,"facilitate");let s=i.phase===void 0?void 0:H(t,i,"phaseRetrospective"),f=i.lessons??[];Je(f)||chunkS3BXVHO7_cjs.b("invalid-input","phaseRetrospective.lessons entries need a text and a scope",`scope is one of: ${_e.join(", ")}`);let d=i.adopt??[],a=i.dismiss??[];return (!Array.isArray(d)||!d.every(n=>Me(n)&&typeof n.id=="string")||!Array.isArray(a)||!a.every(n=>typeof n=="string"))&&chunkS3BXVHO7_cjs.b("invalid-input","phaseRetrospective.adopt must be [{ id, suggestedChange? }] and dismiss a string[]",'e.g. { "adopt": [{ "id": "L1" }], "dismiss": ["L2"] }'),Qe(t,d,a),chunk23P7C25E_cjs.M(t,e(),{type:"ceremony.phaseRetrospective",by:i.by,payload:i},n=>{let r=n,o=chunk23P7C25E_cjs.a(i.now),c=[],l=m=>{!m||m.kind!=="agreement"||(r.agreements.includes(m.text)||(r={...r,agreements:[...r.agreements,m.text]}),c.push(m.text));},u=[];for(let m of f){let g=`L${r.lessons.length+1}`,x={id:g,at:o,text:m.text,scope:m.scope,status:"adopted",from:i.by};m.suggestedChange&&(x.suggestedChange=m.suggestedChange),r={...r,lessons:[...r.lessons,x]},u.push(g),l(m.suggestedChange);}let p=[];for(let m of d)r={...r,lessons:r.lessons.map(g=>g.id===m.id?{...g,status:"adopted",...m.suggestedChange?{suggestedChange:m.suggestedChange}:{}}:g)},p.push(m.id),l(m.suggestedChange??r.lessons.find(g=>g.id===m.id)?.suggestedChange);for(let m of a)r={...r,lessons:r.lessons.map(g=>g.id===m?{...g,status:"dismissed"}:g)};return chunk23P7C25E_cjs.c(r,"phase.retrospective",i.by,{phase:s?.id??null,lessons:u,adopted:p,dismissed:a,agreements:c},o)})}}var Xe=(e,t)=>e.id<t.id?-1:e.id>t.id?1:0,Ne=(e,t)=>exsorted.timSort(A(e,t).filter(i=>i.type!=="question"),Xe),et=(e,t)=>(e.traces??[]).includes(t.id)||(t.traces??[]).includes(e.id);function T(e){let t=k(e).traceability,i=b(e).map(a=>a.id),s=t.to.filter(a=>i.includes(a)),f=Ne(e,t.from).map(a=>{let n={};for(let r of s)n[r]=Ne(e,r).filter(o=>et(a,o)).map(o=>o.id);return {item:a.id,links:n}}),d=f.map(a=>({item:a.item,phases:s.filter(n=>a.links[n].length===0)})).filter(a=>a.phases.length>0);return {from:t.from,to:s,rows:f,missing:d,coverage:{traced:f.length-d.length,total:f.length}}}function fe(e,t){return T(e).rows.filter(i=>(i.links[t]??[]).length===0).map(i=>i.item)}var tt=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function H(e,t,i){let s=t.phase;return (typeof s!="string"||s.trim()==="")&&chunkS3BXVHO7_cjs.b("invalid-input",`${i} needs phase: string`,`pass one of: ${b(e).map(f=>f.id).join(", ")}`),E(e,s)}function Fe(e,t,i,s,f,d){let a=S(e,b(e).map(n=>n.id===t?{...n,produced:[...n.produced??[],{kind:i,ref:s,by:f,at:d}]}:n));return chunk23P7C25E_cjs.c(a,"phase.deliverable",f,{phase:t,kind:i,ref:s},d)}function ue(e){let t=(d,a,n,r)=>chunk23P7C25E_cjs.M(d,e(),{type:a,by:n.by,payload:n},o=>r(o,chunk23P7C25E_cjs.a(n.now)));return {kickoff:(d,a)=>{chunk23P7C25E_cjs.o(d,a.by,"facilitate");let n=H(d,a,"kickoff");return t(d,"ceremony.kickoff",a,(r,o)=>{let c=r.events.filter(p=>p.type==="phase.opened"&&p.payload.phase===n.id).length+1,l=A(r,n.id).filter(p=>p.status!=="done").map(p=>p.id);r=S(r,b(r).map(p=>p.id===n.id?{...p,status:"open"}:p));let u=n.budget??{};return r={...r,iterations:[...r.iterations,{id:`${n.id}#${c}`,goal:n.name,budget:u,spent:chunk2IKIBB73_cjs.a,startedAt:o,committed:l,carryover:[]}]},chunk23P7C25E_cjs.c(r,"phase.opened",a.by,{phase:n.id,version:c,items:l,budget:u},o)})},gateReview:(d,a)=>{let n=H(d,a,"gateReview");n.status!=="open"&&chunkS3BXVHO7_cjs.b("invalid-transition",`phase "${n.id}" is ${n.status}, not open`,n.status==="baselined"?"it is already baselined; a change-request reopens it":`kickoff "${n.id}" first`);let r=n.gate,o=chunk23P7C25E_cjs.j(d,r.id,"approve-gate");a.by!=="human"&&!o.includes(a.by)&&chunkS3BXVHO7_cjs.b("gate-unmet",`"${a.by}" may not review gate "${r.id}"`,`review as one of: human${o.map(p=>`, ${p}`).join("")}`,{rule:"gate"});let c=d.pending.find(p=>p.kind==="gate"&&p.item===void 0&&p.gate===r.id);c&&chunkS3BXVHO7_cjs.b("no-op",`gate "${r.id}" is already awaiting a decision (${c.id})`,`decide ${c.id} approve|reject`);let l=a.deliverables??[];(!Array.isArray(l)||!l.every(p=>tt(p)&&typeof p.kind=="string"&&p.kind.trim()!==""&&typeof p.ref=="string"))&&chunkS3BXVHO7_cjs.b("invalid-input","gateReview.deliverables must be [{ kind, ref }]",'e.g. { "deliverables": [{ "kind": "srs", "ref": "docs/srs.md" }] }');let u=l;return t(d,"ceremony.gateReview",a,(p,m)=>{for(let g of u)p=Fe(p,n.id,g.kind,g.ref,a.by,m);if(k(p).traceability.to.includes(n.id)){let g=T(p);p=chunk23P7C25E_cjs.c(p,"traceability.computed",a.by,{phase:n.id,from:g.from,to:g.to,coverage:g.coverage,missing:g.missing,rows:g.rows},m),n.id===N(p)&&g.missing.length===0&&(p=Fe(p,n.id,"traceability-matrix",`traceability.computed#${p.events[p.events.length-1].seq}`,a.by,m));}if(r.requires.includes("human")&&a.by!=="human"){p=chunk23P7C25E_cjs.I(p,{kind:"gate",gate:r.id,question:`Approve gate "${r.id}" and baseline phase "${n.name}"?`},m);let g=p.pending[p.pending.length-1].id;return chunk23P7C25E_cjs.c(p,"phase.gate-pending",a.by,{phase:n.id,gate:r.id,by:a.by,pending:g},m)}return ee(p,n.id,[a.by],m)})},changeControlBoard:(d,a)=>{chunk23P7C25E_cjs.o(d,a.by,"control-change");let n=a.change;(typeof n!="string"||n.trim()==="")&&chunkS3BXVHO7_cjs.b("invalid-input","changeControlBoard needs change: string (a change-request id)",'e.g. { "change": "CR-1", "decision": "approve", "note": "why" }');let r=chunk23P7C25E_cjs.u(d,n);if(r.type!=="change-request"&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${n}" is a ${r.type}, not a change-request`,"only change-request items go through the board",{items:[n]}),(r.status==="done"||r.status==="dropped")&&chunkS3BXVHO7_cjs.b("invalid-transition",`change "${n}" is already ${r.status==="done"?"approved":"rejected"}`,"raise a new change-request",{items:[n]}),r.status==="awaiting_human"){let p=d.pending.find(m=>m.item===n);chunkS3BXVHO7_cjs.b("no-op",`change "${n}" is awaiting the human decision${p?` (${p.id})`:""}`,`decide ${p?.id??"<pending id>"} approve|reject`,{items:[n]});}let o=a.decision;o!=="approve"&&o!=="reject"&&chunkS3BXVHO7_cjs.b("invalid-input",'changeControlBoard.decision must be "approve" or "reject"',"state the board's decision");let c=typeof a.note=="string"?a.note:"",l=k(d).changeControl.approvers;for(let p of l)p==="human"||a.by==="human"||chunk23P7C25E_cjs.n(d,a.by,p.capability)||chunkS3BXVHO7_cjs.b("gate-unmet",`"${a.by}" lacks capability "${p.capability}" required by change control`,`decide as one of: human${chunk23P7C25E_cjs.i(d,p.capability).map(m=>`, ${m.id}`).join("")}`,{rule:"change-control",items:[n]});let u=l.includes("human")&&a.by!=="human";return t(d,"ceremony.changeControlBoard",a,(p,m)=>{if(u){p=chunk23P7C25E_cjs.I(p,{kind:"decision",item:n,question:`Change "${n}" (${r.title}): the board (${a.by}) recommends ${o}${c?`: ${c}`:""}. Approve or reject the change?`},m);let g=p.pending[p.pending.length-1].id;return chunk23P7C25E_cjs.c(p,"change.recommended",a.by,{change:n,decision:o,note:c,pending:g},m)}return o==="approve"?F(p,n,a.by,c,m):V(p,n,a.by,c,m)})},phaseRetrospective:Ge(e)}}function ge(e,t,i,s,f,d){if(t.kind==="gate"&&t.item===void 0&&t.gate!==void 0){let a=b(e).find(o=>o.gate.id===t.gate);if(!a)return e;s!=="human"&&chunkS3BXVHO7_cjs.b("gate-unmet",`"${s}" may not decide phase gate "${t.gate}" (${t.id}); it awaits a human`,`decide ${t.id} as human`,{rule:"gate"});let n;for(let o=e.events.length-1;o>=0;o--){let c=e.events[o];if(c.type==="phase.gate-pending"&&c.payload.pending===t.id){n=c.by;break}}let r=n!==void 0&&n!==s?[n,s]:[s];return i==="approve"?ee(e,a.id,r,d):chunk23P7C25E_cjs.c(e,"phase.gate-failed",s,{phase:a.id,gate:t.gate,note:f},d)}if(t.kind==="decision"&&t.item!==void 0&&Object.hasOwn(e.items,t.item)){let a=e.items[t.item];return a.type!=="change-request"?e:(s!=="human"&&chunkS3BXVHO7_cjs.b("gate-unmet",`"${s}" may not decide change "${a.id}" (${t.id}); change control awaits a human`,`decide ${t.id} as human`,{rule:"change-control",items:[a.id]}),i==="approve"?F(e,a.id,s,f,d):V(e,a.id,s,f,d))}return e}function me(e){let t=k(e).phases.map($=>$.id),i=()=>Object.fromEntries(t.map($=>[$,0])),s=i(),f=i(),d=i(),a=i(),n=i(),r=new Map,o=new Map,c=new Map,l=0,u=0,p=0,m=0,g=0,x=0,we=0,ke=$=>{let w=o.get($),y=r.get($);return w!=="question"&&w!=="change-request"&&y!==void 0&&y in s};for(let $ of e.events){let w=$.payload??{};switch($.type){case "item.added":{let y=w,q=y.phase??(y.parent!==null?r.get(y.parent):void 0);r.set(y.id,q),o.set(y.id,y.type),c.set(y.id,"todo"),y.type==="change-request"&&(p+=1),ke(y.id)&&(s[q]+=1,y.type==="bug"&&(n[q]+=1));break}case "item.transition":{let y=w.id,q=w.to.status,Re=c.get(y);if(c.set(y,q),!ke(y))break;let ne=r.get(y);q==="done"&&Re!=="done"&&(f[ne]+=1),q==="dropped"&&(s[ne]-=1,Re==="done"&&(f[ne]-=1));break}case "item.completed":{let y=r.get(w.id);y!==void 0&&y in a&&(a[y]+=w.tokens??0);break}case "phase.opened":{let y=w.phase;y in d&&(d[y]=(w.budget??{}).tokens??0);break}case "traceability.computed":{let y=w.coverage;l=y.traced,u=y.total;break}case "change.decided":{w.decision==="approve"?(m+=1,x+=w.weight??0,we+=(w.reopened??[]).length):g+=1;break}}}let $e=i(),We=i();for(let $ of t){let w=s[$]??0;$e[$]=w===0?0:(f[$]??0)/w*100,We[$]=a[$]-d[$];}let Ae=m+g;return {phaseCompletion:$e,budgetPlanned:d,budgetSpent:a,scheduleVariance:We,requirementCoverage:u===0?0:l/u,requirementsTraced:l,requirementsTotal:u,defectsPerPhase:n,changeRequests:p,changesApproved:m,changesRejected:g,changeApprovalRate:Ae===0?0:m/Ae,reworkWeight:x,phasesReopened:we}}function he(e){let t=e.phases.map(i=>i.gate.id);return [{id:"project-manager",name:"Project Manager",modelTier:"large",capabilities:["facilitate","control-change","approve-gate","escalate"],canApprove:[...t,de],inputs:["phase-plan","deliverables","change-requests"],outputs:["gate-decisions","baselines","change-decisions"],do_not:["do not implement items yourself","do not reopen a phase without an approved change-request"]},{id:"developer",name:"Developer",modelTier:"small",capabilities:["deliver"],canApprove:[],inputs:["design-doc","interface-spec","brief"],outputs:["code","code-baseline","test-output"],do_not:["do not change requirements or designs; raise a change-request","do not approve your own work"]},{id:"business-analyst",name:"Business Analyst",modelTier:"medium",capabilities:["define-acceptance","deliver"],canApprove:[],inputs:["stakeholder-needs"],outputs:["srs","acceptance-criteria"],do_not:["do not design or implement","do not edit a baselined requirement; raise a change-request"]},{id:"architect",name:"Architect",modelTier:"medium",capabilities:["deliver"],canApprove:[],inputs:["srs"],outputs:["design-doc","interface-spec"],do_not:["do not change requirements; raise a change-request","do not implement"]},{id:"qa",name:"QA",modelTier:"small",capabilities:["verify","review"],canApprove:[],inputs:["srs","design-doc","code-baseline"],outputs:["test-report","review-notes"],do_not:["do not fix defects yourself; raise bugs","do not approve phase gates"]},{id:"release-manager",name:"Release Manager",modelTier:"small",capabilities:["deliver"],canApprove:[],inputs:["code-baseline","test-report"],outputs:["release-notes","deployment-record"],do_not:["do not deploy an unbaselined verification phase"]}]}var v=(e,t,i,s)=>s?{rule:e,severity:"error",item:s,message:t,fix:i}:{rule:e,severity:"error",message:t,fix:i},C=e=>e.payload??{},U=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),z=e=>{let t=C(e).phase;return typeof t=="string"?t:void 0},P=(e,t)=>b(e).find(i=>i.id===t),ye=e=>b(e).map(t=>t.id).join(", "),te=(e,t)=>typeof t=="string"&&Object.hasOwn(e.items,t)?e.items[t]:void 0;function Ve(e,t){if(t.phase!==void 0)return t.phase;let i=te(e,t.parent);return i?R(e,i):void 0}var He=e=>e.type!=="change-request"&&e.type!=="question",Ue=(e,t)=>`raise a change-request: addItem({ type: "change-request", affects: ["${e}"], impactAnalysis: { summary, reopen: ["${t}"], weight } }) and decide it in changeControlBoard`;function ze(e,t){let i=te(e,C(t).change);return i&&i.type==="change-request"?i:void 0}function be(){return [{id:"phase-sequential",severity:"error",check(n,r){let o=[];if(r.type==="ceremony.kickoff"){let c=z(r),l=c===void 0?void 0:P(n,c);if(!l)return [];l.status==="open"&&o.push(v("phase-sequential",`phase "${l.id}" is already open`,`gateReview "${l.id}" when its work is done`)),l.status==="baselined"&&o.push(v("phase-sequential",`phase "${l.id}" is baselined`,"only an approved change-request reopens a baselined phase"));let u=O(n);u&&u.id!==l.id&&o.push(v("phase-sequential",`phase "${u.id}" is still open`,`pass its gate (gateReview "${u.id}") before opening "${l.id}"`));}else if(r.type==="item.add"){let c=C(r).item;if(!U(c)||!He(c))return [];let l=Ve(n,c);l===void 0?o.push(v("phase-sequential",`item "${c.id}" belongs to no phase`,`set phase to one of: ${ye(n)}`,c.id)):P(n,l)||o.push(v("phase-sequential",`item "${c.id}" names unknown phase "${l}"`,`phases are: ${ye(n)}`,c.id));}else if(r.type==="item.edit"){let c=C(r).id,l=C(r).patch,u=te(n,c);if(!u||!U(l)||l.phase===void 0||l.phase===u.phase)return [];o.push(v("phase-sequential",`item "${u.id}" cannot move from phase "${u.phase??"(none)"}" to "${String(l.phase)}"`,`drop "${u.id}" and add a new item in phase "${String(l.phase)}"`,u.id));}return o}},{id:"gate-before-next-phase",severity:"error",check(n,r){if(r.type!=="ceremony.kickoff")return [];let o=z(r),c=b(n),l=o===void 0?-1:c.findIndex(p=>p.id===o);if(l<0)return [];let u=c.slice(0,l).filter(p=>p.status!=="baselined").map(p=>p.id);return u.length===0?[]:[v("gate-before-next-phase",`phase(s) ${u.join(", ")} before "${o}" are not baselined`,`kickoff and gateReview them in order, starting with "${u[0]}"`)]}},{id:"baseline-immutable",severity:"error",check(n,r){let o=c=>(n.baselines??[]).filter(l=>l.phase===c).length||1;if(r.type==="item.edit"){let c=te(n,C(r).id);if(!c)return [];let l=R(n,c);return l===void 0||P(n,l)?.status!=="baselined"?[]:[v("baseline-immutable",`item "${c.id}" is frozen: phase "${l}" is baselined (v${o(l)})`,Ue(c.id,l),c.id)]}if(r.type==="item.add"){let c=C(r).item;if(!U(c)||!He(c))return [];let l=Ve(n,c);return l===void 0||P(n,l)?.status!=="baselined"?[]:[v("baseline-immutable",`cannot add "${c.id}" to baselined phase "${l}" (v${o(l)})`,Ue(c.id,l),c.id)]}return []}},{id:"change-needs-impact-analysis",severity:"error",check(n,r){if(r.type!=="ceremony.changeControlBoard")return [];let o=ze(n,r);if(!o)return [];let c=k(n).changeControl,l=o.impactAnalysis,u=`editItem("${o.id}", { impactAnalysis: { summary: "what changes and why", reopen: ["<phase>"], weight: <points> } })`;if(l===void 0)return c.requiresImpactAnalysis?[v("change-needs-impact-analysis",`change "${o.id}" has no impact analysis`,u,o.id)]:[];let p=[];if((!U(l)||typeof l.summary!="string"||l.summary.trim()==="")&&p.push(v("change-needs-impact-analysis",`change "${o.id}" impactAnalysis.summary is empty`,u,o.id)),(!Array.isArray(l.reopen)||!l.reopen.every(g=>typeof g=="string"))&&p.push(v("change-needs-impact-analysis",`change "${o.id}" impactAnalysis.reopen must be a string[] of phase ids`,u,o.id)),(typeof l.weight!="number"||!Number.isFinite(l.weight)||l.weight<0)&&p.push(v("change-needs-impact-analysis",`change "${o.id}" impactAnalysis.weight must be a non-negative number`,u,o.id)),p.length)return p;let m=C(r).decision==="approve";for(let g of l.reopen){let x=P(n,g);x?m&&x.status==="pending"&&p.push(v("change-needs-impact-analysis",`phase "${g}" was never baselined; it cannot be reopened`,`remove "${g}" from impactAnalysis.reopen`,o.id)):p.push(v("change-needs-impact-analysis",`change "${o.id}" impactAnalysis.reopen names unknown phase "${g}"`,`phases are: ${ye(n)}`,o.id));}return p}},{id:"requirement-traced",severity:"error",check(n,r){if(r.type!=="ceremony.gateReview")return [];let o=z(r),c=k(n).traceability;return o===void 0||!c.to.includes(o)||!P(n,o)?[]:fe(n,o).map(l=>v("requirement-traced",`item "${l}" of phase "${c.from}" has no trace into "${o}"`,`editItem a "${o}" item with traces: ["${l}"] (or editItem("${l}", { traces: [...] }) while "${c.from}" is not baselined)`,l))}},{id:"deliverables-present",severity:"error",check(n,r){if(r.type!=="ceremony.gateReview")return [];let o=z(r),c=o===void 0?void 0:P(n,o);if(!c)return [];let l=[],u=A(n,c.id).filter(g=>g.status!=="done").map(g=>g.id);u.length&&l.push(v("deliverables-present",`${u.length} item(s) in phase "${c.id}" are not done: ${u.join(", ")}`,"finish them (next/complete) or drop them before the gate"));let p=C(r).deliverables,m=Array.isArray(p)?p.filter(g=>U(g)&&typeof g.kind=="string").map(g=>g.kind):[];c.id===N(n)&&m.push("traceability-matrix");for(let g of G(n,c,m))l.push(v("deliverables-present",`phase "${c.id}" has no deliverable "${g}"`,`pass deliverables: [{ "kind": "${g}", "ref": "<where it lives>" }] to gateReview, or attach evidence of kind "${g}" on an item of the phase`));return l}},{id:"approver-not-author",severity:"error",check(n,r){if(r.by==="human")return [];if(r.type==="ceremony.gateReview"){let o=z(r),c=o===void 0?void 0:P(n,o);if(!c)return [];let l=A(n,c.id).filter(p=>chunk23P7C25E_cjs.G(n,p)===r.by).map(p=>p.id);if(l.length===0)return [];let u=chunk23P7C25E_cjs.j(n,c.gate.id,"approve-gate",r.by);return [v("approver-not-author",`"${r.by}" authored ${l.join(", ")} in phase "${c.id}" and may not approve its gate`,`review the gate as one of: human${u.map(p=>`, ${p}`).join("")}`)]}if(r.type==="ceremony.changeControlBoard"){let o=ze(n,r);if(!o)return [];let c=n.events.find(u=>u.type==="item.added"&&u.payload.id===o.id);if(!c||c.by!==r.by)return [];let l=chunk23P7C25E_cjs.i(n,"control-change").map(u=>u.id).filter(u=>u!==r.by);return [v("approver-not-author",`"${r.by}" raised change "${o.id}" and may not decide it`,`decide as human${l.map(u=>`, ${u}`).join("")}`,o.id)]}return []}}]}function ve(e){return [{id:L,name:"Work",entryPolicy:[{kind:"dependencies-done"}],exitPolicy:[]},{id:_,name:"Review",entryPolicy:[],exitPolicy:[{kind:"no-open-blockers"}],review:true},{id:M,name:"Done",entryPolicy:[],exitPolicy:[]}]}var nt={backlog:"Requirements Baseline",item:"Work Package",stage:"Step",iteration:"Phase",increment:"Deliverable",ceremony:"Review",gate:"Phase Gate"};function it(e,t){let i=R(e,t);if(i!==void 0)return k(e).phases.find(s=>s.id===i)?.deliverBy}function rt(e){return {phases:b(e).map(i=>{let s=A(e,i.id),f=s.filter(a=>a.status==="done").length,d=G(e,i);return {id:i.id,name:i.name,status:i.status,items:s.length,done:f,missingDeliverables:d,readyForGate:i.status==="open"&&f===s.length&&d.length===0}}),current:le(e)?.id??null,open:O(e)?.id??null,pendingGates:e.pending.filter(i=>i.kind==="gate"&&i.item===void 0&&i.gate!==void 0).map(i=>({pending:i.id,gate:i.gate}))}}function st(){return {name:"waterfall",vocabulary:nt,validateConfig:ce,defaultStages:ve,defaultRoles:he,requiredCapabilities:["facilitate","control-change","approve-gate","deliver","verify"],exclusiveCapabilities:[],plannerOptions(e){return {schedulerMode:"level",roleFor:t=>t.status==="todo"&&t.type!=="question"?it(e,t):void 0}},candidates(e){let t=O(e);return t?Object.values(e.items).filter(i=>(i.status==="todo"||i.status==="review")&&(i.stage===L||i.stage===_)&&i.type!=="change-request"&&R(e,i)===t.id):[]},invariants(e,t){let i=k(e),s=b(e),f=R(e,t),d=f===void 0?void 0:s[I(e,f)],a=s.filter(r=>r.status==="baselined").map(r=>r.id),n=d?.gate.requires.includes("human");return [d?`Phase "${d.name}" (${I(e,d.id)+1}/${s.length}); deliverables: ${d.deliverables.join(", ")||"(none)"}; gate "${d.gate.id}"${n?" needs human approval":""}`:"This item belongs to no phase; it is dispatched only through its parent's phase",`Baselined phases are frozen: ${a.join(", ")||"(none yet)"}; to change their items, raise a change-request with an impact analysis`,i.traceability.to.length?`Traceability: every item of phase "${i.traceability.from}" must trace to an item in ${i.traceability.to.join(", ")} (set traces on either side)`:"Traceability: none configured",`Do not change the scope of "${t.id}" or its acceptance criteria; raise open_questions instead`]},ceremonies:ue(st),rules:be(),metrics:e=>({...me(e)}),humanDefaults:{gates:"all"},report:e=>({...rt(e),coverage:T(e).coverage}),afterDecide:ge,afterComplete(e,t,i){let s=chunk2IKIBB73_cjs.f(e),f=O(e);if(!s||!f||s.committed.includes(t))return e;let d=e.items[t];if(!d||R(e,d)!==f.id)return e;let a=e.accounting[e.accounting.length-1];return !a||a.item!==t?e:{...e,iterations:e.iterations.map(n=>n.id===s.id?{...n,committed:[...n.committed,t],spent:chunk2IKIBB73_cjs.b(n.spent,a)}:n)}}}}exports.A=V;exports.B=T;exports.C=fe;exports.D=H;exports.E=ue;exports.F=ge;exports.G=me;exports.H=he;exports.I=be;exports.J=ve;exports.K=nt;exports.L=it;exports.M=rt;exports.N=st;exports.a=je;exports.b=se;exports.c=oe;exports.d=ae;exports.e=de;exports.f=Te;exports.g=k;exports.h=ce;exports.i=L;exports.j=_;exports.k=M;exports.l=b;exports.m=S;exports.n=I;exports.o=E;exports.p=R;exports.q=A;exports.r=O;exports.s=le;exports.t=Ye;exports.u=Be;exports.v=G;exports.w=N;exports.x=ee;exports.y=pe;exports.z=F;//# sourceMappingURL=chunk-TMKCALFT.cjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-TMKCALFT.cjs.map
|