catnip 0.3.0 — the tannery sizes its own hunt
Added
- An editor stands between assembly and the published prowl.md. Analyst
packages accumulate into a staged assembly; each recorded package hands
the assembly to an editor that merges same-phenomenon blocks, orders the
document to argue account-wide first, and cuts restatements. Its publish
is the only writer ofprowl.mdand is guarded twice: a document whose
tier counts differ from its own stamped counts is refused (the editor
arranges, it does not drop or invent findings), and one whose stamp
trails the cycle's record is skipped as superseded — a fresher edit is
already queued behind it. - Self-graded analysis depth. A meta-analyst reads the deterministic
report every third day, judges how much investigation the cycle deserves,
and seeds N analyst briefs — one per distinct phenomenon, N being its
call. Each brief runs as its own analyst; packages fan back in through the
writer, whose per-cycle files accumulate and whose publish dedupes, so
collation needs no join queue and a failed angle costs only itself. The
dispatch and recording ends are both single deterministic calls that parse
blocks themselves — no model ever counts its own fan-out.
Changed
-
The served chain is event-driven; only the fetch and the analysis are on
cron. 0.2.1 scheduled the report at 06:52 and sized the gap so a
41-minute collect would probably have finished — clock arithmetic standing
in for a dependency. The report now runs from a curing fed by collect's
output, and the prowl writer from a curing fed by the analysis, so a slow
fetch delays the report instead of losing it. Routing is one fact per
stage: the producer's intake URL and the consuming curing name the same
queue. Theleather ingesttargets remain for one-shot testing and agent
validation; the served chain never uses them. -
The prowl analysis is recorded by one deterministic call. The 0.2.1
writer made one tool call per FINDING/REFUTED block, which put a
data-dependent number of calls on the model: three calls against four
findings drops one silently — no error, just a shorter report.
catnip-prowl-recordreplacescatnip_prowl_finding,catnip_prowl_refuted
andcatnip_prowl_publish: it takes the whole analysis, parses the blocks
itself, files them all or fails naming the block it refused, and publishes.
Validation is unchanged — tier enum, evidence opening with the catnip tool
the claim rests on, publish refusing an empty cycle. -
Every measured value in a state file is now carried by an extract rule.
Coverage, repo count, schema version, the report's meta fields and the
recorder's counts reach their recording turns as{{...}}verbatim instead
of as a model's transcription — 0.2.1 wrote a Python repr of the coverage
ranges where the store's own JSON belonged. The model writes only judgment:
action,reason, a finding's prose. -
catnip-report's verdict rules moved into the turn that owns the
writer. The agent frontmatter is the system prompt and is resent every
turn, so rules aboutcatnip-report-writefired on turns that could not
reach the tool. Output rules now live with the tools that produce them. -
tannery/README.mdrewritten for someone deciding whether to run this,
in the shape of leather's example READMEs.
Fixed
- The prowl writer dead-lettered every scheduled cycle. The 0.2.1
lifecycle routed the analysis withoutput: type: queue, which builds a
queue item with no hide behind it; the curing loads the item's hide
unconditionally and failed each attempt. The route is nowtype: httpto
leather's/intake, which stores the hide first and enqueues against it.
This tannery had never successfully recorded a prowl analysis until now.