@windyroad/itil 0.21.7-preview.241 → 0.22.0-preview.243

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.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "wr-itil",
3
- "version": "0.21.7",
3
+ "version": "0.22.0",
4
4
  "description": "ITIL-aligned IT service management for Claude Code"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@windyroad/itil",
3
- "version": "0.21.7-preview.241",
3
+ "version": "0.22.0-preview.243",
4
4
  "description": "ITIL-aligned IT service management for Claude Code (problem, and future incident/change skills)",
5
5
  "bin": {
6
6
  "windyroad-itil": "./bin/install.mjs"
@@ -404,6 +404,8 @@ After writing the new `.open.md` file, regenerate `docs/problems/README.md` to i
404
404
 
405
405
  **Mechanism**: use the same rendering rules as Step 7's P062 block (glob `docs/problems/*.open.md` / `*.known-error.md` / `*.verifying.md` / `*.parked.md`; rank open/known-error by WSJF; list verifyings in the Verification Queue ordered by release age; list parkeds in the Parked section). The refresh is a **render, not a re-rank** — existing WSJF values on the other ticket files are trusted per P062's established discipline. Only the new ticket's own WSJF is consumed from its freshly-written file.
406
406
 
407
+ **WSJF Rankings tie-break sort (P138)**: rows in the WSJF Rankings table are sorted by the multi-key `(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)` so the rendered top-to-bottom row order matches `/wr-itil:work-problems` SKILL.md Step 3's tie-break selection 1:1. The first key (WSJF desc) sets the tier; within a tier the next three keys are the canonical tie-break ladder (Known Error before Open; smaller effort before larger; older Reported date before newer); ID asc is the deterministic final tiebreaker for full-tie cases. The table MUST include a `Reported` column so the third tie-break input is visible to README readers — without it, users cannot reconcile the rendered order against the orchestrator's selection. <!-- TIE-BREAK-LADDER-SOURCE: /wr-itil:work-problems SKILL.md Step 3 --> Any future change to the tie-break ladder MUST update this render block, the Step 7 P062 block, the Step 9e template, AND `/wr-itil:review-problems` SKILL.md Step 3 / Step 5 — drift here re-opens P138.
408
+
407
409
  1. After `Write`-ing the new `.open.md` file (and, for multi-concern splits per step 4b, after all split files are written), regenerate `docs/problems/README.md` in-place reflecting the new filename set.
408
410
  2. Update the "Last reviewed" line's parenthetical to name the new ticket (e.g. `P<NNN> opened — <one-line title>`) so the next session's fast-path check has a human-readable audit marker.
409
411
  3. `git add docs/problems/README.md` — the stage list at Step 11 must include it alongside the new `.open.md` file (Step 11's `git add -u` catch-all handles tracked-file modifications; the new README render lands via this path when README.md already exists in git, and via an explicit `git add docs/problems/README.md` when it is newly created).
@@ -544,6 +546,8 @@ Every Step 7 status transition (Open → Known Error, Known Error → Verificati
544
546
 
545
547
  The refresh uses the same rendering rules as Step 9e (glob `docs/problems/*.open.md` / `*.known-error.md` / `*.verifying.md` / `*.parked.md`; rank open/known-error by WSJF; list verifyings in the Verification Queue ordered by release age; list parkeds in the Parked section) but skips the full re-scoring pass — existing WSJF values on the ticket files are trusted. The refresh is a render, not a re-rank.
546
548
 
549
+ **WSJF Rankings tie-break sort (P138)**: rows in the WSJF Rankings table are sorted by the multi-key `(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)` so the rendered top-to-bottom row order matches `/wr-itil:work-problems` SKILL.md Step 3's tie-break selection 1:1. Within each WSJF tier, rows are ordered by the canonical tie-break ladder: Known Error before Open, smaller Effort before larger, older Reported date before newer. The table MUST include a `Reported` column so the third tie-break input is visible to README readers. <!-- TIE-BREAK-LADDER-SOURCE: /wr-itil:work-problems SKILL.md Step 3 --> Any future change to the tie-break ladder MUST update this render block, the Step 5 P094 block, the Step 9e template, AND `/wr-itil:review-problems` SKILL.md Step 3 / Step 5 — drift here re-opens P138.
550
+
547
551
  **Mechanism:**
548
552
 
549
553
  1. After renaming + Editing + `git add`-ing the transitioned ticket file (per the staging-trap rule above), regenerate `docs/problems/README.md` in-place reflecting the new filename set and the transitioned ticket's new Status.
@@ -631,10 +635,10 @@ The re-rate pass is part of Step 9b's output — a re-rate row appears in the st
631
635
 
632
636
  **Step 9c: Present summary and select problem to work**
633
637
 
634
- After reviewing all problems, present a WSJF-ranked table for open/known-error problems (the main dev-work queue):
638
+ After reviewing all problems, present a WSJF-ranked table for open/known-error problems (the main dev-work queue). Sort rows by `(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)` so row order matches `/wr-itil:work-problems` Step 3 tie-break selection 1:1 (P138):
635
639
 
636
- | WSJF | ID | Title | Severity | Status | Effort | Notes |
637
- |------|-----|-------|----------|--------|--------|-------|
640
+ | WSJF | ID | Title | Severity | Status | Effort | Reported | Notes |
641
+ |------|-----|-------|----------|--------|--------|----------|-------|
638
642
 
639
643
  Then present a separate **Verification Queue** section for `.verifying.md` files (per ADR-022 — ranked by release age, oldest first; no WSJF because the multiplier is 0). Highlight each ticket whose release age is **≥ 14 days** (the within-skill default per P048 Candidate 4 — tunable; if it needs cross-skill consistency later, promote to policy) with a `likely verified` marker in the final column. This makes the Verification Queue not just a list but a ranked view of which verifications are most likely ready to close:
640
644
 
@@ -677,7 +681,9 @@ When evidence is **ambiguous, contested, or absent** (no specific in-session cit
677
681
 
678
682
  **Step 9e: Update files and refresh README.md cache**
679
683
 
680
- Edit each problem file where the priority changed. Then write/overwrite `docs/problems/README.md` with the current ranked table so future `work` invocations can skip the full re-scan:
684
+ Edit each problem file where the priority changed. Then write/overwrite `docs/problems/README.md` with the current ranked table so future `work` invocations can skip the full re-scan.
685
+
686
+ **WSJF Rankings tie-break sort (P138)**: rows in the WSJF Rankings table are sorted by the multi-key `(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)` so the rendered top-to-bottom row order matches `/wr-itil:work-problems` SKILL.md Step 3's tie-break selection 1:1. Within a WSJF tier, rows are ordered by the canonical tie-break ladder: Known Error before Open, smaller Effort before larger, older Reported date before newer. The `Reported` column MUST appear so the third tie-break input is visible to README readers. <!-- TIE-BREAK-LADDER-SOURCE: /wr-itil:work-problems SKILL.md Step 3 --> Any future change to the tie-break ladder MUST update this template, the Step 5 P094 block, the Step 7 P062 block, AND `/wr-itil:review-problems` SKILL.md Step 3 / Step 5 — drift here re-opens P138.
681
687
 
682
688
  ```markdown
683
689
  # Problem Backlog
@@ -687,9 +693,9 @@ Edit each problem file where the priority changed. Then write/overwrite `docs/pr
687
693
 
688
694
  ## WSJF Rankings
689
695
 
690
- | WSJF | ID | Title | Severity | Status | Effort |
691
- |------|-----|-------|----------|--------|--------|
692
- | <score> | P<NNN> | <title> | <severity> | <status> | <effort> |
696
+ | WSJF | ID | Title | Severity | Status | Effort | Reported |
697
+ |------|-----|-------|----------|--------|--------|----------|
698
+ | <score> | P<NNN> | <title> | <severity> | <status> | <effort> | <YYYY-MM-DD> |
693
699
  ...
694
700
 
695
701
  ## Verification Queue
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env bats
2
+
3
+ # P138: docs/problems/README.md WSJF Rankings table row order must match
4
+ # /wr-itil:work-problems SKILL.md Step 3's tie-break selection 1:1, and
5
+ # the table must include a Reported date column so the third tie-break
6
+ # input is visible to README readers.
7
+ #
8
+ # Hybrid coverage per ADR-005 + ADR-037:
9
+ # - Structural contract-assertions (Permitted Exception per ADR-005 /
10
+ # contract-assertion pattern per ADR-037): each of the five render-
11
+ # block sites carries the canonical TIE-BREAK-LADDER-SOURCE marker
12
+ # and the Reported column.
13
+ # - One behavioural fixture sort: 4 tickets with equal WSJF differing
14
+ # by Status / Effort / Reported. Apply the documented multi-key
15
+ # sort. Assert the output row order matches the tie-break ladder
16
+ # result derived from /wr-itil:work-problems Step 3 selection rules.
17
+ #
18
+ # @problem P138
19
+ # @jtbd JTBD-001 (enforce governance without slowing down — predictable
20
+ # orchestrator behaviour visible from rendered README)
21
+ # @jtbd JTBD-006 (progress backlog AFK — README and orchestrator agree
22
+ # on next ticket)
23
+ #
24
+ # Cross-reference:
25
+ # P138: docs/problems/138-readme-wsjf-row-order-doesnt-match-work-problems-tie-break.*.md
26
+ # ADR-005 — plugin testing strategy / Permitted Exception
27
+ # ADR-037 — contract-assertion bats pattern
28
+ # ADR-044 — decision delegation contract; tie-break ladder is framework-resolved
29
+
30
+ setup() {
31
+ REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
32
+ MANAGE_SKILL="$REPO_ROOT/packages/itil/skills/manage-problem/SKILL.md"
33
+ REVIEW_SKILL="$REPO_ROOT/packages/itil/skills/review-problems/SKILL.md"
34
+ WORK_SKILL="$REPO_ROOT/packages/itil/skills/work-problems/SKILL.md"
35
+
36
+ TEST_TMP="$(mktemp -d)"
37
+ }
38
+
39
+ teardown() {
40
+ if [ -n "${TEST_TMP:-}" ] && [ -d "$TEST_TMP" ]; then
41
+ rm -rf "$TEST_TMP"
42
+ fi
43
+ }
44
+
45
+ # ---------------------------------------------------------------------------
46
+ # Structural contract-assertions — TIE-BREAK-LADDER-SOURCE marker
47
+ # ---------------------------------------------------------------------------
48
+
49
+ @test "manage-problem Step 5 P094 (refresh on new ticket) carries the TIE-BREAK-LADDER-SOURCE marker" {
50
+ # P138 Phase 2: each render block must carry the canonical greppable
51
+ # marker pointing back to /wr-itil:work-problems Step 3 (the
52
+ # framework-resolved source of the tie-break ladder per ADR-044).
53
+ # Drift across the render sites re-opens P138.
54
+ run grep -F '<!-- TIE-BREAK-LADDER-SOURCE: /wr-itil:work-problems SKILL.md Step 3 -->' "$MANAGE_SKILL"
55
+ [ "$status" -eq 0 ]
56
+ # Marker must appear at multiple sites (Step 5 P094, Step 7 P062, Step 9e).
57
+ count=$(grep -c -F '<!-- TIE-BREAK-LADDER-SOURCE: /wr-itil:work-problems SKILL.md Step 3 -->' "$MANAGE_SKILL")
58
+ [ "$count" -ge 3 ]
59
+ }
60
+
61
+ @test "review-problems Step 3 (Present the refreshed ranking) carries the TIE-BREAK-LADDER-SOURCE marker" {
62
+ run grep -F '<!-- TIE-BREAK-LADDER-SOURCE: /wr-itil:work-problems SKILL.md Step 3 -->' "$REVIEW_SKILL"
63
+ [ "$status" -eq 0 ]
64
+ }
65
+
66
+ @test "work-problems Step 1 (Scan the backlog) carries the TIE-BREAK-LADDER-SOURCE marker" {
67
+ run grep -F '<!-- TIE-BREAK-LADDER-SOURCE: /wr-itil:work-problems SKILL.md Step 3 -->' "$WORK_SKILL"
68
+ [ "$status" -eq 0 ]
69
+ }
70
+
71
+ # ---------------------------------------------------------------------------
72
+ # Structural contract-assertions — multi-key sort spec wording
73
+ # ---------------------------------------------------------------------------
74
+
75
+ @test "manage-problem render blocks document the multi-key sort spec verbatim" {
76
+ # The exact spec must appear so the agent applying the render produces
77
+ # the same row order as /wr-itil:work-problems Step 3.
78
+ run grep -F '(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)' "$MANAGE_SKILL"
79
+ [ "$status" -eq 0 ]
80
+ count=$(grep -c -F '(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)' "$MANAGE_SKILL")
81
+ [ "$count" -ge 3 ]
82
+ }
83
+
84
+ @test "review-problems documents the multi-key sort spec verbatim" {
85
+ run grep -F '(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)' "$REVIEW_SKILL"
86
+ [ "$status" -eq 0 ]
87
+ }
88
+
89
+ @test "work-problems Step 1 documents the multi-key sort spec verbatim" {
90
+ run grep -F '(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)' "$WORK_SKILL"
91
+ [ "$status" -eq 0 ]
92
+ }
93
+
94
+ # ---------------------------------------------------------------------------
95
+ # Structural contract-assertions — Reported column present in templates
96
+ # ---------------------------------------------------------------------------
97
+
98
+ @test "manage-problem Step 9e README template includes the Reported column" {
99
+ # The Step 9e block writes the README template that downstream renderings
100
+ # copy. Without the Reported column in the template, the third tie-break
101
+ # input remains invisible to README readers and P138 recurs.
102
+ run grep -F '| WSJF | ID | Title | Severity | Status | Effort | Reported |' "$MANAGE_SKILL"
103
+ [ "$status" -eq 0 ]
104
+ }
105
+
106
+ @test "review-problems Step 5 README template includes the Reported column" {
107
+ run grep -F '| WSJF | ID | Title | Severity | Status | Effort | Reported |' "$REVIEW_SKILL"
108
+ [ "$status" -eq 0 ]
109
+ }
110
+
111
+ # ---------------------------------------------------------------------------
112
+ # Structural contract-assertions — cross-coupling drift warning
113
+ # ---------------------------------------------------------------------------
114
+
115
+ @test "manage-problem render blocks warn that drift re-opens P138" {
116
+ # The cross-coupling note must explicitly name P138 so future agents
117
+ # who consider relaxing the multi-key sort see the regression risk.
118
+ count=$(grep -c -F 'drift here re-opens P138' "$MANAGE_SKILL")
119
+ [ "$count" -ge 3 ]
120
+ }
121
+
122
+ @test "review-problems renders the drift-re-opens-P138 warning" {
123
+ run grep -F 'drift re-opens P138' "$REVIEW_SKILL"
124
+ [ "$status" -eq 0 ]
125
+ }
126
+
127
+ # ---------------------------------------------------------------------------
128
+ # Behavioural fixture: multi-key sort produces tie-break-ladder order
129
+ # ---------------------------------------------------------------------------
130
+
131
+ @test "behavioural: multi-key sort on 4 same-WSJF tickets matches tie-break ladder order" {
132
+ # Fixture: 4 tickets all at WSJF 6.0, differing by Status / Effort /
133
+ # Reported date. Encode each as a tab-separated row whose columns are
134
+ # the multi-key sort axes (WSJF, KE_flag where 0=KE+1=Open, Effort
135
+ # divisor, Reported date, ID, Title). Apply the documented sort and
136
+ # assert the output row order matches the tie-break ladder result.
137
+ #
138
+ # Tickets:
139
+ # T1: Open, S, Reported 2026-04-27, severity 6, WSJF 6.0
140
+ # T2: Open, M, Reported 2026-04-26, severity 12, WSJF 6.0
141
+ # T3: KE, S, Reported 2026-04-25, severity 3, WSJF 6.0 (3*2/1=6.0)
142
+ # T4: KE, M, Reported 2026-04-24, severity 6, WSJF 6.0 (6*2/2=6.0)
143
+ #
144
+ # Tie-break ladder per /wr-itil:work-problems Step 3:
145
+ # 1. Known-Error first → T3, T4 before T1, T2
146
+ # 2. Smaller effort first → T3 (S) before T4 (M); T1 (S) before T2 (M)
147
+ # 3. Older reported date first → not exercised here because effort
148
+ # already distinguishes within Status (intentional: this is the
149
+ # same shape as a real backlog).
150
+ #
151
+ # Expected order: T3, T4, T1, T2
152
+ #
153
+ # NB: Reported-date field is included in the sort key but not exercised
154
+ # by this fixture (effort distinguishes pairs). The Reported-only test
155
+ # below adds explicit coverage of the third tie-break level.
156
+
157
+ fixture_in="$TEST_TMP/fixture.tsv"
158
+ cat >"$fixture_in" <<'EOF'
159
+ 6.0 1 1 2026-04-27 201 T1: Open S
160
+ 6.0 1 2 2026-04-26 202 T2: Open M
161
+ 6.0 0 1 2026-04-25 203 T3: KE S
162
+ 6.0 0 2 2026-04-24 204 T4: KE M
163
+ EOF
164
+
165
+ # Multi-key sort spec from SKILL.md:
166
+ # k1: WSJF desc -> -k1,1nr
167
+ # k2: KE_flag asc (0 KE) -> -k2,2n
168
+ # k3: Effort divisor asc -> -k3,3n
169
+ # k4: Reported asc -> -k4,4
170
+ # k5: ID asc -> -k5,5n
171
+ sorted=$(sort -t$'\t' -k1,1nr -k2,2n -k3,3n -k4,4 -k5,5n "$fixture_in" | cut -f6)
172
+ expected="T3: KE S
173
+ T4: KE M
174
+ T1: Open S
175
+ T2: Open M"
176
+ [ "$sorted" = "$expected" ]
177
+ }
178
+
179
+ @test "behavioural: multi-key sort exercises the third tie-break level (Reported date) when Status + Effort tie" {
180
+ # Fixture: 3 tickets all at WSJF 6.0, all KE, all Effort S, differing
181
+ # only by Reported date and ID. The first two tie-break levels do not
182
+ # distinguish them; only the Reported-date axis decides the order.
183
+ # This is the explicit regression guard for the third tie-break level
184
+ # being silently dropped — exactly the failure mode P138 documents.
185
+ #
186
+ # Expected order (older Reported first, then ID asc as final tiebreak):
187
+ # T_a (Reported 2026-04-22) → T_b (Reported 2026-04-25) → T_c (Reported 2026-04-27)
188
+ fixture_in="$TEST_TMP/fixture-reported.tsv"
189
+ cat >"$fixture_in" <<'EOF'
190
+ 6.0 0 1 2026-04-25 302 T_b: KE S older
191
+ 6.0 0 1 2026-04-27 303 T_c: KE S newest
192
+ 6.0 0 1 2026-04-22 301 T_a: KE S oldest
193
+ EOF
194
+
195
+ sorted=$(sort -t$'\t' -k1,1nr -k2,2n -k3,3n -k4,4 -k5,5n "$fixture_in" | cut -f6)
196
+ expected="T_a: KE S oldest
197
+ T_b: KE S older
198
+ T_c: KE S newest"
199
+ [ "$sorted" = "$expected" ]
200
+ }
201
+
202
+ @test "behavioural: tie-break flips when WSJF differs (sort respects k1 first)" {
203
+ # Regression guard: ensure the multi-key sort doesn't reorder across
204
+ # WSJF tiers. A higher-WSJF Open ticket must outrank a lower-WSJF KE
205
+ # ticket — the WSJF axis dominates the Status axis.
206
+ fixture_in="$TEST_TMP/fixture-tiers.tsv"
207
+ cat >"$fixture_in" <<'EOF'
208
+ 6.0 0 2 2026-04-20 401 T_low: KE M low-WSJF
209
+ 12.0 1 1 2026-04-30 402 T_high: Open S high-WSJF
210
+ EOF
211
+
212
+ sorted=$(sort -t$'\t' -k1,1nr -k2,2n -k3,3n -k4,4 -k5,5n "$fixture_in" | cut -f6)
213
+ expected="T_high: Open S high-WSJF
214
+ T_low: KE M low-WSJF"
215
+ [ "$sorted" = "$expected" ]
216
+ }
@@ -65,11 +65,11 @@ Re-read the WSJF Prioritisation → "Transitive dependencies (P076)" subsection
65
65
 
66
66
  After re-scoring, present three sections matching the README.md format (same rendering used by `/wr-itil:list-problems` and by the README cache — Step 5 writes the same layout):
67
67
 
68
- **WSJF Rankings** — dev-work queue (open + known-error), sorted by WSJF descending:
68
+ **WSJF Rankings** — dev-work queue (open + known-error), sorted by the multi-key `(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)` so rendered top-to-bottom row order matches `/wr-itil:work-problems` SKILL.md Step 3 tie-break selection 1:1 (P138). Within each WSJF tier, rows follow the canonical tie-break ladder: Known Error before Open, smaller Effort before larger, older Reported date before newer. The `Reported` column MUST appear so the third tie-break input is visible to README readers. <!-- TIE-BREAK-LADDER-SOURCE: /wr-itil:work-problems SKILL.md Step 3 --> Any change to the tie-break ladder MUST update this rendering block, Step 5's README template, AND `/wr-itil:manage-problem` SKILL.md Step 5 P094 / Step 7 P062 / Step 9e — drift re-opens P138.
69
69
 
70
70
  ```
71
- | WSJF | ID | Title | Severity | Status | Effort | Notes |
72
- |------|-----|-------|----------|--------|--------|-------|
71
+ | WSJF | ID | Title | Severity | Status | Effort | Reported | Notes |
72
+ |------|-----|-------|----------|--------|--------|----------|-------|
73
73
  ```
74
74
 
75
75
  **Verification Queue** — `.verifying.md` tickets, sorted by release age (oldest first). Highlight any ticket whose release age is **≥ 14 days** with a `yes (N days)` marker in the `Likely verified?` column (within-skill default per P048 Candidate 4 — tunable; promote to cross-skill policy if needed):
@@ -119,11 +119,11 @@ Write / overwrite `docs/problems/README.md` with the refreshed ranking so future
119
119
 
120
120
  ## WSJF Rankings
121
121
 
122
- Dev-work queue only. Verification Pending (`.verifying.md`, WSJF multiplier 0) and Parked (`.parked.md`, multiplier 0) tickets are excluded per ADR-022 — surfaced in their own sections below.
122
+ Dev-work queue only. Verification Pending (`.verifying.md`, WSJF multiplier 0) and Parked (`.parked.md`, multiplier 0) tickets are excluded per ADR-022 — surfaced in their own sections below. Rows sort by `(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)` so top-to-bottom order matches `/wr-itil:work-problems` Step 3 tie-break selection 1:1 (P138). The `Reported` column MUST appear.
123
123
 
124
- | WSJF | ID | Title | Severity | Status | Effort |
125
- |------|-----|-------|----------|--------|--------|
126
- | <score> | P<NNN> | <title> | <severity> | <status> | <effort> |
124
+ | WSJF | ID | Title | Severity | Status | Effort | Reported |
125
+ |------|-----|-------|----------|--------|--------|----------|
126
+ | <score> | P<NNN> | <title> | <severity> | <status> | <effort> | <YYYY-MM-DD> |
127
127
  ...
128
128
 
129
129
  ## Verification Queue
@@ -100,6 +100,8 @@ This is a robustness layer ON TOP of P094 + P062, not a supersession — both pe
100
100
 
101
101
  Read `docs/problems/README.md` if it exists and is fresh (check via git history — see manage-problem step 9 for the cache freshness check). If stale or missing, scan all `.open.md` and `.known-error.md` files in `docs/problems/`, extract their WSJF scores, and rank them.
102
102
 
103
+ **README row order matches Step 3 tie-break selection (P138)**: as of P138, the README's WSJF Rankings table is rendered with the multi-key sort `(WSJF desc, Known-Error-first, Effort-divisor asc, Reported-date asc, ID asc)`. The cache-fresh path can therefore read the rendered table top-to-bottom and the first row is the orchestrator's pick — no in-memory tie-break re-application needed. The slow path scan must apply the same multi-key sort. <!-- TIE-BREAK-LADDER-SOURCE: /wr-itil:work-problems SKILL.md Step 3 -->
104
+
103
105
  Exclude:
104
106
  - `.closed.md` files (done)
105
107
  - `.parked.md` files (blocked on upstream)