feat(skills): adopt the domain-modeling skill as /domain-modeling - #58
Merged
Conversation
Freudator86
force-pushed
the
fm/fm-adopt-domain-modeling
branch
from
August 3, 2026 14:42
56e0533 to
af28f04
Compare
added 3 commits
August 3, 2026 15:01
…tice Adopts the domain-modeling skill from mattpocock/skills (MIT), read whole at upstream 2ab9580. The notice lands in this same commit rather than in a later correction, which is what the earlier Wayfinder adoption needed. Kept whole: the active/passive boundary, the five live moves, the three-part bar a decision must clear, the seven qualifying categories, the one-paragraph record, and the glossary rules including the _Avoid_ convention. Changed, because the fleet already has these stores and must not gain a third: resolved terms go to a ## Language section of a project's committed AGENTS.md or to data/learnings.md, and decisions go to the existing dated records under data/decisions/, instead of a new CONTEXT.md and docs/adr/ tree. Cross- referencing widens from code to any checkable artifact, because three of the four failures that motivated this were an old installed version, a count of something that never ran, and a name resolving to a different file than intended. An unresolved captain decision is handed to decision-hold-lifecycle, which stays its single owner. Carries the terminology rule set 2026-08-03: a domain's proper nouns are never translated in any language, and German is written per DU. AGENTS.md section 9 gains the one-line boundary against it, since the turn that writes Werkbank for workbench is exactly a turn on which no skill was loaded. Dropped, and recorded in full: CONTEXT-MAP.md and the multi-context model, which is the loss most relevant to why the skill was adopted; the glossary's structural purity, which a mixed memory file cannot guarantee; context inference; and sequential numbering. docs/domain-modeling-provenance.md carries the copyright notice, every quotation checked against the source, and what each drop costs.
…n AGENTS.md reachability
Freudator86
force-pushed
the
fm/fm-adopt-domain-modeling
branch
from
August 3, 2026 15:15
af28f04 to
2272c63
Compare
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
Adopt the domain-modeling skill from mattpocock/skills (MIT) into the firstmate repo, on the captain's decision of 2026-08-03.
The captain's condition was explicit and is the acceptance criterion: take the upstream skill WHOLE, or write down which half is left out and why, and land the attribution in the SAME COMMIT as the skill. That last part is deliberate - the previous adoption from this same upstream (the Wayfinder skill, now /sea-chart) shipped with no attribution and had to be corrected in a later commit, so shipping the notice separately would repeat the exact failure being corrected.
WHY THIS SKILL. The night of 2026-08-02/03 produced four independent failures that were one disease, and none was a coding error: a term meaning two different things in two runbooks; a decision record drafted on the wrong referent of an ambiguous noun, after which a whole schema rested on it; a capability claim about a tool published to three parties, false purely because the installed version was older than the documented one; and a count that included something that never ran. Each was found by tripping over it. The captain wanted the instrument that sharpens terms and records decisions IN PASSING.
CAPTAIN'S FIT CONSTRAINT, deliberately followed: the fleet already has data/decisions/ and per-project AGENTS.md, and the captain said DO NOT BUILD A THIRD STORE. So upstream's CONTEXT.md glossary and docs/adr/ tree were deliberately NOT created. Resolved terms route to a ## Language section of a project's committed AGENTS.md or to data/learnings.md; decisions route to the existing dated records under data/decisions/. This is a substitution of location, not a dropped capability, and it is intentional - a reviewer seeing no CONTEXT.md is seeing the requirement met, not missed.
TERMINOLOGY RULE the captain set 2026-08-03, which he said belongs in this skill: German is written per DU not Sie; technical terms from the repositories are NOT translated (his examples: workbench stays workbench not Werkbank, Treehouse stays Treehouse not Baumhaus; likewise Wayfinder, no-mistakes, Bridge, Lavish, graphify, tasks-axi). The trigger was firstmate writing Werkbank instead of workbench, which the captain corrected as a CATEGORY not a single slip.
DELIBERATE DECISIONS a reviewer would otherwise question:
WHAT WAS DELIBERATELY DROPPED, all recorded in docs/domain-modeling-provenance.md with costs named: CONTEXT-MAP.md and the whole multi-context model (the largest loss, and honestly the one most relevant to why the skill was adopted, since a cross-repository term collision is exactly the failure that put a schema on the wrong noun - dropped because a fleet-wide term map would be the forbidden third store); the glossary's structural purity, which a mixed memory file like AGENTS.md cannot guarantee; context inference, which has nothing to infer against with no map; and sequential ADR numbering, whose loss costs the short handle so a decision discussed as 'ADR-4' is not findable by that number in a dated store.
ATTRIBUTION AND ACCURACY WORK: docs/domain-modeling-provenance.md carries the MIT copyright and permission notice verbatim, follows the convention established by docs/sea-chart-provenance.md (a provenance page under docs/, reachable from README's License section, not a root NOTICE the repo has never had), and every quotation in it was mechanically verified against upstream commit 2ab9580. One arrow character had been silently ASCII-ified from the source's Unicode arrow; rather than leave an unmarked alteration in a licence document it is now declared as a normalisation alongside the em-dash normalisation the repo's no-em-dash rule forces.
TESTS: two EXISTING suites were extended rather than adding a new test file, per firstmate-coding-guidelines ('extend an existing script') and because CI's coverage guard proves the shard partition equals the tests/*.test.sh inventory, so a new file would need shard registration. fm-captain-translation-contract.test.sh (which owns section 9) got the proper-noun boundary assertions; fm-instruction-owners.test.sh got the skill's metadata, section 6 trigger, terminology rule, the five moves and three-part bar, and - deliberately - assertions that the MIT copyright and permission notice survive, because MIT requires the notice to travel with the work and the earlier sea-chart adoption still has no such protection. That gap is recorded as a follow-up in the provenance page rather than fixed here, to keep this change scoped.
VERIFICATION ALREADY RUN LOCALLY: bin/fm-lint.sh exit 0, bin/fm-test-run.sh --check-coverage ok (121 tests), and the affected suites pass - fm-instruction-owners, fm-captain-translation-contract, fm-sea-chart, fm-ensure-agents-md, fm-decision-hold-lifecycle, fm-role-config, fm-lavish-access, fm-shared-captain-inheritance, fm-backlog-lint.
REPO CONVENTIONS FOLLOWED: one sentence per line in tracked Markdown, plain dashes never em dashes (which is why quoted em dashes in the provenance page are normalised and that normalisation is declared), and no agent name as a commit co-author.
What Changed
domain-modelingskill under.agents/skills/domain-modeling/(SKILL.md,GLOSSARY-FORMAT.md,DECISION-RECORD-FORMAT.md,agents/openai.yaml), adopted from Matt Pocock's upstream skill: it carries the five live moves, the three-part bar a decision must clear, and the rule that a domain's proper nouns are never translated. It routes resolved terms into a projectAGENTS.md## Languagesection ordata/learnings.mdand decisions intodata/decisions/rather than creating upstream'sCONTEXT.mdanddocs/adr/stores, and hands an unresolved captain decision todecision-hold-lifecycle./domain-modelingslash-command row and its License section now lists both mattpocock/skills adoptions.docs/domain-modeling-provenance.mdin the same commit as the skill, carrying the MIT copyright and permission notice verbatim, the declared em-dash and arrow normalisations applied to quotations, and the four deliberately dropped capabilities with their costs named. Extends two existing suites rather than adding a test file:fm-instruction-owners.test.shasserts the skill metadata, section 6 trigger, terminology rule, and survival of the MIT notice;fm-captain-translation-contract.test.shasserts the section 9 proper-noun boundary.Review raised four issues on the first pass - the section 9 proper-noun wording and three unsupported or self-falsifying claims in the skill and provenance page - all auto-fixed in
a4d3b99, with the re-check clean.Risk Assessment
✅ Low: All four round-1 findings were fixed at the source with their assertions updated in the same round and verified string-for-string against the files, and the remaining change is documentation and instruction surface only, with no code paths, no weakened boundary, and every acceptance criterion in the intent still satisfied.
Testing
I ran the two extended suites (fm-instruction-owners, fm-captain-translation-contract) plus the coverage guard and the adjacent AGENTS.md contract suites, all green, then went past pass/fail in three ways: mutation checks that break the MIT notice, the section 6 trigger, and the section 9 rendering-only scope each make a suite fail, so the new assertions genuinely protect the attribution and the trigger; an independent script compared the provenance page against a read-only clone of mattpocock/skills, whose head today is the pinned commit 2ab9580, confirming the MIT notice is the upstream LICENSE character for character, every source-attributed quotation exists upstream under the two declared normalisations, every capability listed as dropped really exists upstream, and no forbidden third store was created; and I confirmed the attribution ships in the same commit as the skill, which was the captain's explicit condition. For reviewer-visible evidence of the captain-facing surface I rendered README.md and the provenance page through GitHub's own Markdown API and screenshotted the /domain-modeling slash-command row with its MIT attribution, the License section, the MIT notice, and the What-we-dropped list. The only note is cosmetic: one quotation also converts upstream's nested double quotes to single quotes, an alteration the page's two-character normalisation sentence does not mention.
/home/coditan/.cache/no-mistakes-tmp/no-mistakes-evidence/01KZ3VQSHVHTX60R9XFFESST4M/readme-slash-command-row.png)/home/coditan/.cache/no-mistakes-tmp/no-mistakes-evidence/01KZ3VQSHVHTX60R9XFFESST4M/readme-license-section.png)/home/coditan/.cache/no-mistakes-tmp/no-mistakes-evidence/01KZ3VQSHVHTX60R9XFFESST4M/provenance-mit-notice.png)/home/coditan/.cache/no-mistakes-tmp/no-mistakes-evidence/01KZ3VQSHVHTX60R9XFFESST4M/provenance-what-was-dropped.png)Evidence: Upstream fidelity check output (notice, quotations, dropped list, no third store)
== 1. MIT notice is the upstream LICENSE, character for character == ok 1067 chars identical, incl. 'Copyright (c) 2026 Matt Pocock' == 2. sentences attributed to the source appear upstream == 14 source-attributed quotations checked, all located upstream == 3. every dropped capability really exists upstream == ok CONTEXT-MAP.md and the multi-context model / glossary structural purity / context inference / sequential ADR numbering / shared dependency of other skills == 4. no third store was created == ok no CONTEXT.md, no docs/adr, no CONTEXT-MAP.md == 5. line counts the page reports for the source it read == ok SKILL.md 74, CONTEXT-FORMAT.md 60, ADR-FORMAT.md 47 RESULT: the provenance page is faithful to upstream on every checked claimEvidence: Mutation checks: the new assertions fail when the notice, trigger, or scope is removed
### 1. strip the MIT permission notice from docs/domain-modeling-provenance.md not ok - domain-modeling provenance lost the MIT permission notice ### 2. delete the section 6 trigger sentence from AGENTS.md not ok - AGENTS.md section 6 lost the domain-modeling load trigger ### 3. drop the rendering-only scope from the section 9 proper-noun rule not ok - section 9's proper-noun sentence must stay scoped to rendering ### worktree restored (git status --porcelain prints nothing below)Evidence: The skill where a harness reads it, user-invocable and out of the public installer surface
$ ls -l .claude/skills .claude/skills -> ../.agents/skills $ sed -n 1,10p .claude/skills/domain-modeling/SKILL.md name: domain-modeling user-invocable: true metadata: internal: true $ ls skills/ # installer-facing public skills stowEvidence: Rendered pages the screenshots were taken from, plus the fidelity script and an evidence index
Pipeline
Updates from git push no-mistakes
✅ **intent** - passed
✅ No issues found.
✅ **Rebase** - passed
✅ No issues found.
🔧 **Review** - 4 issues found → auto-fixed ✅
AGENTS.md:421- The new inline sentence states that section 9's captain-facing contract "covers words firstmate invented for its own operation, never a proper noun". Line 419 of that same paragraph bans exposing "harness names, runtime backend names", which are themselves proper nouns (Codex, herdr, tmux, cmux, zellij, Orca), and the mapping list keepsharness, backend, runtime, or adapter -> worker runtime or tool. Read literally, the new sentence removes those families from the contract, and the skill's own discriminator reinforces that reading:.agents/skills/domain-modeling/SKILL.md:105says a word that would appear in a search of the code "is a name, and it stays". Every backend name appears in this repo's code. Failure sequence: a turn with no skill loaded (the exact case this inline stub exists for) hits a dead herdr endpoint and writes "herdr is not responding" to the captain, where line 419 previously forced "the worker runtime is not responding". No test catches it, becausetest_mapping_list_covers_high_risk_internal_familiesonly asserts the mapping line is present. Consider scoping the sentence to rendering rather than to contract coverage, e.g. that a proper noun is never translated while the do-not-expose rule still governs whether to name it at all. The wording is deliberate, so this needs the author's decision rather than an edit..agents/skills/domain-modeling/DECISION-RECORD-FORMAT.md:45- This line claims thedata/decisions/<YYYY-MM-DD>-<slug>.mdrecord "is the same durable decision file thatdecision-hold-lifecyclestep 7 records and links when a captain hold is resolved". That owner states only "Put the captain's exact durable decision in a file" (.agents/skills/decision-hold-lifecycle/SKILL.md:36), and bin/fm-decision-hold.sh accepts--decision-file <path>with no location or naming constraint. So the shared-location claim is not backed by either artifact it names, and a reader following it may believe decision-hold-lifecycle already enforces that path. Given the intent's boundary that decision-hold-lifecycle stays sole owner of the hold lifecycle, either soften this to a routing preference this skill applies, or land the location in the owner..agents/skills/domain-modeling/SKILL.md:73- Fleet-operational terms route todata/learnings.mdhere and in GLOSSARY-FORMAT.md:9, but neither states which entry contract applies. AGENTS.md:99 requiresdata/learnings.mdentries to be dated, evidence-backed, curated, and written with inspect-then-update, while GLOSSARY-FORMAT.md prescribes the**Term**:/_Avoid_glossary shape for the project-side## Languagesection. An agent applying the glossary shape todata/learnings.mdproduces an entry that does not meet the learnings contract. A one-clause pointer to AGENTS.md's learnings contract would resolve it.docs/domain-modeling-provenance.md:26- The normalisation note reads "The source writes the arrow in a relationship as→and no file in this repository does" - but that line is itself the only non-ASCII character in the repository's tracked surface (verified: a repo-wide non-ASCII scan of the changed files returns this line alone), so the statement falsifies itself. In a licence document whose whole point is that alterations are declared accurately, and in a change whose thesis is checking a claim against the artifact, "no other file in this repository does" is the accurate wording.🔧 Fix: scope proper-noun rule to rendering, fix unsupported claims
✅ Re-checked - no issues remain.
docs/domain-modeling-provenance.md:88- docs/domain-modeling-provenance.md states that exactly two characters are normalised in quotations and "nothing else in a quotation is altered", but the quotation on line 88 also converts upstream's nested double quotes around "we did the obvious thing." into single quotes, forced by the outer quote delimiters. Verified against upstream ADR-FORMAT.md line 37. Purely cosmetic and self-evidently forced by the quoting convention; noted only because the page's own subject is declaring its alterations.bin/fm-test-run.sh tests/fm-instruction-owners.test.sh tests/fm-captain-translation-contract.test.sh- both suites pass, including the newdomain-modeling carries its section 6 trigger, its terminology rule, and its MIT noticeandsection 9 keeps a proper noun untranslated without exempting it from the bancasesMutation checks that the new assertions hold something up: removed the MIT permission notice fromdocs/domain-modeling-provenance.md, removed the section 6/domain-modelingtrigger sentence fromAGENTS.md, and removed the rendering-only scoping sentence from section 9 - each made the owning suite fail; worktree restored withgit checkout --after each and confirmed cleanIndependent upstream fidelity check (python3 verify-upstream-fidelity.py . /tmp/nm-upstream-skills) against a read-onlygit clone --depth 1 https://github.com/mattpocock/skills.git, whose head is the pinned commit2ab9580: MIT notice equals upstreamLICENSEcharacter for character; 14 source-attributed quotations all located upstream under the declared em-dash and arrow normalisations; the 5 dropped capabilities (CONTEXT-MAP.md, glossary structural purity, context inference, ADR numbering scan, shared-dependency role) all present upstream; noCONTEXT.md,docs/adr/, orCONTEXT-MAP.mdcreated in this repo; reported source line counts 74/60/47 confirmedgit show --pretty=format: --name-only b8f82f2- confirms the skill,docs/domain-modeling-provenance.md, and the README pointer land in one commit, which is the acceptance conditionRenderedREADME.mdanddocs/domain-modeling-provenance.mdthrough GitHub's own Markdown API (gh api --method POST /markdown) and captured browser screenshots of the/domain-modelingslash-command row, the License section, the MIT notice, and the What-we-dropped listls -l .claude/skillsandsed -n 1,10p .claude/skills/domain-modeling/SKILL.md- the harness-visible skill path resolves through the symlink withuser-invocable: true, and the skill stays out of the installer-facing publicskills/bin/fm-test-run.sh --check-coverage- FM_TEST_COVERAGE ok total=121, so the shard partition still equals the tests inventory after extending two existing filesbin/fm-test-run.sh tests/fm-decision-hold-lifecycle.test.sh tests/fm-ensure-agents-md.test.sh tests/fm-stow-contract.test.sh tests/fm-sea-chart.test.sh- adjacent contracts that read the editedAGENTS.mdall passdocs/skill-trigger-coverage-audit.md:9- docs/skill-trigger-coverage-audit.md states "twelve of the nineteen skills under .agents/skills/" and "the three user-invocable ones"; .agents/skills/ now holds 23 directories and README lists 9 user-invocable skills. I deliberately left this alone: the document is a dated audit (2026-07-31) pinned to bases 6fa6926 and de0b95b, and it argues explicitly that restating removal-proven counts against a tree nobody re-ran the removals on is the exact unverified-number failure it exists to catch. Its counts are therefore historical measurements, not current-state claims, and the drift predates this change. Flagging it only because a reviewer will notice a new skill landing without that count moving.docs/arm-pretool-check.md:24- docs/arm-pretool-check.md:24 and docs/decision-hold-lifecycle.md:31 each contain an em dash, contradicting the plain-dash rule owned by .agents/skills/firstmate-coding-guidelines/SKILL.md:85 - the same rule docs/domain-modeling-provenance.md cites as its reason for normalising quoted em dashes out of a licence document. Surfaced while verifying that citation. Both are pre-existing and unrelated to this change, so I left them rather than widen the diff; worth a two-character follow-up.✅ **Lint** - passed
✅ No issues found.
✅ **Push** - passed
✅ No issues found.