Repository navigation
v0.23.0
The disk guard keeps free space by itself, every hour, without touching anything a process holds; the meter
answers whether a delegated call may spend; a vault slot is released only under a grant that names it; and the
harness scan reports what every agent session loads. Releases are now approved by checks, not by a click. The
companion plugin observatory-log is unchanged.
Added
-
The disk guard (OBS-63): with
features.auto_cleanupon, the hourly maintenance job runs
tools/disk_guard.pyfirst in every pass, before the update and the backup — no longer only from the tick,
whose cleanup step a loaded machine could leave unreached for a day. Free space sets the pressure (normal,
lowunder 25 GB,criticalunder 10 GB) and the pressure moves every threshold: the cache tools' own cleanup
(uv,pnpm, Homebrew, Docker only while its daemon already runs;npm cache verify,uv cache clean, Go and
Yarn fromlow), git-ignored build output of checkouts idle 14 / 3 / 1 days (by checkout, commit or an
uncommitted file, never the index), temporary entries, Trash items older than 30 days (3 atcritical),
abandoned browser code-sign clones, then the cleanup's git auto tier. Nothing a process holds open or works in
is removed: onelsoflisting per run, re-checked at each removal, and without it no path goes. Freed space is
the disk's own before/after count (freed_mb), notdu, which counts an APFS clone in full.
full disk-guard [--apply] [--level L] [--large-files]runs it by hand. The Machine page and
observatory_machine(section: guard) show the last run, the largest files under the home directory and the
running simulators with the command that stops each;machine.guard_idlewarns when the guard has not reported
for three hours, andmachine.disk_lownames the guard's run, the swap holders and the largest files.
Configuration:config/cleanup.json→guard. Supersedes the Space-page draft (OBS-15). -
The meter (OBS-55; Fabric ADR-0144 step 3, contract DEC-0037/0038/0039):
grant.checkon the memory-http
door answers whether a call may spend. The caller presents the onward delegation token Fabric's hub minted for
project-observatoryinAuthorization(never in an argument); the meter verifies it offline against the
estate's Ed25519 keys (delegation.py, the contract's verifier table DL-13), reads the grant from the hub's
grant directory, and reserves the amount against the grant'scall,task,total,project,day,week
andmonthwindows and the estate's monthly total (L0, USD 1,000 by default) and provider-key ceilings, in one
transaction. It answers a receipt, or a denial naming the code, the level and the window.full grant --status,
--check(token on stdin) and--settle. The ledger records no person and no chain. Configuration:
config/meter.json. Design:docs/design/METER.md. -
A vault slot only under a grant (OBS-57): an agent hands
use_secret.pyits delegation token in
FABRIC_DELEGATION_TOKEN(scopesecret.use).run,serveandheaderthen release a slot only when a grant
the token names hascredentialSource {kind: project-key, ref: PROJECT/ENV/NAME}, never read a.env, and
remove the token before the child starts.slotsRequireGrantinconfig/meter.json:when-token(default
until Fabric's issuer ships),always,off. -
The agent harness scan (
integrations.harness,sources.harness_root; off until turned on): what every
Claude Code and Codex session loads before the first word. It counts each skill's entry in the session's skill
listing against a budget (OBSERVATORY_HARNESS_BUDGET_CHARS, default 30,000 characters) and names the
descriptions that no longer fit, largest first; flags an instruction file over 200 lines and the settings that
load every MCP tool upfront; and runs deterministic rules over skill files — hidden Unicode, concealment
directives, download-and-execute, a credential read beside a send, opaque content — weighed by where the skill
comes from. Files are read, never run. A skill whose files change is reported until
full harness --accept KEY; an ack of a rule hit lapses when the skill changes. Design:docs/design/HARNESS.md.
Fixed
full updaterefusing with "the workspace changed while staged" now names the paths that moved, so the writer
to stop can be found (#200).
Verify
gpg --verify SHA256SUMS.asc SHA256SUMS # key 63B30DC324BD697487AA31944FAFB8AEC803B6A7
shasum -a 256 -c SHA256SUMS --ignore-missing
gh attestation verify <file> --owner passioncode-ai --signer-repo passioncode-ai/.githubThe organization's public key: https://github.com/passioncode-ai/.github/blob/main/release-signing/passioncode-release-signing.asc