@windyroad/retrospective 0.12.1-preview.252 → 0.12.2-preview.254
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json
CHANGED
|
@@ -385,7 +385,24 @@ For every codifiable observation identified in Step 2:
|
|
|
385
385
|
|
|
386
386
|
**Ownership boundary** (same as Step 4a): run-retro surfaces the observation and delegates ticket creation to `/wr-itil:manage-problem`. The delegated skill renames, edits, and commits per ADR-014. run-retro does not commit its own work.
|
|
387
387
|
|
|
388
|
-
**Non-interactive / AFK branch**: Stage 1 fires regardless — ticketing is mechanical and does not require user input
|
|
388
|
+
**Non-interactive / AFK branch**: Stage 1 fires regardless — ticketing is mechanical and does not require user input (per ADR-044 framework-resolution boundary; Stage 1 is in the framework-mediated zone — the agent reads the framework, ticket-creates per observation, and reports).
|
|
389
|
+
|
|
390
|
+
**Valid fallback gates** — the ONLY conditions under which an observation may be recorded in the retro summary's "Tickets Deferred" section instead of ticketed via `/wr-itil:manage-problem`:
|
|
391
|
+
|
|
392
|
+
- `cause: skill_unavailable` — the Skill tool is gated out of the current tool surface, OR `/wr-itil:manage-problem` is not registered in this project's plugin set, OR a structural prerequisite (git access, `docs/problems/` directory) is unreachable. The fallback is a graceful-degradation branch when the mechanical action is physically impossible.
|
|
393
|
+
|
|
394
|
+
Every "Tickets Deferred" entry MUST carry an explicit `cause:` field naming one of the valid gates. Entries without `cause:`, or with a cause not in the allowlist, are Step 4b Stage 1 violations and are surfaced by `packages/retrospective/scripts/check-tickets-deferred-cause.sh` (advisory; advisory-only initial mode per ADR-040 declarative-first). If the script reports violations, the retro summary renders them under a labelled `Step 4b Stage 1 violations — observations dropped without skill-unavailability cause` subsection.
|
|
395
|
+
|
|
396
|
+
**Anti-pattern: Do NOT skip Stage 1 ticketing under any of the following rationalisations** (P148, 2026-04-29):
|
|
397
|
+
|
|
398
|
+
- "The session is long" / "context is at N tokens" / "the user might want to wrap up" — session length is not a Stage 1 fallback gate. The user's wrap-up wish is satisfied AT NEXT SESSION, not by deferring observations to a possibly-not-read retro-summary table.
|
|
399
|
+
- "`/wr-itil:manage-problem` lifecycles are heavyweight in this state" — the lifecycle weight is fixed and budgeted; perceived heaviness is not a fallback gate.
|
|
400
|
+
- "I'll defer this to the retro summary's Tickets Deferred section instead" — the Tickets Deferred section is the SKILL-UNAVAILABLE branch only. Routing observations there because the agent prefers a lighter path is the failure mode P148 documents.
|
|
401
|
+
- Fabricating lighter-path subcommands that do not exist (`manage-problem create-fast` and similar) to justify deferring — the only supported invocation surfaces are the ones in `packages/itil/skills/manage-problem/SKILL.md` Operations table.
|
|
402
|
+
|
|
403
|
+
**Evidence (P148, 2026-04-29)**: an observation deferred under a non-`skill_unavailable` cause "could have very easily been lost if I was in a rush" (user correction phrasing — captures the lost-observation hazard exactly). Deferred observations depend on the user reading the retro summary AND ticketing before context expires AND the entries still being accurate when re-read days later. Each gating clause adds drop risk; Stage 1 ticketing has zero drop risk because the ticket exists in `docs/problems/` from the moment of creation.
|
|
404
|
+
|
|
405
|
+
**See also**: ADR-044 framework-mediated surface; P148 (anti-pattern driver ticket); P145 (sibling defer-pattern at the Tier 3 rotation prompt — same class of behaviour, different surface).
|
|
389
406
|
|
|
390
407
|
#### Stage 2: Record proposed fix strategy on each ticket (silent agent action per P135 / ADR-044)
|
|
391
408
|
|
|
@@ -470,6 +487,16 @@ Present a summary to the user:
|
|
|
470
487
|
### Problems Created/Updated
|
|
471
488
|
- [problem ticket]: [summary]
|
|
472
489
|
|
|
490
|
+
### Tickets Deferred
|
|
491
|
+
|
|
492
|
+
(Emitted only when Step 4b Stage 1 took the SKILL-UNAVAILABLE fallback per the AFK branch above — every row MUST cite a `Cause` field naming a valid fallback gate. Omit this section entirely when no observations were deferred. P148.)
|
|
493
|
+
|
|
494
|
+
| Observation | Cause | Citation |
|
|
495
|
+
|-------------|-------|----------|
|
|
496
|
+
| <one-line observation summary> | `skill_unavailable` | <retro-step-citation, e.g. `Step 2b detection`, `Step 4a verification candidate`> |
|
|
497
|
+
|
|
498
|
+
The `Cause` column accepts only `skill_unavailable` (per `packages/retrospective/scripts/check-tickets-deferred-cause.sh` allowlist). Rows with any other cause — or no `Cause` column — are Step 4b Stage 1 violations; the script surfaces them as such on its next run. Session-length rationalisations, perceived heaviness, or fabricated subcommands are NOT valid causes (see the AFK branch's anti-pattern enumeration in Step 4b).
|
|
499
|
+
|
|
473
500
|
### Verification Candidates
|
|
474
501
|
|
|
475
502
|
(Emitted only when Step 4a found `.verifying.md` tickets with specific in-session citations. Omit this section entirely when no candidates were found — or when the interactive path closed them all during Step 4a. Populated in non-interactive / AFK mode per ADR-013 Rule 6 — the user closes on return.)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
#!/usr/bin/env bats
|
|
2
|
+
#
|
|
3
|
+
# P148: run-retro SKILL.md Step 4b Stage 1 MUST carry a tightened
|
|
4
|
+
# AFK-branch fallback-gating clause that (a) names `cause: skill_unavailable`
|
|
5
|
+
# as the only valid fallback gate, (b) enumerates the rationalisation
|
|
6
|
+
# anti-patterns the agent is forbidden to use, and (c) cites the
|
|
7
|
+
# advisory script that mechanically enforces the cause allowlist.
|
|
8
|
+
#
|
|
9
|
+
# # Test shape: minimal structural backstop (ADR-037 permitted exception)
|
|
10
|
+
#
|
|
11
|
+
# Per P081 (structural-content tests are wasteful — behavioural preferred),
|
|
12
|
+
# the LOAD-BEARING test for this fix lives at
|
|
13
|
+
# `packages/retrospective/scripts/test/check-tickets-deferred-cause.bats`
|
|
14
|
+
# (behavioural — exercises the script against fixture retro summary
|
|
15
|
+
# directories with good / bad / legacy / mixed cause column shapes).
|
|
16
|
+
#
|
|
17
|
+
# This file is a TINY structural backstop that links the SKILL.md prose
|
|
18
|
+
# (canonical human-readable source) to the script (mechanical enforcement).
|
|
19
|
+
# Without this link, the prose contract and the script contract could
|
|
20
|
+
# drift independently — agents reading the prose would see one set of
|
|
21
|
+
# valid causes, the script would enforce a different set. The structural
|
|
22
|
+
# assertion confirms the prose names the same allowlist token (`skill_unavailable`)
|
|
23
|
+
# and the same script path the prose tells the reader to consult.
|
|
24
|
+
#
|
|
25
|
+
# Architect verdict (2026-04-29): keep the prose as canonical, the
|
|
26
|
+
# script as mechanical enforcement, and ONE structural assertion linking
|
|
27
|
+
# them. P081 narrows ADR-037's permitted exception; this file's three
|
|
28
|
+
# assertions are the architect-approved minimum.
|
|
29
|
+
#
|
|
30
|
+
# # @adr ADR-037 permitted exception — narrowest justifiable scope.
|
|
31
|
+
# # @adr ADR-044 framework-mediated surface boundary cited in SKILL.md.
|
|
32
|
+
# # @ticket P148 — Stage 1 fallback-gating tightening (driver).
|
|
33
|
+
# # @ticket P145 — sibling defer-pattern at Tier 3 rotation (composing surface).
|
|
34
|
+
# # @ticket P081 — behavioural-tests-preferred direction (justifies tiny scope).
|
|
35
|
+
|
|
36
|
+
setup() {
|
|
37
|
+
REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
|
|
38
|
+
SKILL_MD="$REPO_ROOT/packages/retrospective/skills/run-retro/SKILL.md"
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@test "Stage 1 AFK branch names 'cause: skill_unavailable' as the only valid fallback gate (P148)" {
|
|
42
|
+
# Links SKILL.md prose to the script's allowlist. If the prose adds
|
|
43
|
+
# a second valid cause without an matching script update, this
|
|
44
|
+
# assertion still passes — the goal is "the prose names the canonical
|
|
45
|
+
# token", not "the prose names the entire allowlist exhaustively".
|
|
46
|
+
run grep -F 'cause: skill_unavailable' "$SKILL_MD"
|
|
47
|
+
[ "$status" -eq 0 ]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@test "Stage 1 AFK branch references the advisory script by path (P148)" {
|
|
51
|
+
# Without this reference, a reader of the SKILL.md prose has no path
|
|
52
|
+
# to the mechanical enforcement layer. The script reference IS the
|
|
53
|
+
# affordance to the tooling.
|
|
54
|
+
run grep -F 'check-tickets-deferred-cause.sh' "$SKILL_MD"
|
|
55
|
+
[ "$status" -eq 0 ]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@test "Stage 1 AFK branch cites P148 as the anti-pattern driver (P148)" {
|
|
59
|
+
# Audit-trail link: the anti-pattern enumeration's authority is the
|
|
60
|
+
# 2026-04-29 user correction recorded on P148. This assertion confirms
|
|
61
|
+
# the prose names the driver ticket so future readers can locate the
|
|
62
|
+
# evidence trail.
|
|
63
|
+
run grep -F 'P148' "$SKILL_MD"
|
|
64
|
+
[ "$status" -eq 0 ]
|
|
65
|
+
}
|