Skip to content

catnip 0.3.0 — the tannery sizes its own hunt

Choose a tag to compare

@TGPSKI TGPSKI released this 07 Aug 23:20
· 9 commits to main since this release
v0.3.0
9ca0466

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 of prowl.md and 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. The leather ingest targets 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-record replaces catnip_prowl_finding, catnip_prowl_refuted
    and catnip_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 about catnip-report-write fired on turns that could not
    reach the tool. Output rules now live with the tools that produce them.

  • tannery/README.md rewritten 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 with output: 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 now type: http to
    leather's /intake, which stores the hide first and enqueues against it.
    This tannery had never successfully recorded a prowl analysis until now.