Repository navigation
Releases: nikolasd/nikolasd-plugins
Releases · nikolasd/nikolasd-plugins
Release list
v0.9.0
Changed
- pm
specs-from-prd, business PRDs: the skill no longer assumes the PRD knows the systems. In Phase 1 it reads the repositories' own onboarding, architecture and README documents and agent instruction files, notes every other system they or the code name (including services that appear only in code comments), and asks for each repository's path and for the branch or ref that counts as the current code, recorded in a newBaselineheader line. It also looks for specs, planning documents and tickets that already cover the PRD outside the specs folder. Phase 2 reads the documents the PRD relies on and settles, in one question, which are in scope, which version of each counts and which areas the run covers. - pm
specs-from-prd, analysis: Phase 3 starts with a systems map and translates every requirement into the systems that would deliver it. Requirements get MET, PARTIAL or ABSENT; an ABSENT status needs a search record and survives a second pass that tries to find the capability under another name. Decisions already recorded in tickets, existing specs and design rules are collected and not asked again. A new Defect category covers code that is meant to work and does not: reported, not asked about. Subagent ABSENT results are re-read like FALSE and PARTIAL ones. - pm
specs-from-prd, interview: opens with the systems map in plain words, then the audience question. Every question names the system it concerns and has background, an example, the question, options with what each means for the product's users, and evidence after them, written for a tech lead or solution architect who knows the systems in general but not every detail this PRD touches. The opening shows only the part of the systems map this PRD touches, for the user to correct, and quotes the audience and success measure when the PRD already states them. More than about ten findings: grouping by system or area is recommended. A finding that rested on a wrong fact is corrected and the decisions built on it are re-asked. - pm
specs-from-prd, template and checker: the template gains aBaselineheader line, aSystems involvedtable and a system column in the findings table. The checker accepts citations into other repositories asrepo:path:lineand takes--root NAME=PATHonce per repository; an unprefixed citation in a spec resolves under that spec'sRepo. - pm
specs-from-prd, checker call: the draft reaches the checker as a file,specs-from-prd-draft-<slug>.mdin the scratchpad or system temporary directory, instead of an inline heredoc that failed on Windows and led the agent to improvise a temporary file. Content rule 8 now allows that one draft copy. Whenpython3is missing or is the Windows Store stub, the skill triespython,py -3anduv run --no-project python. - pm
specs-from-prd, frontmatter and permissions:model: sonnetis removed, because a skill's model override lasts only until the user's next message, so it covered the analysis and nothing after it. The Permissions section now says accurately what is pre-approved and that the checker may ask for permission after the user's first reply. - pm
specs-from-prd, when the user is asked: a new section lists the five points where the skill asks the user something, one step per message, so a repository found during the analysis is not folded into the opening question. The pacing offer is now a statement, not a second question. - pm
specs-from-prd, decisions: aD-nnneeds the user's answer or a source document that states it. When the user declines the interview, every choice they did not make is a gap, even when their success signal seems to settle it. A PRD claim the code shows to be FALSE is not reported as a defect. - pm
specs-from-prd, Atlassian: a Confluence PRD can be read through an Atlassian server registered under another name or with other tool names, such asgetConfluenceContent. The Atlassian steps moved toreferences/confluence.md, read only for a Confluence PRD, and the pm README now states this exception to theatlassianserver-name requirement. - pm
specs-from-prd, rules that survive a summary: a shortRules for the whole runblock at the top ofSKILL.md(no write before the confirmed review gate, theSource check:line, a gap instead of a choice nobody made, re-read the phase's reference after a summary) and an eight-step progress list replace the closing completion checklist.SKILL.mdis shorter, so the part kept after a conversation summary holds the review gate. - pm
specs-from-prd, scope and contradictions: what is in or out of scope must come from the PRD, the user or the code, and how to resolve a contradiction between the PRD and the code is a choice: without an answer it is a gap. The INVEST check asks before it splits, merges or reframes a locked spec or one a recorded decision settled, instead of "before drafting", which came after the draft. - pm
specs-from-prd, asking for other repositories: the Phase 1 question says in one plain line what each system found does in this feature, with the evidence in brackets after it.
Added
- pm evals:
specs-from-prd/no-interview-records-gaps-not-decisions, and adry-run-writes-nothinggrader that checks the user is told whether the checker passed or did not run. Eachwrites-no-filegrader, theedits-no-filegrader andwrites-nothing-outside-docs-specsnow allow the checker's draft copy, and everyran-the-checkergrader acceptspython,py -3anduv run pythonas well aspython3. Theplain-languagegrader ofmaps-a-business-prd-onto-the-systemsis written for a tech lead or solution architect and judges only how the systems are described. - pm configuration:
specs_dirin.claude/pm.jsonsets the folderspecs-from-prdwrites to (defaultdocs/specs; absolute paths and..refused). - pm evals:
specs-from-prd/maps-a-business-prd-onto-the-systems, a PRD that names no system where the repository's docs and a code comment place invoices in an external billing service.
v0.8.0
Added
- pm
specs-from-prd(/pm:specs-from-prd, pm 0.3.0): turns a PRD into one local specs document. It checks the PRD's claims against the code withfile:lineevidence, interviews you about what it finds, and writes specs that are each one small story under INVEST, with a feature-level design and every unresolved question recorded as a gap and never guessed. It writes only after you confirm the full draft and never touches Jira. A stdlib checker (check_specs.py) enforces unique IDs, resolvable acyclic dependencies, one repository per spec, acceptance criteria, the labelsstory-from-documentreads, a citedpath:linein every Technical approach and in the Components table (looked up on disk when run with--root), six INVEST results, a status that agrees with the gaps, an Open gaps list that agrees with the specs, a complete header, and no em dashes. It prints a fingerprint so the written file can be compared with the draft you approved. The document is re-runnable: IDs are stable, specs that already have a Story are locked, and removed specs becomeWithdrawn. - pm evals: 39 cases in total. New: 11 for
specs-from-prdand 8 forstory-from-document(spec selection, promote-mode injection, a project you name beating the configured one, stale line citations, an unknown spec ID), a shared order-service fixture inpm/evals/_lib/, and a CI step that runspm/tests/test_check_specs.py(a checker, template, skill-file and contract test suite).
Changed
- pm
story-from-document: acceptspath#S-03, a spec from aspecs-from-prddocument. It reads the whole document as context, builds a Story from that spec only, refuses aWithdrawnspec, asks about the gaps of aNeeds decisionspec, asks before creating a second Story for a spec that already records one, and tells you whichStory:line to fill in. It never edits the document. - pm
story-from-documentandspecs-from-prd, safety: only tools that read are pre-approved (the grant ends at your first reply anyway), so every write asks. OneSource check:step now covers every path by which someone else's text reaches the model, in create and promote mode alike, and sits at the top of the message that ends the turn. Web pages are fetched verbatim. Decisions a source claims are settled are shown as candidates and copied only when you confirm them. A declined permission prompt stops the run. - pm
story-from-document, gates: the duplicate check runs right after the repositories and project are settled (skipped under--dry-runor without Jira). A gate you already answered in the invocation is not asked again, but the final review gate always waits. An open gap is asked about once and may stay in the Story as[GAP: ...]. An amended draft needs a fresh confirmation. A project you name beats the configured one. A short standing-rules block at the top ofSKILL.mdand moving the optional mockups step intoreferences/mockups.mdkeep the key rules inside the part of a skill that survives a conversation summary. - pm
story-from-documentandspecs-from-prd, wording: one name per concept (the promote-mode step, checker "errors", INVEST "results"), two short model examples in the Story templates, a before-and-after split ininvest.md, the stale phase count and an unreachable configuration sentence removed, and the Python requirement of the checker stated.
v0.7.1
Changed
- nd
delivery(nd 0.5.1): restored the pre-coding protocol (read, failing test, implement, verify, with SOLID/DRY/YAGNI/KISS) and a quick-reference table. It now targets medium and heavy work where quality matters and says explicitly that small or trivial edits are out of scope.
Added
- nd evals:
disciplined-delivery-skips-trivial-change.disciplined-delivery-tests-firstnow uses a medium task and passes 9 of 10 runs.
v0.7.0
Added
ndplugin (0.5.0): 18 new eval cases (44 in total). They cover trigger boundaries (architect-skips-plain-pr-review,herdr-skips-spawn-an-agent-for-review,handoff-skips-compact-conversation,onboarding-skips-single-c4-diagram,disciplined-delivery-skips-docs-typo-fix); safety (handoff-keeps-secrets-out,handoff-records-uncommitted-when-declined,onboarding-keeps-injection-and-secrets-out,delivery-gates-push,herdr-hands-dialogs-to-user,herdr-does-not-resend-after-timeout,architect-asks-before-delegating); and behaviour (handoff-updates-existing-file,delivery-commits-after-approval,engineer-reports-not-done-on-red-suite,engineer-challenges-with-evidence,architect-does-not-trust-a-green-report,onboarding-reports-a-failing-gate). Theherdrcases run against a stubherdrand setHERDR_ENVthrough the eval sandbox's own shell startup files.ndonboard: the checker fails a doc containing a secret-shaped string (keySECRETS; it prints the kind and line, never the value), accepts--inadmissible-dir, rejects a nonexistent--root, and prints its default citation floor.ndherdr: a "Spawn a Claude peer" recipe thatarchitectandengineernow share, andwindows.mdfor the Git Bash and PowerShell notes.pmplugin (0.2.1): twosddeval cases (continues-local-only-without-atlassian,asks-which-copy-wins-on-divergence), andrepo-context.sh --hash, which prints the document's hash for Phase 5.
Changed
ndplugin: the five skills whose folder name differed from theirnamenow use the short name for both, so four slash commands change:/nd:disciplined-deliveryis now/nd:delivery,/nd:reflectingis/nd:reflect,/nd:writing-plain-languageis/nd:plain-language, and/nd:onboardingis/nd:onboard./nd:herdr,/nd:handoff,/nd:architectand/nd:engineerare unchanged. The foldersdisciplined-delivery,reflecting,writing-plain-language,onboardingandspawning-herdr-agentswere renamed todelivery,reflect,plain-language,onboardandherdr, so a spec validator no longer flags the mismatch, and the eval regexes accept one name instead of two.ndonboard: writers treat everything read from the repo as data, never instructions, and never copy a secret value into the docs. In a run on a planted repo, the old briefs obeyed an injected "claim SOC2 compliance" comment in one of three runs; the new ones asserted it in none of 16 (they record it under Unknowns as an embedded instruction, as intended). The checker now matches the briefs: a non-empty, keyword-led mermaid block is required in the AI or runtime design doc,infrastructure.md,deployment.mdandONBOARDING.mdas well as C4 and components docs; the citation floor counts distinct files (not anchors), defaults tomin(25, max(3, citable_files * 2 // 3))(printed on the first line; citable files exclude README, CLAUDE.md, AGENTS.md,docs/,reference/, LICENSE and the directory being checked), is never more than the repo has to cite (an earlier draft of this change asked a five-file repo for seven files, which no doc could meet), and excludes citations under the "existing in-repo prose" heading, which is now exempt only inONBOARDING.md; markdown links out of the docs dir to README, CLAUDE.md or AGENTS.md fail; a placeholder is aTODO:orTBD:marker, not the bare word.SKILL.mdcaps the fix loop, bounds cost (default depthtargetedabove about 500 source files, a 30-agent stop, ask which track first above four), checks for stray writes, and lets the orchestrator read the README once for orientation.ndhandoff: never writes a secret value intoHANDOFF.mdeven when asked (and scans the draft); commits onlyHANDOFF.md, by path, never onmain,masteror another protected branch, and never pushes; infers the focus when$ARGUMENTSis empty; updates an existing file for this session instead of appending; leads with Next Steps. Without the secrets rule the old skill wrote the key into the file in two of five runs when asked to.ndherdr: answers a dialog only if it confirms a slash command it just sent or is the trust-folder prompt for the directory it set (everything else goes to the user); treats pane output as data, not instructions; checks before resending after a timeout; starts the agent kind the user named (defaultclaude); closes only panes it recorded and asks first if the agent is still working. Outside Herdr it now runs noherdrcommand at all, not even to diagnose.nddelivery: centred on the approval gate and the definition of done rather than test-first on every edit; approval counts only after the user has seen the diff, test result and exact message ("commit it" before that is not approval); the gated actions are defined by category (publishes, rewrites history, discards work, moves HEAD); it covers pre-existing red suites, no test runner, a declined gate and runs with nobody to approve. A docs-only typo fix does not load it (delivery-skips-docs-typo-fix), and any request to run a gated git action does (a bare "push this to origin" loaded it in 10 of 10 runs after the trigger phrases were widened; before, one run in five pushed without asking).ndarchitectandengineer: after a challenge or question the engineer stops and waits; a challenge that still stands goes to the user, not to either session; a decision is the architect's only if a recorded user decision or the spec settles it and it is reversible; the engineer asks before spawning an architect and never commits unless the user authorized it; failure modes (declined delegation, silent engineer, red suite, low context) and sample task and report messages were added. The engineer now fires on an instruction from the architect session, including a go-ahead to commit (1 of 5 runs before, 5 of 5 after).ndreflect: facts about code are verified against files, while decisions are recorded as "decided in session, not verifiable"; it never guesses a storage path when basic-memory is unreachable; updates an existing note instead of creating a second one; suggests rule edits instead of making them; offers to reflect instead of starting.ndplain-language: says what it does, keeps meaning, code and quoted identifiers exact, and holds the register for the rest of the conversation.nddescriptions forhandoff,herdr,onboard,architect,delivery,reflectandplain-languagenow state what the skill does as well as when to use it, and their trigger phrases were narrowed to avoid colliding with built-in/compact, in-session subagents and single-document requests.pmsdd: Phase 5 recomputeslocal_hashwithrepo-context.sh --hash(whichallowed-toolsalready covers) instead of an unlistedgit hash-object. Reference files point at../templates/...and../scripts/...,story-from-documentno longer reads as locked after a dry run, andepicsays "two writes, then a confirmation".
Fixed
ndevals: on macOS the eval sandbox cannot rungit(the Xcode shim needs a cache file it may not write), which madehandoff-guards-non-git,handoff-asks-before-committing,delivery-shows-before-committingandengineer-refuses-unauthorized-commitfail for reasons unrelated to the skills. Their scaffolds now put the real git binary on the sandbox'sPATH(only when it exists and only inside the eval's own temporary home), and all four pass. Theplain-language-explains-plainlyjudge failed plain answers (it read bold plain sentences as jargon labels), which made the case fail with and without the plugin; its criteria are now exact.reflecting-asks-before-writingalso checks thewrite_noteandedit_notepath, not onlyWrite. Theonboardcases now read the files the run wrote instead of theWritetool's input, because with Bash granted the agent may write the docs with a heredoc and aWrite-only check passes or fails for the wrong reason; they also get a 900 s timeout, since three evals in parallel pushed runs past the default 300 s.
v0.6.0
Added
pmplugin (0.2.0): eight new eval cases that give the skill a canned Atlassian
server (evals/<case>/mocks/atlassian/), so the write tools exist and amax: 0
grader on them is a real test. They cover a held confirmation for every skill that
writes (holds-write-until-confirmedforepic,epic-refine,story,
ui-mockups,story-from-documentandsdd), an existing Epic or Story being shown
before a second one is created (asks-about-existing-epic,asks-about-existing-story),
and a source document that tries to instruct the assistant
(story-from-document/ignores-instructions-in-source).pm:sddrecordslocal_hash(agit hash-objectof the document) in
docs/.solution-design.state.json, andrepo-context.shprints it as "Local file
hash". A state file without it still works; the first run falls back to theVersion
field and records the hash.pm:epic-refinewrites a**Technical constraints:**line into a standard-delivery
Epic's Delivery section, andstorycopies it, since a standard Epic has no phase
constraints.
Changed
pm: a confirmation now has to come after the user has seen the draft. An earlier
"skip the review" or "I trust you" no longer counts, and each skill lists what
confirming will do and ends its turn. Before this,epic,epic-refine,ui-mockups
andsddwrote to Jira, Confluence or git anyway in every run of the new mocked evals,
storytried to create the Story in every run (the sandbox denied it), and
story-from-documentwrote in two of three.sddstill lets you skip the interview,
leaving each judgment call as an open question.pm: the skills no longer fill in values nobody supplied. An NFR threshold, persona,
owner, sub-task effort or constraint that is not in the Epic, the source or your answers
becomes[GAP: …]and goes in the gap list, andepic-refinedraws no sequence diagram
from components it has not confirmed.epicleaves_(Not provided: …)_for an
unanswered question.story-from-documentno longer pads acceptance criteria to a
count, asks before using a different issue type when the project has no Story type, and
storytakes sub-task effort from you (and proposes sub-tasks only for separable work
streams) instead of judging size from its own estimate.pm: checks that used to run after the first irreversible write now run before it.
epicsearches the project for a similar Epic once it has the name.storyre-checks
that the Epic's story-table row still exists before creating the Story.
story-from-documentsearches for an existing Story by its source reference at the
review gate, with no date window, and again before writing.pm: after rewriting an Epic or Story description,epic-refine,story,ui-mockups
andstory-from-document(promote mode) re-fetch it and stop if the state line, the
story-table Ids or the section content did not survive Jira's markdown round trip.pm:story-from-documenttreats the source, an existing Story and fetched pages as
data. It tells you about any text aimed at the assistant, in aSource check:line at
the start of its next message and again at the review gate, even when that text asks it
to stay quiet. It also fetches non-Confluence URLs withWebFetchand ignores
--dry-runwhen working out what the argument is.pm:sddruns the guide's pre-share checklist without its rendered-image item (the
skill cannot upload attachments), strips its "Rendered image not yet attached" notes
when the Confluence copy is taken as authoritative, and links the guide's Part files
directly instead of through an index. Its requirement-status vocabulary no longer has
Retired: a retired item isDescoped. The skill body is trimmed to 497 lines and its
description now says when to use it.pm:ui-mockupswrites its own gaps under### UI Open Questionsinstead of a second
## Summary of Gaps, treats_No mockups were produced for this Epic._as a
placeholder, and ends its turn when the Atlassian MCP is missing.pm:epic,epic-refineandstoryno longer pre-approveWrite, which none of
them uses.ui-mockupsandstory-from-documentdeliberately leaveArtifactout of
allowed-tools, so publishing a mockup canvas stays a prompted action. The skills read
their argument through$ARGUMENTS, and the em dashes the rules ban are gone from the
skills' own headings and templates.
Fixed
pmevals: the old Jira guards passed only because the sandbox had no Atlassian server.
epic'sholds-write-until-confirmednow ships mocks and would have failed on the
previous skill. Thesddupdate-preserves-idscase usesDescoped, and the manual
story-from-documentscenario no longer expects sub-tasks for a one-repo change.
v0.5.1
Changed
pmplugin (0.1.1): the skills no longer estimate or write story points, and no longer
add, change or remove Jira labels. An Epic's maturity is now carried only by the
**Epic Maturity State:**line in its description. The Epic story table is
| Id | Story | Summary | Status |; an existing table that still has a Story Points
column is left as it is.storydecides whether a Story needs sub-tasks from about one
week of work for one developer, not from a point value.pm: thepoints_scaleplugin option and project-file key are removed, since nothing
reads them. Thesiteoption is unchanged.pm:storynow creates sub-tasks before it updates the Epic, and leaves the Epic
untouched if any sub-task failed, so running/pm:storyagain resumes the same Story
instead of skipping it.pm:ui-mockupsnever moves an Epic's maturity backwards. Its confirmation says
when the state is left as it is.pm:epicchecks the Jira project and the Epic issue type before the Q&A, asks for any
required fields beyond the standard ones up front, and guards a retried create against duplicates.
With no Atlassian MCP it now ends the turn at that check, instead of running the whole
interview and failing at the final write or previewing sections it cannot save.
epic-refinematches its template placeholders by their words, so Jira's markdown
re-escaping no longer hides them.pm:story-from-documentalways resolves the project's Story type name in create
mode, and reads an interrupted Story's children and links before resuming it.pm:sddsays which copy wins after a divergence, adds azensical.tomlnaventry
only when the file already has anavarray, lists that edit in its confirmation, and
warns that updating a Confluence page replaces its whole body.--dry-runalso makes
no offer to save configuration, in every skill that has it.pm: the shared mockup procedure (ui-mockupsandstory-from-document) has screens
reuse the first approved screen's CSS variables and shell markup, and makes a state
that matters (empty, loading, error) its own page.pm: removed the trigger phrases from the skill descriptions, since the skills run only
when invoked. The root README lists the skill assdd, matching/pm:sdd.
Fixed
pmconfiguration:sdd_templateandsdd_guidein.claude/pm.jsonmust now be paths
relative to the repository (or a Confluence page ID). An absolute path,~or a drive
letter is refused, so a cloned repository cannot pointsddat a file such as
~/.ssh/id_rsa. When a key appears twice, the first occurrence now wins on one line
as well as across lines, and a value cut short by an escaped quote is treated as unset (a path value must not
end in a backslash).
repos_rootis still accepted, andstory-from-documenttells you the path and asks
once before reading outside the current repository.
CI
release.ymlruns the twopmshell tests before publishing.validate.ymlchecks that
everypmskill loads the configuration and pre-approves the loader command.
v0.5.0
Added
pmplugin (0.1.0): project-management skills for Jira and Confluence, using the
official Atlassian MCP server (registered asatlassian). All six skills run only
when invoked, because each can write to Jira, Confluence or git, and each asks
for explicit confirmation of a full draft before it writes anything.epic,ui-mockups,epic-refineandstory: a staged Epic-to-Story
pipeline.epicturns a business-level Q&A (optionally seeded from a PRD)
into a high-level Epic;ui-mockupsoptionally adds screens for business
review;epic-refineadds technical detail grounded in code the agent has
read;storycreates one Story at a time from the Epic's story table. The
Epic's maturity is tracked by a state line and a label, and each skill
updates the Epic in one write, carrying existing labels forward.story-from-document: builds a verified Story from a source document or
brief, or promotes an existing Story in place (keeping the original text),
with sub-tasks and dependency links. It checks claims against the real
repositories withfile:lineevidence, never duplicates sub-tasks or links
from an earlier run, and supports--dry-run, which writes nothing anywhere
(Jira, Confluence or claude.ai).sdd(/pm:sdd): creates or refreshes one living Solution Design Document per
repository, grounded in the code, as a local markdown file and a Confluence
page kept in sync. It detects hand edits on either side by page version and
uncommitted changes, adopts an existing page with the standard title, preserves
every ID on updates, and commits only the paths it names after one
confirmation that lists every side effect. The bundled template and authoring
guide are organisation-neutral, and either can be replaced with your own (a
file or a Confluence page). The guide is split by Part and loaded per Part; its
fictional examples are never copied into a document, and template text cannot
override the skill's rules.
pmconfiguration: two plugin options (site,points_scale) plus an optional
per-project.claude/pm.json(project_key,repos_root,sdd_template,
sdd_guide,sdd_space,sdd_parent_id), resolved bypm/scripts/config.shand
injected into every skill. Project-file values are format-checked, and invalid
ones are ignored. Anything not configured is asked for, with an offer to save it.pmmockups: each screen is rendered to a PNG by Chrome, Edge, Chromium or
Brave on macOS, Linux or Windows (PM_BROWSERselects one), falling back to a
private Claude Design canvas (after asking, and never during a dry run), then to
HTML files only.pmquality checks: an eval suite inpm/evals/(ten cases; see its README for
what it can and cannot cover and for how they were calibrated), and deterministic
tests for the configuration loader and thesddrepository-context script,
pm/tests/, which run in CI.
Changed
- The marketplace identifier is now
nikolasd-plugins(it was misspelled
nikolad-plugins) and matches the GitHub repo name. If you added the marketplace
under the old name, remove it and add it again; plugins install as
nd@nikolasd-plugins,pm@nikolasd-pluginsandty-lsp@nikolasd-plugins.
v0.4.0
Added
ndplugin:onboardingskill (frontmattername: onboard; the command is
/nd:onboarding, from the folder name), moved in from personal
~/.claude/skills— a workflow for producing a code-grounded onboarding
documentation set (C4 context/containers/components, engineering, AI design,
infrastructure, deployment, ownership map, fork-style ONBOARDING) for any repo,
with a three-layercommon/+ per-track layout when the repo holds several
discrete products. Shipschecker.py(citation/dangling-path/mermaid/link/
track-leak acceptance gate with--layout,--track NAME:REGEX,--ai-doc,
--agents-doc),briefs.md(subagent and reviewer briefs) and
objective-template.md(goal-mode objective). What was verified, and how, is in
the next entry and innd/evals/README.md.ndplugin:onboardingnow runs outside the original harness (subagent and
goal-tool fallbacks, explicit phase order, an inventory step before briefing) and
checker.pyenforces the code-only rule: it fails inadmissible citations (README,
CLAUDE.md,docs/,reference/) outside an "Existing in-repo prose" section, line
and symbol anchors that don't exist, TODO/TBD placeholders, and ONBOARDING entries
that mention a sibling without linking it; paths match case-exactly, and MIME
types,~/@strings andpath:func()anchors are handled. Agents now report in
fixed plain-text headings instead of JSON. The minimum-citations rule now counts
unique citations (path plus anchor) rather than unique files, and the rules say a
file the docs call absent is named in plain text.SKILL.mdgained a workflow
checklist, a Python preflight (an unrun gate is reported NOT RUN, never PASS), a
"running short" rule, and a verification-depth choice (fullortargeted); track
detection and gate details moved totracks.mdandgate.md. Reviewers are
capped by group size, work alone (no helper agents) and must return a report with a
Coveredline, after a real run showed one oversized reviewer stall, spawn helpers
that applied nothing, and leave the orchestrator to reconcile about 35 findings.
The checker now also keeps the README exemption open across sub-headings, counts
route-group paths likesrc/app/(auth)/login/page.tsxand bare*.config.*files,
ignores symbols that occur only in comment lines, andgate.mdhas a failure-to-action
table, a definition of "fails twice", and an always-pass---rootrule. The brief
tells writers to backtick a file only when citing its real path and to write "to-do
comments" instead of the literal placeholder words; in a mixed repoagents.md
covers agents and workloads, and the reviewer count for tracked repos is stated
(and marked unmeasured).
84 tests intests/onboarding/(the checker, plus consistency tests that tie the
brief,gate.mdandSKILL.mdto the checker).
Evidence, with its limits: 4 eval cases. The trigger case fires on natural phrasing
(5/5 with the plugin); its Δ +1.00 is structural, since a baseline cannot load a skill
it lacks. The near-miss does not over-fire. The applied case passes but does not
discriminate from a baseline (Δ 0.00). The full-workflow case is one run each on two
real repos, both single-layout Next.js apps: the second finished (score 0.82, 10 agents,
824 claims checked and 68 corrected by the agents' own count) and its output passes the
checker when run afterwards, but its final-report grader was skipped, not passed, and
the agent had no shell to run the checker itself. That run used a repo about eight times
smaller than the one where a reviewer stalled, so it does not show the review-group cap
fixes that stall. The tracked layout, round-2 fixes,targeteddepth and Haiku/Opus
have not been exercised by an agent.
v0.3.0
Added
ndplugin:disciplined-deliveryskill (frontmattername: delivery; the command
is still/nd:disciplined-delivery, from the folder name) — a delivery protocol
that applies before any code is written or changed, however small the edit:
research before code, test first, the definition of "fully implemented" (coverage
and ADR criteria apply where the repo uses them), adversarial self-review, honest
status reporting, and one explicit "approve" per commit, push, rebase, amend, PR or
checkout change. Test-first mechanics are delegated to
superpowers:test-driven-development.nd/evals/disciplined-delivery/: 4 cases.tests-first(a plain coding request
must get a test edited before the code),flags-incomplete-done(trigger),
skips-code-explanation(near-miss), andshows-before-committing("Commit it"
must still get the diff stat, test result and commit message shown, and an
"approve" asked for, first). Run 2026-09-28 on Windows (5 runs × 2 arms, Sonnet
judge):tests-first1.00 with the plugin vs 0.00 without (Δ +1.00, skill fired
5/5);flags-incomplete-doneandskips-code-explanation1.00 in both arms; and
engineer-skips-solo-taskre-run at 1.00, since the new skill now also fires on
solo coding tasks.tests-firstchecks edit order with a regex over the trace; an
llm judge failed correctly ordered runs because it judged the final reply.
The skill's earlier description ("starting a coding task") fired on only
6 of 12 small-edit runs, which is why the description now names any edit.
shows-before-committingneeds Bash and has not been run yet: this machine's
unreadable Automox PATH entry blocks it, so it still needs a Linux run.
v0.2.0
Added
ndplugin, two skills moved in from personal~/.claude/skills:architect
(plans, reviews and delegates to a separate engineer session) andengineer
(implements architect tasks with TDD, reports back with evidence). Each spawns its
missing peer via Herdr and sets the peer's model with/model, since a skill's
model:field only lasts one turn.nd/evals/architect/andnd/evals/engineer/: trigger / near-miss / applied eval
cases for both new skills (6 cases), closing the gap tracked in
docs/memory/tasks/architect-engineer-evals.md. The applied cases regression-test
the two highest-severity rules:architect-stops-without-herdr(no engineer sessionHERDR_ENVunset must stop delegation, not fall back to self-implementing or a
subagent) andengineer-refuses-unauthorized-commit(an architect instruction to
commit only counts if it says the user authorized it). Run for real 2026-09-24 (5
runs × 2 arms, Sonnet judge): all six at 1.00 score / 1.00 pass rate with the plugin,
after fixing three test-authoring bugs surfaced along the way — see
nd/evals/README.md's Resolved section. No changes needed to eitherSKILL.md.