Repository navigation
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
exception removecan delete an orphaned
shadows = "hard"entry after its hard twin is removed, while ordinary
registry loading stays strict and continues to reject orphan shadows.
Resolves #55. (PR #60) - §FS-004-check-audit.2:
auditnow reports exception entry totals alongside
distinct path-expression totals, so soft/hard twins and repeated globs are
not presented as additional files. (PR #47) - §FS-005-exception-add.2:
exception add --maxnow names the step's next
multiple in its normal and its--dry-runresult, asexception retune --max
already did — the round number the measured form would have written, named and
never applied. A ceiling stated at the day's measurement has no headroom, and
the silence let four such ceilings ship before unrelated growth of 6 and 38
lines in two other files failed CI. The suggestion is withheld exactly where
the command would refuse the number, so it never offers a ceiling the next
call would reject. Registry contents are unchanged. Resolves #45. (PR #54)