Skip to content

/wayfinder at user scope + full/lite charting modes (ADR-0101 rev A) - #359

Merged
ojfbot merged 1 commit into
mainfrom
feat/wayfinder-user-scope
Aug 3, 2026
Merged

/wayfinder at user scope + full/lite charting modes (ADR-0101 rev A)#359
ojfbot merged 1 commit into
mainfrom
feat/wayfinder-user-scope

Conversation

@ojfbot

@ojfbot ojfbot commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Why

/wayfinder was catalog-registered but never flagged scope: ["user"], so despite the catalog-driven promise of adr:catalog-scoped-user-skills it resolved only inside ojfbot repos — charting unavailable exactly when fog is thickest, before an initiative has a repo. That flag is the whole install; the rest of this PR is what user scope forces.

Worth stating up front: upstream mattpocock/skills is still at v1.1.0, the exact version decisions/adopt-stack/pocock-skills-v1-1.md absorbed (pinned ed37663). There is no upstream drift to reconcile — this is not a re-vendor.

Four defects repo scope was hiding

  1. resolve-or-fail was unenforced prose. The skill mandated that ns:<slug>#P<n> anchors resolve, but named no mechanism. Adds scripts/resolve-anchor.mjs (--detect, --anchor=), importing scripts/lib/northstar-fm.mjs rather than reimplementing the constrained frontmatter parse.
  2. The map path was ambiguous. SKILL.md said decisions/wayfinder/<slug>.md; map-format.md said core/decisions/wayfinder/<slug>.md. Harmless inside core, a live bug from an arbitrary cwd. Full mode → the core map library (one library, so any surface can enumerate every open frontier in one read); lite → <cwd>.
  3. No off-fleet behavior. Adds lite mode: file-only map, no northstar anchor, no tracker projection, announced out loud. A claimed anchor that won't resolve stays an error — silent de-anchoring is the guarded failure.
  4. The /frame-standup cross-ref was fiction. SKILL.md claimed one; grep found zero mentions in frame-standup. Step 4.6 now routes an unassertable slice entrance to charting instead of leaving the slice queued indefinitely.

Also wires the selfco vault as the charting-time reference layer per adr:bonded-pair-division-of-labor (draft) — design-time, read-only, one-way, full mode only. The operating-surface-bonded-pair map was already doing this by hand.

Deliberately unchanged

File-canonical maps, serialized research, the two-ledger separation, and the MANDATORY trigger posture. Upstream's disable-model-invocation: true stays rejected — under-firing, not over-firing, is this fleet's measured failure (ADR-0068).

Defect filed, not silently absorbed

northstar-fm.mjs doesn't strip YAML inline comments, so buddy-check's registry slug parses as 91 chars with its comment attached. northstar-lint never caught it because it resolves by path; resolve-anchor.mjs is the fleet's first slug-keyed consumer.

Patching scalar() looked like the clean fix until the corpus scan: roadmap-l2-ojfbot.md:301 is title: "Calibrate judge #1 — …" and several entrance/deliverable values cite PR #165. A naive \s+#.*$ strip would truncate live roadmap slices and break an operational CI gate. Scoped the workaround to slug comparison only (kebab slugs can never contain " #") and filed decisions/defects/dr-northstar-fm-inline-comment-not-stripped.md as repair-mechanism.

Verification

  • 17 user-scope symlinks (was 16); re-running install-agents.sh --user-scope produced no duplicate hooks.
  • --detect: full from core and from a sibling repo; lite from a dir outside the fleet.
  • All 20 registry entries resolve, including the two that must stay unnormalized (buddy-check bare slug, l1-virtuallight lowercase); wrong-case variants correctly fail.
  • ns:l1-fieldwork-1#P1 (registered on main mid-review, file in a private repo) correctly returns unreachable: true while keeping full mode — the vantage case, validated against a registry entry that appeared after the code was written.
  • Both live maps (f1-learning-studio, operating-surface-bonded-pair) unmodified and their anchors resolve.
  • northstar-lint, roadmap-lint, defects-lint all pass. status.jsonl untouched — the two-ledger invariant holds.

🤖 Generated with Claude Code

…R-0101 rev A)

/wayfinder was catalog-registered but never flagged scope:["user"], so despite the
catalog-driven promise of adr:catalog-scoped-user-skills it resolved only inside
ojfbot repos — charting unavailable exactly when fog is thickest, before an
initiative has a repo. Flagged for user scope (catalog v1.21).

User scope forces the rest, and surfaced four defects repo scope had hidden:

- resolve-or-fail was unenforced prose. Adds scripts/resolve-anchor.mjs
  (--detect, --anchor=ns:<slug>#P<n>), importing scripts/lib/northstar-fm.mjs
  rather than reimplementing the constrained frontmatter parse.
- Map path was ambiguous: SKILL.md said repo-relative, map-format.md said
  core-absolute. Harmless inside core, a live bug from an arbitrary cwd.
  Full mode resolves to the core map library; lite mode to <cwd>.
- Lite mode for off-fleet charting: file-only map, no northstar anchor, no
  tracker projection, announced out loud. A *claimed* anchor that will not
  resolve stays an error — silent de-anchoring is the guarded failure.
- The /frame-standup cross-ref SKILL.md claimed did not exist. Step 4.6 now
  routes an unassertable slice entrance to charting instead of leaving the
  slice queued indefinitely.

Also wires the selfco vault as the charting-time reference layer per
adr:bonded-pair-division-of-labor (draft) — design-time, read-only, one-way,
full mode only. The operating-surface-bonded-pair map already did this by hand.

Unchanged: file-canonical maps, serialized research, the two-ledger separation,
and the MANDATORY trigger posture (upstream's disable-model-invocation stays
rejected — under-firing is this fleet's measured failure, per ADR-0068).
Upstream mattpocock/skills remains at v1.1.0, the version already absorbed;
no upstream drift to reconcile.

Files a defect in passing: northstar-fm.mjs does not strip YAML inline comments,
so buddy-check's registry slug parses with its comment attached (91 chars).
northstar-lint missed it because it resolves by path; resolve-anchor.mjs is the
fleet's first slug-keyed consumer. Worked around for slug comparison only — a
naive strip would truncate live roadmap values containing "PR #165".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Skill Audit — PR #359

Skills used during development

  • /frame-standup
  • /wayfinder

Recommended skills (based on diff analysis)

  • /adr — ADR files modified — verify completeness
  • /investigate — PR references bug fix — was root cause analyzed?

Coverage

  • /adr was not used but is recommended
  • /investigate was not used but is recommended

Generated by skill-audit

@ojfbot
ojfbot merged commit 5e71c62 into main Aug 3, 2026
9 checks passed
@ojfbot
ojfbot deleted the feat/wayfinder-user-scope branch August 3, 2026 02:42
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