Skip to content

grund 0.12.1

Choose a tag to compare

@github-actions github-actions released this 26 Aug 02:56
· 2418 commits to main since this release

Added

  • §FS-check.4.7: grund check warns on a heading that opens like a declaration and parses as none — # FS-login: … under the default {kind}-{number}-{slug}, the -NNN- left out. One warning per heading, at its own line, naming the token as written, the configured template, and the shape that template reads; never the corrected ID, which would be a guess at what the author meant. The exit code is unchanged and grund list is unchanged with it: a near-miss heading is still not a declaration, and this reports that rather than repairing it. Ships §RM-declaration-near-miss, whose held-in-reserve opt-out was not needed. (PR #140)

  • §AR-lsp.5 / §FS-lsp.4: the LSP/CLI parity sweep both called future hardening ships as tests/integration/lsp_cli_parity.rs. For every e2e case that is a plain check of a fixture carrying its own config, the diagnostics grund-lsp publishes on initialized are compared with the located findings grund check --format json prints for the same tree — path, line, code, severity, message — with a floor on the number of cases compared, so the sweep cannot shrink unnoticed. scripts/try-integrations.sh resolve runs headlessly beside it as tests/integration/integrations_resolve.rs (§FS-integrations.4). (PR #142)

  • tests/integration/ becomes a workspace member of its own (grund-integration-tests, never published) and holds the proofs that span more than one part: frontend isolation on the resolved dependency graph (§AR-bindings.1), CI/pre-commit parity read off the two files (§AR-ci.1), the §AR-workspace.9 test-contracts table naming only cases and test functions that exist, and the embedded assets matching skills/ and templates/ in both directions (§FS-init.5). (PR #142)

  • §REQ-deterministic-output / §AR-scanner: tests/integration/scan_determinism.rs — every report-producing command over this repository (check --full in text, JSON and with suggestions, cover, list) and check over every plain-check fixture are byte-identical at one thread and at eight, stdout, stderr and exit; the e2e determinism pass runs tiny fixtures twice under one pool and never exercised the parallel merge. §REQ-no-missed-citation.3 / §FS-config.3.5: host_language_dangling_proof.rs reads every golden's unknown reference lines back to the fixture line they name and checks that every default extension and every default comment prefix — as the binary reports them — has a dangling proof. (PR #144)

  • §AR-bindings.2, §AR-goal-measurement.1, §AR-core-module-layout.1: four more Python proofs in tests/integration/ — the engine boundary (the embedding API writes nothing, rendering inside grund-core stays in the closed set of modules the deprecated main_entry() path renders through, and the CLI and server import none of it), every goal and requirement metered, every repository path an architecture page names existing on disk, and every engine file owned by exactly one documented category. (PR #144)

Changed

  • §FS-config.3.4.4: this repository adopts the default test homes it ships. The E2E kind over e2e/cases gives way to the two non-citable kinds — e2e at tests/e2e (must cite FS, should-not cite AR) and integration at tests/integration (should cite AR) — so the corpus moves to tests/e2e/cases/*, [scan] exclude rather than the E2E case pass keeps the fixture repositories out of the host scan (§FS-config.3.5), and the per-case must cite FS obligation moves into the harness's spec.refs gate (crates/grund-cli/tests/e2e.rs), since a manifest is not a scanned file. E2E itself is untouched: the cases that declare it still exercise the case machinery of §AR-scanner.6. The generated agent block loses its E2E map row and gains the two test homes, rendered by place. (PR #139)
  • The Python tests for scripts/ move from tests/ into the tests/integration home, where require_grounding and [citations.integration] reach them, and each now opens with the point it proves. tests/fixtures/valid, which nothing has read since the architecture specs were renamed, is removed. (PR #142)

Fixed

  • §FS-check.4.6: three constructs no longer enroll an external inline declaration that the rule's own conditions already excluded. A number-only shorthand link is authoring sugar until grund fmt --write expands it, so it is an ordinary reference rather than the persisted whole ID enrollment requires (§DF-index-entry-form.2.7). A link nested inside another link's destination sits in a zone grund fmt never writes in, which the enrollment form is defined against (§FS-check.3.17) — the check reached only inline code. And where two kinds share one folder and index, only the last-configured kind could enroll: the index-to-kind lookup kept one target per index file, so an earlier kind's external entries were silently dropped as foreign-kind and its declarations reported unlisted. Each is matched to the kind its ID names now. (PR #137)
  • §FS-init.2.1: templates/grund.toml — the reference copy of the template grund init embeds — lacked the commented [citations] block the embedded copy writes, so the source tree showed a config init no longer produces. The reference copy is the embedded bytes again, and tests/integration/test_asset_sync.py keeps every template identical to its embedded copy in both directions. (PR #142)
  • §FS-integrations: scripts/try-integrations.sh resolve ended with exit 2 and no checks on a repository that declares no E2E kind — this one, since #138 — because grund list --kind E2E refuses an unknown kind and pipefail made that refusal the script's exit. An undeclared kind is an empty answer again, and the check that wanted it is skipped. (PR #142)
  • §FS-integrations: scripts/try-integrations.sh resolve ended with exit 1 and no checks when the first fixture config find reported was a bare grund.toml: the .agents/-stripping test was the last command of collect_citations, so its false status was the function's, and set -e ended the run. It is an if now. (PR #142)
  • §AR-goal-measurement.3: REQ-agents-md and REQ-readme had no meter row, though both are measured — the managed-block drift check and AGENTS.md in the scan scope; README.md in the scan scope, the --full self-check and lychee. Both are recorded, and tests/integration/test_goal_and_requirement_meters.py fails the next goal or requirement declared without a meter. (PR #144)
  • §AR-core-module-layout.1: thirteen implementation files under crates/grund-core/src/ — the workspace_* context, integrations, lsp_hover and on_type, the grammar / markdown_fence / comment_line / shorthand / inline_note_layout lexical helpers, and compat_cli — belonged to no category the page listed. It gains grammar, workspace, integrations, lsp and compat, and a table of the file-name prefixes each category owns, which tests/integration/test_module_categories.py holds against the tree. (PR #144)
  • §REQ-no-missed-citation.3 / §FS-config.3.5: the polyglot dangling case planted a marked citation in 16 of the 26 default extensions and never on a block-comment opener line, so tsx, lisp, scm, hs, lhs, lua, ada, adb, ads and the /* form had no dangling proof. The scanner reads all of them; the case now says so, and tests/integration/host_language_dangling_proof.rs fails the next default extension or comment prefix without one. (PR #144)