Repository navigation
Releases: bar181/bar-observatory
Release list
v0.2.1
Not breaking. Every fix below is an internal correctness or security fix; no config schema or
CLI surface changed. All 16 crates are live on crates.io at 0.2.1 (verified via the crates.io API
and a real cargo install --locked from the published registry, then a genuine
init/ingest/report/doctor run against the installed binary).
An independent review of the report-example redesign + measurement-bug-fix PR found and fixed six
real defects before merging:
- Script injection in the shipped report renderer. Tool names read from the transcript
reached an inline<script>block via HTML-only escaping — a real script-injection path
present in every generated report. Fixed with proper JSON escaping and DOM-safe (textContent)
rendering. - The blind-store honesty guarantee failed on exactly the input it was written for. A
legacy/offloaded-only store rendered confidently clean instead of flagged blind. Fixed by
deriving the flag from run coverage, not scan hits. - Offloading a large
tool_use.inputsilently zeroed six detectors — rework, hotspots,
agent spawns, skill usage, TodoWrite, and the task ledger. Fixed with a declared
per-tool-type bulk-subfield list. HUB.aispasserted a false equation inside its own self-certifying evidence block. Fixed
and re-verified against a freshly migrated store via a real schema dump.- Re-ingest silently double-counted instead of fixing the
partialvalidation caveat it was
meant to remedy. Fixed with one mechanism: clear a turn's facts before re-deriving them
(ADR-131). - pytest's verdict matcher accepted plain prose as a test result. Fixed, and the guard test
corrected to assert the refusal it was meant to.
A second, independent adversarial review pass then caught what the first pass missed: the
identical 139-vs-136 defect in a second example report, a self-contradicting crate count in
README.md, a duplicated crate-table row in two HTML pages, and a missing executive-summary
section in one report that its own HTML twin already had. All fixed and re-verified.
Verified before this release: cargo test --workspace green at 699 (0 failed, 6 ignored),
checksums regenerated and verified clean (89/89), scripts/public-export.sh --check IN SYNC,
banned-framing-lint clean, and a full outside reproduction: installing purely from crates.io and
re-rendering the shipped example matched the published report on 99 of 101 fields (the two that
differ — source_db_hash, report.id — are documented as expected to vary between ingests).
Full details: CHANGELOG.md
v0.2.0
Breaking. All 16 crates went live on crates.io on 2026-08-17 (human go-ahead given, verified
via a real cargo install --locked from the published registry). A [privacy] config key is
removed with no compatibility shim, the capture schema moved six migrations (v17 → v23), and
stored-data semantics changed — a v17 store from a 0.1.x install migrates automatically on the
next write.
Six real findings from an external reviewer, fixed
An external reviewer ran BAR Observatory 0.1.1 against real sessions and reported six reproducible
defects. All six are closed as of this release:
- The
[privacy]config table was fully decorative — zero code paths read it. Replaced by a
real[redact]table that every field of which is actually read. - Archival ingest silently misresolved the workspace root, masking real edits and rendering a
clean, empty report with no indication anything went wrong. Fixed with a disclosed
workspace-root precedence chain, always visible in the report. - Write-seam masking damaged error detection itself — redaction ran before the error/pairing
detectors ever saw the string. Fixed by moving redaction to the render/export seam only;
storage is now always verbatim. - Masking could produce a "plausible" but silently empty result. Every
not_observedresult
now carries a reason code instead of a bare, unexplained empty. - The parser catalogue advertised 4 languages, shipped 1. pytest/npm/generic-exit matchers
are now implemented and covered by fixture tests. - Nothing recorded how any resolved value was derived. The report now names which layer/rung
won for config resolution, workspace-root resolution, and the redaction policy in effect.
Also fixed this release
- A real capture-parsing bug in
bar-proxy'sbodieschannel (Anthropic/count_tokens
diagnostic responses were being dead-lettered as unparseable). bar --helpand barebarexited 2 instead of printing usage and exiting 0 — the first thing a
new user hits.bar doctor— a real, working self-diagnostic (store validity, capture health, lifecycle, DLQ
status in one command).
Full details: CHANGELOG.md