Skip to content

waybill 2.1.0

Choose a tag to compare

@github-actions github-actions released this 23 Aug 18:17

The launch-readiness release: the meter now sees everything Claude Code
writes, the security prose says exactly what the mechanisms do, and the
launch numbers come from the engine metering the session that built this
release. Minor per the migration policy: every
schema change is an additive optional field; no existing event re-derives
differently; no migration.

Historical totals will grow on upgrade — that is the fix working.
Subagent transcripts were previously invisible to the meter (on one
measured real session, 28.6M of 41.8M tokens went uncounted). The next
mine/meter --all discovers them as new sessions with their own
checkpoints — no blanket re-meter, no METER_LOGIC_VERSION bump, and
your existing sessions' events are untouched.

Fixed

  • Subagent transcripts metered (E-02) — the walk, the SessionEnd
    queue path, and --transcript now discover
    projects/<proj>/<session>/subagents/*.jsonl. Each meters as a
    session of its own under a composite id (<parent>:agent-<id>), with
    its own receipt, checkpoint, and conservation check; a whole-session
    pin on the parent covers its subagents; user-facing session counts
    group by root session; packs include a session whole together with
    its subagent events.
  • Three overclaiming sentences rewritten to the mechanisms (E-01) —
    the pack README no longer claims a backdated estimate "fails the
    seal" (the seal proves no edits since a copy was shared, not when the
    estimate was written); the README states conservation is an
    internal-consistency guarantee that cannot detect undercounting at
    the source; the architecture doc describes the escrow payload order
    as a field-shift/delimiter-injection defense, not "structurally
    impossible". Write-time ordering is now enforced where a wall clock
    exists: append refuses a future-dated logged_at (5-minute skew),
    stamps ledger entries with an additive appended_at witness, and
    verify discloses — as a warning, never a failure — a pre-registered
    estimate written more than 48h after its claimed logged_at.
    Backfilled sync facts entries carry no estimate and no stamp, so they
    cannot trip it. External time anchoring is roadmap, recorded.
  • The demo renders everywhere (E-03) — base opacity 1, so renderers
    that don't run CSS animation in <img> (Firefox on GitHub, previews)
    show the complete static transcript; animated playback cold-opens on
    the payoff frame and holds the finished transcript instead of fading
    to nothing.
  • Meter gaps reach verify and every pack (E-11) — sessions whose
    transcripts were pruned or unreadable before metering are disclosed
    as verify warnings and travel in packs (gap_sessions in pack.json,
    a "what the totals do not contain" line in the pack README) instead
    of being silently absent behind green.
  • SessionStart runs no engine work (E-12) — the miner precomputes
    the pacing/renewal/first-run notice at mine time (which is when
    thresholds actually cross) into rollups/next-notice; the hook is
    pure shell: serve the file, consume it, exit. The not-initialized
    nudge is owned by the hook itself. pace --notice is unchanged.
  • First receipt contains tokens (E-04) — init meters every
    existing transcript (subagents included) with a progress line, so
    months of history are visible immediately; the README shows the real
    receipt this produced for this very repo (E-05), and the install
    block says to restart Claude Code (E-07).
  • PAT guidance unified on fine-grained read-only (E-13); the
    waybill-not-on-PATH answer documented (E-08); good first issue
    labeling fixed (E-09); bug intake asks nothing users can't do (E-16).

Added

  • query cache + the cache skill (S-04) — what the bill is
    actually made of: volume by class with the 5m/1h write split, the
    cache-read share, per-model rows, and a derived effective-vs-list
    cost view (labeled list_price_equivalent_derived, net of write
    premiums, coverage disclosed). Triggers on "why is my bill like
    this"; trigger + negative evals included.
  • Multi-repo session disclosure (E-14, warn-only) — receipts record
    every working directory seen (additive cwds, present only when >1);
    verify warns that such a session's spend is attributed via the
    first cwd only. The per-turn split is future work, tracked.
  • A warnings channel in verify — findings can carry
    severity: "warning": disclosed by verify and status, never
    fatal, never blocking packs. Used by the write-time-lag, meter-gap,
    and multi-repo disclosures.
  • Evidence-tier mix in status (S-05) — one line: points shipped,
    points with pre-registered estimates, points facts-only.
  • Capability phrasing (E-15) — "what can waybill do", "waybill
    help", "show me my dashboard" trigger the right skills, with evals.

Changed

  • Positioning reframed to the defensible claim (S-01) — receipts,
    not estimates; the absolute "unserved / no tooling" language is gone
    repo-wide. The dated, evidence-tiered field survey lives in
    docs/positioning.md; the README first screen
    leads with the install unit, the real receipt, and the cache-read
    share (S-02). The launch post carries only engine-generated numbers,
    unattributed share included (S-03).
  • Walks share one stream read (E-10) — mine, meter --all, and
    init's first-run pass load the four streams once per walk instead of
    once per transcript (byte-identical output, tested).
  • ROADMAP, DECISIONS, and VALIDATION moved under docs/; the
    pre-2.0 changelog folded into a details block; .mailmap normalizes
    tool-default commit authorship (E-06).

"Delivered": the free side complete — the final release of the committed
path (ROADMAP). The major version marks scope completion,
not breakage: the event schema is unchanged (v2, frozen since 1.0), every
addition is additive, and 1.x ledgers need no migration. From here,
changes are upkeep, not construction.

Added

  • Azure DevOps tracker adapter — REST/WIQL work items → WorkItems:
    numeric work item ids as keys (AB#123-style branch refs match),
    StoryPoints or Scrum Effort → points (never invented), iteration
    path tail → sprint, ClosedDate/terminal states → done, work item
    type → work_type. Own-data defense-in-depth reads
    System.AssignedTo.uniqueName (an email) against the identity map's
    existing git_emails — no new identity field needed.
    Conformance- and own-data-tested on a realistic fixture
    (--tracker azure-devops). Honest limit: live end-to-end run not yet
    performed; the adapters table says so.
  • Bitbucket Cloud git-host adapter — merged pull requests →
    MergedChanges: repo from the destination repository, branch/title keys,
    and — documented approximation, verbatim leaf — updated_on of a
    MERGED PR standing in for the merge time (the 2.0 PR object exposes no
    merged_on). No closing-keyword linkage on Bitbucket, so closes is
    omitted, never faked. Own-data via new optional
    identity.json.bitbucket_username. Conformance- and own-data-tested
    (--git bitbucket).
  • The Windows story (docs/windows.md) — the
    engine is pure Node and runs everywhere; hooks need only a bash on
    PATH (Git for Windows, WSL); and because metering is retroactive and
    idempotent, a machine where hooks never fire loses nothing — scheduled
    mine --all is a full substitute. Retention is the one real caveat,
    and status already checks it. Honest limit stated: reasoned port,
    native end-to-end report welcome.
  • The OTel live-export recipe (docs/otel.md) —
    telemetry env vars → local OTLP collector with a file exporter →
    waybill meter --otel backfills pruned-transcript sessions. Fallback
    semantics restated: fills transcript-less sessions only; the
    transcript stays the source of truth.
  • The self-verifying release gate (scripts/release-gate.sh,
    npm run gate, new CI job) — the release's claims about itself are
    checked mechanically: VALIDATION's headline test count must match the
    suite that actually runs, the released version must have CHANGELOG and
    ROADMAP coverage, every relative doc link must resolve, and every
    skill must have a trigger eval.
  • status --fast — skips the full-ledger verify re-hash (the one
    expensive step on a large home); the verify line reports "skipped",
    never "ok".

Changed

  • Architecture review closed out — all eight standing
    recommendations from the 1.5.0 review now carry a recorded disposition
    in docs/architecture.md: done in code (time
    module v1.6; own-data kit v1.7; lock-takeover post-rename verification,
    status fast mode, release gate, standup↔spend agreement golden — all
    v2.0), or deliberately closed with rationale (the shared strict flag
    parser src/cli/flags.ts is adopted by the simple read-side commands,
    while tested bespoke parsers on the write paths stay — strictness is
    enforced by regression tests either way). The pricing-honesty
    vocabulary (unpriced / repriceable / unidentified) now has one
    owning definition there.
  • Lock takeover hardened — after the atomic rename that reaps a
    stale miner lock, the reaper re-reads what it actually claimed; a lock
    that turned live inside the race window is restored via
    exclusive-create and the takeover yields.
Earlier releases — 1.8.0 back to 0.1.0 (the 0.x build-out and the 1.x committed path, all 2026-08)

CHANGELOG · VALIDATION · DECISIONS