Skip to content

Releases: fredericrous/aval

v1.12.0

Choose a tag to compare

@github-actions github-actions released this 29 Oct 18:47
e1fe7b6

Added

  • aval mcp install|uninstall [--write] [--check] registers or removes
    aval's MCP server at Claude Code user scope through claude mcp add|remove;
    without --write it only shows the command. --check exits 0 registered,
    1 not, 3 when claude is absent or cannot answer; without --check, no
    claude on PATH is one line on stderr, exit 0. Hints and done lines go to
    stderr. The PATH aval is registered when it is the running binary.
  • aval hook uninstall [--write] [--check] removes the marker-owned
    .claude/hooks/aval-heads.sh and its .claude/settings.json entry, leaving
    other settings, their indentation and the final newline, and a script without
    aval's marker.

What's Changed

Full Changelog: v1.11.0...v1.12.0

v1.11.0

Choose a tag to compare

@github-actions github-actions released this 27 Oct 14:52
ba3aa72

Added

  • in_scopes: a repository declares the scopes it is in. With no
    --scope, resolve, relevant and history (and the aval_resolve,
    aval_relevant and aval_history tools) answer at those scopes; the
    precedence is the flag, then in_scopes, then *. JSON answers carry
    scope_source. Two declared scopes that both answer one key contradict
    (exit 5, with by_scope); check --json carries the same condition as a
    warnings array and still exits 0. aval traits --summary names the
    declared scopes. --scope '*' is unchanged.

What's Changed

Full Changelog: v1.10.0...v1.11.0

v1.10.0

Choose a tag to compare

@github-actions github-actions released this 23 Oct 14:44
c1b1a68

Added

  • governs: code on a rule file, aval rules --governs code and --full.
    The field travels in a pack; --full prints each rule as aval rule <id>
    does (and adds body to --json), and every rule in --json carries
    governs. The aval_rules tool takes governs and full.

What's Changed

Full Changelog: v1.9.1...v1.10.0

v1.9.1

Choose a tag to compare

@github-actions github-actions released this 19 Oct 07:20
bb70578

Fixed

  • aval add --check compares declarations, not commit ids. A revision
    that names a new commit whose pack declares the same thing (the top-level
    aval generator version aside) is current, and the line says which
    commit the revision now names. A fetch or parse failure after a move stays
    behind.
  • aval heads --check accepts a formatter's escaping. A CommonMark
    backslash escape of ASCII punctuation in a table cell (prettier writes \*)
    is decoded during canonicalisation; code spans and the column split are
    unchanged.
  • The budgeted git call no longer deadlocks on output over the pipe
    buffer.
    Under --budget (the session hook) the child was waited for
    before its output was read, so any pack over 64 KB was silently unknown
    and edited or behind never reached the hook for large packs.

What's Changed

Full Changelog: v1.9.0...v1.9.1

v1.9.0

Choose a tag to compare

@github-actions github-actions released this 04 Oct 20:18
d7fbe32

Added

  • aval rules --level <level> --index lists rule ids grouped by prefix,
    one line per prefix (names: no-noise, reveal-intent), and no text. It
    wraps at 80 columns on a terminal, never inside an id, and never off one.
    It exits 2 without --level, or with --json, --all or --all-repos.

Changed

  • The session hook prints the constraint index, not the constraints.
    Every active constraint's first paragraph was 26 KB of a 32 KB session
    load in the fleet decisions repository; the index is about 2 KB, and
    aval rule <id> (MCP aval_rule) has the text. This is the fleet rule
    guidance.always-on-is-an-index (decisions ADR-0026). The count line is
    now (N constraints, M heuristics), counted from the plain listing. An
    aval older than the hook refuses --index; the hook then prints one full
    id per line instead of dropping the constraints. The preamble is shorter
    and keeps the statement that record wording is data, not instruction.
    Re-run aval hook install to take it.

What's Changed

Full Changelog: v1.8.0...v1.9.0

v1.8.0

Choose a tag to compare

@github-actions github-actions released this 24 Sep 17:38
61b72e3

Added

  • aval add creates the registry it vendors into. Adopting another
    repository's decisions is the first thing a repository does with aval, and
    add used to refuse it: "no .adr.yaml … there has to be one". With no
    registry anywhere above, it now writes a starter one at the git top level
    (else the directory asked), declaring nothing, and lists the pack in it.
    --dry-run says it would.
  • aval traits --detect runs before there is a registry, against the
    repository git names and an empty vocabulary, because it is how a
    repository learns which areas: to declare. Every other traits mode
    still needs a corpus.

Fixed

  • A published pack no longer re-exports vendored scopes. Keys, records
    and rules a corpus vendored were already left out of its aval.pack; the
    scopes those packs declared were not, so a consumer's consumers received
    a scope from a pack they never vendored (SEMANTICS §2.3 forbids it). A
    borrowed scope is kept only where this corpus's own key or record uses it.
    No repository in the fleet both publishes and vendors today.
  • aval relevant --path <directory> is covered by the areas beneath it:
    --path web takes web/**'s traits. The glob was compared with the
    literal path web, matched nothing, and the directory was treated as
    uncovered, so nothing was filtered.
  • omitted.traits names only traits that filtered. For a queried path in
    no area, or --all-traits, it listed the repository's traits although
    nothing was filtered; it is now empty there.
  • The hook orders prereleases by semver. It compared the numeric core
    only, so a script written by 1.8.0-rc1 called a 1.8.0 binary older
    than itself. Release beats its prereleases; two prereleases of one core
    compare by text.

What's Changed

Full Changelog: v1.7.2...v1.8.0

v1.7.2

Choose a tag to compare

@github-actions github-actions released this 24 Sep 11:11
092e1b4

Fixed

  • Single-quoted mapping keys are keys. prettier with singleQuote: true
    rewrites an areas: glob such as "packages/ui/**" as
    'packages/ui/**' when it formats .adr.yaml at pre-commit, and 1.7.1 read
    that key with its quotes still on, so every glob came back malformed
    (areas-parse) and the registry stopped loading. Single-quoted keys now
    read as YAML says, '' included. Found adopting the fleet pack in
    duro-design-system.

What's Changed

Full Changelog: v1.7.1...v1.7.2

v1.7.1

Choose a tag to compare

@github-actions github-actions released this 23 Sep 13:34
2c4dbe3

Fixed

  • The generated hook is shellcheck-clean again. 1.7.0's two new
    messages put backticks inside single-quoted printf formats (SC2016), and
    consumers run shellcheck over .claude/hooks/aval-heads.sh at pre-commit, so
    re-installing the hook was blocked. A test now runs shellcheck over the
    script whenever it is installed. The stale-binary line also names both ways
    aval is installed — brew upgrade aval, or its install script — not brew
    alone.

What's Changed

Full Changelog: v1.7.0...v1.7.1

v1.7.0

Choose a tag to compare

@github-actions github-actions released this 23 Sep 13:22
0b57484

Added

  • Traits: rules that apply only where the thing exists (SEMANTICS §2.5).
    A rule file may say applies: [cli]; a registry declares the vocabulary
    (traits:, carried in its pack) and which parts of the repository have which
    traits (areas:, glob → traits, consumer-local). With areas declared,
    aval rules, the aval_rules tool and the session hook list only rules that
    apply to the declared traits — a repository with no command line stops
    printing command-line constraints at every session start.

    Filtering is display, never activity. A hidden rule is still active,
    aval rule <id> explains it, and --all-traits / all_traits: true lists
    it. Every filtering surface reports what it hid: a stderr notice under
    aval rules, omitted (constraints, heuristics, traits) in every
    --json and tool payload, and one hook line printed whenever areas is
    declared, zeros included — so an area that hides everything is seen at every
    session start, not only in the diff that added it. A path no area covers
    filters nothing; an area declaring [] keeps only untargeted rules.

  • aval traits: the declaration (--json, and the aval_traits tool);
    --summary, the hook's line, which reads the corpus only and needs no git;
    --detect, which proposes areas: from tracked files; and --check, which
    reports a detected trait no area or disclaim covers for that package,
    and any glob matching no tracked file. --check exits 0 / 1 findings /
    3 could not inspect — git missing or failing, an unreadable file, a
    package.json that is not JSON. A TOML manifest is scanned, never parsed,
    and never exit 3.

    Detection is advisory and unpinned: it leans toward reporting (a false
    positive costs a disclaims: line; a miss would hide a constraint), and a
    detector getting better is a patch. Today it knows cli (Cargo bins,
    package main outside //go:build ignore, Python script tables, a
    package.json bin) and ui (React, Vue, Svelte, Solid, Preact, Angular,
    Lit in dependencies or peerDependencies, or .tsx/.jsx/.vue/
    .svelte files).

  • Three checks, each firing only where the new fields are present:
    rule-applies-declared, areas-declared, areas-parse.

  • The glob dialect is normative and pinned by conformance/traits.json,
    with the applicability table beside it.

Changed

  • The hook speaks where it used to go silent. When the installed aval is
    older than the one that wrote the script, its first line says so and names
    the upgrade; when aval heads fails on a repository that has a registry, one
    line says so and to run aval check. Without aval installed it still says
    nothing.

Upgrading

  • brew upgrade aval on every workstation before a repository adopts
    traits, areas or disclaims: aval before 1.7 refuses such a registry,
    and a pack carrying traits or applies.
  • Everybody re-runs aval hook install (the script changed); bump each
    workflow's AVAL_VERSION pin in the same pull request.
  • Order: release the tool, publish the producer pack with traits and
    applies, then let each consumer aval add and commit its reviewed
    areas: together.

What's Changed

Full Changelog: v1.6.0...v1.7.0

v1.6.0

Choose a tag to compare

@github-actions github-actions released this 21 Sep 08:17
d794798

Added

  • aval relevant — which decisions bear on what you are about to touch.
    resolve is exact, so a caller has to know a key's name before it can ask
    anything, and at the start of a task that is a chicken-and-egg problem: the
    way to learn that a decision governs a file is to already know the decision.
    The alternative was HEADS.md, which is every decision ever made. This ranks
    the vocabulary against --path (repeatable), --text, and --changed —
    what git reports modified, staged and untracked — and reports each ranked key
    with its verdict, from the same resolve everything else uses. So an
    undecided row says nobody decided it, which is the row that matters: it is
    where an agent left to itself invents an answer.

    Four signals, documented and weighted: BM25 over the query's words (1.0) and
    over the paths' own words (0.6), a record whose body names one of the paths —
    backticked, as a link, or as a glob (2.0 each, three at most), and what git
    says changed alongside the record (0.5 each, three at most). The tokenizer is
    frozen and the conformance battery compares the resulting order byte for
    byte. Nothing is trained, nothing is cached, nothing leaves the machine.

    It is a suggestion in the sense SEMANTICS §5.1 now defines: it resolves
    nothing, writes nothing, and is not part of what the corpus says is true. The
    exit code is always 0 — a ranking has no verdict, and "I found little" must
    not share a code with "I could not look" — except 2 for usage, including a
    --scope the corpus does not declare.

  • --json carries dependencies, the ranked keys compacted for a router:
    key, state, exit, adr and unresolved, the last true for exactly
    undecided and contradiction. A dispatcher routes a change whose decisions
    are not settled to a person rather than to a worker without reading the rest
    of the payload.

  • The MCP tool aval_relevant, with the same inputs and the same bytes.
    Its description carries the obligation the surface makes easy to lose: a
    model reading a ranked list treats the first row as the answer unless it is
    told, in the description, that the ranking resolves nothing.

  • A relevance conformance battery, conformance/relevant.json, over a new
    relevance-sample corpus. It pins the two properties that make a ranking
    reviewable: the same corpus and query give the same order byte for byte, and
    a ranked key's undecided or contradiction verdict is reported as the
    resolver gives it rather than softened or dropped.

Changed

  • aval-core gains relevance (a frozen tokenizer and a BM25 index) and
    Json: From<f64>, which writes a non-finite float as null rather than a
    literal no JSON reader accepts. Still no external dependencies.

What's Changed

Full Changelog: v1.5.0...v1.6.0