Skip to content

[#313] fix: router/catalog + correctness fixes (task T1)#325

Merged
rucka merged 4 commits into
mainfrom
fix/#313-t1-router-catalog
Jul 13, 2026
Merged

[#313] fix: router/catalog + correctness fixes (task T1)#325
rucka merged 4 commits into
mainfrom
fix/#313-t1-router-catalog

Conversation

@rucka

@rucka rucka commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator

Summary

What Changed

Task T1 of story #313 — router/catalog correctness fixes across the next router and four skills (dataset .skills/** + .claude/skills/** mirror, byte-consistent in this commit):

  1. next catalog 33 → 35 — added checkpoint and grill (previously unreachable via the router) to the catalog tables and the suggestion cascades; corrected every stated count (33→35, 23→25 capability); added an explicit note that the catalog is derived from the installed corpus so drift is detectable.
  2. Overlapping cascade rows disambiguated — added distinguishing predicates (macrostate + task-breakdown-present + checkpoint-file-present) to the ambiguous Step 3 rows and co-located the tie-break rule (delivery-proximity ordering) directly under the table instead of leaving it buried in Notes.
  3. Ordered-list numbering resets fixed — review Step 6.2 and refine-story Step 1 now renumber sequentially (indented the interrupting table into item 1). implement Phase 3 was already sequential — no change needed.
  4. Buried load-bearing rules surfaced — verify-quality's Step 5.C write-exception (its ONLY write) now appears in the overview and Arguments section; grill's "never answer for the human" HITL rule is now a Core Rule at the top.
  5. Forward references marked planned/brainstorm (planned — pair-process-brainstorm — 3 phases, parametrized ($root, orientation) #230) and /publish-pr (planned — pair-capability-publish-pr — gate + PR + tag propagation + git-workflow/conditional sections #255) are no longer presented as live skills.

Why This Change

The router silently could not reach 2 of the 35 installed skills; overlapping cascade rows could co-fire with the resolution rule hidden in Notes; numbering bugs rendered non-sequentially; and load-bearing behaviors (a skill's only write, an HITL invariant) were buried. Fixing correctness first (T1) unblocks the rest of #313.

Story Context

User Story: #313 — skill corpus effectiveness (router/catalog + correctness fixes)
Acceptance Criteria: AC1 (every installed skill routable, no ambiguous co-firing rows, counts match reality) + AC8 (dataset + mirror byte-consistent, gates green).

Changes Made

Implementation Details

  • next catalog completed to 35 with corpus-derivation note; counts corrected; cascade rows renumbered
  • Distinguishing predicates added to cascade rows; tie-break co-located with the table
  • Numbering resets fixed (review Step 6.2, refine-story Step 1)
  • verify-quality write-exception surfaced (overview + Arguments); grill HITL rule promoted to Core Rule
  • /brainstorm and /publish-pr marked planned with issue links

Files Changed

  • Modified: next, capability/{verify-quality,grill,checkpoint}, process/{review,refine-story} SKILL.md — each in dataset (packages/knowledge-hub/dataset/.skills/**) + .claude/skills/** mirror (12 files total)

Testing

Test Results

pnpm --filter @pair/knowledge-hub test : PASS (80 tests) + check:links clean
pnpm mdlint:check                      : PASS
pnpm docs:staleness                    : PASS — 35 skills, 8 commands in sync
Routing dry-run                        : 35/35 skills routable (checkpoint + grill via catalog + cascade rows 7 and 15)

Testing Strategy

  • Routing dry-run: parsed the next catalog tables + cascade rows and confirmed every one of the 35 corpus skills is reachable.
  • Numbering: scanned all ordered lists in the three process skills for resets; the two in-scope resets are fixed and none introduced.
  • Mirror consistency: dataset + mirror edited symmetrically under the name-prefix transform; transfer-dataset byte-consistency test passes.

Documentation

  • Technical Documentation: skill SKILL.md files (the product) updated in place; catalog now self-documents its derivation rule.

Dependencies & Related Work


Refs #313

🤖 Generated with Claude Code

- next: catalog 33->35 (add checkpoint+grill to tables and cascades), explicit corpus-derivation note, corrected counts
- next: distinguishing predicates on overlapping cascade rows, tie-break co-located with the table
- numbering resets fixed: review Step 6.2, refine-story Step 1
- verify-quality: Step 5.C write-exception surfaced in overview + Arguments
- grill: never-answer-for-the-human HITL rule promoted to a Core Rule
- forward refs marked planned: /brainstorm (#230), /publish-pr (#255)
- dataset + .claude mirror byte-consistent

Refs: #313

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@rucka

rucka commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

Code Review — PR #325

Review Information

PR Number: #325[#313] fix: router/catalog + correctness fixes (task T1)
Author: rucka
Reviewer: Independent reviewer (adversarial, blind to author working context)
Review Date: 2026-07-13
Story/Epic: #313 — Skill corpus effectiveness (T1: router/catalog + correctness fixes)
Review Type: Bug Fix (docs / skill-corpus correctness)
Head reviewed: 6f7126c (origin/fix/#313-t1-router-catalog)

Review Summary

Overall Assessment

  • Approved with Comments — Minor issues noted, can merge

Rationale: AC1 (routability + no ambiguous co-firing + next stated counts match reality) and AC8 (mirror byte-consistency + gates green) are both fully met and independently verified. Only two non-blocking Minor items and one by-design Nit remain — none touches the T1 acceptance bar.

Key Changes Summary

T1 correctness pass over next + 4 skills, dataset + .claude/skills mirror (12 files):

  1. next catalog 33 → 35 (added checkpoint + grill, both previously unreachable via the router) with an explicit "derived from the installed corpus" note (9 process + 25 capability + /next = 35).
  2. Cascade rows disambiguated (distinguishing predicates on macrostate / task-breakdown / checkpoint-file) with the delivery-proximity tie-break co-located under the Step 3 table.
  3. Ordered-list numbering resets fixed (review Step 6.2, refine-story Step 1); implement Phase 3 correctly left unchanged (already sequential).
  4. Buried rules surfaced (verify-quality write-exception → overview + Arguments; grill "never answer for the human" → Core Rule).
  5. Forward refs /brainstormplanned — #230, /publish-prplanned — #255.

Business Value Validation

Confirmed. The router previously could not reach 2/35 installed skills and overlapping cascade rows had the resolution rule buried in Notes. Both are the AC1 correctness bar and are now resolved. This unblocks the rest of #313.

Verification Performed (independent)

  • Corpus count: counted the real corpus from the filesystem — 25 capability + 9 process + 1 next = 35. Matches the catalog, headers, derivation note, and prose. No residual 33/23 at PR head. Full 25-row capability table cross-checked against the actual .skills/capability/ directory — complete.
  • Reachability: checkpoint reachable via Step 3 row 7, grill via Step 4 row 15; both also in the catalog tables. 35/35 routable.
  • Cascade dry-run: for a single item, rows 7–10 are mutually exclusive (one macrostate each; Ready split by task-breakdown presence; In Progress gated by checkpoint-file). Row 6 (Review) is exclusive from 7–10 per item. Across items the tie-break (row order = delivery proximity) resolves co-holding conditions. Tie-break note is now co-located under the table; Notes/Step 4 point to it rather than restating.
  • Numbering: review Step 6.2 → 1/2/3; refine-story Step 1 → 1/2/3 (interrupting table indented into item 1); implement Phase 3 all steps sequential (PR's "no change needed" is accurate); review Step 3.2 Level N sublists correctly untouched.
  • Forward refs: verified via gh issue viewpair-process-brainstorm — 3 phases, parametrized ($root, orientation) #230 = pair-process-brainstorm (→ /brainstorm), pair-capability-publish-pr — gate + PR + tag propagation + git-workflow/conditional sections #255 = pair-capability-publish-pr (→ /publish-pr), pair-process-implement composes checkpoint + publish-pr via subagent (resume from checkpoint) #256 = pair-process-implement composes checkpoint (→ the future /implement phase, correctly NOT marked planned since /implement exists). planned — #NNN convention matches existing usage in map-contexts/map-subdomains.
  • Mirror discipline: all 6 dataset ↔ .claude/skills pairs edited symmetrically under the name-prefix transform. No conditional transform markers in the edited files, so the mirror is a straight prefix rename — confirmed consistent pair-by-pair. The derivation-note wording is appropriately adapted (dataset: "every skill directory under .skills/" → mirror: "every installed skill", since the installed layout is flat).
  • Gates (run from a detached worktree at PR head):
    • pnpm --filter @pair/knowledge-hub test80 passed (incl. the 29-test transfer-dataset byte-consistency suite); check:links clean.
    • node scripts/docs-staleness-check.jsPASS — 35 skills, 8 commands in sync.
    • markdownlint on the edited files → 0 errors.
      All match the PR's stated gate results.

Detailed Review Comments

Positive Feedback

  • Surgical, well-scoped change: only the 6 declared skills (×2 mirrors) touched; no incidental edits.
  • The "catalog is derived from the installed corpus" note with the explicit 9 + 25 + 1 = 35 derivation is a good anti-drift measure — it makes future divergence self-evident to an editor.
  • Correctly recognized implement Phase 3 was already sequential and left it alone, rather than churning it.
  • Tie-break reasoning (single-item mutual exclusion vs cross-item row order) is precise and now co-located with the table it governs.

Minor Issues 💡 (non-blocking)

  • .pair/knowledge/way-of-working.md:81 (+ dataset mirror packages/knowledge-hub/dataset/.pair/knowledge/way-of-working.md:81) — Stale count: "...the full catalog of 33 skills." The corpus is 35. This contradicts reality, the freshly-fixed next catalog, skills-catalog.mdx (35), and even skills-guide.md:20 (the doc this very line links to, which says 35). It is not caught by docs:staleness (that gate only inspects skills-catalog.mdx). It sits outside T1's declared file list, but the PR's own stated objective Setup & Project Management Integration #1 is "corrected every stated count (33→35)", so leaving this one is an incomplete execution of that goal. Recommendation: update both copies to 35 in this PR (keeps the mirror byte-consistent), or explicitly defer it in the PR/ledger so it is not silently dropped by T3/T7.

  • next/SKILL.md Step 3 table (rows 7–8) + mirror — Coverage gap: a story resolving to macrostate In Progress with no checkpoint file matches neither row 7 (requires the checkpoint file) nor row 8 (requires Ready), so it falls through Step 3 to the Step 4/Step 5 fallback. This is pre-existing (the prior cascade had no In Progress handling at all) and not a regression — AC1 is still met since every skill remains routable (/implement via row 8). Adding row 7 surfaces the adjacent uncovered state. Recommendation (optional): either a catch-all for In Progress (→ /implement or /checkpoint) or a one-line note that In-Progress-without-checkpoint intentionally defers to fallback. Non-blocking.

Nit 💡 (by-design — reported for transparency only)

  • capability/verify-quality/SKILL.md:17 and :25 (+ mirror) — The Step 5.C write-exception is stated twice in near-identical wording within ~8 lines (overview paragraph + "Write note" blockquote in Arguments). This is intentional and correct: AC6/T1 explicitly requires the exception to appear in both the overview and the Arguments section, and the blockquote is the Arguments-section placement. Collapsing them would violate the dual-placement requirement. nonActionable — no change recommended.

Testing Review

Test Results:        80/80 passing (knowledge-hub) + check:links clean
docs:staleness:      PASS — 35 skills, 8 commands
markdownlint:        0 errors on edited files
Byte-consistency:    transfer-dataset suite (29 tests) green

Adequate for a docs/skill-corpus correctness change. No executable source touched; no unit-test additions expected. The existing structural gates (byte-consistency, staleness, links, mdlint) are the right coverage and all pass. Note (informational, not a finding): no gate currently guards the next count itself — that drift-detection is T7/#324's remit; the in-file derivation note is the interim safeguard.

Adoption Compliance

  • Templates: PR body follows the PR template; this review follows the code-review template.
  • Mirror-sync business rule (dataset + .claude/skills in the same commit): satisfied — verified in this commit and by the byte-consistency suite.
  • Portability: no assistant-specific frontmatter introduced; edits are body/description text only.

Risk Assessment

Risk Impact Probability Mitigation
next count drifts again Low Low In-file derivation note (9+25+1=35) makes drift self-evident; T7/#324 to add a gate
Stale "33 skills" in way-of-working.md misleads a reader Low Low Minor finding above; harmless (users invoke /next, which covers 35)
Merge order vs #319 (touches review/checkpoint different regions) Low Medium Per PR: whichever merges second rebases

Verdict

Approved with Comments. All T1 acceptance criteria (AC1 + AC8) are met and independently verified; every stated gate is green. Two Minor items (one stale count in an adjacent file; one pre-existing state-coverage gap) and one by-design Nit are surfaced for transparency and do not block merge. The stale-count Minor is worth folding into this PR since it directly serves the PR's own "correct every stated count" objective and keeps the corpus internally consistent.


Independent review — reconstructed from issue #313 (AC + T1), the PR diff/description, and the code at 6f7126c. Author working context (.pair/working/) was not consulted.

…ch-all

- way-of-working.md + getting-started.md (dataset+mirror): stale "33 skills" / "30 (11+19)" → 35 (9 process + 25 capability + 1 navigator)
- next: add catch-all cascade row (In Progress + no checkpoint → /implement); renumber Step 3 (6-11) and Step 4 (12-16); tie-break notes every In-Progress story is routed, fallback never reached for active work
- dataset + .claude mirror byte-consistent
- changelogs/decision-log left untouched (historical records)

Refs: #313
Addresses PR #325 review findings 1-2

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@rucka

rucka commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

Review remediation — findings 1 & 2

Commit 177ed4c on fix/#313-t1-router-catalog. Gates green (knowledge-hub 80/80 + links, mdlint:check, docs:staleness = 35 skills). Routing dry-run still 35/35.

Finding 1 (Minor) — residual stale counts → FIXED

  • .pair/knowledge/way-of-working.md:81 + dataset mirror packages/knowledge-hub/dataset/.pair/knowledge/way-of-working.md:81: "catalog of 33 skills" → 35. Now agrees with skills-guide.md (35).
  • Whole-repo grep (33 skill | 23 capability | of 33 | 33 pair | 30 skills | N-skill counts) also surfaced one more live stale count: getting-started.md (+ dataset mirror) said "Full catalog of 30 Agent Skills (11 process + 19 capability)". Fixed to "35 Agent Skills (9 process + 25 capability + 1 navigator)", matching skills-guide.md's canonical phrasing. Fixed dataset + mirror together.
  • Deliberately left untouched (historical records, not stale docs): the */CHANGELOG.md entries ("31 skills catalog") and decision-log/2026-02-14-prompt-deletion-over-deprecation.md ("all 30 skills implemented") — these describe the corpus state at a past release/decision and must not be rewritten.

Finding 2 (Minor) — In-Progress-without-checkpoint gap → FIXED with a catch-all row (not a note)

Chose the catch-all row over the defer-to-fallback note. Rationale: a story that is In Progress with no checkpoint is active work — the correct suggestion is to continue implementing, not the generic Step-5 fallback (which would suggest plan-stories/review). Since T1 is the router-correctness task, routing it correctly beats documenting a mediocre behavior.

New Step 3 cascade (renumbered):

# Condition Suggestion
7 In Progress AND checkpoint file exists /checkpoint (resume)
8 In Progress AND no checkpoint file /implement (continue; re-derives state)
9 Ready AND task breakdown /implement
10 Ready, no task breakdown /plan-tasks
11 Draft /refine-story

Rows 7 and 8 are mutually exclusive on checkpoint-file present/absent, so no new ambiguity in the disambiguation added earlier. Step 4 capability rows renumbered 12–16; tie-break note, graceful-degradation and Notes row-references updated to match. The tie-break now states explicitly: every In Progress story matches row 7 or row 8 — the fallback is never reached for active work.

Finding 3 (Nit, non-actionable) — acknowledged, no change

The verify-quality write-exception appearing in both the overview and the Arguments section is by design: AC6 requires the buried rule surfaced in both the skill's top section and Arguments.

Not merging — awaiting your call.

🤖 Generated with Claude Code

@rucka

rucka commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

Re-review — PR #325 remediation verified — Approve

Reviewer: Independent reviewer (adversarial, blind to author working context)
Re-review date: 2026-07-13
Head re-reviewed: 177ed4c (remediation commit) · remediation comment: #issuecomment-4955211848

Both actionable findings from the initial review are genuinely resolved (not merely acknowledged). The by-design Nit was correctly left as-is. All gates re-run green from a detached worktree at 177ed4c.

Finding 1 (stale counts) — RESOLVED ✓

  • way-of-working.md:81 and dataset mirror packages/knowledge-hub/dataset/.pair/knowledge/way-of-working.md:81: "33 skills" → "35 skills". ✓
  • Bonus, author-found live stale count: getting-started.md and dataset mirror — "30 Agent Skills (11 process + 19 capability)" → "35 Agent Skills (9 process + 25 capability + 1 navigator)". Verified against the real corpus (25 capability + 9 process + 1 navigator = 35) and matches skills-guide.md:20's phrasing. ✓
  • Both dataset ↔ mirror pairs byte-consistent (count text identical; only skill-ref prefixes differ per the transform).
  • Deliberately-untouched historical records — I agree these must stay:
    • packages/knowledge-hub/CHANGELOG.md "31 skills catalog" sits under a dated Release v0.4.1 entry describing what that release's reference docs covered. Editing would falsify what v0.4.1 shipped.
    • .pair/adoption/decision-log/2026-02-14-...md "all 30 skills implemented" is under a dated ## Date 2026-02-14 entry — the corpus size that justified the deletion-over-deprecation decision. Editing would falsify the decision's context.
    • Both are append-only, point-in-time records; leaving them is correct.

Finding 2 (In-Progress-without-checkpoint) — RESOLVED ✓

Author chose a catch-all row over a note — verified sound:

  • New Step 3 row 8: In Progress AND no checkpoint file → /implement ("re-derives state from scratch when no checkpoint exists").
  • Rows 7 & 8 mutually exclusive and jointly exhaustive over In Progress: row 7 = checkpoint present, row 8 = checkpoint absent. Every In Progress story now matches row 7 or row 8 — it can no longer fall through to the Step 5 fallback. ✓
  • No new ambiguity: rows 8 and 9 both suggest /implement but are mutually exclusive per macrostate (In Progress vs Ready), so they never co-fire for one item.
  • Single-item exclusivity across rows 7–11 holds via predicates (macrostate; checkpoint present/absent; task-breakdown present/absent): In Progress→7|8, Ready→9|10, Draft→11, Review→6.
  • Renumbering internally consistent: Step 3 = rows 3–11, Step 4 = rows 12–16 — continuous 1–16.
  • All cross-references updated, no dangling pointer:
    • Tie-break paragraph: "rows 6–11", "rows 7–11 mutually exclusive", + new sentence "Every In Progress story matches row 7 or row 8 — the fallback (Step 5) is never reached for active work." ✓
    • Graceful-degradation bullet: "row 11's condition" (Draft/Readiness Fallback moved 10→11). ✓
    • Notes "Full catalog coverage": "row 7 /checkpoint, rows 12–16 including /grill" (grill moved 15→16). ✓
  • 35/35 still routable; both dataset ↔ mirror copies byte-consistent under the transform.

Finding 3 (Nit) — ACKNOWLEDGED

The verify-quality dual-placement of the Step 5.C write-exception was nonActionable (by-design per AC6, which requires the exception in both overview and Arguments). Correctly left unchanged.

Gates (re-run at 177ed4c)

knowledge-hub test:  80/80 passing (incl. 29-test transfer-dataset byte-consistency) + check:links clean
docs:staleness:      PASS — 35 skills, 8 commands in sync
markdownlint:        0 errors on all 6 remediation files

Verdict: Approved

AC1 + AC8 fully met and independently re-verified; all findings resolved; all gates green. No remaining blocking or non-blocking issues. Ready for the human merge gate.


Independent re-review — reconstructed from issue #313, the PR diff/description, and the code at 177ed4c. Author working context (.pair/working/) not consulted. Not merging — human gate.

@rucka

rucka commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

Code Review — PR #325 (canonical /pair-process-review run)

Review Information

PR Number: #325[#313] fix: router/catalog + correctness fixes (task T1)
Author: rucka
Reviewer: Independent reviewer (adversarial; blind to .pair/working/ author context)
Review Date: 2026-07-13
Story/Epic: #313 — Skill corpus effectiveness (T1: router/catalog + correctness fixes)
Review Type: Bug Fix (docs / skill-corpus correctness)
Head reviewed: 177ed4c (origin/fix/#313-t1-router-catalog) — the remediation head
Process: /pair-process-review 6-phase run (Phases 1–5; Phase 6 merge deliberately NOT run — human gate). Composes verify-quality (Phase 2), verify-done (Phase 4), assess-debt (Phase 4, output-only). This is the canonical skill-driven report; two prior ad-hoc reviewer comments exist on this PR and are treated as review artifacts, not author bias.

Review Summary

Overall Assessment

  • Approved with Comments — Minor issues noted, can merge

Rationale: AC1 (every installed skill routable, no ambiguous co-firing rows, next stated counts match reality) and AC8 (dataset ↔ mirror byte-consistent, gates green) — the only two ACs T1 owns — are both fully met and independently re-verified at 177ed4c. All findings below are Minor/Nit and none touches the T1 acceptance bar. The report is upgraded from a plain "Approved" (the prior re-review's verdict) to "Approved with Comments" because this run surfaced two genuinely new, live, user-facing stale counts that neither prior review nor the author's remediation "whole-repo grep" caught.

Key Changes Summary

T1 correctness pass over next + 4 skills, dataset + .claude/skills mirror (16 files at head 177ed4c):

  1. next catalog 33 → 35 (added checkpoint + grill, both previously unreachable via the router) with an explicit "derived from the installed corpus" note (9 process + 25 capability + /next = 35).
  2. Cascade rows disambiguated (distinguishing predicates on macrostate / checkpoint-file / task-breakdown) with the delivery-proximity tie-break co-located under the Step 3 table; remediation added a catch-all so every In Progress story routes (rows 7/8).
  3. Ordered-list numbering resets fixed (review Step 6.2, refine-story Step 1); implement Phase 3 correctly left unchanged.
  4. Buried rules surfaced (verify-quality write-exception → overview + Arguments; grill "never answer for the human" → Core Rule).
  5. Forward refs /brainstormplanned — #230, /publish-prplanned — #255.
  6. Remediation: stale "33 skills" in way-of-working.md and "30 (11+19)" in getting-started.md (both copies) → 35.

Business Value Validation

Confirmed. The router previously could not reach 2/35 installed skills and overlapping cascade rows had the resolution rule buried in Notes. Both — the AC1 correctness bar — are resolved and independently verified. Unblocks the rest of #313.

Independent Verification Performed

  • Corpus count (from the filesystem, not the diff): ls of dataset/.skills/ → 9 process + 25 capability + 1 next = 35; .claude/skills/pair-*35 dirs. Matches the catalog, headers, derivation note, and prose.
  • Routability: cross-checked every one of the 35 skill directory names against the next catalog tables — 0 missing; capability table = exactly 25 rows; next present. checkpoint reachable via Step 3 row 7, grill via Step 4 row 16.
  • Cascade correctness: rows renumbered 3–16 continuous, no gaps or resets (Step 3 = 3–11, Step 4 = 12–16). Rows 7 (In Progress + checkpoint) and 8 (In Progress, no checkpoint) are mutually exclusive and jointly exhaustive over In Progress; rows 6–11 partition {Review, In Progress, Ready, Draft} by macrostate + checkpoint-file + task-breakdown predicates; tie-break (delivery-proximity, row order) is co-located under the table, with Notes/graceful-degradation pointing to it (no dangling references).
  • Numbering render: review Step 6.2 → 1/2/3; refine-story Step 1 → 1/2/3 (interrupting table indented into item 1); implement Phase 3 untouched (correctly — already sequential).
  • Mirror discipline: next "35" occurrences identical dataset (4) vs mirror (4); transfer-dataset byte-consistency suite (29 tests) green. README.md and website getting-started/index.mdx are not part of the dataset mirror, so the two stale counts below are standalone-doc issues, not mirror-consistency breaks.

Quality Gates (verify-quality — re-run at 177ed4c from a detached worktree)

pnpm --filter @pair/knowledge-hub test : PASS — 80/80 (incl. 29-test transfer-dataset byte-consistency + 6 link tests); check:links "All markdown links are valid"
node scripts/docs-staleness-check.js   : PASS — 35 skills, 8 commands in sync
markdownlint (edited files)            : PASS — 0 errors

Note on reproduction: @pair/knowledge-hub test fails on a clean worktree until @pair/content-ops is built (the link/transfer suites import it) — a build-order prerequisite, not a code defect. After pnpm --filter @pair/content-ops build, the full suite is 80/80. No executable source is touched by this PR; the structural gates (byte-consistency, staleness, links, mdlint) are the correct coverage.

Definition of Done (verify-done vs #313 — scoped to T1)

T1 owns AC1 + AC8 only (per the story's AC-coverage matrix). AC2 (authoring ADR), AC3–AC7 belong to T2/#319 and T3–T7 — correctly out of scope here; their absence is not a T1 finding.

  • AC1 — every installed skill routable; no ambiguous co-firing rows; next stated counts match reality. Met + verified.
  • AC8 — gates green; dataset + mirror byte-consistent in every commit. Met + verified.
  • Mirror-sync business rule (dataset + .claude/skills same commit). Satisfied.
  • Portability: no assistant-specific frontmatter introduced (body/description text only). Satisfied.

Detailed Review Comments

Positive Feedback

  • Surgical scope: only the declared skills/docs (×2 mirrors) touched; no incidental churn.
  • The "catalog is derived from the installed corpus" note with the explicit 9 + 25 + 1 = 35 derivation is a genuine anti-drift measure — future divergence becomes self-evident to an editor.
  • Correctly recognized implement Phase 3 was already sequential and left it alone.
  • Remediation chose a catch-all cascade row (route active work to /implement) over a defer-to-fallback note — the routing-correct choice for a router-correctness task; verified it introduces no new co-firing ambiguity.

Minor Issues 💡 (non-blocking) — NEW this run

  • README.md:42 — ".claude/skills/ | 33 Agent Skills …". Live, top-level, user-facing stale count; the corpus is 35. This contradicts reality, the freshly-corrected next catalog, skills-catalog.mdx (35), and skills-guide.md (35). It was not caught by either prior review nor by the remediation commit's stated "whole-repo grep" (whose patterns — 33 skill, 30 skills, … — do not match the phrasing "33 Agent Skills"), so the remediation's completeness claim is incomplete. Not caught by docs:staleness (that gate inspects only skills-catalog.mdx). Impact: low — cosmetic/doc accuracy; does not affect AC1 or AC8, and README is neither mirrored nor gated. Recommendation: update to 35 Agent Skills in this PR (directly serves the PR's own objective Setup & Project Management Integration #1, "corrected every stated count 33→35"), or explicitly defer in the PR/ledger so it is not silently dropped.

  • apps/website/content/docs/getting-started/index.mdx:18 — "…with 30 composable skills covering process and capability concerns." Live, user-facing website docs; stale (should be 35). Same class and same miss as above. Impact: low. Recommendation: update to 35, or explicitly defer.

Nit 💡 (borderline / by-design — reported for transparency only)

  • apps/website/content/docs/integrations/claude-code.mdx:28 — ASCII tree comment "← 30+ skills". Loosely still true for a 35-skill corpus (35 ≥ 30+), so not strictly wrong; flagged only for eventual consistency with the exact "35" used elsewhere. nonActionable — no change required for correctness.

  • capability/verify-quality/SKILL.md (overview L17 + Arguments "Write note") — the Step 5.C write-exception appears twice in near-identical wording within ~8 lines. Intentional and correct: AC6/T1 explicitly requires the exception surfaced in both the overview and the Arguments section. Collapsing would violate the dual-placement requirement. nonActionable.

Prior-Findings Verification (re-review obligation)

The two prior reviewer comments raised three items. Independently re-verified at 177ed4c:

  • Finding 1 (residual stale counts) — RESOLVED. way-of-working.md:81 + dataset mirror ("33 skills" → 35) and getting-started.md + dataset mirror ("30 / 11+19" → "35 / 9+25+1") corrected; both dataset↔mirror pairs byte-consistent. CHANGELOG/decision-log left untouched — correct (dated, point-in-time release/decision records). Caveat: the sweep was not exhaustive — see the two NEW Minor findings above (README + website index).
  • Finding 2 (In-Progress-without-checkpoint gap) — RESOLVED. Catch-all row 8 routes In Progress-without-checkpoint to /implement; rows 7/8 mutually exclusive and jointly exhaustive over In Progress; no new co-firing (rows 8 & 9 both suggest /implement but split on macrostate). Renumbering 3–16 continuous; all cross-references (tie-break, graceful-degradation "row 11", Notes "rows 12–16") updated — verified no dangling pointer.
  • Finding 3 (verify-quality dual-placement Nit) — correctly left as-is (by-design per AC6). Carried above as nonActionable.

Tech Debt (assess-debt — output-only, non-blocking)

  • Low / documentation debt: stated skill-count strings are duplicated across ~6+ non-gated locations (README, website index/integration pages, KB docs) with no single source of truth; docs:staleness guards only skills-catalog.mdx, and the next count has no gate (the in-file 9+25+1=35 derivation note is the interim safeguard). This is exactly the drift this PR just paid down manually twice. Remit: a count-conformance gate is T7/[#313] feat: trigger/effectiveness eval harness + conformance (task T7) #324's job; the two NEW Minor findings are the residual of this debt. Surfaced only — not blocking, no issue created.

Risk Assessment

Risk Impact Probability Mitigation
next count drifts again Low Low In-file derivation note (9+25+1=35); T7/#324 to add a count gate
Stale "33/30 skills" in README + website index misleads a reader Low Low Two NEW Minor findings above; users invoke /next (which covers all 35), so functional impact nil
Merge order vs #319 (touches review/checkpoint, different regions) Low Medium Per PR: whichever merges second rebases

Verdict

Approved with Comments. Both ACs T1 owns (AC1 + AC8) are fully met and independently re-verified at 177ed4c; all gates green; both prior actionable findings genuinely resolved. Two new Minor stale counts (README.md:42, website getting-started/index.mdx:18) and two by-design Nits are surfaced for transparency and do not block merge. The two Minor counts are worth folding into this PR since they directly serve the PR's own "correct every stated count" objective and the remediation's whole-repo-sweep intent; otherwise defer them explicitly so T3/T7 does not silently inherit them. Phase 6 (merge) not run — human gate.


Independent /pair-process-review run — reconstructed from issue #313 (AC + T1 task), the PR diff/description/existing comments, and the code at 177ed4c. Author working context under .pair/working/ was not consulted. Not merging — human gate; self-approve via gh pr review intentionally not attempted (author == gh account).

- README.md:26 "33 idempotent workflows" → 35
- README.md:42 "33 Agent Skills — ..." → 35
- repo-root README not covered by docs:staleness (scans content/docs only), so these had no gate

Refs: #313
Addresses PR #325 /pair-process-review finding (residual stale counts)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@rucka

rucka commented Jul 13, 2026

Copy link
Copy Markdown
Collaborator Author

Review remediation — /pair-process-review finding (residual stale counts, round 2)

Commit 99f2a4f. Gates green (knowledge-hub 80/80 + links, mdlint:check incl. root *.md, docs:staleness = 35 skills). Routing unchanged (35/35).

Finding — repo-root README.md stale "33" counts → FIXED

The canonical review surfaced two counts that both prior reviews and my earlier whole-repo grep missed — my patterns (33 skill / 30 skills) didn't match these qualified phrasings:

  • README.md:26 — "33 idempotent workflows" → 35
  • README.md:42 — "33 Agent Skills — process workflows…" → 35 (parenthetical description kept as-is)

Why the earlier grep missed them + gate gap (for the record)

Broadened-grep results (scope-limited per coordinator)

Excluded apps/website/** (routed to PR #315), CHANGELOG.md, and decision-log/** (historical records). Only README.md (the two lines above) remained among non-website, non-historical files. Confirmed the KB source-of-truth files are already 35 on this branch: next/SKILL.md, way-of-working.md, getting-started.md, skills-guide.md.

The website hits (getting-started/index.mdx "30 composable", claude-code.mdx "30+", developer-journey "32", guidelines-catalog "34", kb-structure "32") were left untouched — PR #315's domain.

Not merging — awaiting your call.

🤖 Generated with Claude Code

rucka added a commit that referenced this pull request Jul 13, 2026
Canonical review found the gate could not catch the very phrasings it
was meant to guard:

- skill regex now matches "N+ skills" (trailing +) and the
  agent/idempotent adjectives, not just pair/composable — "30+ skills"
  and "N agent skills" previously slipped through silently
- guide regex tightened: requires a how-to qualifier (adjective OR
  how-to/process word), so arbitrary "N guides" prose no longer
  false-positives in CI (was over-broadened in prior remediation)
- Check 5 dead-link scan extended to JSX `href="/docs/..."` card
  attributes (Fumadocs <Card>), not just markdown `](/docs/...)`
- README.md documented as intentionally out of docs-gate scope
  (literal counts owned by PR #325)

tests: +6 (N+/agent/composable skill mismatches, bare "N guides"
non-false-positive, dead + valid JSX href). All test-first (red→green).

Refs: PR #315 canonical review
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rucka added a commit that referenced this pull request Jul 13, 2026
…es/, dedupe, extend staleness gate (#315)

* docs: website docs structure assessment + restructuring proposal

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* [#312] docs: batch 1 hygiene — hub, section indexes, links, counts, gate extension

- /docs rewritten as real hub (4 journeys + top tasks); new concepts/index + reference/index (F1/F2/F11)
- 6 stale skill counts fixed to 35 (verified vs dataset/.skills: 25 capability + 9 process + 1 meta)
- docs-staleness-check.js: skill-count check now scans ALL content/docs/**/*.mdx; regex extended
  with 'composable' variant (getting-started phrasing) — subset counts ('9 process skills') excluded
- gate also gains dead-internal-link check (resolves ](/docs/...) against content tree) — the
  optional check from the story, implemented since clean against the filesystem source
- test-first proof: extended gate FAILed with 6 count mismatches + 8 dead section links, PASSes after fixes
- 8 broken section links fixed (concepts/reference via new indexes; 4 /docs/guides links retargeted
  to stable pages ahead of T3 dissolve)
- quickstart variants retitled 'Quickstart: Solo/Team/Organization' (F6); developer-journey unified
  on 'Process Lifecycle' (meta.json + 4 prose labels) (F10)
- llms-txt orphan: inbound links from concepts/index + reference/kb-structure (F12)
- e2e title/sidebar assertions updated (docs + landing); CP5 QA doc: +2 index URLs, label sync

Refs: #312 T1

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* [#312] docs: batch 2 — merge FAQ+troubleshooting into support/troubleshooting

Union of support/faq.mdx (361L) + guides/troubleshooting.mdx (236L) into
support/troubleshooting.mdx; conflicting permission fix reconciled (nvm
recommended, npm-prefix alternative). Redirects /docs/support/faq +
/docs/guides/troubleshooting -> /docs/support/troubleshooting (new
redirects() block). Inbound links updated (grep zero in content/).
E2e: redirect test added, sidebar/smoke lists updated. CP5 inventory synced.

* [#312] docs: batch 3 — dissolve guides/ (moves, merges, redirects, nav)

4 moves: adopter-checklist->getting-started/checklist, cli-workflows->
reference/cli/workflows, install-from-url->customization/install-from-url,
update-link->reference/cli/update-link. 2 merges: customize-kb->
customization/team (Quick Recipe section), packaging->customization/
organization (layout-modes detail kept, org flags reconciled with parser,
pair->pair-cli normalized). guides/ removed; 7 redirects added (full table
now 9 rows incl /docs/guides->/docs). Root meta: drop guides, promote
tutorials (13->12). Inbound links updated — grep /docs/guides zero in
content/ (incl. one link-only edit in frozen reference/cli/commands.mdx).
Hub: duplicate h1 fixed. E2e: moved-pages + dissolved-guides redirect
tests, smoke/prev-next lists updated — 31/31 green. CP5 inventory synced.

* [#312] fix: review remediation — canonical CLI URL, count fixes, e2e smoke, gate negative test

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: relocate IA assessment doc to decision-log

apps/website/docs-structure-assessment.md was an analysis/decision
artifact sitting inside the published site's app directory (not
published content itself, but out of place there). Moved to
.pair/adoption/decision-log/ where decision records belong. Updated
the two references in the #312 issue body accordingly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix: correct migration docs URL — was pointing at removed guides/ path

DOCS_MIGRATIONS_BASE built URLs under /docs/guides/migrations, a page that
never existed there (migrations live at /docs/migrations, top-level).
Found during #312's docs restructuring review — pre-existing, unrelated
to that PR's scope, so fixed here. Updated the 4 hardcoded test-expected
URLs across migration-url.test.ts, version-check.test.ts,
version-check-formatter.test.ts.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* [#312] fix: stale how-to guide counts + gate coverage

- ai-assisted-sdlc said "11 process guides", developer-journey/index
  "all 11 guides" — actual KB count is 9; normalize phrasing to
  "how-to guides"
- extend docs-staleness-check: "N how-to/process guides" claims now
  verified against dataset .pair/knowledge/how-to (test-first,
  negative + positive fixture cases added)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* [#312] docs: IA polish — reading order, orphan link, migrations task

- concepts/index: replace wall-of-text with recommended reading order
  (4 core concepts) + deeper-mechanics list + forward link to lifecycle
- customization/index: surface install-from-url (moved here by T3 but
  invisible from the section index)
- docs hub: add Migrations row to top tasks (only section unreachable
  from the hub)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* [#312] style: prettier formatting from pre-push hook

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* [#312] fix: re-review findings — gate regex adjectives + loud missing-dir

- GUIDE_COUNT_RE now covers adjective phrasings (sequential,
  step-by-step) with optional modifier — mirrors Check 1's shape;
  caught 2 more live stale counts on the real tree
  (knowledge-base.mdx, quickstart.mdx: "11 step-by-step ... guides"
  vs actual 9) — fixed
- guidelines-catalog description normalized "(9 sequential steps)" →
  "9 sequential how-to guides" so every guide-count claim is
  gate-covered
- missing how-to dataset dir now pushes an error instead of silently
  skipping the check (consistent with Check 1)
- tests: +2 (adjective-phrasing negative, missing-dir failure)

Refs: PR #315 re-review findings 1-2
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* [#312] fix: harden staleness gate regexes + JSX href dead-link scan

Canonical review found the gate could not catch the very phrasings it
was meant to guard:

- skill regex now matches "N+ skills" (trailing +) and the
  agent/idempotent adjectives, not just pair/composable — "30+ skills"
  and "N agent skills" previously slipped through silently
- guide regex tightened: requires a how-to qualifier (adjective OR
  how-to/process word), so arbitrary "N guides" prose no longer
  false-positives in CI (was over-broadened in prior remediation)
- Check 5 dead-link scan extended to JSX `href="/docs/..."` card
  attributes (Fumadocs <Card>), not just markdown `](/docs/...)`
- README.md documented as intentionally out of docs-gate scope
  (literal counts owned by PR #325)

tests: +6 (N+/agent/composable skill mismatches, bare "N guides"
non-false-positive, dead + valid JSX href). All test-first (red→green).

Refs: PR #315 canonical review
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* [#312] refactor: docs-staleness logic into tested website module, drop script

Owner rule: tested functionality lives in production code and is tested
there — do NOT unit-test scripts. The gate violated this (logic in
scripts/docs-staleness-check.js, test spawned it black-box).

- port ALL logic verbatim (incl. #315 hardening: tightened guide regex,
  widened skill regex with +/adjectives, JSX href dead-link scan, README
  out-of-scope note) into apps/website/lib/docs-staleness-check.ts —
  ESM module, functions exported individually, import.meta main-guard
  CLI wrapper, DOCS_STALENESS_ROOT retained, root resolved up 3
- rewrite the test as WHITE-BOX vitest unit tests importing the exported
  functions directly; ZERO spawnSync/exec — real-tree parity asserted
  in-process via runAllChecks(). red->green coverage preserved as
  per-function negatives (wrong N+/composable/agent skills, bare
  "N guides" non-false-positive, dead/valid JSX href, missing how-to dir)
- wire: tsx (catalog 4.23.1) + website script docs:staleness=tsx;
  root docs:staleness delegates to @pair/website, unchanged in
  quality-gate + ci.yml (now delegates)
- delete scripts/docs-staleness-check.js (single source of truth);
  update decision-log path refs

Refs: PR #315 architectural rule (no test-on-script)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* [#312] docs: ADL — gate/tooling code in tested modules, no unit-test on scripts

Record the architectural rule the docs-staleness refactor implements as
a non-architectural ADL (adoption/decision-log/2026-07-13-gate-tooling-
code-in-tested-modules.md): gate logic lives in tested owning-package
modules; scripts/CLIs are thin entrypoints; root gates delegate; scripts
are never unit-tested (smoke tests cover CLI end-to-end).

- complements (does not amend) the test-file-colocation ADL — placement
  vs module-vs-script boundary are orthogonal; cross-linked
- surfaced from way-of-working Quality Gates ("Gate & tooling code" bullet)
- no dataset mirror (adoption decision-log is not auto-mirrored; siblings
  husky/colocation are adoption-only)

Refs: PR #315 architectural rule (no test-on-script)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…talog

# Conflicts:
#	.claude/skills/pair-capability-checkpoint/SKILL.md
#	packages/knowledge-hub/dataset/.skills/capability/checkpoint/SKILL.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant