Repository navigation
Releases
fissile 0.11.3
fissile 0.11.2
fissile 0.11.1
fissile 0.11.0
Added
clean.shat the repository root gives back the disk a checkout's builds
took: it runscargo clean, then removes every directory holding a valid
CACHEDIR.TAG, such as a plan's scratch build underpanta/. It is the clean
verbephor cleanruns at the root of a branch checkout no live run holds.
(PR #82)- §FS-004-check-audit.2.2: an
auditwhose scan selects no files at all says
so in one note on stderr, naming the directory it scanned and, inside a git
repository, the repository root. A run from a directory the enclosing
repository ignores no longer passes as a silentok; stdout and the exit
status are unchanged. (PR #84) - §FS-004-check-audit.1.4: a staged soft finding's text detail separates the
prior committed over-soft edits from the staged one (8 prior committed over-soft edits + 1 staged edit) and says when the prior edits had already
reached the promotion limit; with incomplete history it reportsat least N.
The JSON fields are unchanged. (PR #83)
Changed
- §FS-003-exceptions.4: the refusal when two entries of one registry match the
same overflow names thepathof the first two colliding entries, in
registry order, and says to remove or narrow the overlap, instead of naming
only the registry and the measured file. Library break, forcing 0.11.0:
ExceptionError::MultipleMatchesgains apatterns: Box<[String; 2]>field,
so code that constructs the variant or destructures it without..stops
compiling, and a caller comparing the exact message text must update.
(PR #86)
Fixed
- §FS-004-check-audit.5: every spelling of the repository root passed to
measureorcheck(.,./,src/.., the absolute path) is reported as
the directory., a file-level failure that still lets the other paths be
measured, instead of an invalid argument or an empty path name.
§FS-003-exceptions.3:exception add,retuneandremoverefuse an exact
path that names the repository root and leave the registry untouched.
(PR #85)
fissile 0.10.1
Fixed
- §FS-004-check-audit.1.2, §FS-004-check-audit.1.4, §FS-002-init.6: staged
failures describe thefissile check --stagedverdict instead of claiming an
unknown commit hook blocked a commit, explain that filename-passing snapshot
hooks keep soft findings advisory, and document how hook managers enforce
bounded soft-edit promotion. (PR #75)
fissile 0.10.0
Changed
- The links to the sibling tools now name
agent-grounds, whichgrundand
rheijoined after this repository's own move: theAGENTS.mdandREADME.md
pointers togrund, and the config-home decision's reference torhei's
matching issue. Changelog entries keep the old name, because they record where
the work happened at the time. (PR #71)
Changed
- The repository moved from
vjovanov/fissiletoagent-grounds/fissile,
alongside the workspace it is maintained in. Every live link now names the new
owner: the crate'srepositoryandhomepage, the schema$ids, the README's
install and release links, and the managedAGENTS.mdblock thatfissile initwrites into an adopting repository. The crate name on crates.io is
unchanged, socargo install fissileand every pinned version keep working,
and GitHub redirects the old URLs. Changelog entries keep the old name,
because they record where the work happened at the time. Regenerate the
managed block withfissile initto pick up the new link. (PR #70)
Added
-
Debt direction and age in
audit:fissile audit --history <from>..<to>
resolves an ancestral Git range and appends a final history section, in text
and in JSON, that says which way the exception debt moved rather than only
where it stands (§FS-004-check-audit.2). It reports exceptions added and
retired, ceilings raised and lowered, the age of every deferred entry, and the
age of each continuously unexceptioned soft finding, evaluating every
first-parent state with that revision's own config, registries, rules and
measurements. Identity follows §DF-005-exception-identity, so an
evidence-backed file or directory rename preserves an entry and its age
instead of reading as a retirement plus an addition, and age resets only after
a real absence. A malformed, non-ancestral, shallow or ambiguous history is
refused outright rather than reported in part.checkandauditwithout the
option keep their existing execution paths and output. (PR #69)Library callers are affected at source:
AuditOptionsgains ahistory
field and the audit section enum gains a variant, so exhaustive matches and
struct literals need updating. At 0.x this forces the minor number.
Changed
- §FS-001-config.3, §FS-004-check-audit.1.4: soft findings now demand a
current-commit split or recorded-debt decision, andcheck --stagedblocks a
history-proven continuous over-soft run at the rule'ssoft_edit_limit, while
incomplete history stays advisory.fissile limitsreports the effective
allowance for every soft rule. (PR #68)
fissile 0.9.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, on the token form, the cost. (PR #65)
fissile 0.9.0
Added
- §FS-004-check-audit.2:
fissile audit --only <section>[,<section>]prints the
named sections of the text report and nothing else, so tuning config or
pruning the registry stops paying for a findings block the reader is not
looking at. The names are the seven top-level keys of
schema/audit.schema.json—findings,silenced,exceptions,top,
stale,loose,coverage— and they render in that order whatever order
they were named in. Naming a section is the request to compute it, so--only coverageneeds no--rule-coverage;--only topstill needs--top <N>,
which carries a count no default could stand in for. Selection reaches the
screen and nothing else: exit status is computed from the whole run, so a
standing hard overflow still exits non-zero under--only coverage. An
unknown or empty name is a usage error naming the valid set, and--only
with--format jsonis one too —findings,silencedandexceptionsare
requiredin the schema, so a filtered object would not validate.audit
with no--onlyprints what it printed before, and the JSON surface is
unchanged. Resolves #15. (PR #63) - §GOAL-004-token-thrift.1, §FS-006-cli.2:
fissile audit --helpnames the JSON
route,fissile audit --format json --rule-coverage | jq .coverage, and says
that--format jsonis the agent surface. The goals document has designated
it one since §GOAL-004-token-thrift was written; the screen's two examples
were both text and said so nowhere. (PR #63)
Changed
-
§FS-004-check-audit.2:
fissile::audit::AuditOptionsgains a public
only: Option<Vec<Section>>field, andfissile::auditgains the public
Sectionenum and theSECTIONSarray that fixes its canonical order. A
library caller constructing the options with a struct literal must initialize
the new field, normally withNone, which is the whole report. A 0.x source
break, so the minor number moves. (PR #63) -
§AR-001-ci.2: CI's
grund checkjob pinsgrund0.13.0, up from 0.12.3, and
the agent entrypoint's grund managed block moves from v7 to v8 to match.
0.13.0 turns an unindexed declaration into agrund checkerror instead of a
warning and stops accepting theprefixspelling of[[kinds]] kind; this
repository already satisfied both, so pinning the new release found nothing
else to fix. (PR #64)
fissile 0.8.3
Added
-
§FS-001-config.8, §FS-002-init.2: the config's home is
.agent-grounds/fissile.toml. Every command that discovers a config looks
there first and falls back to.agents/fissile.toml,fissile initwrites the
new home, and--configis unchanged..agents/is by convention where agent
instructions live, and sandboxed agent runtimes mount it read-only, so a tool
that has to maintain its own config could not write the one file it owns
(§DF-012-config-home). A repository that already has a config at the old path
keeps it byte-for-byte and gets no second one written at the new home, because
a generated default there would take precedence over the project's own rules on
the very next run. Sibling issues carry the same move ingrund,rheiand
ephor;.agents/skillsis out of scope everywhere. Resolves #61. (PR #62) -
§FS-001-config.3.4, §FS-010-limits.3, §FS-010-limits.4: a
[[rules]]entry
may declareexcludeglobs that remove a path from that rule before overlap
resolution while leaving every other unit and rule eligible. This is distinct
from[scan].exclude, which removes a path from the whole scan, and from an
exception, which accepts an overflow of a rule that still applies.limits
prints non-empty exclusions afterincludein text and JSON and omits empty
lists, so the addition stays compatible with existing version-1 configs and
output. Generated exhaustive configs spell the empty default. (PR #59) -
§FS-004-check-audit.1: each file detail of a
checkorauditfinding names
the ceiling afissile exception addwith no--maxwould record for that
file —(budget 550; an exception here would accept 700)for a line rule, a
parenthesis of its own where the unit carries no budget clause — and the JSON
record carries the same number asexception_would_accept. The measurement
was the only number on screen, so a caller reaching for an exception copied it
into--max, which is written exactly as stated
(§DF-010-stated-ceilings-are-exact.1); the entry then had no headroom and the
next unrelated edit failed the gate. The number is the one the command already
computes (§DF-006-quantized-ceilings.1), said at the moment the caller chooses
between the two forms. It is withheld where that plain call would be refused —
a soft ceiling reaching the rule's hard limit for a file still under it — and
a finding does not read the exception registries, so it withholds from the
deferred-hard-twin caseaddwould accept. Resolves #49. (PR #58) -
§FS-010-limits: new
fissile limitsprints every rule the tree configures —
id, include patterns, unit, and the soft and hard limits each declares — in
config declaration order, with--config,--format text|jsonand
--no-colorasaudittakes them. Nothing printed a repository's rule
inventory before:checkandauditreport findings, so a passing tree said
nothing, andmeasureanswers only for paths a caller already named, so the
numbers were copied into prose that nothing checks. The JSON form is an object
keyedrulesand carries each rule'spriority, message ids and line-counting
policy, published asschema/limits.schema.json, so a documented limit can be
generated or verified rather than maintained by hand. It loads the config and
not the exception registries, so it answers with exit0in a tree whose
registriescheckandauditrefuse. Resolves #46. (PR #56) -
§FS-003-exceptions.2.3, §FS-005-exception-add.1.1: a soft entry may declare
shadows = "hard"and inherit itsreasonanduntilfrom the hard entry at
the same address, andfissile exception add --shadows-hardwrites one. A
deferred hard entry leaves the soft finding standing (§FS-003-exceptions.3),
so every deferred hard acceptance needs a soft twin, and that twin had to
restate an argument and a retirement condition it does not own. The pairing is
now checked at load: exactly one hard entry must answer the twin's address, so
deleting the original fails the load until the twin goes too.shadowsis
forbidden alongsidereasonoruntiland in the hard registry, and
--shadows-hardrefuses--severity hard, the other three flags, and a
missing hard entry.max_acceptedstays required and local, and the pair may
differ. No registry version moves; existing registries are unaffected.
Resolves #16. (PR #52) -
§FS-009-exception-remove: new
fissile exception remove <path> --severity soft|hard --rule <id>deletes one exception entry, addressing it exactly as
exception retunedoes and supporting--config,--matchand--dry-run.
It refuses to delete an entry that is still silencing a finding, and it is the
one command that loads a registry the rule check rejects — so an entry whose
ceiling a raised limit left below that limit, which abortedcheck,audit,
measureand the hook before they measured anything, is now removable without
hand-editing TOML.retune's min-limit refusal,check's stale-entry
guidance andaudit's "silences nothing" line all name the new command.
(PR #53) -
§FS-003-exceptions.7, §FS-004-check-audit.2:
fissile audit --stale-exceptionsnow reports an exact-path entry whose ceiling sits exactly
on the file it accepts, in theloose ceilings:section, with its advice
prefixedno headroom. Such an entry silences the finding today and stops on
the next unrelated commit, and nothing named it: the one-step test that
excuses a freshly quantized ceiling excused a spent one too. The advice is the
first of four cases that applies, and each is a call the named command
performs — removal where the file no longer crosses the limit; the stated form
and a range where the step would land a soft ceiling on the hard limit, or the
hard registry where that range is empty; the stated form carrying the step's
next multiple where the measurement is already one; and otherwiseretune to
that multiple. EverylooseJSON record gainsno_headroom,0or1, and
stated_rangemay now carryminalone, somax_excludedleaves its
requiredlist inschema/audit.schema.json. Loose entries, the section
heading, and the exit codes are unchanged. Resolves #48. (PR #57)
Changed
-
§FS-001-config.8.1:
fissile::cli::Loadedgains a publicsource: ConfigSourcefield, andaudit,measure,limitsand the three
exceptioncommandRuntypes each gain a publicnotes: Vec<String>—
what discovery owes stderr, carried out to the surface that owns it.
fissile::init::Reportgainsconfig: PathBuf, the config the run wrote or
found, anddeprecation: Option<&'static str>. A library caller constructing
any of these with a struct literal must initialize the new field.
Config::load(root, explicit)keeps its signature; the search order is
reported through the additiveConfig::discover. A 0.x source break, so the
minor number moves. (PR #62) -
§FS-001-config.3.4:
fissile::config::RuleSpecgains a public
exclude: Vec<String>field. A library caller constructing the public struct
directly must initialize it, normally withVec::new(); parsed configs
default it automatically. A 0.x source break, so the minor number moves.
(PR #59) -
§FS-005-exception-add.1.1:
fissile::exception::AddOptionsreplaces its public
kind,reason, anduntilfields with onerationale: Rationale, so a
shadowing call is a value the type admits rather than three fields left blank.
A library caller's struct literal stops compiling. Wrap the three it used to
pass inRationale::Stated { kind, reason, until }, or write
Rationale::ShadowsHard. A 0.x source break, so the minor number moves.
(PR #52) -
§FS-003-exceptions.4:
fissile::exceptions::ExceptionErrorgains four variants
for theshadowsrefusals, andEmptyReason/EmptyUntilgain aseverity
field — the soft-registry wording offersshadows = "hard"as the way out and
the hard-registry wording cannot. The enum is not#[non_exhaustive], so an
exhaustive externalmatchon it stops compiling: add the new arms, or a
wildcard. Whether the enum should become#[non_exhaustive]is left open
rather than settled here. Same minor bump. (PR #52) -
§FS-003-exceptions.4: an entry that states no
reasonor nountilnow reads
states no reasonrather thanhas an empty reason. Both fields became
optional in the schema so a shadowing entry can omit them, which makes an
absent field and a blank one one defect; the old wording was true of only one
of them. (PR #52) -
§FS-010-limits.4:
fissile::json::Jsongains aBoolvariant, for the two
line-counting flagslimits --format jsonemits. The enum is not
#[non_exhaustive], so an exhaustive externalmatchon it stops compiling:
add the new arm, or a wildcard. Same minor bump. (PR #56) -
§AR-001-ci: every declaration is listed in its folder's index.
grund check
warned that thirteen declarations were absent from their index README and that
the warning becomes an error in grund 0.13.0; the two decision folders that had
no index at all now have one. (PR #51) -
§AR-001-ci.8.2: after a release, main opens the next patch as
X.Y.Z-dev
instead of keeping the version it just published. A build from main previously
reported the tag it was already ahead of, so a merged-but-uninstalled fix was
indistinguishable from an installed one. (PR #50)
Deprecated
- §FS-001-config.8.2:
.agents/fissile.tomlis deprecated as the config path.
It is still discovered, one step behind.agent-grounds/fissile.toml, and it
changes no exit code — but every run that reads it prints one warning line on
stderr naming the move, and a run that finds a config at both paths says which
one it ignored. Nothing breaks on upgrade; a repository migrates by moving the
file. (PR #62)
Fixed
- §FS-009-exception-remove.2: soft ...
fissile 0.8.2
Changed
- Testing: adopted grund's two non-citable test homes. The e2e corpus moved
frome2e/casestotests/e2e/cases(harness attests/e2e/main.rs), the
cross-part proofs that lived beside it intests/moved into
tests/integration/, and everygrund.toml[[kinds]]block's deprecated
prefixkey is nowkind. Resolves #39. (PR #40)