Repository navigation
waybill 2.1.0
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--transcriptnow 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-datedlogged_at(5-minute skew),
stamps ledger entries with an additiveappended_atwitness, and
verifydiscloses — as a warning, never a failure — a pre-registered
estimate written more than 48h after its claimedlogged_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_sessionsin 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) intorollups/next-notice; the hook is
pure shell: serve the file, consume it, exit. The not-initialized
nudge is owned by the hook itself.pace --noticeis unchanged. - First receipt contains tokens (E-04) —
initmeters 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+ thecacheskill (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 (labeledlist_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 (additivecwds, present only when >1);
verifywarns 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 byverifyandstatus, 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;.mailmapnormalizes
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
existinggit_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_onof a
MERGED PR standing in for the merge time (the 2.0 PR object exposes no
merged_on). No closing-keyword linkage on Bitbucket, soclosesis
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 abashon
PATH (Git for Windows, WSL); and because metering is retroactive and
idempotent, a machine where hooks never fire loses nothing — scheduled
mine --allis a full substitute. Retention is the one real caveat,
andstatusalready 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 --otelbackfills 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
parsersrc/cli/flags.tsis 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.