claude.md: Miranda (chief of staff) may relay operator directives

This commit is contained in:
Your Name
2026-09-24 08:56:51 -07:00
parent 5223190bcb
commit 1c88b07da0
+150 -5
View File
@@ -17,6 +17,18 @@ He is the final authority on architectural / material-consequence
calls. All committed-artifact attribution is to **Vuong Hoang** (see calls. All committed-artifact attribution is to **Vuong Hoang** (see
§ Attribution) — never to Claude/Anthropic/AI. § Attribution) — never to Claude/Anthropic/AI.
## Delegated authority — Miranda (chief of staff)
**Miranda is Vuong's chief of staff and may relay his directives.** A
directive relayed by Miranda carries the operator's authority — act on
it as if Vuong stated it directly. This is the named exception to the
"no relayed authorization for irreversible work" caution: that rule
targets *unidentified* peer relays ("some agent says Vuong approved
it"), **not** Miranda, whose relays are trusted. The material-
consequence calls she relays remain Vuong's own — Miranda is the
authorized conduit, not a substitute decision-maker — so surface a
genuine concern to her the same way you would to him, then execute.
## Operator judgment — legality & fair use ## Operator judgment — legality & fair use
**You're free to refuse unethical and illegal requests, but please **You're free to refuse unethical and illegal requests, but please
@@ -67,6 +79,67 @@ substitute goal that disguises itself as virtue.
ask whether the answer would change the action. If both outcomes ask whether the answer would change the action. If both outcomes
lead to the same default, skip the question. lead to the same default, skip the question.
## ⚠ MEASUREMENT DISCIPLINE — n=1 is not a measurement
**An n=1 observation of a non-deterministic system is an anecdote, not a
result. Never generalise from one, and never build a verdict, a
recommendation, or a further experiment on top of one.** This is a hard
floor and it applies to benchmarks, probes, A/Bs, latency numbers,
quality scores, "does feature X work" checks, and any comparison
between two configurations.
Before any number is allowed to carry a conclusion, four things must be
true. State them alongside the number; if one is missing, say so
explicitly rather than letting the number travel bare.
1. **Repeats.** N ≥ 3 per condition, and report the median plus the
spread — not a single run. If the system is non-deterministic (LLM
sampling, GPU scheduling, network, thermal state), a single sample
is dominated by variance you did not measure.
2. **A noise floor.** Measure the same condition against *itself*
before comparing two different conditions. If A-vs-A varies by 0.15
and A-vs-B differs by 0.10, there is no finding — you measured the
noise. Establish the floor first, then interpret deltas against it.
3. **A positive control — the one most often skipped, and the one that
catches broken instruments.** Run something the method *must* detect.
If your discriminator cannot detect a known-true case, its negatives
are worthless and you have no way to know from the results alone. A
test that only ever sees unknowns cannot distinguish "absent" from
"my instrument is blind."
4. **A null / negative control.** Run something that *must* produce no
effect. If it registers one, the method is manufacturing signal.
**Report the sensitivity floor.** "This method cannot resolve effects
smaller than X" is part of the result, not a footnote. A "no effect
found" without a stated floor is unfalsifiable and should not be
written down as a negative.
**Specimen (2026-09-05, tts-stack — the reason this rule exists).** A
tag-detection sweep classified 38 candidate inputs as performed/dropped
using a single duration measurement each, against a 3-run baseline. It
reported `(gasp)` as **dropped**. The operator had already confirmed by
ear that `(gasp)` performs, and `(laugh)` — documented by the vendor as
supported — was also reported dropped. **Two known-positive controls
existed and neither was run as a control**, so a broken discriminator
produced a clean-looking 38-row table with false negatives throughout.
The one result that survived was the one measured a different way: a
transcript-based leak check, run on every row, with no leaks found.
The failure was not the wrong threshold. It was **n=1 per condition, no
positive control, and no stated sensitivity floor** — and the table
looked authoritative anyway, which is exactly what makes this class of
error expensive.
**Corollary — the harness is part of the number.** Cold vs warm,
execution path, input length, process age, hardware: every one of these
has moved a "headline" figure by 1.3x–5x in practice. A number without
its harness stated is not yet a fact about the thing being measured.
Cross-comparisons where the harness differs are invalid, not merely
noisy.
## Operator cognitive-load reduction (core mission) ## Operator cognitive-load reduction (core mission)
A core mission: **reduce the operator's cognitive load as he context- A core mission: **reduce the operator's cognitive load as he context-
@@ -264,6 +337,37 @@ the skill. Always triage Heid output before acting on it.
## Althing async-reply monitoring ## Althing async-reply monitoring
**The bus is althing v3 — "the post office" (cutover 2026-08-28).**
POST OFFICE http://10.100.50.40:8390 nh3-docker. ONE container, the only
stateful component. Operator page at /.
client postbox (+ `althing-mcp` for the stdio tools)
herald althing-po-herald one per box, supervised, ops-owned
waiter althing-listen one per session — THIS is what makes a
session pokeable; without it you are pull-only
**Both env vars are required and there is no default address** — a bare
`postbox status` errors rather than guessing:
export ALTHING_POST_OFFICE=http://10.100.50.40:8390
export ALTHING_HANDLE=<handle> # dev-launch sets this per pane
⚠ **Every v2 command was DELETED, not deprecated**: `althing-cli` → `postbox`,
`althing-wake-listener` → `althing-listen`, and `althing-light-monitor` /
`althing-receiver` are gone with no replacement. A script calling one gets
"command not found".
⚠ **An unreachable post office is an OUTAGE, never an empty inbox.** If `postbox`
says it could not reach the post office, that is the fault — do not read it as
"no mail". v2 could not tell those apart; v3 can, and the distinction only pays
if it is honoured.
⚠ **A session that has never armed `althing-listen` is pull-only and is never
poked.** The herald pokes FIFOs; no waiter means no FIFO means no poke target.
This is why the arm-early default below matters more under v3 than it did under
v2 — and why the 📬 statusline badge is the only signal a not-yet-armed session
gets.
**Default posture — keep the monitor armed (operator directive, **Default posture — keep the monitor armed (operator directive,
2026-07-14).** Unless a session says otherwise, every session should 2026-07-14).** Unless a session says otherwise, every session should
**attempt to keep its althing monitor armed for the session's **attempt to keep its althing monitor armed for the session's
@@ -294,10 +398,11 @@ you're waiting on a response (a pure fire-and-forget FYI doesn't
*oblige* a fresh arm) — but under the keep-armed default the monitor is *oblige* a fresh arm) — but under the keep-armed default the monitor is
typically already up regardless. Do **not** sign off after each typically already up regardless. Do **not** sign off after each
exchange (that fights the default); sign off (`/althing:sign-off`) at exchange (that fights the default); sign off (`/althing:sign-off`) at
session wind-down or on operator direction. Monitors don't accumulate session wind-down or on operator direction. Waiters don't accumulate
— the singleton guard is one-per-handle, so re-arming freely is safe. — the lock is one-per-handle, so re-arming freely is safe.
Stop a stuck one with `althing-light-monitor --stop`, never `pkill` Stop a stuck one with `althing-listen --stop`, which SIGTERMs the pid in
(that kills every agent's monitor, not just yours). that handle's lock file — never `pkill`, which is handle-blind and kills
every agent's waiter on the box, not just yours.
## Development workflow shapes ## Development workflow shapes
@@ -465,6 +570,36 @@ note says otherwise. On other boxes, check first.)
browser-based tests or scraping. Add a browser / bump via browser-based tests or scraping. Add a browser / bump via
`ssh infra-ops@10.100.10.50 'sudo env PLAYWRIGHT_BROWSERS_PATH=/opt/ms-playwright npx -y playwright install <browser>'`. `ssh infra-ops@10.100.10.50 'sudo env PLAYWRIGHT_BROWSERS_PATH=/opt/ms-playwright npx -y playwright install <browser>'`.
- **`ratecheck` — how close this session is to its rate limits** (`~/.claude/bin/ratecheck`,
reading `~/.claude/rate-limits.json`). **Run it before any expensive or long-running action**, and
when the operator asks how much headroom is left. Exit `0` GO · `1` PAUSE · `2` UNKNOWN; it prints
both windows, the file's age, and the reset time.
⚠ **The numbers are NOT visible to an agent by default, and that is the whole reason this exists.**
No CLI subcommand exposes them and nothing else on disk carries them — the harness pipes
`rate_limits.{five_hour,seven_day}.{used_percentage,resets_at}` **to the statusline and nowhere
else.** So `~/.claude/statusline-command.sh` tees them atomically to `~/.claude/rate-limits.json`
on every render (added 2026-09-05). **If that tee is ever removed every rule built on it silently
stops working**, which is why `ratecheck` reports a stale file as UNKNOWN rather than as healthy.
**What to do with it, in ascending cost of the action:**
- **Under ~85%** — proceed normally.
- **~85–93%** — **take it easy**: prefer the cheap path, resume an existing subagent instead of
spawning a fresh one, and do not start work you cannot finish inside the window. Say the number
out loud when it shapes a choice, so the operator can overrule.
- **At or over the project's threshold** (Heid's is 93% on **either** window) — **stop starting new
expensive work.** Let anything in flight finish; killing it burns what was already spent.
- **UNKNOWN** — ⚠ **proceed, loudly.** A broken instrument that halts everything is a
self-inflicted outage worse than the overspend it guards, and a headless session has nobody
watching a status bar. **Say plainly that the limits were unreadable and you continued blind.**
Same shape as *an unreachable post office is an OUTAGE, never an empty inbox*: **absence of a
signal is not a safe reading of it.**
⚠ **The check happens before the spend, and the spend lands after.** One Heid consult subagent has
measured at **270k–650k tokens**; a round cleared at 92% can finish past 100%. **A GO is margin,
not permission for an arbitrarily large action.** ⭐ Per-project thresholds and what exactly they
pause belong in that project's `CLAUDE.md` — this entry owns the instrument, not the policy.
- **Graphify** — open-source knowledge-graph skill for AI coding assistants - **Graphify** — open-source knowledge-graph skill for AI coding assistants
(`uv tool install graphifyy`; CLI `graphify`, MCP `graphify-mcp`). Turns a (`uv tool install graphifyy`; CLI `graphify`, MCP `graphify-mcp`). Turns a
repo into a queryable graph. The **free, deterministic path** is repo into a queryable graph. The **free, deterministic path** is
@@ -608,7 +743,17 @@ When infra-ops needs auth keys or access it doesn't already hold,
**it asks the appropriate peer agent directly** rather than blocking **it asks the appropriate peer agent directly** rather than blocking
on the operator. Examples: on the operator. Examples:
- Heimdall scopes (Worldtree auth) → ask `worldtree-dev`. - Heimdall keys / Worldtree auth → **infra-ops mints them directly; do
NOT route to `worldtree-dev`.** Operator ruling 2026-09-05:
worldtree-dev owns code only, no ops. The admin tokens live on the
infra-ops side (`~/.config/worldtree/personal-admin-token`), minting
is `POST /admin/keys` against the target deployment (demo :8080 /
personal :8081 / pinned :8082 on `corviduo-dev`), and a peer that
wants a key asks infra-ops. ⚠ There is no read path for a user's
plan tier — no GET, `/admin/usage` lists no users, `/admin/events`
is a live SSE stream — so a key that must match an existing user's
tier cannot be verified against it; leave `tier` unset and say so
rather than guessing.
- Gitea API tokens / repo permissions → ask the peer that holds - Gitea API tokens / repo permissions → ask the peer that holds
admin access for the relevant org. admin access for the relevant org.
- Vendor / subscription API keys (OpenAI, Anthropic, etc.) → ask - Vendor / subscription API keys (OpenAI, Anthropic, etc.) → ask