[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M79DHARE6FBC97H8RAZ2WSTW":3,"skill-same:01M79DHARE6FBC97H8RAZ2WSTW":56},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":26,"repositoryHtmlUrl":27,"repositoryHomepageUrl":28,"ownerHtmlUrl":29,"ownerBlogUrl":30,"ownerDescription":6,"updatedAt":31,"install":32,"resources":45},"01M79DHARE6FBC97H8RAZ2WSTW","inspire-adr",null,"ADR lifecycle for architectural decisions at three scopes, set by placement (global, one module, one face): create \u002F update \u002F promote \u002F supersede \u002F migrate along a maturity ladder (design → prototyped → implemented). Use when proposing, recording, advancing, or retiring an architectural decision.","Genomcore\u002Finspire","Genomcore","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F67845649?v=4","01M79DGNHB5DVE1Q8TC7F3K4FY","01M79DGNM14QF64G5NWT5X00SY",0,"MIT","https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fbase\u002Fskills\u002Finspire-adr\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: inspire-adr\ndescription: \"ADR lifecycle for architectural decisions at three scopes, set by placement (global, one module, one face): create \u002F update \u002F promote \u002F supersede \u002F migrate along a maturity ladder (design → prototyped → implemented). Use when proposing, recording, advancing, or retiring an architectural decision.\"\n---\n\n# \u002Finspire-adr — Architecture Decision Records\n\n## Scope\n\nAn **ADR** records an architectural decision. Where its files sit is its scope:\n\n| Scope | Directory | Holds |\n|---|---|---|\n| **Global** | `inspire_kb\u002F01_spec\u002F_adr\u002F` | a decision that spans **≥2 modules or ≥2 faces**, or is system-wide |\n| **Module** | `inspire_kb\u002F01_spec\u002F_modules\u002F{module}\u002F_adr\u002F` | a decision that binds one module |\n| **Face** | `inspire_kb\u002F01_spec\u002F_faces\u002F{face}\u002F_adr\u002F` | a decision that binds one face, even when it spans two modules within that face |\n\nNothing else declares the scope. Tools find every ADR by its extension, `*.adr.md`,\nwherever it sits under `inspire_kb\u002F01_spec\u002F`. This skill owns their full\nlifecycle. It does **not** run the global review — [`\u002Finspire-workspace review`](..\u002Finspire-workspace\u002FSKILL.md)\nchecks that an ADR's consequences have actually propagated; this skill authors and\nadvances the decisions themselves.\n\nAn ADR is the **decision rung** of the authority ladder\n([`_references\u002Fauthority.md`](..\u002F_references\u002Fauthority.md)). A rule binding one\nmodule belongs in that module's hub, and one binding a single use case, descriptor or\nscreen belongs in that artifact — each of those outranks an ADR on the question it\nactually decides. The reverse is the usual reason to open an ADR: the same departure\ndeclared in a third artifact is a decision sitting at the wrong rung, and it belongs\nhere.\n\n## The maturity ladder\n\nADR `Status` is a **maturity ladder**, not a binary — it declares how far the\ndecision has been realized, and therefore how far its consequences should have\npropagated (the *propagation contract*):\n\n- `design` — design reasoning. Reach: the whole **design workspace** — features\n  (`*.feature.md`) + screens (`*.screen.md`) + the **horizontal prototype**\n  (`\u002Fprototype` by default, a *non-functional* interactive mock — resolve\n  `prototype_root` per\n  [`_references\u002Fproduct-roots.md`](..\u002F_references\u002Fproduct-roots.md), where `none`\n  means this project has no horizontal prototype for a decision to reach) + specs\n  (`*.entity.md`, `*.action.md`). Refined **in place** on new evidence.\n- `prototyped` — additionally **validated in an external functional prototype**:\n  real running code in a vertical spike repo has proven the architecture works\n  (record it with a `**Prototype:**` pointer to that repo). The horizontal\n  prototype does **not** count. Still refined in place.\n- `implemented` — additionally realized in the **product codebase**. **Immutable —\n  both files of the pair; `supersede` to change.**\n- `superseded` (by `[adr-{new-slug}]({new-slug}.adr.md)`) \u002F `rejected` — terminal.\n\nThere is no `proposed`\u002F`accepted` state: an ADR present and not\nsuperseded\u002Frejected **is** the current decision at its maturity; the debate\nhappens in chat before authoring.\n\n## Invocation\n\n- `\u002Finspire-adr create {slug}` — new ADR (defaults to `Status: design`)\n- `\u002Finspire-adr update {id}` — modify an ADR (supersede required only at `implemented`)\n- `\u002Finspire-adr promote {id} {maturity}` — advance maturity and propagate consequences\n- `\u002Finspire-adr supersede {id} {new-id}` — mark old ADR superseded and wire the link\n- `\u002Finspire-adr migrate [{id}…]` — split single-file ADRs into a decision and a rationale\n\n## The decision and its rationale\n\nEvery ADR is a pair of files that share one slug, side by side in the same `_adr\u002F`:\n\n- **`{slug}.adr.md` — the decision.** The H1 title, `**Status:**`,\n  `**Modules affected:**`, `**Rationale:** [adr-{slug}.rationale]({slug}.adr.rationale.md)`, any `Supersedes:`\n  or `**Prototype:**` line, on a global ADR the `faces:` \u002F `bundles:` frontmatter, and\n  `## Decision`: one or a few imperative statements (\"Authentication uses the Better\n  Auth library.\"). It binds, so\n  it stays short: the session-start hook injects every live decision into every\n  session, through `.inspire\u002Fbin\u002Fdecisions.sh`.\n- **`{slug}.adr.rationale.md` — the rationale.** `**Decision:** [adr-{slug}]({slug}.adr.md)`, then\n  `## Context`, `## Consequences` (with `### Breaking changes`),\n  `## Alternatives considered` and `## Related ADRs`. It explains the decision and\n  constrains nothing, so it is read only when someone questions or supersedes it.\n\nThe test for a sentence in `## Decision`: would a reader who follows it build\nsomething different without it? If not, it is a reason, and it belongs in the rationale.\nA link to `{slug}.adr.md` always means the decision; link the rationale file\nonly when the reasons are the point. Links follow\n[kb-links.md](..\u002F_references\u002Fkb-links.md).\n\n## Subcommand: create {slug}\n\n### Conventions\n\n- **Filename:** `{slug}.adr.md` for the decision and `{slug}.adr.rationale.md` beside\n  it for the rationale. Slug-only — no numeric prefix, and no `adr-` prefix: the\n  extension already says the file is an ADR.\n- **Location is the scope:** the global `_adr\u002F`, the module's `_adr\u002F` or the face's\n  `_adr\u002F` (see [Scope](#scope)). A module ADR's slug does not repeat the module's\n  name or prefix: its placement says the module. Which scope a write takes resolves\n  per [`_references\u002Fface-scope.md`](..\u002F_references\u002Fface-scope.md) § Scope resolution:\n  an explicit argument wins, and the skill asks when nothing pins it.\n- **Slug uniqueness:** unique across the project, whatever the scope.\n  `spec-identity.sh` reports a duplicate.\n- **Canonical ID:** `adr-{slug}`, the prefix added back to the slug when the id is\n  read. The rationale's id is `adr-{slug}.rationale`. The H1 is the human title, and\n  the rationale's H1 is the same title followed by `— rationale`.\n- **Blast radius:** a **global** ADR carries the `faces:` \u002F `bundles:` frontmatter\n  the template below holds; absent means the whole project. A module or face ADR\n  carries neither: its placement gives the scope. `**Modules affected:**` lists the\n  modules either way. Semantics — what an absent field means and how an id resolves\n  — live in [`_references\u002Fface-scope.md`](..\u002F_references\u002Fface-scope.md) and are not\n  restated here.\n\n**Rationale.** Numeric prefixes collide under parallel work (two branches grab the\nsame next number). Slug-only filenames are collision-free by construction\n(mirroring the `TASK-{id}` convention).\n\n### Exposure lives in bundles\n\n*Which service exposes which modules* is not an ADR. It is expressed by\n**bundles**: each `{bundle}.bundle.md` lists, under `## Actions`, the whole modules\n(`[tenancy](..\u002F_modules\u002Ftenancy\u002Ftenancy.module.md) (whole module)`) and the single actions it exposes, with its package\nand profiles. [`\u002Finspire-face`](..\u002Finspire-face\u002FSKILL.md) owns the bundle files. The\ndomain stays a single untagged truth: no entity or action names a bundle. Overlap is\nallowed — an action may sit in two bundles. A project with one bundle exposing\neverything still has that one bundle file.\n\nWhen the reasons for a split are worth recording (\"the admin API is its own bundle\nbecause it runs inside the operator network\"), write a global ADR with\n`bundles:` naming the bundles it concerns. The ADR states the reasons and links the\nbundles; it never restates their `## Actions` lists.\n\nAction-granular pressure — most of one module's actions splitting across bundles —\nis a modularity smell: split the module (`inspire-module`) rather than list its\nactions one by one. A backend for a frontend is a bundle with an artifact of its own.\n\n### The action-verbs ADR\n\nA named pattern for the project's **action verbs**: the last segment of every\naction id. The verbs come from the application's own domain (a library reserves,\ncancels and picks up a book), and they are one system-wide decision, recorded in one\nADR with the fixed id **`adr-action-verbs`**. `\u002Finspire-domain` reads it whenever it\nlands an action's verb, and falls back to its default set (`list` · `get` ·\n`create` · `edit` · `delete`) while the ADR does not exist.\n\nThe ADR lists each verb with the kind of change it names, and any rule attached to a\nkind of verb (an event every mutation emits, timestamps every mutable entity\ncarries). It does not restate the generic rules in\n[`inspire-domain\u002Freferences\u002Finterview-prompts-action.md`](..\u002Finspire-domain\u002Freferences\u002Finterview-prompts-action.md):\none target object per action, plural verbs for reads that return many, singular\nverbs for reads that return one. A new verb is added here before the descriptor\nthat uses it lands.\n\n### Template\n\nTemplates: [`templates\u002Fadr.template.md`](templates\u002Fadr.template.md) for the decision\nand [`templates\u002Fadr.rationale.template.md`](templates\u002Fadr.rationale.template.md) for the\nrationale — the decision's `Supersedes:` header line is optional (add only when superseding, per the\n`supersede` subcommand below); the `faces:` \u002F `bundles:` frontmatter is for a global\nADR only and defaults to the whole project by omission, per\n[`_references\u002Fface-scope.md`](..\u002F_references\u002Fface-scope.md).\n\n### Steps\n\n1. **Ask** the user: short title, scope (global, a module or a face — see\n   Conventions), modules affected, for a global ADR the blast radius (the `faces:` \u002F\n   `bundles:` fields; with exactly one face and one bundle there is nothing to ask),\n   context, the decision, key consequences, alternatives considered.\n2. **Write both files** in the scope's `_adr\u002F`: `{slug}.adr.md`, then\n   `{slug}.adr.rationale.md`. Keep every reason out of `## Decision` (see [the\n   decision and its rationale](#the-decision-and-its-rationale)).\n3. **Create every missing link target.** A link to something that does not exist yet\n   requires its file. For each link the two files write (`**Modules affected:**`,\n   `## Related ADRs`, a face or bundle in the frontmatter) whose target is missing,\n   create it from its template in draft: a module hub from\n   [`inspire-module`'s template](..\u002Finspire-module\u002Ftemplates\u002Fmodule.template.md), an ADR\n   from [`templates\u002Fadr.template.md`](templates\u002Fadr.template.md) at `**Status:** design`,\n   a face or bundle from `inspire-face`'s templates at `lifecycle: draft`. Name each one\n   in the output.\n4. **Propose ADR references** in the feature files that should link to it: list\n   files to edit, wait for approval.\n5. Set `**Status:** design` by default. Use `promote` later to advance.\n\n## Subcommand: update {id}\n\nModify an ADR in place. At `design` \u002F `prototyped` maturity this is the **normal\npath** — freely edit either file, including `Decision`; record new evidence (e.g. a\n`**Prototype:**` pointer) when it drove the change.\n\n**At `Status: implemented`** both files are frozen: a change to either one requires\n`supersede` (product code depends on the decision, and the reasons it was taken are\npart of the audit trail): present a warning and offer to switch approach. `migrate`\nis the one exception, because it moves text without changing it. `supersede` also\nstays available at any maturity for a genuine reversal you want recorded as a\ndistinct decision.\n\nWhen the ADR is still in the single-file shape, offer `migrate` for it first.\n\n## Subcommand: promote {id} {maturity}\n\nAdvance an ADR along `design → prototyped → implemented` and propagate its\nconsequences to the layers the new maturity reaches.\n\n1. Verify the ADR exists and the transition is a **forward** step. Reject skips and\n   downgrades — refine the `Decision` in place with `update` instead.\n2. Update `**Status:** {maturity}` in the decision file. For `prototyped`, require a\n   `**Prototype:**` pointer (which external repo validated it, and the evidence); for `implemented`,\n   note where in the codebase it lives.\n3. **Propagate \u002F record evidence:** confirm the design workspace reflects the\n   decision, then for each affected module invoke `\u002Finspire-module review {module}`\n   to detect where the ADR's consequences are not yet reflected. Surface the gaps\n   as follow-up actions.\n4. **Propose endorsement.** Ask the operator whether to endorse the promoted\n   decision, then separately whether to endorse its rationale; on each explicit yes,\n   run `.inspire\u002Fbin\u002Ftrust.sh endorse \u003Cfile>` on that file\n   ([trust-stamps](..\u002F_references\u002Ftrust-stamps.md#endorsement)).\n\n## Subcommand: supersede {id} {new-id}\n\nReplace an ADR with a new one that changes its decision (create the new ADR first\nvia `create`).\n\n1. Verify both ADRs exist (the old one at any non-terminal maturity).\n2. Update the old decision file: `**Status:** superseded by [{new-id}]({new-slug}.adr.md)`. Its\n   rationale stays as it is.\n3. Update the new decision file's header: `Supersedes: [{old-id}]({old-slug}.adr.md)`.\n4. Search `inspire_kb\u002F` for links to the old ADR's file name; propose updating each path.\n\n## Subcommand: migrate [{id}…]\n\nSplit ADRs written before the pair existed: one file holding all five sections. With\nno ids it takes every single-file ADR: every `*.adr.md` under `inspire_kb\u002F01_spec\u002F`\nwith no rationale beside it. A project's KB is the\noperator's, so an upgrade never runs this on its own: `\u002Finspire:update` offers it, and\nthe operator runs it.\n\n1. **List.** Run `.inspire\u002Fbin\u002Fadr-split.sh --list` (or with the ids' paths). Nothing\n   listed means nothing to do.\n2. **Disclose.** For each listed file carrying `endorsed:`, say that the split rewrites\n   content that person endorsed, and on which date\n   ([trust-stamps](..\u002F_references\u002Ftrust-stamps.md#endorsement)).\n3. **Split.** Run `.inspire\u002Fbin\u002Fadr-split.sh` on the listed paths. It moves every line\n   verbatim: the frontmatter, the header and `## Decision` stay in `{slug}.adr.md`, a\n   `**Rationale:**` link joins the header, and every other section moves, in order, to\n   `{slug}.adr.rationale.md` beside it. It reports one line per file: `split`, or `skipped` for a\n   file with no `## Decision` section. Write that section with the operator for each\n   skipped file, then run the script on it again.\n4. **Trim each decision.** The old template asked `## Decision` for \"what we decided\n   and why\", so many of them carry reasons. For each split ADR, read `## Decision`\n   and show the operator the sentences that fail the test in [the decision and its\n   rationale](#the-decision-and-its-rationale), with the proposal to move them, word\n   for word, to the end of the rationale's `## Context`. Move them on a yes. This\n   step changes no word either, so it is allowed at `implemented` too. A decision\n   whose every sentence binds needs no question.\n5. **Stamp** both files of every pair (rule 6 below). Propose no endorsement:\n   nothing was decided.\n\n## Rules\n\n> **Output language.** Write every ADR in the project's declared `output_language`\n> (default English), per\n> [`_references\u002Foutput-language.md`](..\u002F_references\u002Foutput-language.md). Applies\n> whatever language the conversation is in; machine-read tokens (frontmatter\n> keys\u002Fvalues, link paths, filenames) stay verbatim.\n\n> **Writing contract.** ADR prose follows\n> [`_references\u002Fwriting-style.md`](..\u002F_references\u002Fwriting-style.md). `## Decision` in\n> the decision file and `## Context`, `## Consequences` and `## Alternatives considered`\n> in the rationale are normative prose\n> (R1–R6); `**Modules affected:**` and any tabular section are structured (R3, R4, R6).\n> R6 carries section-scoped exemptions this skill relies on — see the\n> *no historical language* rule below.\n\n> **Lesson capture.** At a natural pause, when the operator's feedback should\n> change how this skill behaves, offer `\u002Finspire-lesson note` — never auto-write\n> a lesson. Protocol and ticket-vs-lesson routing:\n> [`_references\u002Flesson-capture.md`](..\u002F_references\u002Flesson-capture.md).\n\n1. **Maturity is explicit, and only `implemented` is immutable.** `create` defaults\n   to `design` and `promote` is the only way forward; a `design` \u002F `prototyped` ADR\n   is refined in place with `update`, while changing either file of an `implemented`\n   ADR requires `supersede`.\n2. **Propagate to the maturity's reach.** Design-workspace coherence (features +\n   screen spec + horizontal prototype + specs) is required at every maturity;\n   `prototyped` adds a pointer to an external functional prototype, `implemented` a\n   codebase reference. Surface gaps within that reach.\n3. **Grep references on rename\u002Fsupersede.** Always scan the vault when renaming an\n   ADR or changing its ID.\n4. **No historical language, per the writing contract.** R6 of\n   [`_references\u002Fwriting-style.md`](..\u002F_references\u002Fwriting-style.md): an ADR describes\n   the decision context, never a migration narrative. This rule is **deliberately\n   narrower than unconditional** — the contract exempts `### Breaking changes`\n   content, `## Related ADRs`, the `**Status:**` line and a `Supersedes:` header,\n   because this skill mandates those sections and a ban on their content would ban a\n   required section.\n5. **Consult the task tracker** ([`\u002Finspire-task list`](..\u002Finspire-task\u002FSKILL.md))\n   for tracked items; don't re-open what's already ticketed.\n6. **Check and stamp every write.** After an ADR file is written — the\n   decision, the rationale, or both — run `.inspire\u002Fbin\u002Freview.sh \u003Cfile>` on\n   each one and fix what it reports on that file: every error, and every\n   warning the operator does not choose to keep\n   ([write-checks](..\u002F_references\u002Fwrite-checks.md)). Then run, for each one,\n   `.inspire\u002Fbin\u002Ftrust.sh stamp \u003Cfile> --skill adr`\n   ([trust-stamps](..\u002F_references\u002Ftrust-stamps.md#stamping)); rewriting an ADR\n   that carries `endorsed:` is disclosed to the operator first\n   ([trust-stamps](..\u002F_references\u002Ftrust-stamps.md#endorsement)).\n\n## Related skills\n\n- `\u002Finspire-workspace` — the global review checks ADR-propagation alignment (that\n  consequences cohere across the design workspace within each ADR's maturity reach).\n- `\u002Finspire-module` — `promote` propagates by invoking module review to surface\n  where an ADR's consequences aren't yet reflected.\n","# \u002Finspire-adr — Architecture Decision Records\n\n## Scope\n\nAn **ADR** records an architectural decision. Where its files sit is its scope:\n\n| Scope | Directory | Holds |\n|---|---|---|\n| **Global** | `inspire_kb\u002F01_spec\u002F_adr\u002F` | a decision that spans **≥2 modules or ≥2 faces**, or is system-wide |\n| **Module** | `inspire_kb\u002F01_spec\u002F_modules\u002F{module}\u002F_adr\u002F` | a decision that binds one module |\n| **Face** | `inspire_kb\u002F01_spec\u002F_faces\u002F{face}\u002F_adr\u002F` | a decision that binds one face, even when it spans two modules within that face |\n\nNothing else declares the scope. Tools find every ADR by its extension, `*.adr.md`,\nwherever it sits under `inspire_kb\u002F01_spec\u002F`. This skill owns their full\nlifecycle. It does **not** run the global review — [`\u002Finspire-workspace review`](..\u002Finspire-workspace\u002FSKILL.md)\nchecks that an ADR's consequences have actually propagated; this skill authors and\nadvances the decisions themselves.\n\nAn ADR is the **decision rung** of the authority ladder\n([`_references\u002Fauthority.md`](..\u002F_references\u002Fauthority.md)). A rule binding one\nmodule belongs in that module's hub, and one binding a single use case, descriptor or\nscreen belongs in that artifact — each of those outranks an ADR on the question it\nactually decides. The reverse is the usual reason to open an ADR: the same departure\ndeclared in a third artifact is a decision sitting at the wrong rung, and it belongs\nhere.\n\n## The maturity ladder\n\nADR `Status` is a **maturity ladder**, not a binary — it declares how far the\ndecision has been realized, and therefore how far its consequences should have\npropagated (the *propagation contract*):\n\n- `design` — design reasoning. Reach: the whole **design workspace** — features\n  (`*.feature.md`) + screens (`*.screen.md`) + the **horizontal prototype**\n  (`\u002Fprototype` by default, a *non-functional* interactive mock — resolve\n  `prototype_root` per\n  [`_references\u002Fproduct-roots.md`](..\u002F_references\u002Fproduct-roots.md), where `none`\n  means this project has no horizontal prototype for a decision to reach) + specs\n  (`*.entity.md`, `*.action.md`). Refined **in place** on new evidence.\n- `prototyped` — additionally **validated in an external functional prototype**:\n  real running code in a vertical spike repo has proven the architecture works\n  (record it with a `**Prototype:**` pointer to that repo). The horizontal\n  prototype does **not** count. Still refined in place.\n- `implemented` — additionally realized in the **product codebase**. **Immutable —\n  both files of the pair; `supersede` to change.**\n- `superseded` (by `[adr-{new-slug}]({new-slug}.adr.md)`) \u002F `rejected` — terminal.\n\nThere is no `proposed`\u002F`accepted` state: an ADR present and not\nsuperseded\u002Frejected **is** the current decision at its maturity; the debate\nhappens in chat before authoring.\n\n## Invocation\n\n- `\u002Finspire-adr create {slug}` — new ADR (defaults to `Status: design`)\n- `\u002Finspire-adr update {id}` — modify an ADR (supersede required only at `implemented`)\n- `\u002Finspire-adr promote {id} {maturity}` — advance maturity and propagate consequences\n- `\u002Finspire-adr supersede {id} {new-id}` — mark old ADR superseded and wire the link\n- `\u002Finspire-adr migrate [{id}…]` — split single-file ADRs into a decision and a rationale\n\n## The decision and its rationale\n\nEvery ADR is a pair of files that share one slug, side by side in the same `_adr\u002F`:\n\n- **`{slug}.adr.md` — the decision.** The H1 title, `**Status:**`,\n  `**Modules affected:**`, `**Rationale:** [adr-{slug}.rationale]({slug}.adr.rationale.md)`, any `Supersedes:`\n  or `**Prototype:**` line, on a global ADR the `faces:` \u002F `bundles:` frontmatter, and\n  `## Decision`: one or a few imperative statements (\"Authentication uses the Better\n  Auth library.\"). It binds, so\n  it stays short: the session-start hook injects every live decision into every\n  session, through `.inspire\u002Fbin\u002Fdecisions.sh`.\n- **`{slug}.adr.rationale.md` — the rationale.** `**Decision:** [adr-{slug}]({slug}.adr.md)`, then\n  `## Context`, `## Consequences` (with `### Breaking changes`),\n  `## Alternatives considered` and `## Related ADRs`. It explains the decision and\n  constrains nothing, so it is read only when someone questions or supersedes it.\n\nThe test for a sentence in `## Decision`: would a reader who follows it build\nsomething different without it? If not, it is a reason, and it belongs in the rationale.\nA link to `{slug}.adr.md` always means the decision; link the rationale file\nonly when the reasons are the point. Links follow\n[kb-links.md](..\u002F_references\u002Fkb-links.md).\n\n## Subcommand: create {slug}\n\n### Conventions\n\n- **Filename:** `{slug}.adr.md` for the decision and `{slug}.adr.rationale.md` beside\n  it for the rationale. Slug-only — no numeric prefix, and no `adr-` prefix: the\n  extension already says the file is an ADR.\n- **Location is the scope:** the global `_adr\u002F`, the module's `_adr\u002F` or the face's\n  `_adr\u002F` (see [Scope](#scope)). A module ADR's slug does not repeat the module's\n  name or prefix: its placement says the module. Which scope a write takes resolves\n  per [`_references\u002Fface-scope.md`](..\u002F_references\u002Fface-scope.md) § Scope resolution:\n  an explicit argument wins, and the skill asks when nothing pins it.\n- **Slug uniqueness:** unique across the project, whatever the scope.\n  `spec-identity.sh` reports a duplicate.\n- **Canonical ID:** `adr-{slug}`, the prefix added back to the slug when the id is\n  read. The rationale's id is `adr-{slug}.rationale`. The H1 is the human title, and\n  the rationale's H1 is the same title followed by `— rationale`.\n- **Blast radius:** a **global** ADR carries the `faces:` \u002F `bundles:` frontmatter\n  the template below holds; absent means the whole project. A module or face ADR\n  carries neither: its placement gives the scope. `**Modules affected:**` lists the\n  modules either way. Semantics — what an absent field means and how an id resolves\n  — live in [`_references\u002Fface-scope.md`](..\u002F_references\u002Fface-scope.md) and are not\n  restated here.\n\n**Rationale.** Numeric prefixes collide under parallel work (two branches grab the\nsame next number). Slug-only filenames are collision-free by construction\n(mirroring the `TASK-{id}` convention).\n\n### Exposure lives in bundles\n\n*Which service exposes which modules* is not an ADR. It is expressed by\n**bundles**: each `{bundle}.bundle.md` lists, under `## Actions`, the whole modules\n(`[tenancy](..\u002F_modules\u002Ftenancy\u002Ftenancy.module.md) (whole module)`) and the single actions it exposes, with its package\nand profiles. [`\u002Finspire-face`](..\u002Finspire-face\u002FSKILL.md) owns the bundle files. The\ndomain stays a single untagged truth: no entity or action names a bundle. Overlap is\nallowed — an action may sit in two bundles. A project with one bundle exposing\neverything still has that one bundle file.\n\nWhen the reasons for a split are worth recording (\"the admin API is its own bundle\nbecause it runs inside the operator network\"), write a global ADR with\n`bundles:` naming the bundles it concerns. The ADR states the reasons and links the\nbundles; it never restates their `## Actions` lists.\n\nAction-granular pressure — most of one module's actions splitting across bundles —\nis a modularity smell: split the module (`inspire-module`) rather than list its\nactions one by one. A backend for a frontend is a bundle with an artifact of its own.\n\n### The action-verbs ADR\n\nA named pattern for the project's **action verbs**: the last segment of every\naction id. The verbs come from the application's own domain (a library reserves,\ncancels and picks up a book), and they are one system-wide decision, recorded in one\nADR with the fixed id **`adr-action-verbs`**. `\u002Finspire-domain` reads it whenever it\nlands an action's verb, and falls back to its default set (`list` · `get` ·\n`create` · `edit` · `delete`) while the ADR does not exist.\n\nThe ADR lists each verb with the kind of change it names, and any rule attached to a\nkind of verb (an event every mutation emits, timestamps every mutable entity\ncarries). It does not restate the generic rules in\n[`inspire-domain\u002Freferences\u002Finterview-prompts-action.md`](..\u002Finspire-domain\u002Freferences\u002Finterview-prompts-action.md):\none target object per action, plural verbs for reads that return many, singular\nverbs for reads that return one. A new verb is added here before the descriptor\nthat uses it lands.\n\n### Template\n\nTemplates: [`templates\u002Fadr.template.md`](templates\u002Fadr.template.md) for the decision\nand [`templates\u002Fadr.rationale.template.md`](templates\u002Fadr.rationale.template.md) for the\nrationale — the decision's `Supersedes:` header line is optional (add only when superseding, per the\n`supersede` subcommand below); the `faces:` \u002F `bundles:` frontmatter is for a global\nADR only and defaults to the whole project by omission, per\n[`_references\u002Fface-scope.md`](..\u002F_references\u002Fface-scope.md).\n\n### Steps\n\n1. **Ask** the user: short title, scope (global, a module or a face — see\n   Conventions), modules affected, for a global ADR the blast radius (the `faces:` \u002F\n   `bundles:` fields; with exactly one face and one bundle there is nothing to ask),\n   context, the decision, key consequences, alternatives considered.\n2. **Write both files** in the scope's `_adr\u002F`: `{slug}.adr.md`, then\n   `{slug}.adr.rationale.md`. Keep every reason out of `## Decision` (see [the\n   decision and its rationale](#the-decision-and-its-rationale)).\n3. **Create every missing link target.** A link to something that does not exist yet\n   requires its file. For each link the two files write (`**Modules affected:**`,\n   `## Related ADRs`, a face or bundle in the frontmatter) whose target is missing,\n   create it from its template in draft: a module hub from\n   [`inspire-module`'s template](..\u002Finspire-module\u002Ftemplates\u002Fmodule.template.md), an ADR\n   from [`templates\u002Fadr.template.md`](templates\u002Fadr.template.md) at `**Status:** design`,\n   a face or bundle from `inspire-face`'s templates at `lifecycle: draft`. Name each one\n   in the output.\n4. **Propose ADR references** in the feature files that should link to it: list\n   files to edit, wait for approval.\n5. Set `**Status:** design` by default. Use `promote` later to advance.\n\n## Subcommand: update {id}\n\nModify an ADR in place. At `design` \u002F `prototyped` maturity this is the **normal\npath** — freely edit either file, including `Decision`; record new evidence (e.g. a\n`**Prototype:**` pointer) when it drove the change.\n\n**At `Status: implemented`** both files are frozen: a change to either one requires\n`supersede` (product code depends on the decision, and the reasons it was taken are\npart of the audit trail): present a warning and offer to switch approach. `migrate`\nis the one exception, because it moves text without changing it. `supersede` also\nstays available at any maturity for a genuine reversal you want recorded as a\ndistinct decision.\n\nWhen the ADR is still in the single-file shape, offer `migrate` for it first.\n\n## Subcommand: promote {id} {maturity}\n\nAdvance an ADR along `design → prototyped → implemented` and propagate its\nconsequences to the layers the new maturity reaches.\n\n1. Verify the ADR exists and the transition is a **forward** step. Reject skips and\n   downgrades — refine the `Decision` in place with `update` instead.\n2. Update `**Status:** {maturity}` in the decision file. For `prototyped`, require a\n   `**Prototype:**` pointer (which external repo validated it, and the evidence); for `implemented`,\n   note where in the codebase it lives.\n3. **Propagate \u002F record evidence:** confirm the design workspace reflects the\n   decision, then for each affected module invoke `\u002Finspire-module review {module}`\n   to detect where the ADR's consequences are not yet reflected. Surface the gaps\n   as follow-up actions.\n4. **Propose endorsement.** Ask the operator whether to endorse the promoted\n   decision, then separately whether to endorse its rationale; on each explicit yes,\n   run `.inspire\u002Fbin\u002Ftrust.sh endorse \u003Cfile>` on that file\n   ([trust-stamps](..\u002F_references\u002Ftrust-stamps.md#endorsement)).\n\n## Subcommand: supersede {id} {new-id}\n\nReplace an ADR with a new one that changes its decision (create the new ADR first\nvia `create`).\n\n1. Verify both ADRs exist (the old one at any non-terminal maturity).\n2. Update the old decision file: `**Status:** superseded by [{new-id}]({new-slug}.adr.md)`. Its\n   rationale stays as it is.\n3. Update the new decision file's header: `Supersedes: [{old-id}]({old-slug}.adr.md)`.\n4. Search `inspire_kb\u002F` for links to the old ADR's file name; propose updating each path.\n\n## Subcommand: migrate [{id}…]\n\nSplit ADRs written before the pair existed: one file holding all five sections. With\nno ids it takes every single-file ADR: every `*.adr.md` under `inspire_kb\u002F01_spec\u002F`\nwith no rationale beside it. A project's KB is the\noperator's, so an upgrade never runs this on its own: `\u002Finspire:update` offers it, and\nthe operator runs it.\n\n1. **List.** Run `.inspire\u002Fbin\u002Fadr-split.sh --list` (or with the ids' paths). Nothing\n   listed means nothing to do.\n2. **Disclose.** For each listed file carrying `endorsed:`, say that the split rewrites\n   content that person endorsed, and on which date\n   ([trust-stamps](..\u002F_references\u002Ftrust-stamps.md#endorsement)).\n3. **Split.** Run `.inspire\u002Fbin\u002Fadr-split.sh` on the listed paths. It moves every line\n   verbatim: the frontmatter, the header and `## Decision` stay in `{slug}.adr.md`, a\n   `**Rationale:**` link joins the header, and every other section moves, in order, to\n   `{slug}.adr.rationale.md` beside it. It reports one line per file: `split`, or `skipped` for a\n   file with no `## Decision` section. Write that section with the operator for each\n   skipped file, then run the script on it again.\n4. **Trim each decision.** The old template asked `## Decision` for \"what we decided\n   and why\", so many of them carry reasons. For each split ADR, read `## Decision`\n   and show the operator the sentences that fail the test in [the decision and its\n   rationale](#the-decision-and-its-rationale), with the proposal to move them, word\n   for word, to the end of the rationale's `## Context`. Move them on a yes. This\n   step changes no word either, so it is allowed at `implemented` too. A decision\n   whose every sentence binds needs no question.\n5. **Stamp** both files of every pair (rule 6 below). Propose no endorsement:\n   nothing was decided.\n\n## Rules\n\n> **Output language.** Write every ADR in the project's declared `output_language`\n> (default English), per\n> [`_references\u002Foutput-language.md`](..\u002F_references\u002Foutput-language.md). Applies\n> whatever language the conversation is in; machine-read tokens (frontmatter\n> keys\u002Fvalues, link paths, filenames) stay verbatim.\n\n> **Writing contract.** ADR prose follows\n> [`_references\u002Fwriting-style.md`](..\u002F_references\u002Fwriting-style.md). `## Decision` in\n> the decision file and `## Context`, `## Consequences` and `## Alternatives considered`\n> in the rationale are normative prose\n> (R1–R6); `**Modules affected:**` and any tabular section are structured (R3, R4, R6).\n> R6 carries section-scoped exemptions this skill relies on — see the\n> *no historical language* rule below.\n\n> **Lesson capture.** At a natural pause, when the operator's feedback should\n> change how this skill behaves, offer `\u002Finspire-lesson note` — never auto-write\n> a lesson. Protocol and ticket-vs-lesson routing:\n> [`_references\u002Flesson-capture.md`](..\u002F_references\u002Flesson-capture.md).\n\n1. **Maturity is explicit, and only `implemented` is immutable.** `create` defaults\n   to `design` and `promote` is the only way forward; a `design` \u002F `prototyped` ADR\n   is refined in place with `update`, while changing either file of an `implemented`\n   ADR requires `supersede`.\n2. **Propagate to the maturity's reach.** Design-workspace coherence (features +\n   screen spec + horizontal prototype + specs) is required at every maturity;\n   `prototyped` adds a pointer to an external functional prototype, `implemented` a\n   codebase reference. Surface gaps within that reach.\n3. **Grep references on rename\u002Fsupersede.** Always scan the vault when renaming an\n   ADR or changing its ID.\n4. **No historical language, per the writing contract.** R6 of\n   [`_references\u002Fwriting-style.md`](..\u002F_references\u002Fwriting-style.md): an ADR describes\n   the decision context, never a migration narrative. This rule is **deliberately\n   narrower than unconditional** — the contract exempts `### Breaking changes`\n   content, `## Related ADRs`, the `**Status:**` line and a `Supersedes:` header,\n   because this skill mandates those sections and a ban on their content would ban a\n   required section.\n5. **Consult the task tracker** ([`\u002Finspire-task list`](..\u002Finspire-task\u002FSKILL.md))\n   for tracked items; don't re-open what's already ticketed.\n6. **Check and stamp every write.** After an ADR file is written — the\n   decision, the rationale, or both — run `.inspire\u002Fbin\u002Freview.sh \u003Cfile>` on\n   each one and fix what it reports on that file: every error, and every\n   warning the operator does not choose to keep\n   ([write-checks](..\u002F_references\u002Fwrite-checks.md)). Then run, for each one,\n   `.inspire\u002Fbin\u002Ftrust.sh stamp \u003Cfile> --skill adr`\n   ([trust-stamps](..\u002F_references\u002Ftrust-stamps.md#stamping)); rewriting an ADR\n   that carries `endorsed:` is disclosed to the operator first\n   ([trust-stamps](..\u002F_references\u002Ftrust-stamps.md#endorsement)).\n\n## Related skills\n\n- `\u002Finspire-workspace` — the global review checks ADR-propagation alignment (that\n  consequences cohere across the design workspace within each ADR's maturity reach).\n- `\u002Finspire-module` — `promote` propagates by invoking module review to surface\n  where an ADR's consequences aren't yet reflected.\n",{"name":5,"description":7},"main","bf5124558fc1203b1fe5aea2d2ae38cfba34939b","plugin\u002Fbase\u002Fskills\u002Finspire-adr",1,"https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire","https:\u002F\u002Finspire.openbims.dev","https:\u002F\u002Fgithub.com\u002FGenomcore","https:\u002F\u002Fgenomcore.com","2026-11-13 22:27:32",{"source":8,"skillName":5,"commands":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add Genomcore\u002Finspire --skill inspire-adr",{"tool":38,"command":39},"bunx","bunx skills add Genomcore\u002Finspire --skill inspire-adr",{"tool":41,"command":42},"pnpm","pnpm dlx skills add Genomcore\u002Finspire --skill inspire-adr","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fbase\u002Fskills\u002Finspire-adr\u002FSKILL.md",true,[46,52],{"path":47,"resourceType":48,"resourceTypeDesc":49,"sizeBytes":50,"sourceHtmlUrl":51},"templates\u002Fadr.rationale.template.md","REFERENCE","参考文档",422,"https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fbase\u002Fskills\u002Finspire-adr\u002Ftemplates\u002Fadr.rationale.template.md",{"path":53,"resourceType":48,"resourceTypeDesc":49,"sizeBytes":54,"sourceHtmlUrl":55},"templates\u002Fadr.template.md",1222,"https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fbase\u002Fskills\u002Finspire-adr\u002Ftemplates\u002Fadr.template.md",[57,64,71,78,85,92],{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":63,"publishedAt":18},"01M79DMDSD4Z004V0CB01EYKT4","update","Update this project's INSPIRE runtime to the installed plugin's version: report drift, re-materialize unchanged files, and refuse to clobber local edits. Use after \u002Fplugin update inspire reports a newer base.","https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fskills\u002Fupdate\u002FSKILL.md",[],[],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":18},"01M79DMAENSXPJJPWTRA9CMBV0","migrate","Move this project's knowledge base from the layered layout (01_adr, 02_modules, 03_features, 04_domain, 05_screens and the surface roster) to the concept layout under inspire_kb\u002F01_spec\u002F, where every artifact has a typed extension, and convert its [[wikilinks]] to relative Markdown links. Run once, on purpose, after \u002Finspire:update reports the layered layout or counts wikilinks. Rebuilds nothing that is already built.","https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fskills\u002Fmigrate\u002FSKILL.md",[],[],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":18},"01M79DM6HZ7YN9M3WGXVN64AW1","init","Install the INSPIRE runtime into this repository: materialize the skills, validators, hooks and knowledge-base skeleton, register the hooks, and freeze the runtime version. Run once per project. Use when setting up INSPIRE in a new or existing repo.","https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fskills\u002Finit\u002FSKILL.md",[],[],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":18},"01M79DM28JSC3GWEJ82346VGW6","inspire-workspace","Workspace-level validation: the global pre-PR review (orchestrating module + cross-module checks) and vault-structure validation. Use for the required pre-merge gate and top-level structure checks. ADR lifecycle lives in \u002Finspire-adr; the task tracker in \u002Finspire-task.","https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fbase\u002Fskills\u002Finspire-workspace\u002FSKILL.md",[],[],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":18},"01M79DKYPKA8TKJCW1GF0W2WAN","inspire-task","Task tracker: create \u002F update \u002F close \u002F list \u002F show tickets in inspire_kb\u002F99_tracker\u002F. A plain-file kanban (one Markdown file per ticket, no external tool) for tracking work, drift, and skill-feedback. Use to open, advance, close, or query tickets.","https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fbase\u002Fskills\u002Finspire-task\u002FSKILL.md",[],[],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":18},"01M79DKTXQWFBW2P6VMQW3DYWX","inspire-spike","Vertical spikes: register and harvest external functional-prototype repos. A spike is a narrow, deep, throwaway build in its OWN repo that answers 'can we build it as we think?'. Use to register such a repo (name\u002Freference it, set up its learnings hygiene) and to capture its learnings into the vault as a gap analysis against the current project.","https:\u002F\u002Fgithub.com\u002FGenomcore\u002Finspire\u002Fblob\u002Fmain\u002Fplugin\u002Fbase\u002Fskills\u002Finspire-spike\u002FSKILL.md",[],[]]