docs: add installed-skill guides for issues, triage labels, and domain docs - #1
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Intent
Preserve and normalize the captain-approved Matt-skill agent documentation from the archived source snapshot only. Carry over only the intended AGENTS additions, and review the three docs/agents guides against authoritative ownership, documentation audience classification, precise trigger hygiene, the one-owner rule, and AGENTS size discipline. Replace raw gh instructions with the repository-required gh-axi workflow based on current help without creating or mutating any GitHub issue. Keep tracked Markdown to one sentence per line with plain dashes, remove duplicated contracts, preserve unique useful setup facts, and add deterministic checks only for current guarantees. Keep the primary uncommitted copy untouched. Deliver this change only to the default branch of yelenplays/firstmate through the no-mistakes PR path; never push or open anything against kunchenguid/firstmate. Validation must include bin/fm-doc-audience-check.sh, relevant tests, and a complete final diff review, with a green fork-only PR as the outcome.
What Changed
agent-runtimeguides underdocs/agents/:issue-tracker.md(GitHub Issues on the captain's forkyelenplays/firstmate, thehas_issuesprerequisite, thegh-axi -Rworkflow, the explicit-authorization rule, and the Wayfinding operations contract),triage-labels.md(the five canonical label roles), anddomain.md(reading rootCONTEXT.mdanddocs/adr/before exploration).AGENTS.mdgains a single two-line pointer that routes to them by behavior, when a skill will create or update issues or triage labels, or read or updateCONTEXT.mdordocs/adr/, rather than by skill name.agent-runtimeindocs/documentation-audiences.jsonand register theAGENTS.mdto guide relationships as required owner pointers, sobin/fm-doc-audience-check.shfails if a classification or the discovery pointer is dropped.domain.mdalso requires anyCONTEXT.mdordocs/adr/record a skill creates to be classified in the same change..agents/skills/harness-adapters/SKILL.mdto state that user-installed skills are outside firstmate's bundled adapter guarantee: confirm the selected worker runtime can discover the exact installed skill before dispatching, and report the blocker instead of dropping the requirement or falling back to a stale project copy.Risk Assessment
✅ Low: The change is additive documentation only, every round-1 finding is fixed and verified against the consuming skill contract and the repository's own audience-check logic, and no new source risk was introduced.
Testing
Ran the intent-named bin/fm-doc-audience-check.sh (clean, 64 surfaces / 179 links) plus the documentation-audiences, ask-user-authority, ensure-agents-md, and supervision-instructions contract tests, all green. Verified the round-1 fix end-to-end against live GitHub with read-only gh-axi calls: the fork really does report has_issues false, issue reads fail with exactly the error string the new Tracker prerequisite section quotes, and all five canonical triage labels already exist, so the guide is accurate rather than aspirational. Proved the newly added inventory entries are load-bearing by showing the audience check fails when the issue-tracker classification or the AGENTS.md owner pointer is removed, then restoring and re-confirming a clean worktree. Captured reviewer-visible visual evidence by rendering the three guides and the AGENTS.md pointer through GitHub's own GFM renderer and screenshotting the page; chrome-devtools-axi screenshot reported success while silently writing no file across three attempts and two sessions, so the capture was taken with headless Chrome directly. Also confirmed markdown discipline (no em dashes, one sentence per line), AGENTS size discipline (536 to 538 lines), and single ownership of the tracker and label contracts. No GitHub issue was created or mutated and no repository settings were changed. The pre-existing fm-calm-pi-extension Pi 0.84.1 environment failure was dismissed in round 1 and was not re-run.
/var/folders/9d/8w50jhgd79x63rgbq_5cyyvm0000gn/T/no-mistakes-evidence/01KZNKCVBV5R36QZ5X1V788Q10/agent-docs-rendered.png)Evidence: Rendered docs HTML source (AGENTS.md pointer + three guides)
Evidence: Tracker prerequisite verified against live yelenplays/firstmate (read-only)
$ gh-axi api repos/yelenplays/firstmate full_name: yelenplays/firstmate fork: true has_issues: false default_branch: main $ gh-axi issue list -R yelenplays/firstmate --limit 5 error: the 'yelenplays/firstmate' repository has disabled issues [exit 1] $ gh-axi label list -R yelenplays/firstmate --limit 500 wontfix needs-info needs-triage ready-for-agent ready-for-human [exit 0]Evidence: Added deterministic checks proven load-bearing
## Control: repository as committed fm-doc-audience-check: ok surfaces=64 local_links=179 [exit 0] ## Regression A: audience classification for docs/agents/issue-tracker.md removed fm-doc-audience-check: unclassified: docs/agents/issue-tracker.md [exit 1] ## Regression B: AGENTS.md owner-pointer sentence deleted fm-doc-audience-check: required owner pointer missing: AGENTS.md -> docs/agents/issue-tracker.md [exit 1] ## Control after restore: repository as committed fm-doc-audience-check: ok surfaces=64 local_links=179 [exit 0]Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
🔧 **Review** - 3 issues found → auto-fixed ✅
docs/agents/issue-tracker.md:14- The section is titled## Wayfinding, but the consuming skill resolves it by name: mattpocock-skills 1.2.3skills/engineering/wayfinder/SKILL.md:26says "Consult the tracker doc's &feat: add advisory Jev queue triage to heartbeats #34;Wayfinding operations&feat: add advisory Jev queue triage to heartbeats #34; section for how this repo expresses them. If no tracker has been provided, default to the local-markdown tracker." The upstream GitHub template (setup-matt-pocock-skills/issue-tracker-github.md) uses the exact heading## Wayfinding operations, and the plugin CHANGELOG records that resolving this section by name is the deliberate indirection contract. Renaming it during normalization breaks the lookup. Fix: restore the heading to## Wayfinding operations.docs/agents/domain.md:10- The guide authorizes the domain-modeling skill to lazily create rootCONTEXT.mdanddocs/adr/records, but never states that new tracked prose must be classified indocs/documentation-audiences.json. That inventory is mandatory:bin/fm-doc-audience-check.shdiffsgit ls-files -- '*.md' ...against the inventory and fails on any unclassified surface, and it is invoked by CI and the no-mistakes gate. This change classified its own three files but left the sources it tells a skill to create unguarded. Fix: add one sentence to the Sources section requiring any newly createdCONTEXT.mdordocs/adr/record to be classified indocs/documentation-audiences.json(audienceagent-runtimeormaintainer-architectureas appropriate).docs/documentation-audiences.json:35-AGENTS.md:228is the single pointer that makes the three new guides discoverable at runtime (the skills expect the tracker doc to "have been provided to you"), yet it is not listed inrequiredOwnerPointers, unlike every other owner relationship in this file. Deleting that one sentence would leave all three guides classified and link-clean, sobin/fm-doc-audience-check.shwould still pass while the skills silently lose their tracker. Adding{"source": "AGENTS.md", "target": "docs/agents/issue-tracker.md"}pins a guarantee that is true today and passes the check as written.🔧 Fix: restore Wayfinding operations heading and pin guide pointers
✅ Re-checked - no issues remain.
🔧 **Test** - 2 issues found → auto-fixed ✅
docs/agents/issue-tracker.md:3- docs/agents/issue-tracker.md and docs/agents/triage-labels.md direct Matt engineering skills to GitHub Issues on yelenplays/firstmate, but Issues are disabled on that fork (has_issues: false, the GitHub default for forks). Every documented read or write fails today witherror: the 'yelenplays/firstmate' repository has disabled issues, so the tracker workflow could not be demonstrated end-to-end. The five canonical triage labels do already exist on the fork, so only the issues surface is missing. The intent forbids creating or mutating any GitHub issue and enabling Issues is a repository-settings change outside this phase, so this needs your decision: enable Issues on the fork, or state in the guide that the tracker is dormant until the captain turns it on.tests/fm-calm-pi-extension.test.sh:20- tests/fm-calm-pi-extension.test.sh fails withTypeError: this.getMarkdownTransformers is not a functionfrom /opt/homebrew/lib/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js. This is a pre-existing local environment issue, not a regression: it reproduces identically when the same test is run from the base commit cd73e75 tree, and this change touches only Markdown and JSON documentation. The installed Pi is 0.84.1 while the test records compatibility evidence against 0.81.1/0.82.0, and 0.84.1 changed that internal renderer API. Fixing it would mean changing a globally installed npm package outside the worktree, which is out of scope here.bin/fm-doc-audience-check.sh- green:ok surfaces=64 local_links=179bin/fm-doc-audience-check.sh --inventory <inventory with docs/agents/domain.md classification removed>- mutation guard proof, fails withunclassified: docs/agents/domain.mdbin/fm-doc-audience-check.sh --inventory <inventory with AGENTS.md -> docs/agents/issue-tracker.md pointer retargeted>- mutation guard proof, fails withowner-pointer target is missingbin/fm-test-run.sh --changed --base cd73e75e02a1c1e74811b00c5ee08ffae8a59e1e- 26 change-mapped scripts (pure-contract-unit family), 1 pre-existing environment failure, 1 gate skip (tsc not found)tests/fm-documentation-audiences.test.sh- passed as part of the changed settests/fm-ensure-agents-md.test.sh- passed as part of the changed setBaseline reproduction:git archive cd73e75 | tar -x -C /tmp/base-tree && bash /tmp/base-tree/tests/fm-calm-pi-extension.test.sh- identical failure at base, confirming it is not a regression (temp tree removed afterwards)Markdown style verification over all 62 added Markdown lines in the 5 touched surfaces -python3 verify-markdown-style.py . cd73e75 69beead, plain dashes only and one sentence per lineAGENTS.md size discipline:git show cd73e75:AGENTS.md | wc -lcvswc -lc AGENTS.md- 536 -> 538 lines, 60449 -> 60690 bytesgh-axi issue --helpandgh-axi label --help- confirmed the documented subcommands, andgh-axi --helpconfirmed the-R/--repo <OWNER/NAME>flag the guide prescribesgh-axi label list -R yelenplays/firstmate- all five documented triage labels exist on the forkgh-axi issue list -R yelenplays/firstmate --state all(read-only) - returnedrepository has disabled issues; no issue created or mutatedgh-axi api repos/yelenplays/firstmate(read-only) -has_issues: false,fork: truegit remote -v- onlyorigin -> yelenplays/firstmate; nothing addressedkunchenguid/firstmateOne-owner check:grep -rl 'wayfinder:map|needs-triage|ready-for-agent' --include=*.md --include=*.jsonoutsidedocs/agents/returned nothing, so the new guides are the sole owner of those contractsRendered the three new guides plus the AGENTS.md pointer through GitHub's own markdown API (stateless render) and captured a full-page screenshot of the reader-facing surfaceComplete final diff review:git diff cd73e75..69beeadread in full (6 files, +86 lines, all Markdown/JSON)git status --porcelain- worktree clean, no transient test artifacts left behind🔧 Fix: document GitHub Issues prerequisite in tracker guide
✅ Re-checked - no issues remain.
bin/fm-doc-audience-check.sh- clean, 64 surfaces / 179 local links resolvedbash tests/fm-documentation-audiences.test.sh- all four contracts passbash tests/fm-ask-user-authority.test.sh,bash tests/fm-ensure-agents-md.test.sh,bash tests/fm-supervision-instructions.test.sh- instruction-surface contract tests covering the AGENTS.md and .agents/skills editsNegative check A: ranbin/fm-doc-audience-check.sh --inventory <copy with docs/agents/issue-tracker.md classification removed>-> exit 1,unclassified: docs/agents/issue-tracker.mdNegative check B: temporarily deleted the AGENTS.md pointer sentence, ranbin/fm-doc-audience-check.sh-> exit 1,required owner pointer missing: AGENTS.md -> docs/agents/issue-tracker.md, then restored (worktree verified clean)gh-axi api repos/yelenplays/firstmate- confirmedhas_issues: falseon the fork exactly as the new Tracker prerequisite section documentsgh-axi issue list -R yelenplays/firstmate --limit 5- reproduced the verbatim error string quoted in the guidegh-axi label list -R yelenplays/firstmate --limit 500- confirmed all five canonical triage labels exist on the forkgh-axi issue --help,gh-axi label --help,gh-axi api --help- confirmed the documented gh-axi workflow (-R,subissue,api) matches current help surfacesRendered docs/agents/{issue-tracker,triage-labels,domain}.md plus the AGENTS.md pointer paragraph through GitHub's GFM renderer (gh-axi api POST /markdown --field mode=gfm) and captured a full-page screenshot via headless ChromeMarkdown style: verified zero em dashes and zero multi-sentence lines across the three new guides; AGENTS.md grew only 536 -> 538 linesOwnership: grepped the repo to confirm the triage-label and wayfinding contracts exist only under docs/agents/, with no duplicate elsewhereAGENTS.md:228- The term "Matt engineering skill" is used four times across tracked documentation (AGENTS.md:228 and the opening line of each of the three docs/agents guides) and is defined nowhere in the repository. AGENTS.md is always loaded, so every session pays for a trigger whose qualifier it may not be able to evaluate; a session that does not recognize an installed skill as a "Matt" skill can skip loading the guide and therefore miss its safety rules (do not publish to upstream kunchenguid/firstmate, and a read-only request never authorizes an issue mutation). The operative half of the trigger ("will use this repository's issue tracker, triage labels, or domain documentation") is evaluable on its own, so the guides are not wrong - only under-anchored. I did not fix this because the correct expansion is a naming decision the captain owns: the installed skill set appears to be the mattpocock-skills plugin (its domain-modeling, research, prototype, and grilling skills line up exactly with what the guides reference), but writing that inference into tracked docs would assert a fact I cannot verify from the repository, and anchoring the term inline in AGENTS.md trades against the size discipline the intent explicitly guards. Suggested resolution: confirm the intended name, then define it once in the guides' shared opening rather than expanding the AGENTS.md line.docs/agents/issue-tracker.md:3- docs/agents/issue-tracker.md and docs/agents/triage-labels.md state the captain's personal forkyelenplays/firstmateas a repository-wide convention in tracked, shared material. This sits in tension with AGENTS.md section 1, which routes captain-private fleet material to gitignoreddata/and reserves tracked surfaces for "knowledge general to every firstmate user", and with README.md/CONTRIBUTING.md, which present this repo as a template other captains clone and run (CONTRIBUTING.md:18 has contributors point localoriginat the parent repo, which is exactly why the-R yelenplays/firstmateinstruction is load-bearing). For any other captain running the distro, the named fork and thehas_issuesprerequisite are wrong. I deliberately did not genericize this: the user intent explicitly and repeatedly requires the fork targeting and forbids kunchenguid/firstmate, so the content is captain-approved and only the captain can decide the placement. Possible follow-up: keep the mechanism and safety rules in docs/agents/ but move the concrete repository slug to captain-private state, or record an explicit note that these guides are captain-fork-specific.🔧 Fix: replace Matt-skill trigger with behavior-based guide routing
1 info still open:
AGENTS.md:228- Judgment call worth the captain's awareness: the instruction specified the trigger as "create or update GitHub Issues, triage labels, CONTEXT.md, or docs/adr/". I used that verb pair verbatim for issues and labels, but wrote "read or update" for rootCONTEXT.mdanddocs/adr/, because docs/agents/domain.md's operative content is a read-before-exploration rule ("Read rootCONTEXT.mdbefore exploration when it exists"); a write-only trigger would have made that guide unreachable in exactly the case it governs. The consequence of the literal reading is accepted for issues and labels: a purely read-only issue query no longer trips the trigger, so a session doing one may not load the-R yelenplays/firstmatetargeting rule and could read against whateveroriginpoints at. That is a read, never a prohibited write, and every mutating path still loads the guide, so I left the captain's wording in place there rather than widening it unasked.✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.