Repository navigation
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::run_integrationsandgrund_core::print_config_warningsare gone — both parsed or printed rather than answered, which §FS-distribution.3.1 says this surface does not do — and thirty-four data-returning names the command reads join in their place, so the crate exposes 164 documented names where it exposed 132.grund_core::main_entry()is the only renderer left on it. The deprecated entry point answersgrund integrationsby naming the migration §FS-distribution.3.1 documents — install thegrundCLI package — rather than carrying a second copy of a command the engine is retiring; every other subcommand of that path is unchanged. (PR #244) -
§FS-distribution.4.2:
scripts/check_release_ramps.pyreads theis removed in <release>clause, the pending half ofwas removed in <release>. A tree whose messages promise a removal cannot be cut at that release or above until the removal lands, so the deprecation naming 0.15.0 is the first one a machine refuses to publish at the wrong version. (PR #244) -
§AR-core-module-layout.1: move
grund-core's unit-test modules out of the crate root and beside the code they pin, one group of components at a time. A test module is now<component>/tests_<subject>.rs, declared by one#[cfg(test)] modline in that component'smod.rs, sosuperis the component it exercises and everything else arrives by an explicituse crate::<other>::{…}; the fixtures they share lefttests_support.rsforcrate::testing, apub(crate)module besidelib.rs. Which component a module belongs to is decided by the entry point its cases exercise rather than by its name, sotests_scanner_walk.rsisscanner/tests_walk.rsandtests_init_scan_guidance.rsisscanner/tests_scope_probe.rs. This commit moves the thirty modules whose entry points are the model, grammar, config, workspace, templates and scanner, and retires the thirteen#[cfg(test)] pub(crate) usere-exports that existed only so a flat test could reach past a component boundary; the next moves the eighteen the resolver and the checker answer for, retiring seven more of those re-exports and the prelude'sapi,configandworkspaceglobs, which those modules were the last to read; and the last eighteen — the queries', the writers', the api's and the deprecated path's — go with the prelude itself, retiring sixteen more of those re-exports, every one of them the writers', because the only test that read each now sits inside the component and reaches it throughsuper.lib.rsis left holding the twelvemodlines, the explicitpub use <component>::{…}surface and#[cfg(test)] pub(crate) mod testing;, with no#[cfg(test)]glob, no#[cfg(test)]std import and noinclude!, sotests/integration/test_module_layout.pynow allowslib.rsandtesting.rsat the crate root and nothing else, and asks thatlib.rssplice in nothing at all. The twenty-seven#[cfg(test)] pub(crate) usere-exports still standing are the ones another component's tests read, which is the same boundary as any other cross-component read.tests/integration/test_dependency_direction.pynow skipstests_*.rsandtesting.rs, because a test module may read any component (§AR-system.4), and.agent-grounds/fissile.toml'stestsbudget follows a module into its component directory. Behaviour is unchanged: the same 618 tests run under the same names, and the public surface is the same 132 names. (PR #242) -
§AR-resolver, §AR-system.2.10: split the workspace layer in two and give the run-time half a component of its own.
workspace/keeps what is answered from config text — member expansion, the alias-path claims, scope narrowing, boundary roots — and the newresolver/holds what needs a scan: the loaded project set every walking command operates on, the off-grammar reconciliation across that set, the one citation-to-target lookup §AR-resolver.1 is about, a declaration's body sliced by the spans the scan recorded, the link target its ID resolves to, and the one half of §FS-check.4.10 that has to run the walker. It sits between the scanner and the checker, so eleven reads that ran against the direction of §AR-system.4 now run with it and leavetests/integration/test_dependency_direction.py's record: eight from workspace up into the scanner, two from the checker into a query's body slicer, and one from the checker into the formatter's link target. Three walk-level facts went the other way instead of up —root_scope_rootsandcanonical_config_rootintoconfig/scope_roots.rs,is_hiddenintomodel/paths.rs— because each reads a configuration or aPathand nothing of a tree, andis_stub_for_inline_decljoinedmodel/records.rsbeside the stub target it resolves. In the same split the grammar stopped taking aConfigat all — a lexical reader now takes the compiledGrammarand the one settings record config builds beside it (§AR-system.2.1) — and the number-only shorthand parted along the seam between recognizing a token and resolving it: the shape stays lexical, the catalog of a whole run is §AR-resolver.4, and the finding a site earns is the checker's (§FS-check.3.13), which retires the last seventeen of the record'sgrammar/entries. The last eight are retired by an eleventh component,templates/(§AR-system.2.11): what a managed agent-entrypoint block should say is a function of config alone, sogrund initwrites it andgrund checkre-renders two of its sections and byte-compares them from below rather than reaching up into the writers (§FS-check.3.5, §AR-checker.2.7), while which entrypoint files a repository has is a probe over the tree and joins the scanner as the one walkinitandcheckshare (§FS-init.2.1). The formatter's own syntax went down to the grammar with them — the--cross-refswrapper a shown body is flattened back from and the two scopes a repository takes out of a rewrite's reach (§FS-fmt.2.5) — because recognizing a wrapper or a directive is lexical, which leavestests/integration/test_dependency_direction.pyholding six entries, all of them the deprecated path's stderr printers. Behaviour, CLI output and the public API are unchanged: the same 132 names are reachable asgrund_core::<name>and nothing new is public. (PR #241) -
§AR-core-module-layout.1, §AR-system.2: assemble
grund-corefrom one Rust module per component instead of a flatinclude!list, one component at a time. A component's internals are private to its module and only what crosses a boundary ispub(crate), so the dependency direction of §AR-system.4 is the compiler's to hold rather than a file-name test's, and §AR-core-module-layout.1 is the module rule — one directory per component,mod.rsthe whole of what crosses it — rather than a table of file-name prefixes. The public API is unchanged: every name reachable asgrund_core::<name>before the move is reachable after it, and nothing new becomes public.lib.rsnow re-exports that surface as an explicitpub use <component>::{…}list — 139 names, the 132 documented ones plus the seven#[doc(hidden)]items a frontend reads — rather than by glob, so a name is public because the list says so and an unused public name shows up as a diff.tests/integration/test_dependency_direction.pyholds the order across the ten directories: everycrate::<other>reference runs downward but for the forty-two reads recorded in the test one by one, each of which must still exist and still carry its §AR-system.4 note at the import, so the record can only shrink and a new upward read fails.tests/integration/test_module_layout.pyreplacestest_module_categories.pyand holds the shape: every.rsundercrates/grund-core/src/islib.rs, atests_*module, or a file in one of the ten component directories, each with itsmod.rs, andlib.rssplices in nothing but those test modules, which keep reading the crate flat through a#[cfg(test)]prelude until they move into the components they test. (PR #239) -
§DA-engine-renders-nothing, §FS-check.4.7, §FS-check.4.8, §FS-check.4.10, §FS-workspace.6.1, §FS-lsp.1.1, §FS-lsp.4, §FS-distribution.3.1: the four run-level
[workspace]warnings are diagnostics the engine returns, not lines it prints. An absorbed scan (§FS-check.4.7), a block no enclosing workspace lists (§FS-check.4.8), an opted-out block whose tree nobody reads (§FS-check.4.10) and an ancestor claim that cannot be answered (§FS-workspace.6.1) were written to stderr from inside the workspace pass, seven components below any frontend. Each now travels as aDiagnosticin the run's warning channel, carried on whatever the walking command returns and rendered by whichever frontend asked — the channel §FS-check.2.2's scope cautions already used. For agrunduser nothing moves: the same text, on the same stream, in the same position, in §FS-check.2.1.1's CLI-level shape under--format jsontoo, with §FS-check.4.8's JSON object keeping itspath,lineandsitesnulls, the samesuccesssuppression and the same exit codes — all 604 e2e goldens are byte-identical, stderr included. For an editor it is a reader it never had:grund-lsppublishes all four for the first time, each on thegrund.tomlit anchors at — the block'smembersline, its[workspace]line, itsinclude_rootline, and for the undecidable claim the config with no line, since the line is what could not be read — carried as the finding's own location so the server never parses a message for one. §FS-lsp.4's sweep holds them against the same case's stderr, so neither surface may carry one the other does not. For an embedder:CheckOutputtradesunread_opted_out_blocks: usizeforwarnings: Vec<Finding>, andListOutput,RefsOutput,CoverOutput,CoverTextOutput,FmtOutput,ListSizeOutputandInitOutputeach gain the same field, withLspSnapshotgainingrun_warnings— additive breaks for exhaustive struct literals and exhaustive destructuring. The four printers leavecompat/, which no component below it reads any more:tests/integration/test_dependency_direction.py's ledger of reads against §AR-system.4 is empty, and the mechanism stays so a new one has to be recorded or not made. (PR #244) -
§DA-engine-renders-nothing, §FS-check.4.7, §FS-check.4.8, §FS-check.4.10, §FS-workspace.6.1, §FS-lsp.1.1, §FS-integrations.1, §FS-distribution.3.1: retire the renderer inside the engine. The four
[workspace]warningscompat/still prints on the live path travel as diagnostics in the run's warning channel, anchored at thegrund.tomlline each message already names and rendered by every frontend — so the LSP publishes them on that line and no CLI byte, stream, JSON shape or exit code moves;integrationstakes its argument parsing and its printing togrund-cliwhile the engine keeps detection, artifacts and the managed writes as data; andgrund_core::main_entry(), deprecated since 0.4.1 without ever naming a release, is named in 0.14.0 as removed in 0.15.0, which is whencompat/, thecommand_*adapters and the two frontend-parity tests go with it. §FS-distribution.4.2 gains theis removed in <release>clause that promise is written in. Specification only: nothing is implemented in this release. (PR #240) -
§FS-check.2.1, §FS-errors.4: make every default-text
grund checkfinding's channel explicit and group errors before warnings before opt-in suggestions, keeping the jump-friendly location prefix and every full diagnostic. This intentionally changes exact text output; migrate byte-sensitive consumers to--format=json, whose bytes, shape, global location order, selectors, and verdict behavior are unchanged. Closes issue #232. (PR #234) -
The repository moved to the
agent-groundsGitHub organization, along with
ephor,fissileandrhei, and every reference now names it. That includes
the twoAGENTS.mdscaffold templates and the citation-directions URL baked
intotemplates/citation_directions.rs, which is what puts the link into an adopting
repository's generated block; the twenty-eight end-to-end goldens that capture
whatinitwrites were regenerated rather than hand-edited. Past changelog
entries were repointed too: a transferred repository's URL redirects but an
issue URL does not, so leaving them would have left fifty dead links behind
thelycheegate. The crate name on crates.io is unchanged. An adopting
repository picks up the new link by runninggrund initagain. (PR #230)
Deprecated
- §FS-distribution.3.1, §DA-engine-renders-nothing:
grund_core::main_entry()is removed in 0.15.0. Deprecated since 0.4.1 without ever naming a release, its note now carries the clause §FS-distribution.4.2 closes for a pending removal, and 0.15.0 takes the symbol together withcrates/grund-core/src/compat/, thecommand_*adapters behind it and both frontend-parity tests. An embedder migrates by replacing one call: thegrundCLI package for a process entry point, orgrund_core::{check, show, scan}for embedding. (PR #244)
Fixed
- §FS-check.3.24, §FS-fmt.2.4, §FS-lsp.1.3: recognize persisted marker-plus-numeric local section paths instead of silently dropping them. Uniquely owned paths now feed checks, references, coverage, grounding, citation directions, and editor navigation while retaining a canonical-form error; missing sections get an independent error, and ownerless or unsupported forms are diagnosed without a guessed target.
grund fmt --writeexpands safe owned sites, while protected and unresolved sites remain for manual review. This intentionally makes previously silent local forms fail until migrated. Closes issue #259. (PR #262) - §FS-show.2.5, §FS-show.3.2.1: preserve complete cross-reference wrappers exactly as authored inside Markdown fenced code blocks in
showtext and decoded JSON bodies, while continuing to flatten wrappers in ordinary prose and leaving Markdown output and non-Markdown bodies unchanged. Closes issue #253. (PR #258) - §FS-check.3.17:
grund checknow treats a bare citation in an external file-symlink index as a missing entry instead of recommendinggrund fmt --write, which refuses to rewrite that target. Existing links in the readable external index still satisfy the entry obligation, while bare citations in ordinary indexes and in-root file symlinks remain mechanically repairable. (PR #257) - §DF-fmt-one-model.2.5, §DF-fmt-one-model.3: distinguish the decision record's historical flat-
include!layout from the current component module while preserving its nested-module privacy rationale and completeness contract. Closes issue #246. (PR #261) Auto bump's closing step printed$next, the same variableRelease minor
got wrong: the step reads the released version intoreleasedand derives
devfrom it, soset -uaborted the run after the patch release had already
been published. The weekly bump would have reported failure every Monday while
succeeding. (PR #237)- CI gives
lycheeaGITHUB_TOKEN, so its three-thousand-odd link checks are
authenticated rather than sharing an unauthenticated per-IP budget with every
other job on the runner. Two of this repository's own documents were coming
back503on most runs and failing the whole ubuntu job, reported as
"Rejected status code", which reads like a dead link rather than a throttle.
Closes issue #236. (PR #235) - The
Release minorworkflow's closing step printed$next, a variable that
step never sets — it reads the released version intoreleasedand derives
devfrom it — soset -uaborted the run after the release had already
succeeded: version commit pushed, tag created,release.ymldispatched,
mainadvanced.fissilecarries the identical line and hit exactly that on
its v0.10.0, which reported failure while publishing correctly. The message
now names what the step did and the version the previous step dispatched for.
(PR #235) - §FS-init.2.2: keep the
grund initno---docsscaffold advice but omit its “nothing to scan” suffix when the effective configured scanner can already read a file. Closes issue #231. (PR #233) - §FS-integrations.3.1, §FS-integrations.4.3: correct clickable-citations guidance for resolver PATH failures, configuration keys, per-agent link gates, and write-report annotations. (PR #228)
- §REQ-readme.2, §FS-init.2.2: refresh the README's captured
grundoutput and correct theinitnext-step guidance to nametests/. (PR #228) - §FS-show.2.1.2, §FS-check.3.23: keep every section coordinate inside its declaration body across queries, checking, values, completion, list, refs, and LSP navigation, and report a numeric or enabled named heading left beyond that body as
section-outside-declaration. Closes issue #225. (PR #226) - §FS-check.3.8, §FS-errors.3: clarify the narrowed-run scope-only unknown-alias diagnostic in 0.13.2 by retaining its legacy bytes as a contiguous prefix and appending that the named subtree includes the project and its descendants, plus notice that the legacy wording is removed in 0.14.0. Closes issue #216. (PR #220)
- §FS-config.3.2, §FS-check.4.6: retain exact persisted off-grammar declarations and their marked citations across queries, checking, formatting, completion, cover, workspaces, and LSP navigation while warning that the mismatch becomes an error in 0.15.0. Fixes issue #54. (PR #210)
- §FS-examples.5.1, §AR-workspace.9: keep the synthetic e2e verdict probe in comparison mode when a contributor runs the suite with
UPDATE_EXPECTED, so its deliberately wrong scratch goldens still expose and name every mismatched case and surface. (PR #212)
Changed
- §FS-check.4.14, §FS-init.2.3.4.5: Schema: warn on unmarked ATX headings inside scanned Markdown declaration bodies, with deterministic unused-coordinate guidance and a grund 0.15.0 error deadline; migrate headings manually and refresh managed agent guidance from v9 to v10 with
grund init. Closes issue #132. (PR #227) - §REQ-backwards-compatibility.5, §DF-cover-workspace-scope.4: add a bounded compatibility route for correcting a verdict that another existing hard requirement already forbade, with an accepted conflict proof, a named release, and located actionable findings; record the
grund coverworkspace correction as its worked case. Closes issue #116. (PR #222) - §FS-refs.4, §FS-errors.5: give
grund refsresolver-rejected IDs the same failed-query exit asshowfrom 0.15.0; 0.14.0 preserves exit2and existing diagnostics while warning scripts about the transition. (PR #223) - §FS-init.2.3: Schema: bump the managed agent-instructions block from v8 to v9 so the cheap-grounding ladder teaches
grund list --size=words --top 10; migrate an existing block withgrund init. (PR #224) - §FS-config.3.5.1, §DF-symlink-scan.2.6: bound outward directory links at the canonical project root, which may move verdicts when a project depended on declarations found only through such a link; external file links remain followed. Affected projects can move the target under the project root, check it as its own project, or replace the symlinked root with an intentional non-symlink parent-relative
[scan] include. (PR #211)
Deprecated
- §FS-refs.4, §FS-errors.5: preserve
grund refsresolver-rejected IDs at exit2for the 0.14.0 warning phase and emit exactlywarning: `grund refs` invalid IDs and ambiguous number-only shorthands currently exit 2; they will exit 1 (failed query) in grund 0.15.0. (PR #223)
Added
- §FS-config.3.1, §FS-check.3.13, §FS-fmt.2.4: add the opt-in per-project
[reference] shorthand = "accepted"policy so a uniquely resolving number-only marker citation may persist alongside its full ID without a check finding or formatter rewrite; canonical remains the default, trigger input still expands, and target-project policy governs workspace citations. Closes issue #107. (PR #219) - §FS-values.2.4, §FS-values.3.1: assign the previously inert exact
<!-- grund:value -->suffix to a strict one-level value at any numeric section in Markdown or a supported source doc-comment, with no configuration migration, dotted bindings, existing section identity and navigation, and optionallistroot metadata. Closes issue #207. (PR #221) - §FS-list.3.4, §FS-check.4.13: add deterministic
lines,words, andbyteslead/full measurements withgrund list --size, largest-lead selection with--top, and an absent-by-defaultlead_size_warningrepository policy that reports fixed-severity warnings without changing a clean exit. Closes issue #122. (PR #224) - §FS-check.1, §FS-errors.3: add repeatable exact-code
grund check --only/--ignorequeries while preserving the complete default check and0/1/2verdict;agents-initmessages enter their two-release maintenance-wording migration so readers know citation checks still ran. Closes issue #49. (PR #213) - §FS-check.3.8: suggest known deeper project alias paths when an unknown alias is their proper segment prefix, before lower-confidence candidates. Closes issue #73. (PR #214)
- §FS-show.2.6, §FS-output-shapes.4.1: add JSON-only
grund show --batchfor ordered NDJSON queries and--batch --allfor exhaustive declaration-and-section reads, both reusing one workspace scan while preserving per-coordinate results and failures. (PR #215) - §FS-lsp.2.4: ship the LSP4IJ custom template inside
grund-lspand addgrund-lsp integrationscommands to list, preview, and conflict-safely materialize it with the current project's effective file mappings and the installed server path. (PR #218) - §FS-config.3.4.10, §FS-check.4.12, §FS-fetch: add per-kind ID formats, fixed
must/shouldsnapshot resolution, and explicitgrund fetch <ID>materialization into committed file or folder homes. Fetch integrations run directly only on request; every check and query stays offline.KindConfiggains publicformat,resolve, andfetchfields, so downstream exhaustive struct literals must initialize them;grund_config_versionremains 1 because all configuration keys are optional and absent keys retain prior behavior. Closes issue #93. (PR #208)
Fixed
- §FS-check.3.8.1: let a narrowed
grund checkoffer loaded alias candidates for a written path that strictly extends its own scope segment by segment. Shorter, equal, outside-prefix, and merely lexical-prefix paths retain the existing scope-only diagnostic. (PR #217)