ex-workflow 0.3.0-stage → 0.4.0-stage

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/README.md +16 -3
  3. package/dist/adapters/index.cjs +1 -1
  4. package/dist/adapters/index.mjs +1 -1
  5. package/dist/chunk-36M6OVUJ.mjs +2 -0
  6. package/dist/chunk-36M6OVUJ.mjs.map +1 -0
  7. package/dist/{chunk-4A4TD4MH.cjs → chunk-7KF5K3L7.cjs} +2 -2
  8. package/dist/{chunk-4A4TD4MH.cjs.map → chunk-7KF5K3L7.cjs.map} +1 -1
  9. package/dist/{chunk-2IKIBB73.cjs → chunk-CWBH7H52.cjs} +2 -2
  10. package/dist/{chunk-2IKIBB73.cjs.map → chunk-CWBH7H52.cjs.map} +1 -1
  11. package/dist/chunk-DXC2RSN5.cjs +3 -0
  12. package/dist/chunk-DXC2RSN5.cjs.map +1 -0
  13. package/dist/{chunk-UOGNVWVO.mjs → chunk-GATJZYTB.mjs} +2 -2
  14. package/dist/{chunk-UOGNVWVO.mjs.map → chunk-GATJZYTB.mjs.map} +1 -1
  15. package/dist/{chunk-ZX4DAMTG.mjs → chunk-GFH2FEZH.mjs} +2 -2
  16. package/dist/{chunk-ZX4DAMTG.mjs.map → chunk-GFH2FEZH.mjs.map} +1 -1
  17. package/dist/{chunk-NN3XJUHP.cjs → chunk-HHC5EZ54.cjs} +2 -2
  18. package/dist/{chunk-NN3XJUHP.cjs.map → chunk-HHC5EZ54.cjs.map} +1 -1
  19. package/dist/{chunk-TMKCALFT.cjs → chunk-KSKEFYY7.cjs} +2 -2
  20. package/dist/{chunk-TMKCALFT.cjs.map → chunk-KSKEFYY7.cjs.map} +1 -1
  21. package/dist/chunk-KUUIAKEJ.cjs +2 -0
  22. package/dist/chunk-KUUIAKEJ.cjs.map +1 -0
  23. package/dist/{chunk-R27STIER.mjs → chunk-L2ZN6HEL.mjs} +2 -2
  24. package/dist/{chunk-R27STIER.mjs.map → chunk-L2ZN6HEL.mjs.map} +1 -1
  25. package/dist/{chunk-BJEOTG6P.mjs → chunk-NDORREWR.mjs} +2 -2
  26. package/dist/{chunk-BJEOTG6P.mjs.map → chunk-NDORREWR.mjs.map} +1 -1
  27. package/dist/{chunk-WOKNWJKU.mjs → chunk-NZ2DIDOD.mjs} +2 -2
  28. package/dist/{chunk-WOKNWJKU.mjs.map → chunk-NZ2DIDOD.mjs.map} +1 -1
  29. package/dist/chunk-OHSQ52DW.mjs +6 -0
  30. package/dist/chunk-OHSQ52DW.mjs.map +1 -0
  31. package/dist/chunk-RSKZVOYC.cjs +6 -0
  32. package/dist/chunk-RSKZVOYC.cjs.map +1 -0
  33. package/dist/chunk-S22CPYXJ.mjs +3 -0
  34. package/dist/chunk-S22CPYXJ.mjs.map +1 -0
  35. package/dist/{chunk-FLCYD2QF.mjs → chunk-SHAPFMVP.mjs} +2 -2
  36. package/dist/{chunk-FLCYD2QF.mjs.map → chunk-SHAPFMVP.mjs.map} +1 -1
  37. package/dist/{chunk-23P7C25E.cjs → chunk-SJRRQZ3R.cjs} +2 -2
  38. package/dist/{chunk-23P7C25E.cjs.map → chunk-SJRRQZ3R.cjs.map} +1 -1
  39. package/dist/{chunk-7HZXZF3L.cjs → chunk-UM5X2JHB.cjs} +2 -2
  40. package/dist/{chunk-7HZXZF3L.cjs.map → chunk-UM5X2JHB.cjs.map} +1 -1
  41. package/dist/cli/bin.cjs +1 -1
  42. package/dist/cli/bin.cjs.map +1 -1
  43. package/dist/cli/bin.mjs +1 -1
  44. package/dist/cli/bin.mjs.map +1 -1
  45. package/dist/cli/index.cjs +1 -1
  46. package/dist/cli/index.mjs +1 -1
  47. package/dist/index.cjs +1 -1
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.cts +5 -5
  50. package/dist/index.d.ts +5 -5
  51. package/dist/index.mjs +1 -1
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/kanban/index.cjs +1 -1
  54. package/dist/kanban/index.mjs +1 -1
  55. package/dist/schema/index.cjs +2 -0
  56. package/dist/schema/index.cjs.map +1 -0
  57. package/dist/schema/index.d.cts +57 -0
  58. package/dist/schema/index.d.ts +57 -0
  59. package/dist/schema/index.mjs +2 -0
  60. package/dist/schema/index.mjs.map +1 -0
  61. package/dist/scrum/index.cjs +1 -1
  62. package/dist/scrum/index.mjs +1 -1
  63. package/dist/types.d.cts +9 -2
  64. package/dist/types.d.ts +9 -2
  65. package/dist/waterfall/index.cjs +1 -1
  66. package/dist/waterfall/index.mjs +1 -1
  67. package/package.json +18 -2
  68. package/dist/chunk-6R3YFUUV.cjs +0 -6
  69. package/dist/chunk-6R3YFUUV.cjs.map +0 -1
  70. package/dist/chunk-AUZIQPFT.cjs +0 -2
  71. package/dist/chunk-AUZIQPFT.cjs.map +0 -1
  72. package/dist/chunk-P4P4JTE5.mjs +0 -2
  73. package/dist/chunk-P4P4JTE5.mjs.map +0 -1
  74. package/dist/chunk-VGD4V5BA.mjs +0 -6
  75. package/dist/chunk-VGD4V5BA.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/state.ts","../src/roles.ts","../src/items.ts","../src/policies.ts","../src/gates.ts","../src/rules.ts","../src/methodology.ts"],"names":["nowOf","now","createState","input","seenStages","st","fail","roles","r","assertId","at","appendEvent","state","type","by","payload","ev","lastEvent","i","roleOf","id","OPEN","registerRole","role","next","retireRole","roleId","open","hasCapability","cap","rolesWith","approverIds","gateId","except","approversFor","requireCapabilities","required","exclusive","holders","separationLost","c","canDo","caps","requireCap","h","stageOf","stageId","s","nextStageOf","idx","isTerminalStage","putItem","item","patchItem","fn","getItem","stripItemFields","keys","copy","k","it","assertKnownItems","ids","what","missing","d","addItem","firstStage","_s","rest","editItem","patch","changed","updated","moveItem","to","toStage","addEvidence","evidence","raiseBlocker","reason","owner","blockerId","t","lastTransitionTo","status","clearBlocker","b","blockers","stillBlocked","prev","toStatus","dropRole","_r","noRole","clearRole","itemId","advanceItem","wantsReview","evaluatePolicies","policies","out","v","rule","message","fix","p","e","notDone","assertPolicies","context","unmet","u","lastDispatchBefore","order","here","from","authorOf","before","checkGate","gate","violations","kind","needsHuman","req","author","others","raisePending","pending","entry","decide","pendingId","decision","note","methodology","item0","q","onFail","coreRulesFor","action","handoff","verdict","validateAction","applyAction","reduce","errors","x","init","m","config","stages","stateInput"],"mappings":"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","file":"chunk-23P7C25E.cjs","sourcesContent":["import { assertId, fail } from \"./errors.ts\";\nimport type { Event, MethodologyName, Role, Stage, WorkflowState } from \"./types.ts\";\n\nexport function nowOf(now?: string): string {\n return now ?? new Date().toISOString();\n}\n\nexport interface CreateStateInput {\n methodology: MethodologyName;\n config: unknown;\n stages: Stage[];\n roles: Role[];\n now?: string;\n}\n\nexport function createState(input: CreateStateInput): WorkflowState {\n const seenStages = new Set<string>();\n for (const st of input.stages) {\n if (seenStages.has(st.id))\n fail(\"config-invalid\", `duplicate stage id \"${st.id}\"`, \"give every stage a unique id\");\n seenStages.add(st.id);\n }\n const roles: Record<string, Role> = {};\n for (const r of input.roles) {\n assertId(r.id, \"role id\");\n if (Object.hasOwn(roles, r.id))\n fail(\"duplicate-role\", `duplicate role id \"${r.id}\"`, \"give every role a unique id\");\n roles[r.id] = r;\n }\n const at = nowOf(input.now);\n return {\n version: 1,\n methodology: input.methodology,\n config: input.config,\n items: {},\n stages: input.stages,\n roles,\n iterations: [],\n events: [\n {\n seq: 1,\n at,\n type: \"state.created\",\n by: \"system\",\n payload: { methodology: input.methodology },\n },\n ],\n accounting: [],\n pending: [],\n lessons: [],\n agreements: [],\n };\n}\n\nexport function appendEvent(\n state: WorkflowState,\n type: string,\n by: string,\n payload: unknown,\n now?: string,\n): WorkflowState {\n const last = state.events[state.events.length - 1];\n const ev: Event = { seq: (last?.seq ?? 0) + 1, at: nowOf(now), type, by, payload };\n return { ...state, events: [...state.events, ev] };\n}\n\nexport function lastEvent(state: WorkflowState, type?: string): Event | undefined {\n for (let i = state.events.length - 1; i >= 0; i--) {\n const ev = state.events[i]!;\n if (type === undefined || ev.type === type) return ev;\n }\n return undefined;\n}\n","import { assertId, fail } from \"./errors.ts\";\nimport { appendEvent } from \"./state.ts\";\nimport type { Capability, Role, WorkflowState } from \"./types.ts\";\n\n/** Own-property role lookup (ids such as \"constructor\" never hit the prototype). */\nexport function roleOf(state: WorkflowState, id: string): Role | undefined {\n return Object.hasOwn(state.roles, id) ? state.roles[id] : undefined;\n}\n\nconst OPEN: ReadonlySet<string> = new Set([\"in_progress\", \"review\", \"blocked\"]);\n\nexport function registerRole(\n state: WorkflowState,\n role: Role,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(role.id, \"role id\");\n if (roleOf(state, role.id))\n fail(\n \"duplicate-role\",\n `role \"${role.id}\" already exists`,\n `use a different id or retireRole(\"${role.id}\") first`,\n );\n const next = { ...state, roles: { ...state.roles, [role.id]: role } };\n return appendEvent(\n next,\n \"role.registered\",\n by,\n { role: role.id, capabilities: role.capabilities },\n now,\n );\n}\n\nexport function retireRole(\n state: WorkflowState,\n roleId: string,\n by: string,\n now?: string,\n): WorkflowState {\n if (!roleOf(state, roleId))\n fail(\n \"unknown-role\",\n `role \"${roleId}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \") || \"(none)\"}`,\n );\n const open = Object.values(state.items)\n .filter((i) => i.role === roleId && OPEN.has(i.status))\n .map((i) => i.id);\n if (open.length)\n fail(\n \"role-has-open-items\",\n `role \"${roleId}\" still holds ${open.length} open item(s)`,\n `complete or reassign ${open.join(\", \")} before retiring the role`,\n { items: open },\n );\n const roles = { ...state.roles };\n delete roles[roleId];\n return appendEvent({ ...state, roles }, \"role.retired\", by, { role: roleId }, now);\n}\n\nexport function hasCapability(role: Role, cap: Capability): boolean {\n return role.capabilities.includes(cap);\n}\n\nexport function rolesWith(state: WorkflowState, cap: Capability): Role[] {\n return Object.values(state.roles).filter((r) => hasCapability(r, cap));\n}\n\n/** Ids of roles that may approve `gateId`, optionally holding `cap` and excluding one id. */\nexport function approverIds(\n state: WorkflowState,\n gateId: string,\n cap?: string,\n except?: string,\n): string[] {\n return Object.values(state.roles)\n .filter(\n (r) =>\n r.id !== except &&\n r.canApprove.includes(gateId) &&\n (cap === undefined || (r.capabilities as readonly string[]).includes(cap)),\n )\n .map((r) => r.id);\n}\n\nexport function approversFor(state: WorkflowState, gateId: string): Role[] {\n return rolesWith(state, \"approve-gate\").filter((r) => r.canApprove.includes(gateId));\n}\n\nexport function requireCapabilities(\n state: WorkflowState,\n required: Capability[],\n exclusive: Capability[],\n): void {\n for (const cap of required) {\n if (rolesWith(state, cap).length === 0) {\n fail(\n \"missing-capability\",\n `no registered role has capability \"${cap}\"`,\n `register a role whose capabilities include \"${cap}\" (registerRole) before init`,\n );\n }\n }\n for (const cap of exclusive) {\n const holders = rolesWith(state, cap);\n if (holders.length > 1) {\n fail(\n \"exclusive-capability\",\n `capability \"${cap}\" must belong to exactly one role but is held by ${holders.map((r) => r.id).join(\", \")}`,\n `remove \"${cap}\" from all but one role`,\n );\n }\n }\n}\n\nexport function separationLost(state: WorkflowState, required: Capability[]): Role[] {\n if (required.length === 0) return [];\n return Object.values(state.roles).filter((r) => required.every((c) => hasCapability(r, c)));\n}\n\n/** `human` may do anything; a role must hold at least one of `caps`; unknown ids may do nothing. */\nexport function canDo(state: WorkflowState, by: string, ...caps: Capability[]): boolean {\n if (by === \"human\") return true;\n const role = roleOf(state, by);\n return !!role && caps.some((c) => hasCapability(role, c));\n}\n\nexport function requireCap(state: WorkflowState, by: string, ...caps: Capability[]): void {\n if (!canDo(state, by, ...caps)) {\n const holders = Object.values(state.roles)\n .filter((r) => caps.some((c) => hasCapability(r, c)))\n .map((r) => r.id);\n fail(\n \"missing-capability\",\n `\"${by}\" lacks capability ${caps.map((c) => `\"${c}\"`).join(\" or \")}`,\n `run this as one of: human${holders.map((h) => `, ${h}`).join(\"\")}`,\n );\n }\n}\n","import { assertId, fail } from \"./errors.ts\";\n\nexport { assertId };\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Evidence,\n ItemStatus,\n NewItem,\n Stage,\n Transition,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function stageOf(state: WorkflowState, stageId: string): Stage {\n const st = state.stages.find((s) => s.id === stageId);\n if (!st)\n fail(\n \"unknown-stage\",\n `stage \"${stageId}\" does not exist`,\n `stages are: ${state.stages.map((s) => s.id).join(\" → \")}`,\n );\n return st;\n}\n\nexport function nextStageOf(state: WorkflowState, stageId: string): Stage | undefined {\n const idx = state.stages.findIndex((s) => s.id === stageId);\n if (idx < 0) stageOf(state, stageId);\n return state.stages[idx + 1];\n}\n\nexport function isTerminalStage(state: WorkflowState, stageId: string): boolean {\n return state.stages[state.stages.length - 1]?.id === stageId;\n}\n\nfunction putItem(state: WorkflowState, item: WorkItem): WorkflowState {\n return { ...state, items: { ...state.items, [item.id]: item } };\n}\n\n/** Replace one item with `fn(item)`; no event. */\nexport function patchItem(\n state: WorkflowState,\n id: string,\n fn: (item: WorkItem) => WorkItem,\n): WorkflowState {\n return putItem(state, fn(getItem(state, id)));\n}\n\n/** Drop optional fields (iteration, role, ...) from one item; no event. */\nexport function stripItemFields(\n state: WorkflowState,\n id: string,\n keys: Array<\"iteration\" | \"role\">,\n): WorkflowState {\n return patchItem(state, id, (item) => {\n const copy = { ...item };\n for (const k of keys) delete copy[k];\n return copy;\n });\n}\n\nexport function getItem(state: WorkflowState, id: string): WorkItem {\n const it = Object.hasOwn(state.items, id) ? state.items[id] : undefined;\n if (!it)\n fail(\n \"unknown-item\",\n `item \"${id}\" does not exist`,\n `add it with addItem first; known items: ${Object.keys(state.items).join(\", \") || \"(none)\"}`,\n { items: [id] },\n );\n return it;\n}\n\nfunction assertKnownItems(state: WorkflowState, ids: string[], what: string): void {\n const missing = ids.filter((d) => !Object.hasOwn(state.items, d));\n if (missing.length)\n fail(\n \"unknown-item\",\n `${what} refers to unknown item(s) ${missing.join(\", \")}`,\n \"add those items first or remove the reference\",\n { items: missing },\n );\n}\n\nexport function addItem(\n state: WorkflowState,\n input: NewItem,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(input.id, \"item id\");\n if (Object.hasOwn(state.items, input.id))\n fail(\n \"duplicate-item\",\n `item \"${input.id}\" already exists`,\n \"use editItem to change it, or pick a new id\",\n { items: [input.id] },\n );\n const firstStage = state.stages[0];\n if (!firstStage)\n fail(\"config-invalid\", \"state has no stages\", \"create the state with at least one stage\");\n const stageId = input.stage ?? firstStage.id;\n stageOf(state, stageId);\n assertKnownItems(state, input.dependsOn ?? [], `item \"${input.id}\".dependsOn`);\n if (input.affects) assertKnownItems(state, input.affects, `item \"${input.id}\".affects`);\n if (input.parent !== undefined)\n assertKnownItems(state, [input.parent], `item \"${input.id}\".parent`);\n if (input.role !== undefined && !Object.hasOwn(state.roles, input.role))\n fail(\n \"unknown-role\",\n `role \"${input.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n\n const { stage: _s, ...rest } = input;\n const item: WorkItem = {\n type: \"task\",\n acceptance: [],\n dependsOn: [],\n ...rest,\n id: input.id,\n title: input.title,\n stage: stageId,\n status: \"todo\",\n evidence: [],\n blockers: [],\n transitions: [],\n };\n const next = putItem(state, item);\n return appendEvent(\n next,\n \"item.added\",\n by,\n {\n id: item.id,\n type: item.type,\n stage: item.stage,\n weight: item.weight ?? null,\n priority: item.priority ?? null,\n phase: item.phase ?? null,\n parent: item.parent ?? null,\n },\n now,\n );\n}\n\nexport type ItemPatch = Partial<\n Omit<WorkItem, \"id\" | \"stage\" | \"status\" | \"transitions\" | \"evidence\" | \"blockers\">\n>;\n\nexport function editItem(\n state: WorkflowState,\n id: string,\n patch: ItemPatch,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n if (patch.dependsOn) assertKnownItems(state, patch.dependsOn, `item \"${id}\".dependsOn`);\n if (patch.affects) assertKnownItems(state, patch.affects, `item \"${id}\".affects`);\n if (patch.parent !== undefined) assertKnownItems(state, [patch.parent], `item \"${id}\".parent`);\n if (patch.role !== undefined && !Object.hasOwn(state.roles, patch.role))\n fail(\n \"unknown-role\",\n `role \"${patch.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n const changed = (Object.keys(patch) as Array<keyof ItemPatch>).filter(\n (k) => JSON.stringify(patch[k]) !== JSON.stringify(item[k]),\n );\n if (changed.length === 0)\n fail(\n \"no-op\",\n `editItem(\"${id}\") changes nothing`,\n \"pass at least one field with a different value\",\n { items: [id] },\n );\n const updated: WorkItem = { ...item };\n for (const k of changed) (updated as unknown as Record<string, unknown>)[k] = patch[k];\n const next = putItem(state, updated);\n return appendEvent(next, \"item.edited\", by, { id, changed }, now);\n}\n\nexport function moveItem(\n state: WorkflowState,\n id: string,\n to: { stage?: string; status: ItemStatus },\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const toStage = to.stage ?? item.stage;\n stageOf(state, toStage);\n if (item.status === \"done\" || item.status === \"dropped\") {\n fail(\n \"invalid-transition\",\n `item \"${id}\" is ${item.status} and cannot move`,\n \"create a new item (or a change-request) instead of reopening a finished one\",\n { items: [id] },\n );\n }\n if (toStage === item.stage && to.status === item.status)\n fail(\n \"no-op\",\n `item \"${id}\" is already ${item.status} in \"${toStage}\"`,\n \"choose a different stage or status\",\n { items: [id] },\n );\n const at = nowOf(now);\n const updated: WorkItem = {\n ...item,\n stage: toStage,\n status: to.status,\n transitions: [\n ...item.transitions,\n {\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n at,\n by,\n },\n ],\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.transition\",\n by,\n {\n id,\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n },\n at,\n );\n}\n\nexport function addEvidence(\n state: WorkflowState,\n id: string,\n evidence: Omit<Evidence, \"at\">,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const updated: WorkItem = { ...item, evidence: [...item.evidence, { ...evidence, at }] };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.evidence\",\n evidence.by,\n { id, kind: evidence.kind, ref: evidence.ref },\n at,\n );\n}\n\nexport function raiseBlocker(\n state: WorkflowState,\n id: string,\n reason: string,\n owner: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const blockerId = `${id}-b${item.blockers.length + 1}`;\n const t: Transition | null =\n item.status === \"blocked\"\n ? null\n : {\n from: { stage: item.stage, status: item.status },\n to: { stage: item.stage, status: \"blocked\" },\n at,\n by,\n };\n const updated: WorkItem = {\n ...item,\n status: \"blocked\",\n blockers: [...item.blockers, { id: blockerId, reason, owner, raisedAt: at }],\n transitions: t ? [...item.transitions, t] : item.transitions,\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"blocker.raised\",\n by,\n { id, blocker: blockerId, reason, owner, transition: t && { from: t.from, to: t.to } },\n at,\n );\n}\n\nfunction lastTransitionTo(item: WorkItem, status: ItemStatus): Transition | undefined {\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === status) return t;\n }\n return undefined;\n}\n\nexport function clearBlocker(\n state: WorkflowState,\n id: string,\n blockerId: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const idx = item.blockers.findIndex((b) => b.id === blockerId && !b.clearedAt);\n if (idx < 0)\n fail(\n \"invalid-input\",\n `item \"${id}\" has no open blocker \"${blockerId}\"`,\n `open blockers: ${\n item.blockers\n .filter((b) => !b.clearedAt)\n .map((b) => b.id)\n .join(\", \") || \"(none)\"\n }`,\n { items: [id] },\n );\n const at = nowOf(now);\n const blockers = item.blockers.map((b, i) => (i === idx ? { ...b, clearedAt: at } : b));\n const stillBlocked = blockers.some((b) => !b.clearedAt);\n const prev = lastTransitionTo(item, \"blocked\")?.from.status ?? \"todo\";\n let toStage = item.stage;\n let toStatus: ItemStatus = prev;\n let dropRole = false;\n if (prev === \"in_progress\") {\n toStatus = \"todo\";\n toStage = lastTransitionTo(item, \"in_progress\")?.from.stage ?? item.stage;\n } else if (prev === \"awaiting_human\") {\n // a rejected human gate: the work is re-dispatched in the current stage\n toStatus = stageOf(state, item.stage).review ? \"review\" : \"todo\";\n dropRole = true;\n }\n const { role: _r, ...noRole } = item;\n const t: Transition | null = stillBlocked\n ? null\n : {\n from: { stage: item.stage, status: \"blocked\" },\n to: { stage: toStage, status: toStatus },\n at,\n by,\n };\n const updated: WorkItem = {\n ...(dropRole && !stillBlocked ? (noRole as WorkItem) : item),\n blockers,\n stage: stillBlocked ? item.stage : toStage,\n status: stillBlocked ? \"blocked\" : toStatus,\n transitions: t ? [...item.transitions, t] : item.transitions,\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"blocker.cleared\",\n by,\n { id, blocker: blockerId, transition: t && { from: t.from, to: t.to } },\n at,\n );\n}\n\n/** Entering a new stage is a new assignment: the role that finished the previous stage is cleared so the planner picks the right one (a reviewer, not the author). */\nexport function clearRole(state: WorkflowState, itemId: string): WorkflowState {\n return stripItemFields(state, itemId, [\"role\"]);\n}\n\n/** Move an item to the next stage (done at the end, review/todo otherwise) and clear its role. */\nexport function advanceItem(\n state: WorkflowState,\n itemId: string,\n by: string,\n wantsReview: boolean,\n now: string,\n): WorkflowState {\n const item = getItem(state, itemId);\n const to = nextStageOf(state, item.stage);\n if (!to) return moveItem(state, itemId, { status: \"done\" }, by, now);\n if (isTerminalStage(state, to.id))\n return moveItem(state, itemId, { stage: to.id, status: \"done\" }, by, now);\n const status = wantsReview || to.review === true ? \"review\" : \"todo\";\n return clearRole(moveItem(state, itemId, { stage: to.id, status }, by, now), itemId);\n}\n","import { fail } from \"./errors.ts\";\nimport type { Policy, Violation, WorkItem, WorkflowState } from \"./types.ts\";\n\nexport function evaluatePolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n): Violation[] {\n const out: Violation[] = [];\n const v = (rule: string, message: string, fix: string) =>\n out.push({ rule, severity: \"error\", item: item.id, message, fix });\n for (const p of policies) {\n switch (p.kind) {\n case \"evidence\":\n if (!item.evidence.some((e) => e.kind === p.evidenceKind))\n v(\n \"policy:evidence\",\n `item \"${item.id}\" has no evidence of kind \"${p.evidenceKind}\"`,\n `attach evidence { kind: \"${p.evidenceKind}\" } via addEvidence or in the handoff.produced`,\n );\n break;\n case \"acceptance-written\":\n if (item.acceptance.length === 0)\n v(\n \"policy:acceptance-written\",\n `item \"${item.id}\" has no acceptance criteria`,\n \"editItem with a non-empty acceptance[] (needs define-acceptance)\",\n );\n break;\n case \"estimate-present\":\n if (item.weight === undefined)\n v(\n \"policy:estimate-present\",\n `item \"${item.id}\" has no weight`,\n \"editItem with a weight (story points)\",\n );\n break;\n case \"no-open-blockers\": {\n const open = item.blockers.filter((b) => !b.clearedAt);\n if (open.length)\n v(\n \"policy:no-open-blockers\",\n `item \"${item.id}\" has ${open.length} open blocker(s)`,\n `clearBlocker ${open.map((b) => b.id).join(\", \")}`,\n );\n break;\n }\n case \"dependencies-done\": {\n const notDone = item.dependsOn.filter((d) => state.items[d]?.status !== \"done\");\n if (notDone.length)\n v(\n \"policy:dependencies-done\",\n `item \"${item.id}\" depends on unfinished ${notDone.join(\", \")}`,\n `finish ${notDone.join(\", \")} first`,\n );\n break;\n }\n case \"custom\":\n if (!item.evidence.some((e) => e.kind === `policy:${p.id}`))\n v(\n `policy:custom:${p.id}`,\n `item \"${item.id}\" has not satisfied \"${p.description}\"`,\n `attach evidence { kind: \"policy:${p.id}\" } when it is satisfied`,\n );\n break;\n }\n }\n return out;\n}\n\nexport function assertPolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n context: string,\n): void {\n const unmet = evaluatePolicies(state, item, policies);\n if (unmet.length) {\n fail(\n \"policy-unmet\",\n `item \"${item.id}\" cannot ${context}: ${unmet.length} polic${unmet.length === 1 ? \"y\" : \"ies\"} unmet`,\n unmet.map((u) => u.fix).join(\"; \"),\n { items: [item.id] },\n );\n }\n}\n","import { fail } from \"./errors.ts\";\nimport { advanceItem, clearRole, getItem, moveItem, raiseBlocker } from \"./items.ts\";\nimport { approverIds } from \"./roles.ts\";\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Gate,\n Methodology,\n PendingHuman,\n Transition,\n Violation,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport type GateResult =\n | { outcome: \"pass\" }\n | { outcome: \"human\" }\n | { outcome: \"fail\"; violations: Violation[] };\n\n/** Last in_progress dispatch made from a stage that comes STRICTLY BEFORE the item's current stage in `state.stages` order (unknown stage ids count as not-before). */\nexport function lastDispatchBefore(state: WorkflowState, item: WorkItem): Transition | undefined {\n const order = new Map(state.stages.map((s, i) => [s.id, i] as const));\n const here = order.get(item.stage);\n if (here === undefined) return undefined;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n const from = order.get(t.from.stage);\n if (t.to.status === \"in_progress\" && from !== undefined && from < here) return t;\n }\n return undefined;\n}\n\n/** Role that did the work the gate guards: the last dispatch made from a stage strictly before the current one (so a reviewer dispatched into the gated stage is not its author); else the last dispatch of any stage; undefined if never dispatched. */\nexport function authorOf(state: WorkflowState, item: WorkItem): string | undefined {\n const before = lastDispatchBefore(state, item);\n if (before) return before.by;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === \"in_progress\") return t.by;\n }\n return undefined;\n}\n\nexport function checkGate(\n state: WorkflowState,\n item: WorkItem,\n gate: Gate,\n by: string,\n): GateResult {\n const violations: Violation[] = [];\n for (const kind of gate.evidence) {\n if (!item.evidence.some((e) => e.kind === kind)) {\n violations.push({\n rule: \"gate:evidence\",\n severity: \"error\",\n item: item.id,\n message: `gate \"${gate.id}\" needs evidence \"${kind}\" on item \"${item.id}\"`,\n fix: `attach evidence { kind: \"${kind}\" } before approving`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n\n let needsHuman = false;\n for (const req of gate.requires) {\n if (req === \"human\") {\n if (by !== \"human\") needsHuman = true;\n continue;\n }\n const ok = approverIds(state, gate.id, req.capability).includes(by);\n if (!ok) {\n violations.push({\n rule: \"gate:capability\",\n severity: \"error\",\n item: item.id,\n message: `\"${by}\" may not approve gate \"${gate.id}\" (needs capability \"${req.capability}\" and canApprove \"${gate.id}\")`,\n fix: `approve as one of: ${approverIds(state, gate.id, req.capability).join(\", \") || \"(no role qualifies; register one)\"}`,\n });\n continue;\n }\n const author = authorOf(state, item);\n if (author !== undefined && author === by) {\n const others = approverIds(state, gate.id, req.capability, by);\n violations.push({\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${by}\" did the work on \"${item.id}\" and may not approve it`,\n fix: `approve as a different role: ${others.join(\", \") || \"(register another approver)\"}`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n return needsHuman ? { outcome: \"human\" } : { outcome: \"pass\" };\n}\n\nexport function raisePending(\n state: WorkflowState,\n pending: Omit<PendingHuman, \"id\" | \"raisedAt\">,\n now?: string,\n): WorkflowState {\n const at = nowOf(now);\n const id = `p${state.events.filter((e) => e.type === \"pending.raised\").length + 1}`;\n const entry: PendingHuman = { ...pending, id, raisedAt: at };\n let next: WorkflowState = { ...state, pending: [...state.pending, entry] };\n if (pending.item) {\n const item = getItem(next, pending.item);\n if (item.status !== \"awaiting_human\")\n next = moveItem(next, pending.item, { status: \"awaiting_human\" }, \"system\", at);\n }\n return appendEvent(\n next,\n \"pending.raised\",\n \"system\",\n { id, kind: pending.kind, item: pending.item ?? null, gate: pending.gate ?? null },\n at,\n );\n}\n\nexport function decide(\n state: WorkflowState,\n pendingId: string,\n decision: \"approve\" | \"reject\",\n by: string,\n note: string,\n now?: string,\n methodology?: Methodology,\n): WorkflowState {\n if (decision !== \"approve\" && decision !== \"reject\")\n fail(\n \"invalid-input\",\n `decision must be \"approve\" or \"reject\" (got ${JSON.stringify(decision)})`,\n \"pass approve or reject\",\n );\n const entry = state.pending.find((p) => p.id === pendingId);\n if (!entry)\n fail(\n \"unknown-pending\",\n `no pending decision \"${pendingId}\"`,\n `open decisions: ${state.pending.map((p) => p.id).join(\", \") || \"(none)\"}`,\n );\n const item0 = entry.kind === \"gate\" && entry.item ? getItem(state, entry.item) : undefined;\n const gate =\n item0 &&\n (state.stages.find((s) => entry.gate !== undefined && s.gate?.id === entry.gate)?.gate ??\n state.stages.find((s) => s.id === item0.stage)?.gate);\n if (item0 && gate && by !== \"human\") {\n const res = gate.requires.includes(\"human\") ? undefined : checkGate(state, item0, gate, by);\n if (res?.outcome !== \"pass\")\n fail(\n \"gate-unmet\",\n `\"${by}\" may not decide gate \"${gate.id}\" on \"${item0.id}\"`,\n `decide as one of: human${gate.requires\n .flatMap((q) => (q === \"human\" ? [] : approverIds(state, gate.id, q.capability)))\n .map((r) => `, ${r}`)\n .join(\"\")}`,\n { items: [item0.id], rule: \"gate\" },\n );\n }\n const at = nowOf(now);\n let next: WorkflowState = { ...state, pending: state.pending.filter((p) => p.id !== pendingId) };\n next = appendEvent(\n next,\n \"pending.decided\",\n by,\n { id: pendingId, decision, note, item: entry.item ?? null, gate: entry.gate ?? null },\n at,\n );\n if (item0) {\n const id = item0.id;\n const gateId = entry.gate ?? gate?.id ?? null;\n if (decision === \"approve\") {\n next = advanceItem(next, id, by, false, at);\n next = appendEvent(next, \"gate.passed\", by, { item: id, gate: gateId }, at);\n } else {\n const onFail = gate?.onFail ?? { action: \"block\" as const };\n if (onFail.action === \"return-to\")\n next = clearRole(moveItem(next, id, { stage: onFail.stage, status: \"todo\" }, by, at), id);\n else\n next = raiseBlocker(\n next,\n id,\n `gate \"${gateId ?? \"?\"}\" rejected: ${note || \"no reason given\"}`,\n by,\n by,\n at,\n );\n next = appendEvent(next, \"gate.failed\", by, { item: id, gate: gateId, note }, at);\n }\n }\n if (methodology?.afterDecide) next = methodology.afterDecide(next, entry, decision, by, note, at);\n return next;\n}\n","import { authorOf } from \"./gates.ts\";\nimport { approverIds, separationLost } from \"./roles.ts\";\nimport type { Action, Handoff, Methodology, Rule, Violation } from \"./types.ts\";\n\nexport function coreRulesFor(methodology: Pick<Methodology, \"requiredCapabilities\">): Rule[] {\n const separation: Rule = {\n id: \"separation-lost\",\n severity: \"warning\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"init\" && action.type !== \"role.register\") return [];\n return separationLost(state, methodology.requiredCapabilities).map((r) => ({\n rule: \"separation-lost\",\n severity: \"warning\" as const,\n message: `role \"${r.id}\" holds every required capability (${methodology.requiredCapabilities.join(\", \")}); no separation of duties`,\n fix: \"fine for a solo operator; otherwise split capabilities across roles\",\n }));\n },\n };\n const coi: Rule = {\n id: \"conflict-of-interest\",\n severity: \"error\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"complete\") return [];\n const handoff = (action.payload as { handoff?: Handoff } | undefined)?.handoff;\n if (!handoff) return [];\n const verdict = handoff.verdict ?? \"done\";\n if (verdict !== \"done\" && verdict !== \"needs-review\") return [];\n const item = state.items[handoff.item];\n if (!item) return [];\n const gate = state.stages.find((s) => s.id === item.stage)?.gate;\n if (!gate || !gate.requires.some((q) => q !== \"human\")) return [];\n if (authorOf(state, item) !== handoff.role) return [];\n const others = approverIds(state, gate.id, undefined, handoff.role);\n return [\n {\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${handoff.role}\" authored \"${item.id}\" and may not pass gate \"${gate.id}\" on it`,\n fix: `hand the gate to another approver: ${others.join(\", \") || \"(register one)\"}`,\n },\n ];\n },\n };\n return [separation, coi];\n}\n","import { fail } from \"./errors.ts\";\nimport { requireCapabilities } from \"./roles.ts\";\nimport { coreRulesFor } from \"./rules.ts\";\nimport { createState } from \"./state.ts\";\nimport type {\n Action,\n ApplyResult,\n Methodology,\n Role,\n Stage,\n Violation,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function validateAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n): Violation[] {\n const out: Violation[] = [];\n for (const rule of [...coreRulesFor(methodology), ...methodology.rules])\n out.push(...rule.check(state, action));\n return out;\n}\n\nexport function applyAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n reduce: (s: WorkflowState) => WorkflowState,\n): ApplyResult {\n const violations = validateAction(state, methodology, action);\n const errors = violations.filter((v) => v.severity === \"error\");\n if (errors.length) {\n fail(\n \"rule-violation\",\n `${action.type} violates ${errors.map((e) => e.rule).join(\", \")}: ${errors.map((e) => e.message).join(\"; \")}`,\n errors.map((e) => e.fix).join(\"; \"),\n { rule: errors[0]!.rule, items: errors.map((e) => e.item).filter((x): x is string => !!x) },\n );\n }\n return { state: reduce(state), warnings: violations.filter((v) => v.severity === \"warning\") };\n}\n\nexport interface InitInput<C> {\n methodology: Methodology<C>;\n config: unknown;\n roles?: Role[];\n stages?: Stage[];\n by?: string;\n now?: string;\n}\n\nexport function init<C>(input: InitInput<C>): ApplyResult {\n const m = input.methodology;\n const config = m.validateConfig(input.config);\n const stages = input.stages ?? m.defaultStages(config);\n const roles = input.roles ?? m.defaultRoles(config);\n const stateInput =\n input.now !== undefined\n ? { methodology: m.name, config, stages, roles, now: input.now }\n : { methodology: m.name, config, stages, roles };\n const state = createState(stateInput);\n requireCapabilities(state, m.requiredCapabilities, m.exclusiveCapabilities);\n return applyAction(state, m as Methodology, { type: \"init\", by: input.by ?? \"system\" }, (s) => s);\n}\n"]}
1
+ {"version":3,"sources":["../src/state.ts","../src/roles.ts","../src/items.ts","../src/policies.ts","../src/gates.ts","../src/rules.ts","../src/methodology.ts"],"names":["nowOf","now","createState","input","seenStages","st","fail","roles","r","assertId","at","appendEvent","state","type","by","payload","ev","lastEvent","i","roleOf","id","OPEN","registerRole","role","next","retireRole","roleId","open","hasCapability","cap","rolesWith","approverIds","gateId","except","approversFor","requireCapabilities","required","exclusive","holders","separationLost","c","canDo","caps","requireCap","h","stageOf","stageId","s","nextStageOf","idx","isTerminalStage","putItem","item","patchItem","fn","getItem","stripItemFields","keys","copy","k","it","assertKnownItems","ids","what","missing","d","addItem","firstStage","_s","rest","editItem","patch","changed","updated","moveItem","to","toStage","addEvidence","evidence","raiseBlocker","reason","owner","blockerId","t","lastTransitionTo","status","clearBlocker","b","blockers","stillBlocked","prev","toStatus","dropRole","_r","noRole","clearRole","itemId","advanceItem","wantsReview","evaluatePolicies","policies","out","v","rule","message","fix","p","e","notDone","assertPolicies","context","unmet","u","lastDispatchBefore","order","here","from","authorOf","before","checkGate","gate","violations","kind","needsHuman","req","author","others","raisePending","pending","entry","decide","pendingId","decision","note","methodology","item0","q","onFail","coreRulesFor","action","handoff","verdict","validateAction","applyAction","reduce","errors","x","init","m","config","stages","stateInput"],"mappings":"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","file":"chunk-SJRRQZ3R.cjs","sourcesContent":["import { assertId, fail } from \"./errors.ts\";\nimport type { Event, MethodologyName, Role, Stage, WorkflowState } from \"./types.ts\";\n\nexport function nowOf(now?: string): string {\n return now ?? new Date().toISOString();\n}\n\nexport interface CreateStateInput {\n methodology: MethodologyName;\n config: unknown;\n stages: Stage[];\n roles: Role[];\n now?: string;\n}\n\nexport function createState(input: CreateStateInput): WorkflowState {\n const seenStages = new Set<string>();\n for (const st of input.stages) {\n if (seenStages.has(st.id))\n fail(\"config-invalid\", `duplicate stage id \"${st.id}\"`, \"give every stage a unique id\");\n seenStages.add(st.id);\n }\n const roles: Record<string, Role> = {};\n for (const r of input.roles) {\n assertId(r.id, \"role id\");\n if (Object.hasOwn(roles, r.id))\n fail(\"duplicate-role\", `duplicate role id \"${r.id}\"`, \"give every role a unique id\");\n roles[r.id] = r;\n }\n const at = nowOf(input.now);\n return {\n version: 1,\n methodology: input.methodology,\n config: input.config,\n items: {},\n stages: input.stages,\n roles,\n iterations: [],\n events: [\n {\n seq: 1,\n at,\n type: \"state.created\",\n by: \"system\",\n payload: { methodology: input.methodology },\n },\n ],\n accounting: [],\n pending: [],\n lessons: [],\n agreements: [],\n };\n}\n\nexport function appendEvent(\n state: WorkflowState,\n type: string,\n by: string,\n payload: unknown,\n now?: string,\n): WorkflowState {\n const last = state.events[state.events.length - 1];\n const ev: Event = { seq: (last?.seq ?? 0) + 1, at: nowOf(now), type, by, payload };\n return { ...state, events: [...state.events, ev] };\n}\n\nexport function lastEvent(state: WorkflowState, type?: string): Event | undefined {\n for (let i = state.events.length - 1; i >= 0; i--) {\n const ev = state.events[i]!;\n if (type === undefined || ev.type === type) return ev;\n }\n return undefined;\n}\n","import { assertId, fail } from \"./errors.ts\";\nimport { appendEvent } from \"./state.ts\";\nimport type { Capability, Role, WorkflowState } from \"./types.ts\";\n\n/** Own-property role lookup (ids such as \"constructor\" never hit the prototype). */\nexport function roleOf(state: WorkflowState, id: string): Role | undefined {\n return Object.hasOwn(state.roles, id) ? state.roles[id] : undefined;\n}\n\nconst OPEN: ReadonlySet<string> = new Set([\"in_progress\", \"review\", \"blocked\"]);\n\nexport function registerRole(\n state: WorkflowState,\n role: Role,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(role.id, \"role id\");\n if (roleOf(state, role.id))\n fail(\n \"duplicate-role\",\n `role \"${role.id}\" already exists`,\n `use a different id or retireRole(\"${role.id}\") first`,\n );\n const next = { ...state, roles: { ...state.roles, [role.id]: role } };\n return appendEvent(\n next,\n \"role.registered\",\n by,\n { role: role.id, capabilities: role.capabilities },\n now,\n );\n}\n\nexport function retireRole(\n state: WorkflowState,\n roleId: string,\n by: string,\n now?: string,\n): WorkflowState {\n if (!roleOf(state, roleId))\n fail(\n \"unknown-role\",\n `role \"${roleId}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \") || \"(none)\"}`,\n );\n const open = Object.values(state.items)\n .filter((i) => i.role === roleId && OPEN.has(i.status))\n .map((i) => i.id);\n if (open.length)\n fail(\n \"role-has-open-items\",\n `role \"${roleId}\" still holds ${open.length} open item(s)`,\n `complete or reassign ${open.join(\", \")} before retiring the role`,\n { items: open },\n );\n const roles = { ...state.roles };\n delete roles[roleId];\n return appendEvent({ ...state, roles }, \"role.retired\", by, { role: roleId }, now);\n}\n\nexport function hasCapability(role: Role, cap: Capability): boolean {\n return role.capabilities.includes(cap);\n}\n\nexport function rolesWith(state: WorkflowState, cap: Capability): Role[] {\n return Object.values(state.roles).filter((r) => hasCapability(r, cap));\n}\n\n/** Ids of roles that may approve `gateId`, optionally holding `cap` and excluding one id. */\nexport function approverIds(\n state: WorkflowState,\n gateId: string,\n cap?: string,\n except?: string,\n): string[] {\n return Object.values(state.roles)\n .filter(\n (r) =>\n r.id !== except &&\n r.canApprove.includes(gateId) &&\n (cap === undefined || (r.capabilities as readonly string[]).includes(cap)),\n )\n .map((r) => r.id);\n}\n\nexport function approversFor(state: WorkflowState, gateId: string): Role[] {\n return rolesWith(state, \"approve-gate\").filter((r) => r.canApprove.includes(gateId));\n}\n\nexport function requireCapabilities(\n state: WorkflowState,\n required: Capability[],\n exclusive: Capability[],\n): void {\n for (const cap of required) {\n if (rolesWith(state, cap).length === 0) {\n fail(\n \"missing-capability\",\n `no registered role has capability \"${cap}\"`,\n `register a role whose capabilities include \"${cap}\" (registerRole) before init`,\n );\n }\n }\n for (const cap of exclusive) {\n const holders = rolesWith(state, cap);\n if (holders.length > 1) {\n fail(\n \"exclusive-capability\",\n `capability \"${cap}\" must belong to exactly one role but is held by ${holders.map((r) => r.id).join(\", \")}`,\n `remove \"${cap}\" from all but one role`,\n );\n }\n }\n}\n\nexport function separationLost(state: WorkflowState, required: Capability[]): Role[] {\n if (required.length === 0) return [];\n return Object.values(state.roles).filter((r) => required.every((c) => hasCapability(r, c)));\n}\n\n/** `human` may do anything; a role must hold at least one of `caps`; unknown ids may do nothing. */\nexport function canDo(state: WorkflowState, by: string, ...caps: Capability[]): boolean {\n if (by === \"human\") return true;\n const role = roleOf(state, by);\n return !!role && caps.some((c) => hasCapability(role, c));\n}\n\nexport function requireCap(state: WorkflowState, by: string, ...caps: Capability[]): void {\n if (!canDo(state, by, ...caps)) {\n const holders = Object.values(state.roles)\n .filter((r) => caps.some((c) => hasCapability(r, c)))\n .map((r) => r.id);\n fail(\n \"missing-capability\",\n `\"${by}\" lacks capability ${caps.map((c) => `\"${c}\"`).join(\" or \")}`,\n `run this as one of: human${holders.map((h) => `, ${h}`).join(\"\")}`,\n );\n }\n}\n","import { assertId, fail } from \"./errors.ts\";\nimport type { ItemPatch } from \"./types.ts\";\n\nexport { assertId };\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Evidence,\n ItemStatus,\n NewItem,\n Stage,\n Transition,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function stageOf(state: WorkflowState, stageId: string): Stage {\n const st = state.stages.find((s) => s.id === stageId);\n if (!st)\n fail(\n \"unknown-stage\",\n `stage \"${stageId}\" does not exist`,\n `stages are: ${state.stages.map((s) => s.id).join(\" → \")}`,\n );\n return st;\n}\n\nexport function nextStageOf(state: WorkflowState, stageId: string): Stage | undefined {\n const idx = state.stages.findIndex((s) => s.id === stageId);\n if (idx < 0) stageOf(state, stageId);\n return state.stages[idx + 1];\n}\n\nexport function isTerminalStage(state: WorkflowState, stageId: string): boolean {\n return state.stages[state.stages.length - 1]?.id === stageId;\n}\n\nfunction putItem(state: WorkflowState, item: WorkItem): WorkflowState {\n return { ...state, items: { ...state.items, [item.id]: item } };\n}\n\n/** Replace one item with `fn(item)`; no event. */\nexport function patchItem(\n state: WorkflowState,\n id: string,\n fn: (item: WorkItem) => WorkItem,\n): WorkflowState {\n return putItem(state, fn(getItem(state, id)));\n}\n\n/** Drop optional fields (iteration, role, ...) from one item; no event. */\nexport function stripItemFields(\n state: WorkflowState,\n id: string,\n keys: Array<\"iteration\" | \"role\">,\n): WorkflowState {\n return patchItem(state, id, (item) => {\n const copy = { ...item };\n for (const k of keys) delete copy[k];\n return copy;\n });\n}\n\nexport function getItem(state: WorkflowState, id: string): WorkItem {\n const it = Object.hasOwn(state.items, id) ? state.items[id] : undefined;\n if (!it)\n fail(\n \"unknown-item\",\n `item \"${id}\" does not exist`,\n `add it with addItem first; known items: ${Object.keys(state.items).join(\", \") || \"(none)\"}`,\n { items: [id] },\n );\n return it;\n}\n\nfunction assertKnownItems(state: WorkflowState, ids: string[], what: string): void {\n const missing = ids.filter((d) => !Object.hasOwn(state.items, d));\n if (missing.length)\n fail(\n \"unknown-item\",\n `${what} refers to unknown item(s) ${missing.join(\", \")}`,\n \"add those items first or remove the reference\",\n { items: missing },\n );\n}\n\nexport function addItem(\n state: WorkflowState,\n input: NewItem,\n by: string,\n now?: string,\n): WorkflowState {\n assertId(input.id, \"item id\");\n if (Object.hasOwn(state.items, input.id))\n fail(\n \"duplicate-item\",\n `item \"${input.id}\" already exists`,\n \"use editItem to change it, or pick a new id\",\n { items: [input.id] },\n );\n const firstStage = state.stages[0];\n if (!firstStage)\n fail(\"config-invalid\", \"state has no stages\", \"create the state with at least one stage\");\n const stageId = input.stage ?? firstStage.id;\n stageOf(state, stageId);\n assertKnownItems(state, input.dependsOn ?? [], `item \"${input.id}\".dependsOn`);\n if (input.affects) assertKnownItems(state, input.affects, `item \"${input.id}\".affects`);\n if (input.parent !== undefined)\n assertKnownItems(state, [input.parent], `item \"${input.id}\".parent`);\n if (input.role !== undefined && !Object.hasOwn(state.roles, input.role))\n fail(\n \"unknown-role\",\n `role \"${input.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n\n const { stage: _s, ...rest } = input;\n const item: WorkItem = {\n type: \"task\",\n acceptance: [],\n dependsOn: [],\n ...rest,\n id: input.id,\n title: input.title,\n stage: stageId,\n status: \"todo\",\n evidence: [],\n blockers: [],\n transitions: [],\n };\n const next = putItem(state, item);\n return appendEvent(\n next,\n \"item.added\",\n by,\n {\n id: item.id,\n type: item.type,\n stage: item.stage,\n weight: item.weight ?? null,\n priority: item.priority ?? null,\n phase: item.phase ?? null,\n parent: item.parent ?? null,\n },\n now,\n );\n}\n\nexport type { ItemPatch } from \"./types.ts\";\n\nexport function editItem(\n state: WorkflowState,\n id: string,\n patch: ItemPatch,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n if (patch.dependsOn) assertKnownItems(state, patch.dependsOn, `item \"${id}\".dependsOn`);\n if (patch.affects) assertKnownItems(state, patch.affects, `item \"${id}\".affects`);\n if (patch.parent !== undefined) assertKnownItems(state, [patch.parent], `item \"${id}\".parent`);\n if (patch.role !== undefined && !Object.hasOwn(state.roles, patch.role))\n fail(\n \"unknown-role\",\n `role \"${patch.role}\" does not exist`,\n `registered roles: ${Object.keys(state.roles).join(\", \")}`,\n );\n const changed = (Object.keys(patch) as Array<keyof ItemPatch>).filter(\n (k) => JSON.stringify(patch[k]) !== JSON.stringify(item[k]),\n );\n if (changed.length === 0)\n fail(\n \"no-op\",\n `editItem(\"${id}\") changes nothing`,\n \"pass at least one field with a different value\",\n { items: [id] },\n );\n const updated: WorkItem = { ...item };\n for (const k of changed) (updated as unknown as Record<string, unknown>)[k] = patch[k];\n const next = putItem(state, updated);\n return appendEvent(next, \"item.edited\", by, { id, changed }, now);\n}\n\nexport function moveItem(\n state: WorkflowState,\n id: string,\n to: { stage?: string; status: ItemStatus },\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const toStage = to.stage ?? item.stage;\n stageOf(state, toStage);\n if (item.status === \"done\" || item.status === \"dropped\") {\n fail(\n \"invalid-transition\",\n `item \"${id}\" is ${item.status} and cannot move`,\n \"create a new item (or a change-request) instead of reopening a finished one\",\n { items: [id] },\n );\n }\n if (toStage === item.stage && to.status === item.status)\n fail(\n \"no-op\",\n `item \"${id}\" is already ${item.status} in \"${toStage}\"`,\n \"choose a different stage or status\",\n { items: [id] },\n );\n const at = nowOf(now);\n const updated: WorkItem = {\n ...item,\n stage: toStage,\n status: to.status,\n transitions: [\n ...item.transitions,\n {\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n at,\n by,\n },\n ],\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.transition\",\n by,\n {\n id,\n from: { stage: item.stage, status: item.status },\n to: { stage: toStage, status: to.status },\n },\n at,\n );\n}\n\nexport function addEvidence(\n state: WorkflowState,\n id: string,\n evidence: Omit<Evidence, \"at\">,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const updated: WorkItem = { ...item, evidence: [...item.evidence, { ...evidence, at }] };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"item.evidence\",\n evidence.by,\n { id, kind: evidence.kind, ref: evidence.ref },\n at,\n );\n}\n\nexport function raiseBlocker(\n state: WorkflowState,\n id: string,\n reason: string,\n owner: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const at = nowOf(now);\n const blockerId = `${id}-b${item.blockers.length + 1}`;\n const t: Transition | null =\n item.status === \"blocked\"\n ? null\n : {\n from: { stage: item.stage, status: item.status },\n to: { stage: item.stage, status: \"blocked\" },\n at,\n by,\n };\n const updated: WorkItem = {\n ...item,\n status: \"blocked\",\n blockers: [...item.blockers, { id: blockerId, reason, owner, raisedAt: at }],\n transitions: t ? [...item.transitions, t] : item.transitions,\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"blocker.raised\",\n by,\n { id, blocker: blockerId, reason, owner, transition: t && { from: t.from, to: t.to } },\n at,\n );\n}\n\nfunction lastTransitionTo(item: WorkItem, status: ItemStatus): Transition | undefined {\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === status) return t;\n }\n return undefined;\n}\n\nexport function clearBlocker(\n state: WorkflowState,\n id: string,\n blockerId: string,\n by: string,\n now?: string,\n): WorkflowState {\n const item = getItem(state, id);\n const idx = item.blockers.findIndex((b) => b.id === blockerId && !b.clearedAt);\n if (idx < 0)\n fail(\n \"invalid-input\",\n `item \"${id}\" has no open blocker \"${blockerId}\"`,\n `open blockers: ${\n item.blockers\n .filter((b) => !b.clearedAt)\n .map((b) => b.id)\n .join(\", \") || \"(none)\"\n }`,\n { items: [id] },\n );\n const at = nowOf(now);\n const blockers = item.blockers.map((b, i) => (i === idx ? { ...b, clearedAt: at } : b));\n const stillBlocked = blockers.some((b) => !b.clearedAt);\n const prev = lastTransitionTo(item, \"blocked\")?.from.status ?? \"todo\";\n let toStage = item.stage;\n let toStatus: ItemStatus = prev;\n let dropRole = false;\n if (prev === \"in_progress\") {\n toStatus = \"todo\";\n toStage = lastTransitionTo(item, \"in_progress\")?.from.stage ?? item.stage;\n } else if (prev === \"awaiting_human\") {\n // a rejected human gate: the work is re-dispatched in the current stage\n toStatus = stageOf(state, item.stage).review ? \"review\" : \"todo\";\n dropRole = true;\n }\n const { role: _r, ...noRole } = item;\n const t: Transition | null = stillBlocked\n ? null\n : {\n from: { stage: item.stage, status: \"blocked\" },\n to: { stage: toStage, status: toStatus },\n at,\n by,\n };\n const updated: WorkItem = {\n ...(dropRole && !stillBlocked ? (noRole as WorkItem) : item),\n blockers,\n stage: stillBlocked ? item.stage : toStage,\n status: stillBlocked ? \"blocked\" : toStatus,\n transitions: t ? [...item.transitions, t] : item.transitions,\n };\n const next = putItem(state, updated);\n return appendEvent(\n next,\n \"blocker.cleared\",\n by,\n { id, blocker: blockerId, transition: t && { from: t.from, to: t.to } },\n at,\n );\n}\n\n/** Entering a new stage is a new assignment: the role that finished the previous stage is cleared so the planner picks the right one (a reviewer, not the author). */\nexport function clearRole(state: WorkflowState, itemId: string): WorkflowState {\n return stripItemFields(state, itemId, [\"role\"]);\n}\n\n/** Move an item to the next stage (done at the end, review/todo otherwise) and clear its role. */\nexport function advanceItem(\n state: WorkflowState,\n itemId: string,\n by: string,\n wantsReview: boolean,\n now: string,\n): WorkflowState {\n const item = getItem(state, itemId);\n const to = nextStageOf(state, item.stage);\n if (!to) return moveItem(state, itemId, { status: \"done\" }, by, now);\n if (isTerminalStage(state, to.id))\n return moveItem(state, itemId, { stage: to.id, status: \"done\" }, by, now);\n const status = wantsReview || to.review === true ? \"review\" : \"todo\";\n return clearRole(moveItem(state, itemId, { stage: to.id, status }, by, now), itemId);\n}\n","import { fail } from \"./errors.ts\";\nimport type { Policy, Violation, WorkItem, WorkflowState } from \"./types.ts\";\n\nexport function evaluatePolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n): Violation[] {\n const out: Violation[] = [];\n const v = (rule: string, message: string, fix: string) =>\n out.push({ rule, severity: \"error\", item: item.id, message, fix });\n for (const p of policies) {\n switch (p.kind) {\n case \"evidence\":\n if (!item.evidence.some((e) => e.kind === p.evidenceKind))\n v(\n \"policy:evidence\",\n `item \"${item.id}\" has no evidence of kind \"${p.evidenceKind}\"`,\n `attach evidence { kind: \"${p.evidenceKind}\" } via addEvidence or in the handoff.produced`,\n );\n break;\n case \"acceptance-written\":\n if (item.acceptance.length === 0)\n v(\n \"policy:acceptance-written\",\n `item \"${item.id}\" has no acceptance criteria`,\n \"editItem with a non-empty acceptance[] (needs define-acceptance)\",\n );\n break;\n case \"estimate-present\":\n if (item.weight === undefined)\n v(\n \"policy:estimate-present\",\n `item \"${item.id}\" has no weight`,\n \"editItem with a weight (story points)\",\n );\n break;\n case \"no-open-blockers\": {\n const open = item.blockers.filter((b) => !b.clearedAt);\n if (open.length)\n v(\n \"policy:no-open-blockers\",\n `item \"${item.id}\" has ${open.length} open blocker(s)`,\n `clearBlocker ${open.map((b) => b.id).join(\", \")}`,\n );\n break;\n }\n case \"dependencies-done\": {\n const notDone = item.dependsOn.filter((d) => state.items[d]?.status !== \"done\");\n if (notDone.length)\n v(\n \"policy:dependencies-done\",\n `item \"${item.id}\" depends on unfinished ${notDone.join(\", \")}`,\n `finish ${notDone.join(\", \")} first`,\n );\n break;\n }\n case \"custom\":\n if (!item.evidence.some((e) => e.kind === `policy:${p.id}`))\n v(\n `policy:custom:${p.id}`,\n `item \"${item.id}\" has not satisfied \"${p.description}\"`,\n `attach evidence { kind: \"policy:${p.id}\" } when it is satisfied`,\n );\n break;\n }\n }\n return out;\n}\n\nexport function assertPolicies(\n state: WorkflowState,\n item: WorkItem,\n policies: Policy[],\n context: string,\n): void {\n const unmet = evaluatePolicies(state, item, policies);\n if (unmet.length) {\n fail(\n \"policy-unmet\",\n `item \"${item.id}\" cannot ${context}: ${unmet.length} polic${unmet.length === 1 ? \"y\" : \"ies\"} unmet`,\n unmet.map((u) => u.fix).join(\"; \"),\n { items: [item.id] },\n );\n }\n}\n","import { fail } from \"./errors.ts\";\nimport { advanceItem, clearRole, getItem, moveItem, raiseBlocker } from \"./items.ts\";\nimport { approverIds } from \"./roles.ts\";\nimport { appendEvent, nowOf } from \"./state.ts\";\nimport type {\n Gate,\n Methodology,\n PendingHuman,\n Transition,\n Violation,\n WorkItem,\n WorkflowState,\n} from \"./types.ts\";\n\nexport type GateResult =\n | { outcome: \"pass\" }\n | { outcome: \"human\" }\n | { outcome: \"fail\"; violations: Violation[] };\n\n/** Last in_progress dispatch made from a stage that comes STRICTLY BEFORE the item's current stage in `state.stages` order (unknown stage ids count as not-before). */\nexport function lastDispatchBefore(state: WorkflowState, item: WorkItem): Transition | undefined {\n const order = new Map(state.stages.map((s, i) => [s.id, i] as const));\n const here = order.get(item.stage);\n if (here === undefined) return undefined;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n const from = order.get(t.from.stage);\n if (t.to.status === \"in_progress\" && from !== undefined && from < here) return t;\n }\n return undefined;\n}\n\n/** Role that did the work the gate guards: the last dispatch made from a stage strictly before the current one (so a reviewer dispatched into the gated stage is not its author); else the last dispatch of any stage; undefined if never dispatched. */\nexport function authorOf(state: WorkflowState, item: WorkItem): string | undefined {\n const before = lastDispatchBefore(state, item);\n if (before) return before.by;\n for (let i = item.transitions.length - 1; i >= 0; i--) {\n const t = item.transitions[i]!;\n if (t.to.status === \"in_progress\") return t.by;\n }\n return undefined;\n}\n\nexport function checkGate(\n state: WorkflowState,\n item: WorkItem,\n gate: Gate,\n by: string,\n): GateResult {\n const violations: Violation[] = [];\n for (const kind of gate.evidence) {\n if (!item.evidence.some((e) => e.kind === kind)) {\n violations.push({\n rule: \"gate:evidence\",\n severity: \"error\",\n item: item.id,\n message: `gate \"${gate.id}\" needs evidence \"${kind}\" on item \"${item.id}\"`,\n fix: `attach evidence { kind: \"${kind}\" } before approving`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n\n let needsHuman = false;\n for (const req of gate.requires) {\n if (req === \"human\") {\n if (by !== \"human\") needsHuman = true;\n continue;\n }\n const ok = approverIds(state, gate.id, req.capability).includes(by);\n if (!ok) {\n violations.push({\n rule: \"gate:capability\",\n severity: \"error\",\n item: item.id,\n message: `\"${by}\" may not approve gate \"${gate.id}\" (needs capability \"${req.capability}\" and canApprove \"${gate.id}\")`,\n fix: `approve as one of: ${approverIds(state, gate.id, req.capability).join(\", \") || \"(no role qualifies; register one)\"}`,\n });\n continue;\n }\n const author = authorOf(state, item);\n if (author !== undefined && author === by) {\n const others = approverIds(state, gate.id, req.capability, by);\n violations.push({\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${by}\" did the work on \"${item.id}\" and may not approve it`,\n fix: `approve as a different role: ${others.join(\", \") || \"(register another approver)\"}`,\n });\n }\n }\n if (violations.length) return { outcome: \"fail\", violations };\n return needsHuman ? { outcome: \"human\" } : { outcome: \"pass\" };\n}\n\nexport function raisePending(\n state: WorkflowState,\n pending: Omit<PendingHuman, \"id\" | \"raisedAt\">,\n now?: string,\n): WorkflowState {\n const at = nowOf(now);\n const id = `p${state.events.filter((e) => e.type === \"pending.raised\").length + 1}`;\n const entry: PendingHuman = { ...pending, id, raisedAt: at };\n let next: WorkflowState = { ...state, pending: [...state.pending, entry] };\n if (pending.item) {\n const item = getItem(next, pending.item);\n if (item.status !== \"awaiting_human\")\n next = moveItem(next, pending.item, { status: \"awaiting_human\" }, \"system\", at);\n }\n return appendEvent(\n next,\n \"pending.raised\",\n \"system\",\n { id, kind: pending.kind, item: pending.item ?? null, gate: pending.gate ?? null },\n at,\n );\n}\n\nexport function decide(\n state: WorkflowState,\n pendingId: string,\n decision: \"approve\" | \"reject\",\n by: string,\n note: string,\n now?: string,\n methodology?: Methodology,\n): WorkflowState {\n if (decision !== \"approve\" && decision !== \"reject\")\n fail(\n \"invalid-input\",\n `decision must be \"approve\" or \"reject\" (got ${JSON.stringify(decision)})`,\n \"pass approve or reject\",\n );\n const entry = state.pending.find((p) => p.id === pendingId);\n if (!entry)\n fail(\n \"unknown-pending\",\n `no pending decision \"${pendingId}\"`,\n `open decisions: ${state.pending.map((p) => p.id).join(\", \") || \"(none)\"}`,\n );\n const item0 = entry.kind === \"gate\" && entry.item ? getItem(state, entry.item) : undefined;\n const gate =\n item0 &&\n (state.stages.find((s) => entry.gate !== undefined && s.gate?.id === entry.gate)?.gate ??\n state.stages.find((s) => s.id === item0.stage)?.gate);\n if (item0 && gate && by !== \"human\") {\n const res = gate.requires.includes(\"human\") ? undefined : checkGate(state, item0, gate, by);\n if (res?.outcome !== \"pass\")\n fail(\n \"gate-unmet\",\n `\"${by}\" may not decide gate \"${gate.id}\" on \"${item0.id}\"`,\n `decide as one of: human${gate.requires\n .flatMap((q) => (q === \"human\" ? [] : approverIds(state, gate.id, q.capability)))\n .map((r) => `, ${r}`)\n .join(\"\")}`,\n { items: [item0.id], rule: \"gate\" },\n );\n }\n const at = nowOf(now);\n let next: WorkflowState = { ...state, pending: state.pending.filter((p) => p.id !== pendingId) };\n next = appendEvent(\n next,\n \"pending.decided\",\n by,\n { id: pendingId, decision, note, item: entry.item ?? null, gate: entry.gate ?? null },\n at,\n );\n if (item0) {\n const id = item0.id;\n const gateId = entry.gate ?? gate?.id ?? null;\n if (decision === \"approve\") {\n next = advanceItem(next, id, by, false, at);\n next = appendEvent(next, \"gate.passed\", by, { item: id, gate: gateId }, at);\n } else {\n const onFail = gate?.onFail ?? { action: \"block\" as const };\n if (onFail.action === \"return-to\")\n next = clearRole(moveItem(next, id, { stage: onFail.stage, status: \"todo\" }, by, at), id);\n else\n next = raiseBlocker(\n next,\n id,\n `gate \"${gateId ?? \"?\"}\" rejected: ${note || \"no reason given\"}`,\n by,\n by,\n at,\n );\n next = appendEvent(next, \"gate.failed\", by, { item: id, gate: gateId, note }, at);\n }\n }\n if (methodology?.afterDecide) next = methodology.afterDecide(next, entry, decision, by, note, at);\n return next;\n}\n","import { authorOf } from \"./gates.ts\";\nimport { approverIds, separationLost } from \"./roles.ts\";\nimport type { Action, Handoff, Methodology, Rule, Violation } from \"./types.ts\";\n\nexport function coreRulesFor(methodology: Pick<Methodology, \"requiredCapabilities\">): Rule[] {\n const separation: Rule = {\n id: \"separation-lost\",\n severity: \"warning\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"init\" && action.type !== \"role.register\") return [];\n return separationLost(state, methodology.requiredCapabilities).map((r) => ({\n rule: \"separation-lost\",\n severity: \"warning\" as const,\n message: `role \"${r.id}\" holds every required capability (${methodology.requiredCapabilities.join(\", \")}); no separation of duties`,\n fix: \"fine for a solo operator; otherwise split capabilities across roles\",\n }));\n },\n };\n const coi: Rule = {\n id: \"conflict-of-interest\",\n severity: \"error\",\n check(state, action: Action): Violation[] {\n if (action.type !== \"complete\") return [];\n const handoff = (action.payload as { handoff?: Handoff } | undefined)?.handoff;\n if (!handoff) return [];\n const verdict = handoff.verdict ?? \"done\";\n if (verdict !== \"done\" && verdict !== \"needs-review\") return [];\n const item = state.items[handoff.item];\n if (!item) return [];\n const gate = state.stages.find((s) => s.id === item.stage)?.gate;\n if (!gate || !gate.requires.some((q) => q !== \"human\")) return [];\n if (authorOf(state, item) !== handoff.role) return [];\n const others = approverIds(state, gate.id, undefined, handoff.role);\n return [\n {\n rule: \"conflict-of-interest\",\n severity: \"error\",\n item: item.id,\n message: `role \"${handoff.role}\" authored \"${item.id}\" and may not pass gate \"${gate.id}\" on it`,\n fix: `hand the gate to another approver: ${others.join(\", \") || \"(register one)\"}`,\n },\n ];\n },\n };\n return [separation, coi];\n}\n","import { fail } from \"./errors.ts\";\nimport { requireCapabilities } from \"./roles.ts\";\nimport { coreRulesFor } from \"./rules.ts\";\nimport { createState } from \"./state.ts\";\nimport type {\n Action,\n ApplyResult,\n Methodology,\n Role,\n Stage,\n Violation,\n WorkflowState,\n} from \"./types.ts\";\n\nexport function validateAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n): Violation[] {\n const out: Violation[] = [];\n for (const rule of [...coreRulesFor(methodology), ...methodology.rules])\n out.push(...rule.check(state, action));\n return out;\n}\n\nexport function applyAction(\n state: WorkflowState,\n methodology: Methodology,\n action: Action,\n reduce: (s: WorkflowState) => WorkflowState,\n): ApplyResult {\n const violations = validateAction(state, methodology, action);\n const errors = violations.filter((v) => v.severity === \"error\");\n if (errors.length) {\n fail(\n \"rule-violation\",\n `${action.type} violates ${errors.map((e) => e.rule).join(\", \")}: ${errors.map((e) => e.message).join(\"; \")}`,\n errors.map((e) => e.fix).join(\"; \"),\n { rule: errors[0]!.rule, items: errors.map((e) => e.item).filter((x): x is string => !!x) },\n );\n }\n return { state: reduce(state), warnings: violations.filter((v) => v.severity === \"warning\") };\n}\n\nexport interface InitInput<C> {\n methodology: Methodology<C>;\n config: unknown;\n roles?: Role[];\n stages?: Stage[];\n by?: string;\n now?: string;\n}\n\nexport function init<C>(input: InitInput<C>): ApplyResult {\n const m = input.methodology;\n const config = m.validateConfig(input.config);\n const stages = input.stages ?? m.defaultStages(config);\n const roles = input.roles ?? m.defaultRoles(config);\n const stateInput =\n input.now !== undefined\n ? { methodology: m.name, config, stages, roles, now: input.now }\n : { methodology: m.name, config, stages, roles };\n const state = createState(stateInput);\n requireCapabilities(state, m.requiredCapabilities, m.exclusiveCapabilities);\n return applyAction(state, m as Methodology, { type: \"init\", by: input.by ?? \"system\" }, (s) => s);\n}\n"]}
@@ -1,2 +1,2 @@
1
- 'use strict';var chunk23P7C25E_cjs=require('./chunk-23P7C25E.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),exsorted=require('exsorted');var M=new Set(["in_progress","blocked","awaiting_human"]),P=new Set(["todo","in_progress","blocked","review","awaiting_human"]);function oe(e){let t=e.stages[0];return t||chunkS3BXVHO7_cjs.b("config-invalid","kanban board has no columns","init with at least options, a commitment column and a delivery column"),t}function B(e){let t=e.stages.find(a=>a.commitmentPoint);return t||chunkS3BXVHO7_cjs.b("config-invalid","no column is the commitment point","set commitmentPoint: true on exactly one column"),t}function X(e){let t=e.stages.find(a=>a.deliveryPoint);return t||chunkS3BXVHO7_cjs.b("config-invalid","no column is the delivery point","set deliveryPoint: true on the last column"),t}function Q(e,t){return chunk23P7C25E_cjs.p(e,t),e.stages.findIndex(a=>a.id===t)}function E(e,t){let a=Q(e,t.stage);return a>=Q(e,B(e).id)&&a<Q(e,X(e).id)}function J(e){return Object.values(e.items).filter(t=>t.classOfService==="expedite"&&M.has(t.status)&&E(e,t)).map(t=>t.id)}function N(e){for(let t=e.transitions.length-1;t>=0;t--){let a=e.transitions[t];if(a.to.stage===e.stage&&a.from.stage!==e.stage)return a.at}}var U=["replenishment","delivery-planning","service-delivery-review","operations-review","risk-review","strategy-review"],D=["expedite","fixed-date","standard","intangible"],ee=864e5;function x(e){return e.config}var Ce=[{id:"options",name:"Options",policies:[{kind:"acceptance-written"}]},{id:"ready",name:"Ready",wipLimit:4,commitmentPoint:true,policies:[{kind:"dependencies-done"}]},{id:"dev",name:"Development",wipLimit:3,policies:[{kind:"evidence",evidenceKind:"test-output"}]},{id:"review",name:"Review",wipLimit:2,review:true,policies:[{kind:"no-open-blockers"}]},{id:"done",name:"Done",deliveryPoint:true,policies:[]}],K=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function _(e,t,a,s=1){if(e!==void 0)return (typeof e!="number"||!Number.isFinite(e)||e<s)&&chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.${t} must be a number >= ${s} (got ${JSON.stringify(e)})`,a),e}var Ae=["acceptance-written","estimate-present","no-open-blockers","dependencies-done"],se=e=>typeof e=="string"&&e.trim()!=="";function ae(e,t){Array.isArray(e)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.${t} must be an array of Policy objects`,'e.g. [{ "kind": "evidence", "evidenceKind": "test-output" }]');let a=[];return e.forEach((s,m)=>{let u=`kanban config.${t}[${m}]`;K(s)&&(s.kind==="evidence"?se(s.evidenceKind):s.kind==="custom"?se(s.id)&&se(s.description):typeof s.kind=="string"&&Ae.includes(s.kind))||chunkS3BXVHO7_cjs.b("config-invalid",`${u} must be a Policy`,`use a Policy such as { "kind": "evidence", "evidenceKind": "test-output" }, { "kind": "custom", "id": "x", "description": "..." } or one of: ${Ae.join(", ")}`),a.push(s);}),a}function Le(e,t){K(e)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.columns[${t}] must be an object`,'e.g. { "id": "dev", "policies": [] }'),chunkS3BXVHO7_cjs.c(e.id,`kanban config.columns[${t}].id`);let a=e.id;Array.isArray(e.policies)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.columns[${t}] ("${a}") needs policies: Policy[]`,'every column states its policies explicitly, e.g. [{ "kind": "acceptance-written" }]');let s={id:a,name:typeof e.name=="string"&&e.name.trim()!==""?e.name:a,policies:ae(e.policies,`columns[${t}].policies`)},m=_(e.wipLimit,`columns[${t}].wipLimit`,"omit wipLimit for no limit");m!==void 0&&(s.wipLimit=m);for(let u of ["commitmentPoint","deliveryPoint","review"])e[u]!==void 0&&(typeof e[u]!="boolean"&&chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.columns[${t}].${u} must be a boolean`,`set ${u}: true or omit it`),e[u]&&(s[u]=true));return s}function Y(e){let t=e??{};t.columns!==void 0&&!Array.isArray(t.columns)&&chunkS3BXVHO7_cjs.b("config-invalid","kanban config.columns must be an array of columns","omit columns for the default board (options, ready, dev, review, done)");let a=t.columns===void 0?Ce.map(r=>({...r})):t.columns.map(Le),s=new Set;for(let r of a)s.has(r.id)&&chunkS3BXVHO7_cjs.b("config-invalid",`duplicate column id "${r.id}"`,"give every column a unique id"),s.add(r.id);let m={},u=t.classesOfService??{};K(u)||chunkS3BXVHO7_cjs.b("config-invalid","kanban config.classesOfService must be an object keyed by class",'e.g. { "expedite": { "wipBypass": 1 } }');for(let[r,c]of Object.entries(u)){D.includes(r)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.classesOfService.${r} is not a class of service`,`use one of: ${D.join(", ")}`),K(c)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.classesOfService.${r} must be an object`,'e.g. { "wipBypass": 1, "sle": { "percentile": 85, "targetMs": 604800000 } }');let d={},f=_(c.wipBypass,`classesOfService.${r}.wipBypass`,"omit it for the default 1",0);if(f!==void 0&&(d.wipBypass=f),c.sle!==void 0){let y=c.sle;(!K(y)||typeof y.percentile!="number"||y.percentile<0||y.percentile>100)&&chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.classesOfService.${r}.sle.percentile must be 0..100`,'e.g. { "percentile": 85, "targetMs": 604800000 }');let k=_(y.targetMs,`classesOfService.${r}.sle.targetMs`,"state the service level target in milliseconds");k===void 0&&chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.classesOfService.${r}.sle.targetMs is required`,"state the service level target in milliseconds"),d.sle={percentile:y.percentile,targetMs:k};}m[r]=d;}let g=t.fairness??{};(!K(g)||g.aging!==void 0&&typeof g.aging!="boolean")&&chunkS3BXVHO7_cjs.b("config-invalid","kanban config.fairness must be { aging: boolean, maxDeferralRounds?: number }","omit it for aging on");let l=_(g.maxDeferralRounds,"fairness.maxDeferralRounds","omit it for 5 rounds"),i={aging:g.aging===void 0?true:g.aging,maxDeferralRounds:l??5},o={},n=t.cadences??{};K(n)||chunkS3BXVHO7_cjs.b("config-invalid","kanban config.cadences must be an object keyed by cadence",'e.g. { "replenishment": { "everyTurns": 10 } }');for(let[r,c]of Object.entries(n)){U.includes(r)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.cadences.${r} is not a cadence`,`use one of: ${U.join(", ")}`),K(c)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.cadences.${r} must be an object`,'e.g. { "everyTurns": 10 }');let d=_(c.everyTurns,`cadences.${r}.everyTurns`,"omit it when the cadence is run by hand");o[r]=d===void 0?{}:{everyTurns:d};}return {columns:a,classesOfService:m,fairness:i,cadences:o,throughputWindowMs:_(t.throughputWindowMs,"throughputWindowMs","omit it for one week")??7*ee,maxExpedite:_(t.maxExpedite,"maxExpedite","omit it for 1")??1}}function te(e,t){return e.events.find(s=>s.type==="item.added"&&s.payload.id===t)?.at??e.events[0].at}function ne(e,t,a){return Date.parse(a)-Date.parse(N(t)??te(e,t.id))}function Ke(e,t){return e.stages.map(a=>{let s=Object.values(e.items).filter(l=>l.stage===a.id&&l.status!=="dropped"),m=exsorted.timSort(s.map(l=>({id:l.id,title:l.title,type:l.type,status:l.status,classOfService:l.classOfService??"standard",role:l.role??null,ageMs:ne(e,l,t),blocked:l.blockers.some(i=>!i.clearedAt),deadline:l.deadline??null})),(l,i)=>i.ageMs-l.ageMs||(l.id<i.id?-1:1)),u=m.filter(l=>M.has(l.status)).length,g=m.filter(l=>l.status==="todo"||l.status==="review").length;return {id:a.id,name:a.name,wipLimit:a.wipLimit??null,active:u,queued:g,overLimit:a.wipLimit!==void 0&&u>a.wipLimit,commitmentPoint:a.commitmentPoint===true,deliveryPoint:a.deliveryPoint===true,cards:m}})}var Re=e=>`cadence.${e}`;function ce(e){let t=x(e);return U.map(a=>{let s=0,m=null;for(let l of e.events)l.type===Re(a)&&(s=l.seq,m=l.at);let u=e.events.filter(l=>l.type==="item.completed"&&l.seq>s).length,g=t.cadences[a]?.everyTurns??null;return {cadence:a,everyTurns:g,lastAt:m,turnsSince:u,due:g!==null&&u>=g}})}var $e=(e,t)=>Date.parse(t)-Date.parse(e),Me=e=>e.transition??null;function ie(e,t,a){let s=new Map,m=[],u=e[0]?.at??"1970-01-01T00:00:00.000Z",g=(i,o,n)=>{o===t&&i.committedAt===void 0&&(i.committedAt=n),o===a&&i.deliveredAt===void 0&&(i.deliveredAt=n);},l=(i,o,n)=>{i.since.status==="in_progress"&&(i.activeMs+=$e(i.since.at,n)),i.since.status==="blocked"&&(i.blockedMs+=$e(i.since.at,n)),i.since={status:o.status,at:n},o.stage!==i.stage&&(i.stays[i.stays.length-1].leftAt=n,i.stays.push({stage:o.stage,enteredAt:n}),g(i,o.stage,n)),i.stage=o.stage,i.status=o.status;};for(let i of e){u=i.at;let o=i.payload??{};switch(i.type){case "item.added":{let n=o.id,r=o.stage,c={id:n,type:typeof o.type=="string"?o.type:"task",stage:r,status:"todo",stays:[{stage:r,enteredAt:i.at}],classOfService:"standard",activeMs:0,blockedMs:0,since:{status:"todo",at:i.at}};g(c,r,i.at),s.set(n,c);break}case "item.transition":{let n=s.get(o.id);if(!n)break;l(n,o.to,i.at);break}case "cadence.replenishment":{let n=o.items??[];for(let r of n){let c=s.get(r.id);c&&(c.classOfService=r.classOfService,r.deadline?c.deadline=r.deadline:delete c.deadline);}break}case "blocker.raised":{m.push({item:o.id,blocker:o.blocker,raisedAt:i.at});let n=s.get(o.id),r=Me(o);n&&r&&l(n,r.to,i.at);break}case "blocker.cleared":{let n=m.find(d=>d.item===o.id&&d.blocker===o.blocker&&d.clearedAt===void 0);n&&(n.clearedAt=i.at);let r=s.get(o.id),c=Me(o);r&&c&&l(r,c.to,i.at);break}}}return {items:s,blockers:m,lastAt:u}}function q(e,t){if(e.length===0)return 0;let a=exsorted.timSort([...e],(m,u)=>m-u),s=Math.min(a.length,Math.max(1,Math.ceil(t/100*a.length)));return a[s-1]}var H=(e,t)=>Date.parse(t)-Date.parse(e),Pe=(e,t)=>t===0?0:e/t;function Ee(e){let t=e.stages.find(s=>s.commitmentPoint)?.id??"",a=e.stages.find(s=>s.deliveryPoint)?.id??"";return {commitment:t,delivery:a,ci:e.stages.findIndex(s=>s.id===t),di:e.stages.findIndex(s=>s.id===a)}}function De(e){let t={};for(let a of e.items.values())for(let s of a.stays)s.leftAt!==void 0&&(t[s.stage]??=[]).push(H(s.enteredAt,s.leftAt));return t}function de(e){let t=Ee(e);return De(ie(e.events,t.commitment,t.delivery))}function G(e){let t=x(e),a=Ee(e),s=ie(e.events,a.commitment,a.delivery),m=[...s.items.values()],u=e.stages.map(p=>p.id),g=new Map(u.map((p,b)=>[p,b])),l=exsorted.timSort(m.filter(p=>p.type!=="question"&&p.committedAt!==void 0&&p.deliveredAt!==void 0),(p,b)=>Date.parse(p.deliveredAt)-Date.parse(b.deliveredAt)),i=l.map(p=>H(p.committedAt,p.deliveredAt)),o={};for(let[p,b]of Object.entries(De(s)))o[p]=b.reduce((h,S)=>h+S,0)/b.length;let n=m.filter(p=>p.type!=="question"&&p.committedAt!==void 0).map(p=>Date.parse(p.committedAt)),r=[];if(n.length>0){let p=n.reduce((h,S)=>S<h?S:h,n[0]),b=Math.floor((Date.parse(s.lastAt)-p)/t.throughputWindowMs)+1;r=Array.from({length:b},()=>0);for(let h of l){let S=Math.floor((Date.parse(h.deliveredAt)-p)/t.throughputWindowMs);S>=0&&S<b&&(r[S]+=1);}}let c=Object.fromEntries(u.map(p=>[p,0])),d={};for(let p of m){if(!P.has(p.status))continue;Object.hasOwn(c,p.stage)&&(c[p.stage]+=1);let b=g.get(p.stage);b!==void 0&&b>=a.ci&&b<a.di&&(d[p.id]=H(p.stays[p.stays.length-1].enteredAt,s.lastAt));}let f=new Map;for(let p of m)for(let b of p.stays){let h=f.get(b.stage)??new Map;h.has(p.id)||h.set(p.id,b.enteredAt),f.set(b.stage,h);}let y=exsorted.timSort([...new Set(e.events.map(p=>p.at.slice(0,10)))],(p,b)=>p<b?-1:p>b?1:0),k={};for(let p of y)for(let b of u)k[`${p}:${b}`]=[...f.get(b)?.values()??[]].filter(h=>h.slice(0,10)<=p).length;let w={};for(let[p,b]of Object.entries(t.classesOfService)){if(!b?.sle)continue;let h=l.filter(S=>S.classOfService===p);h.length!==0&&(w[p]=h.filter(S=>H(S.committedAt,S.deliveredAt)<=b.sle.targetMs).length/h.length);}let I=s.blockers.reduce((p,b)=>p+H(b.raisedAt,b.clearedAt??s.lastAt),0);return {leadTimeMs:i,leadTimeP50:q(i,50),leadTimeP85:q(i,85),cycleTimeMsByColumn:o,throughput:r,wipByColumn:c,flowEfficiency:Pe(l.reduce((p,b)=>p+b.activeMs,0),i.reduce((p,b)=>p+b,0)),agingWipMs:d,cumulativeFlow:k,sleCompliance:w,blockerTimeMs:I,meanBlockerTimeMs:Pe(I,s.blockers.length)}}function me(e,t){let a=Date.parse(t),s=de(e),m=[],u=[],g=Object.fromEntries(e.stages.map(i=>[i.id,0])),l=Object.fromEntries(e.stages.map(i=>[i.id,0]));for(let i of Object.values(e.items)){for(let o of i.blockers)o.clearedAt||m.push({item:i.id,blocker:o.id,owner:o.owner,reason:o.reason,ageMs:a-Date.parse(o.raisedAt)});if(M.has(i.status)?l[i.stage]=(l[i.stage]??0)+1:(i.status==="todo"||i.status==="review")&&(g[i.stage]=(g[i.stage]??0)+1),P.has(i.status)&&E(e,i)){let o=s[i.stage]??[],n=o.length?q(o,85):null,r=ne(e,i,t);u.push({item:i.id,column:i.stage,status:i.status,ageMs:r,p85Ms:n,overP85:n!==null&&r>n});}}return {blockers:m,agingWip:exsorted.timSort(u,(i,o)=>o.ageMs-i.ageMs||(i.item<o.item?-1:1)),queued:g,active:l}}function Ne(e,t){let a=B(e).id;return e.items[t].transitions.find(u=>u.to.stage===a&&u.from.stage!==a)?.at??te(e,t)}function fe(e,t,a){let s=Date.parse(t),m=x(e),u=G(e).leadTimeMs,g=m.classesOfService["fixed-date"]?.sle?.percentile??85,l=u.length?q(u,g):null,i=[],o=[];for(let n of Object.values(e.items)){for(let f of n.blockers){let y=f.clearedAt?0:s-Date.parse(f.raisedAt);!f.clearedAt&&y>a&&o.push({item:n.id,blocker:f.id,owner:f.owner,ageMs:y});}if(n.classOfService!=="fixed-date"||!n.deadline||!P.has(n.status)||!E(e,n))continue;let r=s-Date.parse(Ne(e,n.id)),c=l===null?null:Math.max(0,l-r),d=Date.parse(n.deadline)-s;i.push({item:n.id,deadline:n.deadline,timeLeftMs:d,projectedRemainingMs:c,atRisk:d<0||c!==null&&c>d});}return {fixedDate:i,staleBlockers:o,expediteActive:J(e)}}var V=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function ue(e,t,a){let s=t.items;(!Array.isArray(s)||s.length===0||!s.every(u=>typeof u=="string"))&&chunkS3BXVHO7_cjs.b("invalid-input",`${a} needs items: string[]`,'pass ["A", "B"]');let m=s.find((u,g)=>s.indexOf(u)!==g);m!==void 0&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${m}" appears twice in items[]`,"list each item once",{items:[m]});for(let u of s)chunk23P7C25E_cjs.u(e,u);return s}function _e(e){return V(e)&&typeof e.percentile=="number"&&e.percentile>=0&&e.percentile<=100&&typeof e.targetMs=="number"&&Number.isFinite(e.targetMs)&&e.targetMs>0}function Ie(e,t){let{wipLimit:a,...s}=e;return t===null?s:{...s,wipLimit:t}}function pe(e){let t=(i,o,n,r)=>chunk23P7C25E_cjs.M(i,e(),{type:o,by:n.by,payload:n},c=>r(c,chunk23P7C25E_cjs.a(n.now)));return {replenishment:(i,o)=>{chunk23P7C25E_cjs.o(i,o.by,"order-backlog","manage-flow");let n=ue(i,o,"replenishment"),r=B(i),c=oe(i);for(let d of n)chunk23P7C25E_cjs.E(i,chunk23P7C25E_cjs.u(i,d),c.exitPolicy,`leave "${c.id}"`);return t(i,"ceremony.replenishment",o,(d,f)=>{for(let y of n)d=chunk23P7C25E_cjs.x(d,y,{stage:r.id,status:"todo"},o.by,f);return chunk23P7C25E_cjs.c(d,"cadence.replenishment",o.by,{column:r.id,items:n.map(y=>{let k=chunk23P7C25E_cjs.u(d,y);return {id:y,classOfService:k.classOfService??"standard",deadline:k.deadline??null}})},f)})},"delivery-planning":(i,o)=>{chunk23P7C25E_cjs.o(i,o.by,"facilitate","manage-flow");let n=ue(i,o,"delivery-planning"),r=X(i),c=i.stages[i.stages.findIndex(d=>d.id===r.id)-1];for(let d of n){let f=chunk23P7C25E_cjs.u(i,d);f.stage!==c.id&&f.stage!==r.id&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${d}" is in "${f.stage}", not ready for delivery`,`only cards in "${c.id}" or "${r.id}" can be planned for delivery`,{items:[d]});}return t(i,"ceremony.delivery-planning",o,(d,f)=>chunk23P7C25E_cjs.c(d,"cadence.delivery-planning",o.by,{items:n,window:typeof o.window=="string"?o.window:null,delivered:n.filter(y=>chunk23P7C25E_cjs.u(d,y).status==="done")},f))},"service-delivery-review":(i,o)=>{chunk23P7C25E_cjs.o(i,o.by,"manage-flow");let n=o.wip??{},r=o.policies??{},c=o.sle??{};(!V(n)||!V(r)||!V(c))&&chunkS3BXVHO7_cjs.b("invalid-input","service-delivery-review takes wip, policies and sle objects keyed by column or class",'e.g. { "wip": { "dev": 2 }, "policies": { "dev": [{ "kind": "no-open-blockers" }] }, "sle": { "standard": { "percentile": 85, "targetMs": 604800000 } } }');for(let[f,y]of Object.entries(n))chunk23P7C25E_cjs.p(i,f),y!==null&&(typeof y!="number"||!Number.isFinite(y)||y<1)&&chunkS3BXVHO7_cjs.b("invalid-input",`wip.${f} must be a positive number or null`,"null removes the limit");let d={};for(let[f,y]of Object.entries(r))chunk23P7C25E_cjs.p(i,f),d[f]=ae(y,`policies.${f}`);for(let[f,y]of Object.entries(c))D.includes(f)||chunkS3BXVHO7_cjs.b("invalid-input",`sle.${f} is not a class of service`,`use one of: ${D.join(", ")}`),y!==null&&!_e(y)&&chunkS3BXVHO7_cjs.b("invalid-input",`sle.${f} must be { percentile: 0..100, targetMs: > 0 } or null`,"null removes the service level");return t(i,"ceremony.service-delivery-review",o,(f,y)=>{let k=x(f),w=f.stages,I=k.columns,p={...k.classesOfService},b=[],h=[],S=[];for(let[O,A]of Object.entries(n)){let W=w.find(R=>R.id===O).wipLimit??null;W!==A&&(b.push({column:O,before:W,after:A}),w=w.map(R=>R.id===O?Ie(R,A):R),I=I.map(R=>R.id===O?Ie(R,A):R));}for(let[O,A]of Object.entries(d)){let W=w.find($=>$.id===O).exitPolicy;if(JSON.stringify(W)===JSON.stringify(A))continue;h.push({column:O,before:W,after:A});let R=w.findIndex($=>$.id===O),z=w[R].commitmentPoint?w[R+1]?.id:void 0;w=w.map($=>$.id===O?{...$,exitPolicy:A}:$.id===z?{...$,entryPolicy:A}:$),I=I.map($=>$.id===O?{...$,policies:A}:$);}for(let[O,A]of Object.entries(c)){let W=p[O]?.sle??null;if(JSON.stringify(W)===JSON.stringify(A))continue;S.push({classOfService:O,before:W,after:A});let{sle:R,...z}=p[O]??{};p={...p,[O]:A===null?z:{...z,sle:A}};}return f={...f,stages:w,config:{...k,columns:I,classesOfService:p}},chunk23P7C25E_cjs.c(f,"cadence.service-delivery-review",o.by,{wip:b,policies:h,sle:S},y)})},"operations-review":(i,o)=>{chunk23P7C25E_cjs.o(i,o.by,"facilitate","manage-flow");let n=o.assign??[];(!Array.isArray(n)||!n.every(r=>V(r)&&typeof r.item=="string"&&typeof r.blocker=="string"))&&chunkS3BXVHO7_cjs.b("invalid-input","operations-review.assign must be [{ item, blocker, owner }]",'e.g. { "assign": [{ "item": "A", "blocker": "A-b1", "owner": "service-delivery-manager" }] }');for(let r of n){let c=chunk23P7C25E_cjs.u(i,r.item);c.blockers.some(d=>d.id===r.blocker&&!d.clearedAt)||chunkS3BXVHO7_cjs.b("invalid-input",`item "${r.item}" has no open blocker "${r.blocker}"`,`open blockers: ${c.blockers.filter(d=>!d.clearedAt).map(d=>d.id).join(", ")||"(none)"}`,{items:[r.item]});}return t(i,"ceremony.operations-review",o,(r,c)=>{for(let d of n){let f=chunk23P7C25E_cjs.u(r,d.item).blockers.find(y=>y.id===d.blocker).owner;r=chunk23P7C25E_cjs.s(r,d.item,y=>({...y,blockers:y.blockers.map(k=>k.id===d.blocker?{...k,owner:d.owner}:k)})),r=chunk23P7C25E_cjs.c(r,"blocker.reassigned",o.by,{id:d.item,blocker:d.blocker,from:f,to:d.owner},c);}return chunk23P7C25E_cjs.c(r,"cadence.operations-review",o.by,me(r,c),c)})},"risk-review":(i,o)=>{chunk23P7C25E_cjs.o(i,o.by,"facilitate","manage-flow");let n=o.staleAfterMs??7*ee;return (typeof n!="number"||!Number.isFinite(n)||n<0)&&chunkS3BXVHO7_cjs.b("invalid-input","risk-review.staleAfterMs must be a non-negative number of milliseconds","omit it for one week"),t(i,"ceremony.risk-review",o,(r,c)=>chunk23P7C25E_cjs.c(r,"cadence.risk-review",o.by,fe(r,c,n),c))},"strategy-review":(i,o)=>{chunk23P7C25E_cjs.o(i,o.by,"manage-flow");let n=x(i),r=o.classesOfService??{};V(r)||chunkS3BXVHO7_cjs.b("invalid-input","strategy-review.classesOfService must be an object keyed by class",'e.g. { "expedite": { "wipBypass": 2 }, "intangible": null }');let c={...n.classesOfService};for(let[f,y]of Object.entries(r))D.includes(f)||chunkS3BXVHO7_cjs.b("invalid-input",`classesOfService.${f} is not a class of service`,`use one of: ${D.join(", ")}`),y===null?delete c[f]:c[f]=y;let d=Y({...n,classesOfService:c,maxExpedite:o.maxExpedite??n.maxExpedite});return t(i,"ceremony.strategy-review",o,(f,y)=>{let k=Object.fromEntries(D.map(w=>[w,0]));for(let w of Object.values(f.items))P.has(w.status)&&E(f,w)&&(k[w.classOfService??"standard"]+=1);return f={...f,config:{...x(f),classesOfService:d.classesOfService,maxExpedite:d.maxExpedite}},chunk23P7C25E_cjs.c(f,"cadence.strategy-review",o.by,{mix:k,before:{classesOfService:n.classesOfService,maxExpedite:n.maxExpedite},after:{classesOfService:d.classesOfService,maxExpedite:d.maxExpedite}},y)})}}}function ge(){return [{id:"service-request-manager",name:"Service Request Manager",modelTier:"large",capabilities:["order-backlog","define-acceptance","manage-flow","escalate"],canApprove:[],inputs:["stakeholder-requests","options"],outputs:["ordered-options","acceptance-criteria","classes-of-service"],do_not:["do not implement items yourself","do not push work past the commitment point outside replenishment"]},{id:"service-delivery-manager",name:"Service Delivery Manager",modelTier:"large",capabilities:["facilitate","manage-flow","escalate"],canApprove:[],inputs:["board","flow-metrics","blockers"],outputs:["cadence-records","wip-and-policy-changes","lessons"],do_not:["do not reorder the options","do not assign work; the planner pulls"]},{id:"worker",name:"Worker",modelTier:"small",capabilities:["deliver","review","verify"],canApprove:[],inputs:["brief"],outputs:["code","test-output"],do_not:["do not change acceptance criteria","do not pull more work while your card is open"]}]}var C=(e,t,a,s,m)=>m?{rule:e,severity:t,item:m,message:a,fix:s}:{rule:e,severity:t,message:a,fix:s},Z=e=>e.payload??{},re=e=>{let t=Z(e).items;return Array.isArray(t)?t:[]},qe=(e,t)=>Object.values(e.items).filter(a=>a.stage===t&&M.has(a.status)).length;function ye(){return [{id:"policy-explicit",severity:"error",check(l,i){let o=l.stages.find(n=>n.deliveryPoint)?.id;if(i.type==="init")return l.stages.filter(n=>n.id!==o&&n.exitPolicy.length===0).map(n=>C("policy-explicit","error",`column "${n.id}" has no explicit policy`,`give column "${n.id}" at least one policy, e.g. { "kind": "acceptance-written" }`));if(i.type==="ceremony.service-delivery-review"){let n=Z(i).policies??{};return Object.entries(n).filter(([r,c])=>r!==o&&Array.isArray(c)&&c.length===0).map(([r])=>C("policy-explicit","error",`column "${r}" would be left without a policy`,"keep at least one policy per column; Kanban policies are explicit"))}return []}},{id:"commitment-point-once",severity:"error",check(l,i){if(i.type!=="init")return [];let o=[],n=l.stages.filter(c=>c.commitmentPoint),r=l.stages.filter(c=>c.deliveryPoint);if(n.length!==1&&o.push(C("commitment-point-once","error",`${n.length} columns are marked commitmentPoint (${n.map(c=>c.id).join(", ")||"none"})`,"mark exactly one column commitmentPoint: true")),r.length!==1&&o.push(C("commitment-point-once","error",`${r.length} columns are marked deliveryPoint (${r.map(c=>c.id).join(", ")||"none"})`,"mark exactly one column deliveryPoint: true")),n.length===1&&r.length===1){let c=l.stages.indexOf(n[0]),d=l.stages.indexOf(r[0]);d!==l.stages.length-1&&o.push(C("commitment-point-once","error",`delivery column "${r[0].id}" is not the last column`,"move the delivery column to the end; finished cards leave the board there")),c===0?o.push(C("commitment-point-once","error",`commitment column "${n[0].id}" is the first column`,"keep an Options column before the commitment point; replenishment pulls from it")):c>=d&&o.push(C("commitment-point-once","error",`commitment column "${n[0].id}" comes after the delivery column`,"order columns options \u2192 commitment \u2192 \u2026 \u2192 delivery"));}return o}},{id:"wip-respected",severity:"error",check(l,i){if(i.type==="ceremony.replenishment"){let o=l.stages.find(f=>f.commitmentPoint);if(!o||o.wipLimit===void 0)return [];let n=re(i),r=Object.values(l.items).filter(f=>f.stage===o.id&&P.has(f.status)).length,c=n.some(f=>l.items[f]?.classOfService==="expedite")?x(l).classesOfService.expedite?.wipBypass??1:0,d=o.wipLimit+c;return r+n.length<=d?[]:[C("wip-respected","error",`column "${o.id}" holds ${r} card(s); pulling ${n.length} more exceeds its WIP limit of ${o.wipLimit}${c?` (+${c} expedite bypass)`:""}`,`pull at most ${Math.max(0,d-r)} card(s) now, or raise the limit in a service-delivery-review`)]}if(i.type==="ceremony.service-delivery-review"){let o=Z(i).wip??{},n=[];for(let[r,c]of Object.entries(o)){if(typeof c!="number")continue;let d=qe(l,r);d>c&&n.push(C("wip-respected","warning",`column "${r}" has ${d} active card(s), above the new limit of ${c}`,"nothing new is pulled into it until it drains; finish or move cards"));}return n}return []}},{id:"pull-not-push",severity:"error",check(l,i){if(i.type!=="ceremony.replenishment")return [];let o=l.stages[0],n=l.stages.find(d=>d.commitmentPoint);if(!o||!n)return [];let r=[],c=Z(i).column;c!==void 0&&c!==n.id&&r.push(C("pull-not-push","error",`replenishment may only pull into the commitment column "${n.id}", not "${String(c)}"`,"drop column or set it to the commitment column; later columns are pulled by the planner"));for(let d of re(i)){let f=l.items[d];f&&(f.stage!==o.id||f.status!=="todo")&&r.push(C("pull-not-push","error",`item "${d}" is ${f.status} in "${f.stage}", not an option`,`only todo cards in "${o.id}" can be pulled; cards already on the board flow by pull`,d));}return r}},{id:"blocker-has-owner",severity:"error",check(l,i){if(!i.type.startsWith("ceremony."))return [];let o=[];if(i.type==="ceremony.operations-review"){let n=Z(i).assign??[];for(let r of n)(typeof r.owner!="string"||r.owner.trim()==="")&&o.push(C("blocker-has-owner","error",`blocker "${r.blocker}" on "${r.item}" would have no owner`,"name the role or person who clears it",r.item));}for(let n of Object.values(l.items))for(let r of n.blockers)!r.clearedAt&&r.owner.trim()===""&&o.push(C("blocker-has-owner","warning",`blocker "${r.id}" on "${n.id}" has no owner`,`assign one in operations-review: { "assign": [{ "item": "${n.id}", "blocker": "${r.id}", "owner": "<who>" }] }`,n.id));return o}},{id:"one-expedite",severity:"error",check(l,i){if(i.type!=="ceremony.replenishment")return [];let o=re(i).filter(c=>l.items[c]?.classOfService==="expedite");if(o.length===0)return [];let n=Object.values(l.items).filter(c=>c.classOfService==="expedite"&&P.has(c.status)&&E(l,c)).map(c=>c.id),r=x(l).maxExpedite;return n.length+o.length<=r?[]:[C("one-expedite","error",`${n.length} expedite card(s) already on the board (${n.join(", ")||"none"}); pulling ${o.join(", ")} exceeds maxExpedite ${r}`,"deliver the current expedite first, reclassify the new card, or raise maxExpedite in a strategy-review")]}},{id:"fixed-date-needs-deadline",severity:"error",check(l,i){return i.type!=="ceremony.replenishment"?[]:re(i).filter(o=>{let n=l.items[o];return n?.classOfService==="fixed-date"&&!(n.deadline&&Number.isFinite(Date.parse(n.deadline)))}).map(o=>C("fixed-date-needs-deadline","error",`fixed-date item "${o}" has no deadline`,`editItem("${o}", { deadline: "<ISO date>" }) before pulling it`,o))}}]}function be(e){let t=e.columns.map(m=>{let u={id:m.id,name:m.name,entryPolicy:[],exitPolicy:m.policies};return m.wipLimit!==void 0&&(u.wipLimit=m.wipLimit),m.commitmentPoint&&(u.commitmentPoint=true),m.deliveryPoint&&(u.deliveryPoint=true),m.review&&(u.review=true),u}),a=t.findIndex(m=>m.commitmentPoint),s=a>=0?t[a+1]:void 0;return s&&(s.entryPolicy=t[a].exitPolicy),t}var Fe={backlog:"Options",item:"Work Item",stage:"Column",iteration:"Cadence",increment:"Delivery",ceremony:"Cadence",gate:"Policy"},Je={expedite:0,"fixed-date":1,standard:2,intangible:3},We=e=>Je[e.classOfService??"standard"]??2,ve=1e15,Ue=4e9,Ye=(e,t,a)=>Math.min(a,Math.max(t,e));function He(e,t){let a=e.classOfService??"standard";if(e.type==="question")return 5*ve;if(a==="fixed-date"&&e.deadline!==void 0){let l=Date.parse(e.deadline);if(Number.isFinite(l))return 3*ve+1e10-Math.floor(l/1e3)}let s=t.aging?Math.floor(t.deferrals/t.maxDeferralRounds):0,m=Ye(e.priority??0,-1e9,1e9)+s*Ue,u=t.aging&&t.deferrals>=t.maxDeferralRounds;return (a==="expedite"?4:a==="fixed-date"?3:a==="intangible"&&!u?1:2)*ve+m}function je(e,t){let a=We(e)-We(t);if(a!==0)return a;let s=N(e),m=N(t),u=s===void 0?0:Date.parse(s),g=m===void 0?0:Date.parse(m);return u!==g?u-g:e.id<t.id?-1:e.id>t.id?1:0}function Ge(e){return e.map(t=>t.kind==="evidence"?`evidence ${t.evidenceKind}`:t.kind==="custom"?`${t.id}: ${t.description}`:t.kind).join(", ")||"(none)"}function Ze(){return {name:"kanban",vocabulary:Fe,validateConfig:Y,defaultStages:be,defaultRoles:ge,requiredCapabilities:["manage-flow","deliver"],exclusiveCapabilities:[],plannerOptions(e){let t=x(e),a=B(e),s=e.stages[e.stages.findIndex(n=>n.id===a.id)+1],m=t.classesOfService.expedite?.wipBypass??1,u=[],g=[0],l=new Map;for(let n of e.events)u.push(Date.parse(n.at)),g.push(g[g.length-1]+(n.type==="planner.resolved"?1:0)),n.type==="item.added"&&l.set(n.payload.id,n.at);let i=n=>{let r=0,c=u.length;for(;r<c;){let d=r+c>>1;u[d]<=n?r=d+1:c=d;}return g[u.length]-g[r]},o={schedulerMode:"throughput",fairnessPolicy:t.fairness.aging?"aging":"none",deadlineStrategy:"earliest-first",dispatchStage:n=>n.stage===a.id&&s?s.id:void 0,priorityOf:n=>{let r=Date.parse(N(n)??l.get(n.id)??"");return He(n,{deferrals:i(Number.isFinite(r)?r:0),aging:t.fairness.aging,maxDeferralRounds:t.fairness.maxDeferralRounds})},tieBreaker:je,wipCounts:[...M],wipLimitOf:(n,r)=>n.wipLimit===void 0?void 0:r.classOfService==="expedite"?n.wipLimit+m:n.wipLimit};return o.maxDeferralRounds=t.fairness.maxDeferralRounds,o},candidates(e){let t=Math.max(0,x(e).maxExpedite-J(e).length),a=Object.values(e.items).filter(m=>(m.status==="todo"||m.status==="review")&&E(e,m)),s=exsorted.timSort(a.filter(m=>m.classOfService==="expedite"),je).slice(0,t);return a.filter(m=>m.classOfService!=="expedite"||s.includes(m))},invariants(e,t){let a=x(e),s=e.stages.find(l=>l.id===t.stage),m=t.classOfService??"standard",u=a.classesOfService[m]?.sle,g=Object.values(e.items).filter(l=>l.stage===s.id&&M.has(l.status)).length;return [`Column "${s.name}" exit policies: ${Ge(s.exitPolicy)}`,`Class of service: ${m}${t.deadline?`; deadline ${t.deadline}`:""}${u?`; service level p${u.percentile} <= ${u.targetMs} ms`:""}`,`WIP limit of "${s.name}": ${s.wipLimit??"none"} (active now: ${g}); finish this card before pulling another`,`Do not change the scope of "${t.id}" or its acceptance criteria; raise open_questions instead`]},ceremonies:pe(Ze),rules:ye(),metrics:e=>({...G(e)}),humanDefaults:{gates:"none"},report:e=>({cadencesDue:ce(e)})}}exports.A=ue;exports.B=pe;exports.C=ge;exports.D=ye;exports.E=be;exports.F=Fe;exports.G=He;exports.H=je;exports.I=Ze;exports.a=M;exports.b=P;exports.c=oe;exports.d=B;exports.e=X;exports.f=Q;exports.g=E;exports.h=J;exports.i=N;exports.j=U;exports.k=D;exports.l=ee;exports.m=x;exports.n=Ce;exports.o=Y;exports.p=te;exports.q=ne;exports.r=Ke;exports.s=Re;exports.t=ce;exports.u=ie;exports.v=q;exports.w=de;exports.x=G;exports.y=me;exports.z=fe;//# sourceMappingURL=chunk-7HZXZF3L.cjs.map
2
- //# sourceMappingURL=chunk-7HZXZF3L.cjs.map
1
+ 'use strict';var chunkSJRRQZ3R_cjs=require('./chunk-SJRRQZ3R.cjs'),chunkS3BXVHO7_cjs=require('./chunk-S3BXVHO7.cjs'),exsorted=require('exsorted');var M=new Set(["in_progress","blocked","awaiting_human"]),P=new Set(["todo","in_progress","blocked","review","awaiting_human"]);function oe(e){let t=e.stages[0];return t||chunkS3BXVHO7_cjs.b("config-invalid","kanban board has no columns","init with at least options, a commitment column and a delivery column"),t}function B(e){let t=e.stages.find(a=>a.commitmentPoint);return t||chunkS3BXVHO7_cjs.b("config-invalid","no column is the commitment point","set commitmentPoint: true on exactly one column"),t}function X(e){let t=e.stages.find(a=>a.deliveryPoint);return t||chunkS3BXVHO7_cjs.b("config-invalid","no column is the delivery point","set deliveryPoint: true on the last column"),t}function Q(e,t){return chunkSJRRQZ3R_cjs.p(e,t),e.stages.findIndex(a=>a.id===t)}function E(e,t){let a=Q(e,t.stage);return a>=Q(e,B(e).id)&&a<Q(e,X(e).id)}function J(e){return Object.values(e.items).filter(t=>t.classOfService==="expedite"&&M.has(t.status)&&E(e,t)).map(t=>t.id)}function N(e){for(let t=e.transitions.length-1;t>=0;t--){let a=e.transitions[t];if(a.to.stage===e.stage&&a.from.stage!==e.stage)return a.at}}var U=["replenishment","delivery-planning","service-delivery-review","operations-review","risk-review","strategy-review"],D=["expedite","fixed-date","standard","intangible"],ee=864e5;function x(e){return e.config}var Ce=[{id:"options",name:"Options",policies:[{kind:"acceptance-written"}]},{id:"ready",name:"Ready",wipLimit:4,commitmentPoint:true,policies:[{kind:"dependencies-done"}]},{id:"dev",name:"Development",wipLimit:3,policies:[{kind:"evidence",evidenceKind:"test-output"}]},{id:"review",name:"Review",wipLimit:2,review:true,policies:[{kind:"no-open-blockers"}]},{id:"done",name:"Done",deliveryPoint:true,policies:[]}],K=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function _(e,t,a,s=1){if(e!==void 0)return (typeof e!="number"||!Number.isFinite(e)||e<s)&&chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.${t} must be a number >= ${s} (got ${JSON.stringify(e)})`,a),e}var Ae=["acceptance-written","estimate-present","no-open-blockers","dependencies-done"],se=e=>typeof e=="string"&&e.trim()!=="";function ae(e,t){Array.isArray(e)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.${t} must be an array of Policy objects`,'e.g. [{ "kind": "evidence", "evidenceKind": "test-output" }]');let a=[];return e.forEach((s,m)=>{let u=`kanban config.${t}[${m}]`;K(s)&&(s.kind==="evidence"?se(s.evidenceKind):s.kind==="custom"?se(s.id)&&se(s.description):typeof s.kind=="string"&&Ae.includes(s.kind))||chunkS3BXVHO7_cjs.b("config-invalid",`${u} must be a Policy`,`use a Policy such as { "kind": "evidence", "evidenceKind": "test-output" }, { "kind": "custom", "id": "x", "description": "..." } or one of: ${Ae.join(", ")}`),a.push(s);}),a}function Le(e,t){K(e)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.columns[${t}] must be an object`,'e.g. { "id": "dev", "policies": [] }'),chunkS3BXVHO7_cjs.c(e.id,`kanban config.columns[${t}].id`);let a=e.id;Array.isArray(e.policies)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.columns[${t}] ("${a}") needs policies: Policy[]`,'every column states its policies explicitly, e.g. [{ "kind": "acceptance-written" }]');let s={id:a,name:typeof e.name=="string"&&e.name.trim()!==""?e.name:a,policies:ae(e.policies,`columns[${t}].policies`)},m=_(e.wipLimit,`columns[${t}].wipLimit`,"omit wipLimit for no limit");m!==void 0&&(s.wipLimit=m);for(let u of ["commitmentPoint","deliveryPoint","review"])e[u]!==void 0&&(typeof e[u]!="boolean"&&chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.columns[${t}].${u} must be a boolean`,`set ${u}: true or omit it`),e[u]&&(s[u]=true));return s}function Y(e){let t=e??{};t.columns!==void 0&&!Array.isArray(t.columns)&&chunkS3BXVHO7_cjs.b("config-invalid","kanban config.columns must be an array of columns","omit columns for the default board (options, ready, dev, review, done)");let a=t.columns===void 0?Ce.map(r=>({...r})):t.columns.map(Le),s=new Set;for(let r of a)s.has(r.id)&&chunkS3BXVHO7_cjs.b("config-invalid",`duplicate column id "${r.id}"`,"give every column a unique id"),s.add(r.id);let m={},u=t.classesOfService??{};K(u)||chunkS3BXVHO7_cjs.b("config-invalid","kanban config.classesOfService must be an object keyed by class",'e.g. { "expedite": { "wipBypass": 1 } }');for(let[r,c]of Object.entries(u)){D.includes(r)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.classesOfService.${r} is not a class of service`,`use one of: ${D.join(", ")}`),K(c)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.classesOfService.${r} must be an object`,'e.g. { "wipBypass": 1, "sle": { "percentile": 85, "targetMs": 604800000 } }');let d={},f=_(c.wipBypass,`classesOfService.${r}.wipBypass`,"omit it for the default 1",0);if(f!==void 0&&(d.wipBypass=f),c.sle!==void 0){let y=c.sle;(!K(y)||typeof y.percentile!="number"||y.percentile<0||y.percentile>100)&&chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.classesOfService.${r}.sle.percentile must be 0..100`,'e.g. { "percentile": 85, "targetMs": 604800000 }');let k=_(y.targetMs,`classesOfService.${r}.sle.targetMs`,"state the service level target in milliseconds");k===void 0&&chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.classesOfService.${r}.sle.targetMs is required`,"state the service level target in milliseconds"),d.sle={percentile:y.percentile,targetMs:k};}m[r]=d;}let g=t.fairness??{};(!K(g)||g.aging!==void 0&&typeof g.aging!="boolean")&&chunkS3BXVHO7_cjs.b("config-invalid","kanban config.fairness must be { aging: boolean, maxDeferralRounds?: number }","omit it for aging on");let l=_(g.maxDeferralRounds,"fairness.maxDeferralRounds","omit it for 5 rounds"),i={aging:g.aging===void 0?true:g.aging,maxDeferralRounds:l??5},o={},n=t.cadences??{};K(n)||chunkS3BXVHO7_cjs.b("config-invalid","kanban config.cadences must be an object keyed by cadence",'e.g. { "replenishment": { "everyTurns": 10 } }');for(let[r,c]of Object.entries(n)){U.includes(r)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.cadences.${r} is not a cadence`,`use one of: ${U.join(", ")}`),K(c)||chunkS3BXVHO7_cjs.b("config-invalid",`kanban config.cadences.${r} must be an object`,'e.g. { "everyTurns": 10 }');let d=_(c.everyTurns,`cadences.${r}.everyTurns`,"omit it when the cadence is run by hand");o[r]=d===void 0?{}:{everyTurns:d};}return {columns:a,classesOfService:m,fairness:i,cadences:o,throughputWindowMs:_(t.throughputWindowMs,"throughputWindowMs","omit it for one week")??7*ee,maxExpedite:_(t.maxExpedite,"maxExpedite","omit it for 1")??1}}function te(e,t){return e.events.find(s=>s.type==="item.added"&&s.payload.id===t)?.at??e.events[0].at}function ne(e,t,a){return Date.parse(a)-Date.parse(N(t)??te(e,t.id))}function Ke(e,t){return e.stages.map(a=>{let s=Object.values(e.items).filter(l=>l.stage===a.id&&l.status!=="dropped"),m=exsorted.timSort(s.map(l=>({id:l.id,title:l.title,type:l.type,status:l.status,classOfService:l.classOfService??"standard",role:l.role??null,ageMs:ne(e,l,t),blocked:l.blockers.some(i=>!i.clearedAt),deadline:l.deadline??null})),(l,i)=>i.ageMs-l.ageMs||(l.id<i.id?-1:1)),u=m.filter(l=>M.has(l.status)).length,g=m.filter(l=>l.status==="todo"||l.status==="review").length;return {id:a.id,name:a.name,wipLimit:a.wipLimit??null,active:u,queued:g,overLimit:a.wipLimit!==void 0&&u>a.wipLimit,commitmentPoint:a.commitmentPoint===true,deliveryPoint:a.deliveryPoint===true,cards:m}})}var Re=e=>`cadence.${e}`;function ce(e){let t=x(e);return U.map(a=>{let s=0,m=null;for(let l of e.events)l.type===Re(a)&&(s=l.seq,m=l.at);let u=e.events.filter(l=>l.type==="item.completed"&&l.seq>s).length,g=t.cadences[a]?.everyTurns??null;return {cadence:a,everyTurns:g,lastAt:m,turnsSince:u,due:g!==null&&u>=g}})}var $e=(e,t)=>Date.parse(t)-Date.parse(e),Me=e=>e.transition??null;function ie(e,t,a){let s=new Map,m=[],u=e[0]?.at??"1970-01-01T00:00:00.000Z",g=(i,o,n)=>{o===t&&i.committedAt===void 0&&(i.committedAt=n),o===a&&i.deliveredAt===void 0&&(i.deliveredAt=n);},l=(i,o,n)=>{i.since.status==="in_progress"&&(i.activeMs+=$e(i.since.at,n)),i.since.status==="blocked"&&(i.blockedMs+=$e(i.since.at,n)),i.since={status:o.status,at:n},o.stage!==i.stage&&(i.stays[i.stays.length-1].leftAt=n,i.stays.push({stage:o.stage,enteredAt:n}),g(i,o.stage,n)),i.stage=o.stage,i.status=o.status;};for(let i of e){u=i.at;let o=i.payload??{};switch(i.type){case "item.added":{let n=o.id,r=o.stage,c={id:n,type:typeof o.type=="string"?o.type:"task",stage:r,status:"todo",stays:[{stage:r,enteredAt:i.at}],classOfService:"standard",activeMs:0,blockedMs:0,since:{status:"todo",at:i.at}};g(c,r,i.at),s.set(n,c);break}case "item.transition":{let n=s.get(o.id);if(!n)break;l(n,o.to,i.at);break}case "cadence.replenishment":{let n=o.items??[];for(let r of n){let c=s.get(r.id);c&&(c.classOfService=r.classOfService,r.deadline?c.deadline=r.deadline:delete c.deadline);}break}case "blocker.raised":{m.push({item:o.id,blocker:o.blocker,raisedAt:i.at});let n=s.get(o.id),r=Me(o);n&&r&&l(n,r.to,i.at);break}case "blocker.cleared":{let n=m.find(d=>d.item===o.id&&d.blocker===o.blocker&&d.clearedAt===void 0);n&&(n.clearedAt=i.at);let r=s.get(o.id),c=Me(o);r&&c&&l(r,c.to,i.at);break}}}return {items:s,blockers:m,lastAt:u}}function q(e,t){if(e.length===0)return 0;let a=exsorted.timSort([...e],(m,u)=>m-u),s=Math.min(a.length,Math.max(1,Math.ceil(t/100*a.length)));return a[s-1]}var H=(e,t)=>Date.parse(t)-Date.parse(e),Pe=(e,t)=>t===0?0:e/t;function Ee(e){let t=e.stages.find(s=>s.commitmentPoint)?.id??"",a=e.stages.find(s=>s.deliveryPoint)?.id??"";return {commitment:t,delivery:a,ci:e.stages.findIndex(s=>s.id===t),di:e.stages.findIndex(s=>s.id===a)}}function De(e){let t={};for(let a of e.items.values())for(let s of a.stays)s.leftAt!==void 0&&(t[s.stage]??=[]).push(H(s.enteredAt,s.leftAt));return t}function de(e){let t=Ee(e);return De(ie(e.events,t.commitment,t.delivery))}function G(e){let t=x(e),a=Ee(e),s=ie(e.events,a.commitment,a.delivery),m=[...s.items.values()],u=e.stages.map(p=>p.id),g=new Map(u.map((p,b)=>[p,b])),l=exsorted.timSort(m.filter(p=>p.type!=="question"&&p.committedAt!==void 0&&p.deliveredAt!==void 0),(p,b)=>Date.parse(p.deliveredAt)-Date.parse(b.deliveredAt)),i=l.map(p=>H(p.committedAt,p.deliveredAt)),o={};for(let[p,b]of Object.entries(De(s)))o[p]=b.reduce((h,S)=>h+S,0)/b.length;let n=m.filter(p=>p.type!=="question"&&p.committedAt!==void 0).map(p=>Date.parse(p.committedAt)),r=[];if(n.length>0){let p=n.reduce((h,S)=>S<h?S:h,n[0]),b=Math.floor((Date.parse(s.lastAt)-p)/t.throughputWindowMs)+1;r=Array.from({length:b},()=>0);for(let h of l){let S=Math.floor((Date.parse(h.deliveredAt)-p)/t.throughputWindowMs);S>=0&&S<b&&(r[S]+=1);}}let c=Object.fromEntries(u.map(p=>[p,0])),d={};for(let p of m){if(!P.has(p.status))continue;Object.hasOwn(c,p.stage)&&(c[p.stage]+=1);let b=g.get(p.stage);b!==void 0&&b>=a.ci&&b<a.di&&(d[p.id]=H(p.stays[p.stays.length-1].enteredAt,s.lastAt));}let f=new Map;for(let p of m)for(let b of p.stays){let h=f.get(b.stage)??new Map;h.has(p.id)||h.set(p.id,b.enteredAt),f.set(b.stage,h);}let y=exsorted.timSort([...new Set(e.events.map(p=>p.at.slice(0,10)))],(p,b)=>p<b?-1:p>b?1:0),k={};for(let p of y)for(let b of u)k[`${p}:${b}`]=[...f.get(b)?.values()??[]].filter(h=>h.slice(0,10)<=p).length;let w={};for(let[p,b]of Object.entries(t.classesOfService)){if(!b?.sle)continue;let h=l.filter(S=>S.classOfService===p);h.length!==0&&(w[p]=h.filter(S=>H(S.committedAt,S.deliveredAt)<=b.sle.targetMs).length/h.length);}let I=s.blockers.reduce((p,b)=>p+H(b.raisedAt,b.clearedAt??s.lastAt),0);return {leadTimeMs:i,leadTimeP50:q(i,50),leadTimeP85:q(i,85),cycleTimeMsByColumn:o,throughput:r,wipByColumn:c,flowEfficiency:Pe(l.reduce((p,b)=>p+b.activeMs,0),i.reduce((p,b)=>p+b,0)),agingWipMs:d,cumulativeFlow:k,sleCompliance:w,blockerTimeMs:I,meanBlockerTimeMs:Pe(I,s.blockers.length)}}function me(e,t){let a=Date.parse(t),s=de(e),m=[],u=[],g=Object.fromEntries(e.stages.map(i=>[i.id,0])),l=Object.fromEntries(e.stages.map(i=>[i.id,0]));for(let i of Object.values(e.items)){for(let o of i.blockers)o.clearedAt||m.push({item:i.id,blocker:o.id,owner:o.owner,reason:o.reason,ageMs:a-Date.parse(o.raisedAt)});if(M.has(i.status)?l[i.stage]=(l[i.stage]??0)+1:(i.status==="todo"||i.status==="review")&&(g[i.stage]=(g[i.stage]??0)+1),P.has(i.status)&&E(e,i)){let o=s[i.stage]??[],n=o.length?q(o,85):null,r=ne(e,i,t);u.push({item:i.id,column:i.stage,status:i.status,ageMs:r,p85Ms:n,overP85:n!==null&&r>n});}}return {blockers:m,agingWip:exsorted.timSort(u,(i,o)=>o.ageMs-i.ageMs||(i.item<o.item?-1:1)),queued:g,active:l}}function Ne(e,t){let a=B(e).id;return e.items[t].transitions.find(u=>u.to.stage===a&&u.from.stage!==a)?.at??te(e,t)}function fe(e,t,a){let s=Date.parse(t),m=x(e),u=G(e).leadTimeMs,g=m.classesOfService["fixed-date"]?.sle?.percentile??85,l=u.length?q(u,g):null,i=[],o=[];for(let n of Object.values(e.items)){for(let f of n.blockers){let y=f.clearedAt?0:s-Date.parse(f.raisedAt);!f.clearedAt&&y>a&&o.push({item:n.id,blocker:f.id,owner:f.owner,ageMs:y});}if(n.classOfService!=="fixed-date"||!n.deadline||!P.has(n.status)||!E(e,n))continue;let r=s-Date.parse(Ne(e,n.id)),c=l===null?null:Math.max(0,l-r),d=Date.parse(n.deadline)-s;i.push({item:n.id,deadline:n.deadline,timeLeftMs:d,projectedRemainingMs:c,atRisk:d<0||c!==null&&c>d});}return {fixedDate:i,staleBlockers:o,expediteActive:J(e)}}var V=e=>typeof e=="object"&&e!==null&&!Array.isArray(e);function ue(e,t,a){let s=t.items;(!Array.isArray(s)||s.length===0||!s.every(u=>typeof u=="string"))&&chunkS3BXVHO7_cjs.b("invalid-input",`${a} needs items: string[]`,'pass ["A", "B"]');let m=s.find((u,g)=>s.indexOf(u)!==g);m!==void 0&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${m}" appears twice in items[]`,"list each item once",{items:[m]});for(let u of s)chunkSJRRQZ3R_cjs.u(e,u);return s}function _e(e){return V(e)&&typeof e.percentile=="number"&&e.percentile>=0&&e.percentile<=100&&typeof e.targetMs=="number"&&Number.isFinite(e.targetMs)&&e.targetMs>0}function Ie(e,t){let{wipLimit:a,...s}=e;return t===null?s:{...s,wipLimit:t}}function pe(e){let t=(i,o,n,r)=>chunkSJRRQZ3R_cjs.M(i,e(),{type:o,by:n.by,payload:n},c=>r(c,chunkSJRRQZ3R_cjs.a(n.now)));return {replenishment:(i,o)=>{chunkSJRRQZ3R_cjs.o(i,o.by,"order-backlog","manage-flow");let n=ue(i,o,"replenishment"),r=B(i),c=oe(i);for(let d of n)chunkSJRRQZ3R_cjs.E(i,chunkSJRRQZ3R_cjs.u(i,d),c.exitPolicy,`leave "${c.id}"`);return t(i,"ceremony.replenishment",o,(d,f)=>{for(let y of n)d=chunkSJRRQZ3R_cjs.x(d,y,{stage:r.id,status:"todo"},o.by,f);return chunkSJRRQZ3R_cjs.c(d,"cadence.replenishment",o.by,{column:r.id,items:n.map(y=>{let k=chunkSJRRQZ3R_cjs.u(d,y);return {id:y,classOfService:k.classOfService??"standard",deadline:k.deadline??null}})},f)})},"delivery-planning":(i,o)=>{chunkSJRRQZ3R_cjs.o(i,o.by,"facilitate","manage-flow");let n=ue(i,o,"delivery-planning"),r=X(i),c=i.stages[i.stages.findIndex(d=>d.id===r.id)-1];for(let d of n){let f=chunkSJRRQZ3R_cjs.u(i,d);f.stage!==c.id&&f.stage!==r.id&&chunkS3BXVHO7_cjs.b("invalid-input",`item "${d}" is in "${f.stage}", not ready for delivery`,`only cards in "${c.id}" or "${r.id}" can be planned for delivery`,{items:[d]});}return t(i,"ceremony.delivery-planning",o,(d,f)=>chunkSJRRQZ3R_cjs.c(d,"cadence.delivery-planning",o.by,{items:n,window:typeof o.window=="string"?o.window:null,delivered:n.filter(y=>chunkSJRRQZ3R_cjs.u(d,y).status==="done")},f))},"service-delivery-review":(i,o)=>{chunkSJRRQZ3R_cjs.o(i,o.by,"manage-flow");let n=o.wip??{},r=o.policies??{},c=o.sle??{};(!V(n)||!V(r)||!V(c))&&chunkS3BXVHO7_cjs.b("invalid-input","service-delivery-review takes wip, policies and sle objects keyed by column or class",'e.g. { "wip": { "dev": 2 }, "policies": { "dev": [{ "kind": "no-open-blockers" }] }, "sle": { "standard": { "percentile": 85, "targetMs": 604800000 } } }');for(let[f,y]of Object.entries(n))chunkSJRRQZ3R_cjs.p(i,f),y!==null&&(typeof y!="number"||!Number.isFinite(y)||y<1)&&chunkS3BXVHO7_cjs.b("invalid-input",`wip.${f} must be a positive number or null`,"null removes the limit");let d={};for(let[f,y]of Object.entries(r))chunkSJRRQZ3R_cjs.p(i,f),d[f]=ae(y,`policies.${f}`);for(let[f,y]of Object.entries(c))D.includes(f)||chunkS3BXVHO7_cjs.b("invalid-input",`sle.${f} is not a class of service`,`use one of: ${D.join(", ")}`),y!==null&&!_e(y)&&chunkS3BXVHO7_cjs.b("invalid-input",`sle.${f} must be { percentile: 0..100, targetMs: > 0 } or null`,"null removes the service level");return t(i,"ceremony.service-delivery-review",o,(f,y)=>{let k=x(f),w=f.stages,I=k.columns,p={...k.classesOfService},b=[],h=[],S=[];for(let[O,A]of Object.entries(n)){let W=w.find(R=>R.id===O).wipLimit??null;W!==A&&(b.push({column:O,before:W,after:A}),w=w.map(R=>R.id===O?Ie(R,A):R),I=I.map(R=>R.id===O?Ie(R,A):R));}for(let[O,A]of Object.entries(d)){let W=w.find($=>$.id===O).exitPolicy;if(JSON.stringify(W)===JSON.stringify(A))continue;h.push({column:O,before:W,after:A});let R=w.findIndex($=>$.id===O),z=w[R].commitmentPoint?w[R+1]?.id:void 0;w=w.map($=>$.id===O?{...$,exitPolicy:A}:$.id===z?{...$,entryPolicy:A}:$),I=I.map($=>$.id===O?{...$,policies:A}:$);}for(let[O,A]of Object.entries(c)){let W=p[O]?.sle??null;if(JSON.stringify(W)===JSON.stringify(A))continue;S.push({classOfService:O,before:W,after:A});let{sle:R,...z}=p[O]??{};p={...p,[O]:A===null?z:{...z,sle:A}};}return f={...f,stages:w,config:{...k,columns:I,classesOfService:p}},chunkSJRRQZ3R_cjs.c(f,"cadence.service-delivery-review",o.by,{wip:b,policies:h,sle:S},y)})},"operations-review":(i,o)=>{chunkSJRRQZ3R_cjs.o(i,o.by,"facilitate","manage-flow");let n=o.assign??[];(!Array.isArray(n)||!n.every(r=>V(r)&&typeof r.item=="string"&&typeof r.blocker=="string"))&&chunkS3BXVHO7_cjs.b("invalid-input","operations-review.assign must be [{ item, blocker, owner }]",'e.g. { "assign": [{ "item": "A", "blocker": "A-b1", "owner": "service-delivery-manager" }] }');for(let r of n){let c=chunkSJRRQZ3R_cjs.u(i,r.item);c.blockers.some(d=>d.id===r.blocker&&!d.clearedAt)||chunkS3BXVHO7_cjs.b("invalid-input",`item "${r.item}" has no open blocker "${r.blocker}"`,`open blockers: ${c.blockers.filter(d=>!d.clearedAt).map(d=>d.id).join(", ")||"(none)"}`,{items:[r.item]});}return t(i,"ceremony.operations-review",o,(r,c)=>{for(let d of n){let f=chunkSJRRQZ3R_cjs.u(r,d.item).blockers.find(y=>y.id===d.blocker).owner;r=chunkSJRRQZ3R_cjs.s(r,d.item,y=>({...y,blockers:y.blockers.map(k=>k.id===d.blocker?{...k,owner:d.owner}:k)})),r=chunkSJRRQZ3R_cjs.c(r,"blocker.reassigned",o.by,{id:d.item,blocker:d.blocker,from:f,to:d.owner},c);}return chunkSJRRQZ3R_cjs.c(r,"cadence.operations-review",o.by,me(r,c),c)})},"risk-review":(i,o)=>{chunkSJRRQZ3R_cjs.o(i,o.by,"facilitate","manage-flow");let n=o.staleAfterMs??7*ee;return (typeof n!="number"||!Number.isFinite(n)||n<0)&&chunkS3BXVHO7_cjs.b("invalid-input","risk-review.staleAfterMs must be a non-negative number of milliseconds","omit it for one week"),t(i,"ceremony.risk-review",o,(r,c)=>chunkSJRRQZ3R_cjs.c(r,"cadence.risk-review",o.by,fe(r,c,n),c))},"strategy-review":(i,o)=>{chunkSJRRQZ3R_cjs.o(i,o.by,"manage-flow");let n=x(i),r=o.classesOfService??{};V(r)||chunkS3BXVHO7_cjs.b("invalid-input","strategy-review.classesOfService must be an object keyed by class",'e.g. { "expedite": { "wipBypass": 2 }, "intangible": null }');let c={...n.classesOfService};for(let[f,y]of Object.entries(r))D.includes(f)||chunkS3BXVHO7_cjs.b("invalid-input",`classesOfService.${f} is not a class of service`,`use one of: ${D.join(", ")}`),y===null?delete c[f]:c[f]=y;let d=Y({...n,classesOfService:c,maxExpedite:o.maxExpedite??n.maxExpedite});return t(i,"ceremony.strategy-review",o,(f,y)=>{let k=Object.fromEntries(D.map(w=>[w,0]));for(let w of Object.values(f.items))P.has(w.status)&&E(f,w)&&(k[w.classOfService??"standard"]+=1);return f={...f,config:{...x(f),classesOfService:d.classesOfService,maxExpedite:d.maxExpedite}},chunkSJRRQZ3R_cjs.c(f,"cadence.strategy-review",o.by,{mix:k,before:{classesOfService:n.classesOfService,maxExpedite:n.maxExpedite},after:{classesOfService:d.classesOfService,maxExpedite:d.maxExpedite}},y)})}}}function ge(){return [{id:"service-request-manager",name:"Service Request Manager",modelTier:"large",capabilities:["order-backlog","define-acceptance","manage-flow","escalate"],canApprove:[],inputs:["stakeholder-requests","options"],outputs:["ordered-options","acceptance-criteria","classes-of-service"],do_not:["do not implement items yourself","do not push work past the commitment point outside replenishment"]},{id:"service-delivery-manager",name:"Service Delivery Manager",modelTier:"large",capabilities:["facilitate","manage-flow","escalate"],canApprove:[],inputs:["board","flow-metrics","blockers"],outputs:["cadence-records","wip-and-policy-changes","lessons"],do_not:["do not reorder the options","do not assign work; the planner pulls"]},{id:"worker",name:"Worker",modelTier:"small",capabilities:["deliver","review","verify"],canApprove:[],inputs:["brief"],outputs:["code","test-output"],do_not:["do not change acceptance criteria","do not pull more work while your card is open"]}]}var C=(e,t,a,s,m)=>m?{rule:e,severity:t,item:m,message:a,fix:s}:{rule:e,severity:t,message:a,fix:s},Z=e=>e.payload??{},re=e=>{let t=Z(e).items;return Array.isArray(t)?t:[]},qe=(e,t)=>Object.values(e.items).filter(a=>a.stage===t&&M.has(a.status)).length;function ye(){return [{id:"policy-explicit",severity:"error",check(l,i){let o=l.stages.find(n=>n.deliveryPoint)?.id;if(i.type==="init")return l.stages.filter(n=>n.id!==o&&n.exitPolicy.length===0).map(n=>C("policy-explicit","error",`column "${n.id}" has no explicit policy`,`give column "${n.id}" at least one policy, e.g. { "kind": "acceptance-written" }`));if(i.type==="ceremony.service-delivery-review"){let n=Z(i).policies??{};return Object.entries(n).filter(([r,c])=>r!==o&&Array.isArray(c)&&c.length===0).map(([r])=>C("policy-explicit","error",`column "${r}" would be left without a policy`,"keep at least one policy per column; Kanban policies are explicit"))}return []}},{id:"commitment-point-once",severity:"error",check(l,i){if(i.type!=="init")return [];let o=[],n=l.stages.filter(c=>c.commitmentPoint),r=l.stages.filter(c=>c.deliveryPoint);if(n.length!==1&&o.push(C("commitment-point-once","error",`${n.length} columns are marked commitmentPoint (${n.map(c=>c.id).join(", ")||"none"})`,"mark exactly one column commitmentPoint: true")),r.length!==1&&o.push(C("commitment-point-once","error",`${r.length} columns are marked deliveryPoint (${r.map(c=>c.id).join(", ")||"none"})`,"mark exactly one column deliveryPoint: true")),n.length===1&&r.length===1){let c=l.stages.indexOf(n[0]),d=l.stages.indexOf(r[0]);d!==l.stages.length-1&&o.push(C("commitment-point-once","error",`delivery column "${r[0].id}" is not the last column`,"move the delivery column to the end; finished cards leave the board there")),c===0?o.push(C("commitment-point-once","error",`commitment column "${n[0].id}" is the first column`,"keep an Options column before the commitment point; replenishment pulls from it")):c>=d&&o.push(C("commitment-point-once","error",`commitment column "${n[0].id}" comes after the delivery column`,"order columns options \u2192 commitment \u2192 \u2026 \u2192 delivery"));}return o}},{id:"wip-respected",severity:"error",check(l,i){if(i.type==="ceremony.replenishment"){let o=l.stages.find(f=>f.commitmentPoint);if(!o||o.wipLimit===void 0)return [];let n=re(i),r=Object.values(l.items).filter(f=>f.stage===o.id&&P.has(f.status)).length,c=n.some(f=>l.items[f]?.classOfService==="expedite")?x(l).classesOfService.expedite?.wipBypass??1:0,d=o.wipLimit+c;return r+n.length<=d?[]:[C("wip-respected","error",`column "${o.id}" holds ${r} card(s); pulling ${n.length} more exceeds its WIP limit of ${o.wipLimit}${c?` (+${c} expedite bypass)`:""}`,`pull at most ${Math.max(0,d-r)} card(s) now, or raise the limit in a service-delivery-review`)]}if(i.type==="ceremony.service-delivery-review"){let o=Z(i).wip??{},n=[];for(let[r,c]of Object.entries(o)){if(typeof c!="number")continue;let d=qe(l,r);d>c&&n.push(C("wip-respected","warning",`column "${r}" has ${d} active card(s), above the new limit of ${c}`,"nothing new is pulled into it until it drains; finish or move cards"));}return n}return []}},{id:"pull-not-push",severity:"error",check(l,i){if(i.type!=="ceremony.replenishment")return [];let o=l.stages[0],n=l.stages.find(d=>d.commitmentPoint);if(!o||!n)return [];let r=[],c=Z(i).column;c!==void 0&&c!==n.id&&r.push(C("pull-not-push","error",`replenishment may only pull into the commitment column "${n.id}", not "${String(c)}"`,"drop column or set it to the commitment column; later columns are pulled by the planner"));for(let d of re(i)){let f=l.items[d];f&&(f.stage!==o.id||f.status!=="todo")&&r.push(C("pull-not-push","error",`item "${d}" is ${f.status} in "${f.stage}", not an option`,`only todo cards in "${o.id}" can be pulled; cards already on the board flow by pull`,d));}return r}},{id:"blocker-has-owner",severity:"error",check(l,i){if(!i.type.startsWith("ceremony."))return [];let o=[];if(i.type==="ceremony.operations-review"){let n=Z(i).assign??[];for(let r of n)(typeof r.owner!="string"||r.owner.trim()==="")&&o.push(C("blocker-has-owner","error",`blocker "${r.blocker}" on "${r.item}" would have no owner`,"name the role or person who clears it",r.item));}for(let n of Object.values(l.items))for(let r of n.blockers)!r.clearedAt&&r.owner.trim()===""&&o.push(C("blocker-has-owner","warning",`blocker "${r.id}" on "${n.id}" has no owner`,`assign one in operations-review: { "assign": [{ "item": "${n.id}", "blocker": "${r.id}", "owner": "<who>" }] }`,n.id));return o}},{id:"one-expedite",severity:"error",check(l,i){if(i.type!=="ceremony.replenishment")return [];let o=re(i).filter(c=>l.items[c]?.classOfService==="expedite");if(o.length===0)return [];let n=Object.values(l.items).filter(c=>c.classOfService==="expedite"&&P.has(c.status)&&E(l,c)).map(c=>c.id),r=x(l).maxExpedite;return n.length+o.length<=r?[]:[C("one-expedite","error",`${n.length} expedite card(s) already on the board (${n.join(", ")||"none"}); pulling ${o.join(", ")} exceeds maxExpedite ${r}`,"deliver the current expedite first, reclassify the new card, or raise maxExpedite in a strategy-review")]}},{id:"fixed-date-needs-deadline",severity:"error",check(l,i){return i.type!=="ceremony.replenishment"?[]:re(i).filter(o=>{let n=l.items[o];return n?.classOfService==="fixed-date"&&!(n.deadline&&Number.isFinite(Date.parse(n.deadline)))}).map(o=>C("fixed-date-needs-deadline","error",`fixed-date item "${o}" has no deadline`,`editItem("${o}", { deadline: "<ISO date>" }) before pulling it`,o))}}]}function be(e){let t=e.columns.map(m=>{let u={id:m.id,name:m.name,entryPolicy:[],exitPolicy:m.policies};return m.wipLimit!==void 0&&(u.wipLimit=m.wipLimit),m.commitmentPoint&&(u.commitmentPoint=true),m.deliveryPoint&&(u.deliveryPoint=true),m.review&&(u.review=true),u}),a=t.findIndex(m=>m.commitmentPoint),s=a>=0?t[a+1]:void 0;return s&&(s.entryPolicy=t[a].exitPolicy),t}var Fe={backlog:"Options",item:"Work Item",stage:"Column",iteration:"Cadence",increment:"Delivery",ceremony:"Cadence",gate:"Policy"},Je={expedite:0,"fixed-date":1,standard:2,intangible:3},We=e=>Je[e.classOfService??"standard"]??2,ve=1e15,Ue=4e9,Ye=(e,t,a)=>Math.min(a,Math.max(t,e));function He(e,t){let a=e.classOfService??"standard";if(e.type==="question")return 5*ve;if(a==="fixed-date"&&e.deadline!==void 0){let l=Date.parse(e.deadline);if(Number.isFinite(l))return 3*ve+1e10-Math.floor(l/1e3)}let s=t.aging?Math.floor(t.deferrals/t.maxDeferralRounds):0,m=Ye(e.priority??0,-1e9,1e9)+s*Ue,u=t.aging&&t.deferrals>=t.maxDeferralRounds;return (a==="expedite"?4:a==="fixed-date"?3:a==="intangible"&&!u?1:2)*ve+m}function je(e,t){let a=We(e)-We(t);if(a!==0)return a;let s=N(e),m=N(t),u=s===void 0?0:Date.parse(s),g=m===void 0?0:Date.parse(m);return u!==g?u-g:e.id<t.id?-1:e.id>t.id?1:0}function Ge(e){return e.map(t=>t.kind==="evidence"?`evidence ${t.evidenceKind}`:t.kind==="custom"?`${t.id}: ${t.description}`:t.kind).join(", ")||"(none)"}function Ze(){return {name:"kanban",vocabulary:Fe,validateConfig:Y,defaultStages:be,defaultRoles:ge,requiredCapabilities:["manage-flow","deliver"],exclusiveCapabilities:[],plannerOptions(e){let t=x(e),a=B(e),s=e.stages[e.stages.findIndex(n=>n.id===a.id)+1],m=t.classesOfService.expedite?.wipBypass??1,u=[],g=[0],l=new Map;for(let n of e.events)u.push(Date.parse(n.at)),g.push(g[g.length-1]+(n.type==="planner.resolved"?1:0)),n.type==="item.added"&&l.set(n.payload.id,n.at);let i=n=>{let r=0,c=u.length;for(;r<c;){let d=r+c>>1;u[d]<=n?r=d+1:c=d;}return g[u.length]-g[r]},o={schedulerMode:"throughput",fairnessPolicy:t.fairness.aging?"aging":"none",deadlineStrategy:"earliest-first",dispatchStage:n=>n.stage===a.id&&s?s.id:void 0,priorityOf:n=>{let r=Date.parse(N(n)??l.get(n.id)??"");return He(n,{deferrals:i(Number.isFinite(r)?r:0),aging:t.fairness.aging,maxDeferralRounds:t.fairness.maxDeferralRounds})},tieBreaker:je,wipCounts:[...M],wipLimitOf:(n,r)=>n.wipLimit===void 0?void 0:r.classOfService==="expedite"?n.wipLimit+m:n.wipLimit};return o.maxDeferralRounds=t.fairness.maxDeferralRounds,o},candidates(e){let t=Math.max(0,x(e).maxExpedite-J(e).length),a=Object.values(e.items).filter(m=>(m.status==="todo"||m.status==="review")&&E(e,m)),s=exsorted.timSort(a.filter(m=>m.classOfService==="expedite"),je).slice(0,t);return a.filter(m=>m.classOfService!=="expedite"||s.includes(m))},invariants(e,t){let a=x(e),s=e.stages.find(l=>l.id===t.stage),m=t.classOfService??"standard",u=a.classesOfService[m]?.sle,g=Object.values(e.items).filter(l=>l.stage===s.id&&M.has(l.status)).length;return [`Column "${s.name}" exit policies: ${Ge(s.exitPolicy)}`,`Class of service: ${m}${t.deadline?`; deadline ${t.deadline}`:""}${u?`; service level p${u.percentile} <= ${u.targetMs} ms`:""}`,`WIP limit of "${s.name}": ${s.wipLimit??"none"} (active now: ${g}); finish this card before pulling another`,`Do not change the scope of "${t.id}" or its acceptance criteria; raise open_questions instead`]},ceremonies:pe(Ze),rules:ye(),metrics:e=>({...G(e)}),humanDefaults:{gates:"none"},report:e=>({cadencesDue:ce(e)})}}exports.A=ue;exports.B=pe;exports.C=ge;exports.D=ye;exports.E=be;exports.F=Fe;exports.G=He;exports.H=je;exports.I=Ze;exports.a=M;exports.b=P;exports.c=oe;exports.d=B;exports.e=X;exports.f=Q;exports.g=E;exports.h=J;exports.i=N;exports.j=U;exports.k=D;exports.l=ee;exports.m=x;exports.n=Ce;exports.o=Y;exports.p=te;exports.q=ne;exports.r=Ke;exports.s=Re;exports.t=ce;exports.u=ie;exports.v=q;exports.w=de;exports.x=G;exports.y=me;exports.z=fe;//# sourceMappingURL=chunk-UM5X2JHB.cjs.map
2
+ //# sourceMappingURL=chunk-UM5X2JHB.cjs.map