Repository navigation
Releases: agent-grounds/grund
Release list
grund 0.20.0
- grund init's managed block takes its grund list --kind example from the project's own kinds, so the discovery recipe runs in a project without FS and AR (PR #979)
- Run workspace-load observer tests through their own re-spawned executable so featureless builds cannot replace the observer (§AR-ci.3.3.1) (PR #982)
- Keep overlapping command-agreement fixtures from deleting each other's working directories (PR #980)
- Keep grund init's next: block on a re-run that changes nothing while the selected home is still missing or no kind is declared (§FS-init.2.2.2, §FS-init.2.2.2.1, §FS-init.2.2.2.2) (PR #976)
- Name the first differing workspace entry in stale managed block findings (PR #971)
- Say in the spec, the decision, the init guide and the grund-init skill that --scaffold lays grund's whole software-development starter rather than the selected home alone, which is why grund init's configured-kind next: block never offers it (§FS-init.2.2.2.3, §FS-init-fixtures.8, §FS-init.2.1.3) (PR #975)
- The stale managed-block finding reads "the <section> section differs", whatever the section (§FS-errors.3.6.1) (PR #969)
- Point grund refs at grund list --unused, in one stderr note, when nothing cites a declared ID (PR #965)
- Call a managed block unsupported in grund check only above this grund's maximum, naming that maximum, and report a block grund init rewrites as stale (PR #968)
- Reclaim Node acceptance targets after their source checkout disappears (PR #966)
- Teach grund list --unused only forms that work under the default kinds, in --help, the querying guide and the grund-init skill (§FS-list.1.3.1, §FS-list.1.3.2) (PR #967)
- Give a bare or dotted grund config explain target naming a table of the other config version the answer its bracketed spelling gets (§FS-config-explain.5) (PR #964)
- Name a kind and a home the project declares in grund init's next: block, so a refresh with that home in place prints none (PR #959)
- Count a citation on a declaration heading in a kind's own index as use, never as its entry, in check, list --unused and refs (PR #957)
- Teach grund list --unused in querying.md and the grund-init skill's queries reference (§FS-init.2.3.4.3.1, §FS-list.1.3) (PR #960)
- Give completed check reports the same stable order in single-project, workspace and editor runs (PR #958)
- Teach grund list --unused in the managed block, directly after the --kind bullet (PR #961)
- Close a refused grund config migrate --write with each cause and its remedy, and drop the completed-write defaults and next-init advice printed above it (§FS-config-migrate.2.2) (PR #955)
- Count a citation in a near-miss declaration heading's title, as one in a conforming heading's counts (PR #954)
- Link each workspace member by its directory, so one grund init per project, in either order, leaves the root check green (PR #949)
- Report "args":[] for an E2E case with no command.args on every structured surface, so only the text form says grund check (§FS-show.2.4.2, §AR-scanner.6.2) (PR #953)
- Give an E2E case no title instead of a made-up "e2e case `<name>`", so grund list leaves its title empty and null (PR #951)
- Write the Workspace members discoverability line with its second clause, one alias segment per workspace level, as §FS-init.2.3.4.15.2 gives it (PR #950)
- Prepare each staged Node package once for private acceptance consumers (PR #944)
- Land the two 0.20.0 ramps: `grund agent-setup-instructions` is removed, and a citation-only image is no kind-index entry (PR #941)
- Record the grund v2 adoption by the six repositories named on #465, and pin that no phase of the 1.0 plan stays planned for a release that shipped (§DISC-core-concerns.9.4) (PR #942)
- Keep grund init's existing workspace member lists while an optional member is absent (PR #929)
- Record the merge-queue cost of benching every group: the eight groups after #798 against the eight before (§AR-ci.12) (PR #928)
- Name the bracketed spelling that answers when grund config explain is asked a dotted path to a table or key, and show a table and a key example in grund config --help (PR #926)
- Name grund list --unused on the top-level help's list row, so the declarations nothing cites are one call away from grund --help (PR #925)
- Keep the Org-mode Babel paper's DOI in the related work as text, since its publisher's host stopped accepting connections (PR #924)
- Make grund check compare the whole managed block, judging the workspace sections only at the outermost root of a full checkout (PR #922)
- Keep successful config migration writes compact by default and restore full output with --full (PR #920)
- Say in a non-citable home's Citation directions bullet and place-refusal hint that a file citing nothing is not checked where the row grounds nothing, name the setting that makes it a finding, and name each row's own grounding in the grounding sentence (§FS-init.2.3.5.2.2, §FS-init.2.3.5.7) (PR #919)
- Explain in check's unused warning and in text refs that a kind's index entry does not count as a use (PR #911)
- Hold the slowest-tests check-in and table to slowest-first order rather than to which test leads them (PR #917)
- Allow up to 30 minutes for Node release-build acceptance on slow runners (PR #914)
- Retry the dev advance after a release while main is still the release commit, and report main as moved only when it has (PR #916)
- Hold every basic case to one answer across the command line, the editor and both bindings, and run the scan-determinism sweep's fixtures concurrently to pay for it (PR #887)
Compatibility notices
- §DF-a-near-miss-title-citation-is-a-citation, §FS-citations.recognized.title-lines, §REQ-backwards-compatibility.5, §REQ-no-missed-citation.2: a citation in a near-miss declaration's title is now a citation. A heading
checkreports asdeclaration-near-miss, such as# FS-beta: Beta, pera citedFS-001-alphaunder the default{kind}-{number}-{slug}, now cites it, as a conforming declaration's title has since 0.18.0:refs FS-001-alphalists it, andFS-001-alphais no longer reported unused. This holds in every form a near miss takes, Markdown headings and doc comments alike, and only a citation of the near miss's own ID, as written, is still dropped. Who this breaks: a repository whose near-miss headings cite other IDs in their titles. The verdict moves both ways: a title citation there that dangles, names a missing section or an unknown project alias, or is a number-only shorthand is now an error (dangling,missing-section,unknown-project,shorthand-citation), a direction rule now judges it (forbidden-citation,discouraged-citation), a glob there is aglob-citationerror, and every finding names its location and the fix, as for a citation anywhere else. Renaming the ID to the configured format, as thedeclaration-near-misserror asks, no longer changes what its title cites. - §DF-agent-setup-instructions-removed-in-0-20, §FS-init.5.7, §REQ-backwards-compatibility.2: **
grund agent-setup-instructionsis removed; run `grund guide...
grund 0.19.0
- Pass the Python tests on release candidates and on macOS: derive the release tests' bump versions from the tree under test, and skip the non-UTF-8 member case where the filesystem refuses the name (PR #899)
- Fail every Python acceptance step with its output, and retry the build fetch on network failures (PR #898)
- Rename grund agent-setup-instructions to grund guide, whose bare run prints the fresh path and every section with its size (PR #897)
- Allow owners to prepare 1.0.0 through the manual release helper (PR #894)
- Link both seL4 papers in the gradual-typing related work to their PDFs on sel4.systems, since trustworthy.systems refuses every connection (PR #892)
- Keep release version inputs synchronized and reject due planned notices before building candidates (PR #890)
- Stop `fmt` writing a link into any link its author wrote or over a citation-only image's destination, and warn where an image is an index's only entry for an ID (§FS-citations.wrap.enclosing.scope, §FS-citations.checks.image-index-entry) (PR #885)
- Land the five 0.19.0 ramps: `init --docs` is refused, the one-grammar window closes, and glob citations, ungrounded Lisp doc-comments and nested-alias rule findings are errors (PR #886)
- Document CI link-check timeout budgets for connection and whole-request stalls (PR #884)
- Teach formatter link and section-lock maintenance after declaration renames (PR #879)
- Synchronize Python pending-interrupt acceptance and isolate its signal state (PR #882)
- Name the entry form and the entry to write when a declaration is not listed in its index (PR #880)
- Answer any configuration key or check code from the installed grund with `grund config explain` (§REQ-discoverable-offline, §FS-config-explain) (PR #878)
- Label the managed block heading as the block's revision, `(block vN)` (PR #877)
- Name rejected v2 formatting values and the assignment grund executes (§FS-config-v2.rollout.fmt-values) (PR #876)
- Say when a narrowed check judged nothing: an --only code the run leaves off, and a rule whose subject has no unit (§FS-check.1.4.1, §FS-check.2.2.1.4) (PR #868)
- Make grund init's next: block say a fresh scaffold warns "nothing recognized" as expected, instead of promising a clean check (§FS-init.2.2.2) (PR #874)
- Run the Python binding acceptance in the Python gate, and give an empty show_batch its note (§AR-bindings.6.2) (PR #873)
- Guide refused place rules to their citation configuration (PR #869)
- Print the setup skill's core by default, each reference section with --section, and the whole guide with --full (PR #867)
- Diagnose unsupported every quantifiers and offer accepted each forms (PR #866)
- Suggest an escaped citation's live form with the section it escapes, and only when that section exists (§FS-check.2.3.1.3) (PR #865)
- Qualify refs typo notes with the explicit scan path (PR #864)
- Remove cover's stale comparison with check's scan scope (PR #863)
- Use the loaded configuration's keys and effective kind formats in repair guidance (PR #856)
- Bound list, show --batch, refs and complete ids by a path below a workspace root and outside every member, as check already is (§FS-scan.path.list, §FS-scan.path.refs) (PR #860)
- Resolve refs --from sources outside the scan path (PR #861)
- Say what a run with no PATH covers in the spec and on the help pages, in place of a default of `.` that is false below the config root (§FS-scan.path.none) (PR #855)
- Connect missing-target stub diagnostics to safe repair guidance (PR #853)
- Name where to run grund fmt --write in check's section-lock errors, since a run given a file writes no lock (§FS-section-lock.checks.remedy) (PR #852)
- Remind users to refresh managed instructions after config migration (PR #851)
- Bring the section lock to the tree one fmt run leaves, so a --write that marks a `$$` trigger needs no second run (§FS-section-lock.write.same-run) (PR #848)
- Explain correction-route audit triggers and mention alternatives (PR #849)
- Offer valid citation repairs for marked kind-index entries (PR #845)
- Report an unresolved merge conflict in a declaration as a check error, and have fmt write nothing while one remains (§FS-declarations.checks.conflict-marker, §FS-fmt.7.4, §FS-fmt.7.4.3) (PR #843)
- Spell a per-target citation ceiling of one as at most once (PR #841)
- Preserve written numeric ID spelling in reports and heading anchors (PR #834)
- Leave a citation in the text of a link its author wrote inside that link in fmt, and take the link as the kind-index entry in check (§FS-citations.wrap.enclosing, §FS-check.3.18.5, §DF-fmt-preserves-authored-link-labels) (PR #838)
- Explain the workspace root remedy for member unknown-alias errors (§FS-workspace.5.1.1) (PR #840)
- Name the keys a version-2 table admits when it refuses an unknown one, and the v2 tables a v1 table's settings went to (§FS-config-v2.reader.1.keys, §FS-config-v2.reader.1.v1-tables) (PR #821)
- Reuse restored CI oracle dependencies and copy only version-history inputs (PR #812)
- Fix macOS Python extension linking in raw Cargo builds (PR #815)
- Label the issue each CI report opens or edits with its kind, bug for a failed macOS run and tokens for duration drift, so issue sources that select by kind see it (§AR-ci.14.3, §AR-ci.requirements.3) (PR #816)
- List who cites a set with refs --glob and what one point cites with refs --from, and keep only matching citations with cover --glob, in the CLI and both bindings (PR #811)
- Isolate concurrent mutable fixture copies in the shared test runner (PR #799)
- Give grund-core one `integrations` entry point and name what 1.0 freezes (PR #806)
- Keep each push to main's benchmark record for good on the benchmark-data branch (PR #803)
- Select coordinates with --glob on list and show --batch, and count them with list --total (PR #807)
- Explain Workspace Trust when setting up the LSP in VSCode and VSCodium (PR #802)
- Show a passing test's build and gate-time lines in a green Python gate's job log (§AR-ci.requirements.5.1, §AR-ci.3.4.1.1) (PR #801)
- Hold every merge-queue group to the instruction ceilings before it lands, and keep the push to main as its revision's one record (PR #798)
- Title an untitled complement row "Every scanned file no other row claims" in the Project map (PR #796)
- Warn when config migration carries comments across value vocabulary changes (PR #795)
- Hold every cover, scan and stub case to one answer across the command line, the editor and both bindings, and fix three disagreements it found (PR #724)
- Recognize qualified comment citations after apostrophes, Rust lifetimes and Haskell primes (PR #794)
- Name each project's root from the report base in the empty-scan warning, never by its absolute path (PR #793)
- Preserve literal tildes in global excludes paths (PR #789)
- [Retry each forge call a release makes up to three times, 1s then 2s apart, before it refuses](https://github.com/agen...
grund 0.18.0
- Move the integrations names' notice to 0.19.0 and their removal to 0.21.0, since #466 did not land before 0.18.0 (§DISC-core-concerns.9.7) (PR #763)
- Land the counted-section ramp as an error at 0.18.0 and move the nested alias pin's error to 0.19.0 (§FS-rules.7.8, §FS-rules.7.9) (PR #760)
- Write a minimal version-2 grund.toml from init and print config show's keyed tables in row order (PR #758)
- Skip migration capture on ordinary reads and cache walk sort keys to restore benchmark headroom (PR #757)
- Add grund config migrate --to 2: a checked preview and a guarded, atomic write (PR #754)
- Write each v2 row's agent guidance into the AGENTS.md above its places (PR #752)
- Let a v2 row own several folders and files, with `code` as the complement and the deepest place owning a file (PR #751)
- Check the Python version of a release from before the binding moved, and pin PyPI staging's archive paths with a test (PR #749)
- Use the raw CodeQL license source to avoid GitHub blob link flakes (PR #750)
- Read v2 sources by language, exclude them by glob, and declare v2 IDs only in doc comments (PR #743)
- Add `grund schema`: a standalone view of kinds, places, shapes and citation rules (PR #744)
- Teach project boundaries only in workspace agent blocks and member splitting during setup (PR #739)
- Check external links only on the lines a change touches, and sweep every external link nightly (PR #747)
- Link the Python API guide from the installation guide, so the README's route reaches it (PR #745)
- Specify that the Python binding is one directory, its crate (PR #737)
- Check a transient link failure from any host once more before failing the link gate (PR #740)
- Name the modal-word chapter a rule's modality split cut a subject short at (PR #736)
- Settle a github.com 5xx in the link gate through GitHub's API (PR #735)
- Refuse a rule count above the largest supported count for its range (PR #732)
- Show the path-subject refusal without a rewrite in the rules example (PR #734)
- Report a duplicate rule's finding wherever its [citations] direction passes the unit, so --only-rule no longer prints success for a violated rule (PR #731)
- Read a string literal that spans lines as one literal (PR #728)
- Shard the pull-request benchmarks across seven legs after one build job, add a nightly tier of 144 scenarios, and bench the LSP and Python frontends (PR #720)
- Link sTeX at its source repository while ctan.org is unreachable from CI (PR #733)
- Build every grund-lsp test fixture root under a temp base no config covers (PR #730)
- Specify REQ in the init template and the fs-home-moves warning (PR #725)
- Let Lua ---, Haskell -- | and Lisp ;; doc comments declare, and stop measuring Lisp doc blocks as notes (PR #718)
- Read every language grund classifies by default: derive [scan] extensions from the built-in language table (PR #715)
- Name alternative citation markers in generated configuration (PR #719)
- Hold every command, flag and performance-sensitive mode to a benchmark scenario or a waiver (PR #717)
- Place grund among academic work and open tools in the related-work folder (PR #716)
- Explain extension refusal for stub targets (PR #714)
- Generate the instruction benchmarks from one scenario catalog with absolute Ir ceilings and a PGO subset (PR #713)
- State in the functional spec what it took from the architecture through plain links (PR #707)
- Allow a name under a numbered section (`1.goals`), locked once cited (PR #704)
- Pin grund's reading of every top-20 language, plus Scala, in one e2e case (PR #712)
- Prepare the Node acceptance's TypeScript compiler once and cache it, so a registry blip no longer fails the suite (PR #709)
- Pin the bench job's environment by image digest, measure base and head with one harness, and record each run in a series (PR #700)
- Warn where a configured file home or include entry is not read because its name is hidden (PR #694)
- State in each functional spec what the whole document holds to, and correct the sentences its marks found false (PR #647)
- Add grund init --template and --scaffold, deprecate --docs, and let kinds = [] declare no kinds (PR #663)
- Run the macOS suites once a day and on every release candidate, not on every pull request (PR #684)
- Warn where a configured file home or include entry is not read because [scan] extensions leaves out its extension (PR #692)
- Publish a grund.toml that will not load as an error on that file in grund-lsp, instead of only on stderr (PR #691)
- Build each source checkout's Node acceptance into a target of its own under GRUND_NODE_TARGET (PR #693)
- Give every flag on every subcommand help page a one-line example, the shared --path-base line naming the page's own command (PR #690)
- Count a value binding or section citation in a kind's own index as use (PR #687)
- Refuse in grund id a proposed ID that check would reject under the effective slug_pattern (PR #688)
- Link a heading fmt --write expands in the same run with the anchor it leaves, so one --write is a fixed point (PR #686)
- Match rule subjects with one matcher and split aliases only in grammar/ids.rs, fixing G06 and G09 (PR #681)
- Refuse a malformed or newer entrypoint block before grund init writes anything (PR #685)
- Read declaration headings and citations through the scanner in the index checks and fmt, instead of re-parsing the line (PR #683)
- Warn parse-moves on a relative section heading in a doc-comment declaration body, which becomes a section in 0.19.0 (PR #682)
- Have fmt read through sources and take its scope from the run (PR #679)
- Do not read a heading inside a fence in a doc-comment as a section (PR #678)
- Lend an outside stub target's citations and chapters to the stubbed declaration, so rules, refs and unused judge it as if it were scanned (PR #677)
- Let a section heading write only its own component, and lock each cited relative section to its text (PR #666)
- Find a declaration on a block-comment line without ` * `, and behind a `/**` or `/*!` opener (PR #676)
- A README that shows the grounding loop, and a JSON Schema and key reference for grund.toml (PR #670)
- Raise the CI-duration threshold from ten minutes to fifteen (PR #675)
- Rule every row of the one-answer ledgers on a listed step or a decision record (PR #668)
- Warn at a stub whose target the walk excludes or ignores, broken from grund 0.19.0 (PR #667)
- Warn where a path narrows what show, list and id resolve, and where check <dir> refuses an alias the workspace root resolves (PR #664)
- Leave citations inside link destinations as fmt found them, and warn at an unclosed link wrapper (PR #658)
- [Read each file into one record, a...
grund 0.17.0
- Introduce Project, Run, Compiled and Catalog with a lossless v1 reader (PR #501)
- Answer a local section citation whose owner lacks the section with the escape, not a full citation check reports missing (PR #560)
- Count every line a stub's target declares its ID on as a home, a lone stub's too, so check reports the duplicate a scanned target gives (PR #559)
- Read a stub's target only where the scan would read it, so show refuses a hidden or unlisted-extension target check reports broken (PR #558)
- Restate grund's why as the two things that make structure hard (PR #517)
- Build and rehearse npm and PyPI packages locally without publishing them, and attach grund-lsp archives to releases (PR #516)
- Ask whether a cited section exists even where the link takes no heading anchor, so fmt no longer links a section check reports missing (PR #551)
- Measure a healthy stub at its home outside the scan in list --size, so it is no longer called broken (PR #555)
- Take a bare ID's heading from the stub target's record, so fmt links the anchor show reports (PR #554)
- Read a stub's target as a save would write it when counting its ID's homes, so the editor reports the duplicate a save would (PR #548)
- Take a cited section's heading from the scan's record, so fmt no longer links a heading after a declaration's body has closed (PR #547)
- Skip fenced lines when fmt looks for a cited section's heading, so a heading inside a Markdown fence no longer gets a link (PR #545)
- List every checker rule that reads a file after the scan in one place, held to the code by a test, and drop every count of them (PR #543)
- Read a stub's sections from its target outside the scan, so check resolves them as it does with the target scanned (PR #538)
- Fail the pull request that writes a release note the next release bump would refuse (PR #542)
- Read a stub's Markdown target as the scan does, so a heading inside a fence no longer declares its ID (PR #537)
- Judge a stub's target on the editor's unsaved text, so show and the broken-stub diagnostic answer as a save would (PR #535)
- Pair a stub with a target outside the scan, so stubs to one file are one home, named at the target's line (PR #533)
- Refuse a bare refs <ID> whose unscanned stub target declares the ID twice, as show does (PR #534)
- Find a stub's target by its ID in show, so a target outside the scan reads as if it were scanned (PR #527)
- Build the same-source binding oracle in the local Python gate when it is not given one (PR #526)
- Select a chapter subject's NAME by its whole path, so FS.requirements.terms reaches its nested chapter (PR #523)
- Answer a rule subject that needs named sections with one they make valid (PR #521)
- Accept a --kind any selected workspace project has citable, in list and list --size (PR #524)
- Name only the selected projects' kinds in a list --project refusal (PR #519)
- Read a refused list --selector as check --rule does, and suggest only selectors that paste back (PR #518)
- Add the Node Promise API and source-buildable grund-cli package (PR #481)
- Answer a refused list --selector with a selector, not a rule sentence (PR #509)
- Honor configured slug punctuation in show, refs and check (PR #506)
- Add --path-base=project|invocation and answer a bad report flag before loading (PR #502)
- Expose configured heading anchors in show JSON (PR #500)
- Specify remote projects: cite another repository's declarations offline (PR #499)
- Report an unknown alias in a workspace run whatever kind its tail names (PR #498)
- Teach grund's structural queries in a Querying grund guide, the grund-init skill and the managed block (PR #493)
- Answer which declaration and section own each line of a cover --lines range (PR #492)
- Say what a deprecation note may name, and pin the 1.0 ledger it owes (PR #494)
- Avoid executing freshly written cleanup fixtures (PR #488)
- Refuse a [scan] exclude entry containing / as a located config error (PR #486)
- Add an opt-in Git recipe for related spec and test edits (PR #479)
- Add grund check --watch, a terminal feedback loop over the ordinary check (PR #478)
- Add the Python API over grund-core and prove binding parity (PR #480)
- Resolve colon-format IDs discovered by list (PR #485)
- Recognize citations with word-character markers (PR #484)
- Complete LSP citation authoring with ID completion (PR #477)
- Clarify factual positioning and performance evidence (PR #476)
Compatibility notices
- §DA-config-concern-records, §AR-config, §FS-distribution.3.1, §REQ-backwards-compatibility.2:
grund-coredeprecatesFindings,Config,KindConfigandCitationRulesat its root, to be removed in0.19.0. The engine now reads agrund.tomlintoProject(itsschema,rulesandpresentation, inside an envelope of name, version and workspace),RunandCompiled, and the scan returns aCatalog. All four are public beside the old names.Findingsis now an alias ofCatalog, andConfigis a façade built from the records. Code that names an old type still compiles, with a deprecation warning that names the replacement. Only a build with-D warningsfails. Nogrundcommand, LSP response, JSON report or written file changes, for any v1 config. Closes issue #453. (PR #501) - §FS-init.2.3.4.3.1, §FS-init.2.3.7.1: the managed
AGENTS.mdblock moves v12 → v14, and v13 → v15 where a rule kind is enabled. It gains one bullet teachinggrund list --selector "<selector>" --format json | jq -c '{id,section}' | grund show --batch --toc --format jsonand linking the new Querying grund guide. Who this breaks: every repository with a grund block —grund checkreports it outdated until it is re-rendered. Migration: rungrund init. (#491) - §DF-canonical-slug-declarations, §REQ-backwards-compatibility.5, §REQ-no-wrong-citation.2, §FS-declarations.line.configured-slug: configured slug punctuation retains its canonical declaration identity.
Before the correction, a valid repository declaring and citingFS-*orFS-tail*,
with Markdown-link index entries, failedcheckat exit1with off-format,
unknown-reference and missing-index-entry errors. After the correction it prints
successat exit0; explicit and bareshowreturn the actual lead, and
declaration-onlyrefsno longer emits the typo note.
No repository edit or migration is required. Consumers expecting the erroneous
findings must accept their removal; genuinely off-grammar tokens and unresolved
citations retain their findings.
The verdict changes from failure to success for the valid fixture; every...
grund 0.16.1
- Count a resolved section citation in chapter rules (PR #450)
- Explain chapter display names and handles in rule diagnostics (PR #448)
Compatibility notices
- §FS-rules.5.1, §FS-rules.3.4, §FS-rules.7.8, §REQ-backwards-compatibility.2: a resolved citation to a numbered section now counts in chapter rules.
GOAL-x.4counts as a citation ofGOAL-x, andGOAL-x.outcome.2as one of theoutcomechapter, in every rule family, as[citations.KIND]already counted them. A chapter rule that failed only because such a citation was ignored now passes. A finding the newly counted citation alone produces — amust not citeprohibition, or anat most Norexactly Ncount it pushes out of bounds — is a warning in this release, carrying the code it will carry as an error and ending; a citation to a numbered section now counts, and this warning becomes an error in grund 0.18.0; the exit code does not move until then. Who this breaks, from 0.18.0: a repository whose prohibition or upper-bound rule a section citation silently evaded, most widely one withnamed_sectionsoff. The escapes are to remove or move the citation, loosen the rule's count, or pass--ignoreon the finding's code. (#449)
grund 0.16.0
- Make the 0.16.0 warnings errors and refs rejections failed queries, and finish three wording migrations (PR #446)
- Move the clean hook to scripts and keep IntelliJ settings local (PR #445)
- Prevent automatic Git maintenance from racing changelog fixture cleanup (PR #442)
- Specify and pin bounded tolerance for external link timeouts (PR #404)
- List the pull requests merged since the previous tag as the release notes and retire the pending changelog (PR #439)
- Close an inline code span on the next backtick run of its own length (PR #441)
- Keep invalid-rule in a check narrowed to a rule-produced code (PR #438)
- Avoid repeated whole-snapshot joins when evaluating chapter rules (PR #435)
- Read a -- or ; source declaration's body behind its own comment marker (PR #436)
- Pin that fmt writes and checks the same link for a bare file name as for ./NAME (PR #437)
- Hint at the batch form when show's path slot holds a missing coordinate (PR #434)
- Group grund --help by intent and link the public guides (PR #432)
- Refuse a flag placed before the subcommand with a CLI-level error (PR #431)
- Specify and pin that the fmt preview-equivalence corpus holds the declaration-local rewrite class (PR #430)
- Name the declaration-local expansion's dry-run label in the fmt report spec (PR #429)
- Print no next: block on a refresh of a complete setup (PR #428)
- Narrow a sub-folder lsp_snapshot's report, not its resolution (PR #427)
- Specify that a bare file argument discovers config from the working directory (PR #426)
- Specify that a block comment's closing */ is no part of a chapter's title (PR #425)
- Drop the whitespace before a doc-comment's marker from the shown body (PR #424)
- Specify and pin that a one-line /* … */ declaration ends on its own line (PR #422)
- Name every expansion of a line in its one fmt report row (PR #412)
- Render the chapter-rule citation as fmt's link in init and check, so fmt --check and init --check agree (PR #388)
- Refuse a value binding split by a line break at its literal (PR #400)
- Write the changelog before a release, not with each change (PR #402)
- Name the rejected inline_style value and the accepted set on load (PR #396)
- Add clean.sh, the clean verb ephor clean runs in a checkout (PR #398)
- Ignore the tests that read the workspace-load observer without its feature, and spell the gate's test command with it (PR #394)
- Read e2e command.args as shell words, and refuse what cannot be honoured (PR #395)
- Limit the filesystem-check hint to existing path refusals (PR #393)
- Stop a line that opens with a section-suffixed ID from declaring the parent ID (PR #391)
- Build grund-core fixture roots under a temp base no config covers (PR #392)
- Refuse ambiguous refs targets before listing citations (PR #390)
- Count a chapter declared in a doc-comment by the label its author wrote (PR #389)
- Specify and pin that a path-scoped check compares the same chapter rules (PR #387)
- Keep each pending changelog entry in a file of its own, not in `## Unreleased` (PR #386)
- Give related work a citable home: a REL kind, its eight entries, and the trace-tool matrix moved into one (PR #385)
- Require a resolving target before fmt expands a local section (PR #380)
- Let a value binding aim at the whole value, comparing its components joined by one space (PR #382)
- Fail the run on a declaration a chapter-scoped rule cannot reach (PR #369)
- Land bare `grund` on a CLI-level error instead of `check .` (PR #331)
- Read the inline latest release for a correction decision's record (PR #383)
Compatibility notices
- §FS-check.3.30, §FS-workspace.2.1, §FS-config.4.3, §REQ-backwards-compatibility.2: a
[workspace]block whose members swallow its own scan now fails to load. The ramp every0.13.xto0.15.xbinary announced in its own output lands on the release it named:warning: grund.toml:16: [workspace] members swallows this project's whole scan — every scan root is inside a member: `docs` in `docs` — so its declarations are unreachable and its citations are never checked. Point [scan] include at a directory that is not a member, or set include_root = false. This becomes an error in grund 0.16.0.at the command's own exit becomeserror: grund.toml:16: [workspace] members swallows this project's whole scan — … Point [scan] include at a directory that is not a member, or set include_root = false; this became an error in grund 0.16.0at exit2, with nothing on stdout, under--format jsontoo. It is located at the block'smembersline like every othermemberserror, and it wins over a later expansion refusal in the same tree.initis the exception: it is how a broken workspace gets repaired, so it neither refuses nor prints the warning any more. §RM-workspace-absorbed-scan-error loses its plan but keeps its address and heading text as a pointer, because released changelogs cite it, and §FS-check.4.7 and §FS-check.4.7.9 stay behind as pointers for the same reason. Nine e2e cases move to exit2:workspace-member-absorbs-scan-list,-check,-check-json,-full,-glob-symlink,-nested,-default-include,-expansion-errorand-expansion-error-json. What does not move: the rule of §FS-workspace.2.1 and its exclusions, the covered pairs the message names, and both fixes —include_root = falseor a[scan] includethat is not a member;workspace-member-absorbs-scan-partialandworkspace-member-absorbs-scan-include-root-falsestay green untouched. Who this breaks: a repository whose[workspace] memberscover every one of the block's scan roots — every walking command exits2where it exited0or1. Closes issue #443. (PR #446) - §FS-cli.1, §FS-cli.4, §REQ-backwards-compatibility.2: bare
grundno longer runsgrund check .. The deprecation window the warning named closes on the release it named, so the path's worked example is now a path performed end to end:grundwith no arguments is a CLI-level error — empty stdout, exit2, and on stderrerror: no command given; the bare `grund` fallback that ran `grund check .` was removed in grund 0.16.0followed by twohint:lines naminggrund checkandgrund --help. Who this breaks: a CI step still spelledgrund, which was green having validated the repository and is now red having validated nothing; the line to write instead isgrund check, which is what the error says.grund check,grund <ID>,grund --help,grund --versionandgrund .are untouched, and §FS-cli.5's report-to-exit mapping does not move — baregrundmoves between two codes that mapping already defines. Why the landing is an error rather than the top-level help page, which would be stdout and exit0and so the successful no-op the window was bought to prevent, is [§DF-bare-grund-lands-on-an-error](decisions/functional/DF-bare-grund-lands-on-an-error.md#df-bare-grund-lands-on-a...
grund 0.15.0
Added
- §FS-terms.senses, §FS-terms.terms, §RULE-terms: the shared vocabulary is held by a machine instead of by a reviewer's search. §RULE-terms makes a missing
## terms: Termschapter agrund checkerror over everyFSdeclaration, and four fixed-syntax invariants gate beside it intests/integration/test_functional_spec_terms_content.py— shared labels unique, every parenthesised word a label of the group its line cites, local labels unique per document, and a shared word redefined only in the(narrowed)form. What no machine can judge is reported rather than asserted: the same test program's--advisoryflag prints, per spec, the shared words it uses without leaning on them and leans on without using, silent unless it is asked for and never an exit condition, because a gate over a lean line's completeness would ask authors to name words they do not use. The newsenseschapter is where the four exclusions that make a token a use rather than a name are now written down. The architecture's twelve pages keep presence alone, held by their own test: a rule sentence cannot except the index page. This repository turns on its firstrules = truekind, so its ownAGENTS.mdblock moves from v12 to v13 and gains the### Chapter rulessection — no**Schema:**prefix, because the rule-enabled schema shipped in #335 and nothing about it moves here. That block is also taken out ofgrund fmt's reach with agrund:fmt offregion around it (§FS-fmt.2.5.2): the chapter-rule bullet carries the first live citation this repository's managed block has ever held, andgrund fmt --writewraps it into a cross-reference whilegrund checkbyte-compares it bare (§FS-init.2.3.5.10), so the two surfaces refuse each other until that is settled upstream. (PR #374) - §FS-config.concerns, §FS-terms.terms.9, §REQ-spec-section-names.reserved: every
grund.tomlkey belongs to exactly one of three concerns, and which one is answered by what a finding from the key can be about — schema is one node on its own, rules are at least two, presentation is the bytesgrundwrites.grund_config_version,project_nameand[workspace]are the envelope outside the three. The chapter also states once the rule its two existing instances were written one at a time: a rule's unit is its subject's node (§FS-config.3.9.1.1, §FS-config.3.9.2.4). The complete key→concern assignment is derived from the reader's parse sites and recorded with the decision that argues it, not written by hand. place, complement place, language, field and unit join the shared vocabulary with it; nothing a user runs behaves differently. The cut, the v2 format it is the axis of, and the releases between here and1.0are proposed in §DISC-core-concerns, and the two records that argue the halves of it ship with them: §DF-config-concerns carries the derived key→concern inventory, and §DA-config-concern-records the engine records the concerns become. (PR #359) - §FS-config.3.4.13, §FS-values.2.5:
[[kinds]] value_chapternames the chapter whose named direct children are value roots in every declaration of that kind, so a record keeps a checked quantity under a stable name beside the declaration that explains it. Until now a named section held a value nothing compared: the citation resolved andgrund checksaidsuccess. The key needs[id] named_sections = true, is refused besidevalues = true, and a project that does not set it reads, reports, and exits byte-identically. (PR #278) - §DISC-grund-core-public-surface, §AR-core-module-layout.1.2: audit the public root surface of
grund-coreagainst the embedding surface §FS-distribution.3.1 documents — a recorded baseline, a counting convention, one classified row per root name, and an integration check holding the inventory equal tolib.rs's explicitpub uselist. A proposal with a release plan under §REQ-backwards-compatibility.2; no symbol, visibility,#[doc(hidden)]attribute, command, output or exit code changes. (PR #281) - §FS-distribution.4.2: the release guard reads
wording changes in <release>, so a release at or above a wording deadline is refused. The clause was in the spec's table and absent from the gate; the two wording constants this tree ships — theagents-initmaintenance tail and the narrowed-alias scope suffix — now hold the release they name, and each has a version-gated deadline test of its own. (PR #282) - §FS-terms, §FS-check.2.3: settle the vocabulary the functional spec shares. One new declaration defines 42 shared words in seven cited groups, and each of the 24 specs the functional-spec index links gains a
## terms: Termschapter that opens with a lean line naming the groups it draws on and then defines only the words it introduces or narrows. Until now the same word could mean two things two specs apart, so a section read on its own did not answer on its own. TwoFS-checkcorrections ship with it: a suggestion is a finding carried on the suggestions channel rather than something other than a finding, which is what §FS-distribution.3.0.1 and §FS-rules.7 already type it as. No behavior changes — two reads that exit1today,grund FS-termsandgrund FS-<spec>.terms, start returning content. (PR #286) - §FS-declarations, §FS-errors.5.5, §REQ-spec-section-names: a check is now named by the code that selects it. The ten checks
grund checkenforces about a declaration —duplicate,duplicate-section,orphan-section,section-heading-level,section-outside-declaration,unmarked-heading,declaration-near-miss,misplaced-declaration,broken-stubandoversized-lead— move out ofFS-check's positional Errors detected and Warnings chapters into one concept spec, each at a section named for its diagnostic code, sogrund FS-declarations.checks.duplicatereads the rule that--only duplicateselects. The flat code list of §FS-errors.5.5 becomes a table carrying each code's severity, its pending ramp, what enables it and the point that specifies it, which is what makes a promotion a one-cell edit rather than a section move: the two ramps this tree still owes, §RM-unmarked-heading-error and §RM-off-grammar-declaration-error, are rewritten to say so. §REQ-spec-section-names writes down what a section of this repository's own specification may be called. All ten old addresses stay as one-line pointers until 0.15.0, andscripts/move_spec_sections.pyrepointed the 330 sites that addressed them. No behavior changes: no message, severity, exit code, golden file or template byte moves. The nine remaining concept specs follow one pull request at a time. (PR #299) - §FS-terms, §AR-system.5: widen the shared vocabulary to the architecture. §FS-terms is the vocabulary of the functional spec and the architecture, and each of the eleven pages the arc...
grund 0.14.1
Fixed
- §FS-check.4.7.9, §FS-check.4.10.8, §FS-distribution.3.1: preserve warnings already settled or answerable at the run root when a later workspace-member expansion refuses, and render them once before the unchanged config error. Questions below the root that failed expansion leaves unanswered remain silent. (PR #273)
grund 0.14.0
Fixed
-
§FS-distribution.1.1: let the pre-release name guard recognize a package this project published before the repository moved.
scripts/check-registry-names.shestablishes ownership from the registry's own metadata, which the last publish wrote, so it names the repository the package was published from —github.com/vjovanov/grundfor all three crates at0.13.1. Against a pattern that matched onlyagent-grounds/grundthe guard reportedcrates.io/grund-core is already taken by another projectabout this project's own crate, and refused every release: the move cannot reach the registry except through a publish, and the publish is what the guard stands in front of. The former repository is now accepted beside the current one, and an unrelated owner still fails. (PR #272) -
§FS-check.1.1.3.1, §FS-refs.2: recover real Python docstrings after a simple top-level assigned triple-quoted string and stop treating the assigned runtime data as citations. No configuration migration is required; move intentional edges from qualifying assigned data to a
#comment or real docstring, and note that recovered docstrings can expose genuine findings that were previously hidden. Closes issue #264. (PR #268) -
§FS-init.2.3.8: keep the configured
project_namewhen creating or forcibly regenerating canonicalAGENTS.mdwithout an explicit--name, falling back to the target directory name only when the target config has no name. (PR #269) -
§FS-init.2.1.3: render every scaffold-owned ID example from the illustrated kind's effective repository or per-kind format, so fresh and
--force-refreshed docs teach slug-only, number-only, and numbered-with-slug grammars without stale numbered prose. Closes issue #266. (PR #271) -
§FS-config.3.4.3: expose the resolved target kind title as optional
kind_titlemetadata on successful show JSON and detailed refs JSON, and as a separate literal Kind paragraph in hover. Keep declaration and section show objects compatible with installed resolvers by placing metadata before their terminalpath,linepair; preserve the E2E manifest prefix, Markdown previews, refs summary shapes and existing callable APIs. (PR #254) -
§FS-id.3: trim leading as well as trailing literal hyphens when deriving an ID slug, including hyphens accepted by the configured character class. (PR #254)
Added
- §AR-goal-measurement.1: gate every functional-spec leaf on exact test evidence or a reviewed, self-retiring exception, and add the missing fetch, ID, check, output, error, config, query, value, completion, and init proofs. The gate is measured against the consolidated specification of PR #256, which split most sections into citable children: every citation that named a section now holding children was retargeted onto the exact child the test proves, thirty-three end-to-end cases and nineteen focused tests were written for the leaves nothing reached, and the two exception tables were re-established for the new catalog — 934 leaves, 840 named by exact evidence, 85 permanent non-behavioral entries and 9 temporary. A parent citation still covers no child, so a section that gains children loses its parent's proof until a test names the child. (PR #254)
- §FS-rules, §AR-rules: add opt-in grounded rule declarations with five controlled-English families over declarations, named chapters, and citation relations;
check --rule,list --selector, shared CLI/LSP findings, semantic deduplication, conditional v11 agent guidance, a complete writing guide, and a runnable example ship together while projects withoutrules = trueretain their existing bytes. (PR #263) - §AR-system: the architecture index declares the system — one page naming every component with what it consumes, produces and must not know, the frontends, and the dependency direction — and every architecture page now opens with a named
placementchapter — a diagram of what feeds the component and what it feeds, then four facts — that cites its box there, held bytests/integration/test_architecture_placement.py.[id] named_sections = trueis switched on for this repository so the chapter has a stable coordinate. §AR-workspace.1, §AR-lsp.1 and §AR-bindings.1 point at the overview instead of repeating it, and §AR-core-module-layout.1 maps each file category to its component. (PR #238)
Changed
- §FS-check.4.7, §FS-check.4.8, §FS-check.3.8.4, §FS-errors.3.3, §FS-errors.3.6, §FS-distribution.4.2: the four ramps that named
0.14.0now name0.15.0.0.14.0ships as an ordinary release, so every deadline it would have reached moves one minor rather than passing while the message that promised it is still printed: the absorbed-scan warning (§FS-check.4.7) and the unlisted-[workspace]warning (§FS-check.4.8) become errors in0.15.0rather than0.14.0, and the two wording migrations — the fiveagents-initmessages and the narrowed-run scope-only unknown-project message — keep their compatibility form through0.14.0and take their final text in0.15.0, which makes each a three-release migration where it was a two-release one. For a user the only change is the release each message names: the findings, their codes, their severities and every exit code are what they were, and no repository that was green becomes red. The ramp guards move with the constants, soscripts/check_release_ramps.pyand the unit tests holding each named release ahead ofCARGO_PKG_VERSIONpass at0.14.0and fail again at0.15.0unless the flips land in it. §RM-workspace-absorbed-scan-error and §RM-unlisted-workspace-error record the release they now land in, and §DF-absorbed-scan-warning.2.3 keeps the reasoning that first set the date beside the one move it has made. (PR #270) - §AR-core-module-layout.1.5, §AR-ci.9: split formatter tree orchestration, reference-scope handling, init guidance, agent-entrypoint coverage, configuration validation, qualified-citation scanning, and workspace scope classification into cohesive component-local owners, preserving all behavior and the existing 67-test inventory while bringing every mapped source and test file within its configured soft budget. CI now installs the pinned
fissileon every leg, ahead of the Python tests, because the ownership regression measures with it. (PR #267) - §AR-system and every FS declaration: the specification is consolidated into short leads with numbered child sections a citation can name, section numbers unchanged throughout: 2142 citable sections where there were 1227, the words a citation reads down from 51400 to 17525, 380 of 427 registered contradictions ruled and applied (the 47 left for afterwards are #255); 2137 code citations retargeted to the child section that holds their claim (PR #256)
- §DA-engine-renders-nothing, §FS-integrations.1, §AR-bindings.2, §AR-bindings.3, §FS-distribution.3.1:
integrationsrenders in the CLI, and the engine's public surface carries no renderer. The command's argument parsing, its detection and artifact printing, its--writereports and its agent-guidance sync moved fromcrates/grund-core/src/compat/tocrates/grund-cli/src/cli_integrations.rsandcli_integrations_write.rs, like every other subcommand's; the engine keeps client detection, each client's artifact and the managed writes as the data-returning functions they already were underwriters/. For agrunduser nothing moves: the same bytes on the same streams, the same frozen client set, the same--writeidempotence and the same exit codes, with every e2e golden byte-identical. For an embedder, `grund_core...
grund 0.13.1
Added
- Report intake:
.github/ISSUE_TEMPLATE/carries four GitHub issue forms — bug report, feature request, usability report, and token or time waste — each applying the matching kind label (bug,enhancement,usability,tokens) as the issue is opened, andconfig.ymlturns blank issues off so no issue can arrive without a kind. Every form asks for the fields that make a report actionable: the context (command, directory, version), what happened, what was expected, an optional workaround, and, for the token form, the cost. (PR #205) - §FS-values, §DA-explicit-value-bindings: add opt-in first-class Markdown and home-JSON values, exact authored bindings in prose and scanned comments, arbitrary-precision decimal or decoded-string consistency checks, fixed text/NDJSON diagnostics, and shared query, formatter, workspace, core, and LSP behavior. Repositories opt in per citable kind with only
values = true; existing repositories keep byte-identical behavior. Closes issues #37 and #38. (PR #206) - §FS-config.3.2, §FS-check.3.19, §FS-show.2.2: add opt-in explicit named section coordinates across checking, queries, references, formatting, completion, LSP, and generated guidance.
[id] named_sections = truemakes complete colon-form handles such asgoals.performancestable and addressable at every depth, permits ordered numeric children such asgoals.3, reservesnumber.name, and reports missing prefixes instead of accepting structurally orphaned paths. The absent/false default retains numeric behavior and output;grund initwritesnamed_sections = false. (PR #204)