Landing blocker for #61 and #63: the deployment checkout is 12 commits behind and `merge --ff-only` refuses while tracked paths are dirty. Discard is not available here (workspace policy: no `checkout`/`stash` on shared state), so the dirt is committed. - `agent/APPEND_SYSTEM.md`: the point-of-use / one-work-log / PR-link doctrine, already byte-identical to `origin/main` (`cmp` against the trunk blob: no difference). No new prose — the commit exists so the trunk merge can proceed. - `agent/config.yml` and `agent/managed-skills/**`: the machine-live tier the heartbeat owns (AGENTS.md § Live-sync tiers). `ALLOW_SECRETS=1` was used, deliberately and after auditing the staged diff by hand: the only credential-shaped strings in it are two copies of `AKIA0000000000000EXAMPLE` — the inert all-zero AWS example id — and they appear inside the two skill pages that teach that exact placeholder shape. This checkout is still running the pre-#61 hook; the merged gate (value-scoped placeholder filter, `71601f7`) exempts this value, so the refusal dies with this landing. No `--no-verify` was used: the gate ran and its verdict is recorded here. Refs #61
2.4 KiB
name, description
| name | description |
|---|---|
| omp-extension-stale-module-audit | Diagnose omp extension misbehavior (handler timeouts/silence, cross-instance arbitration failures like simultaneous speech) when the on-disk fix is already deployed: running sessions hold pre-upgrade in-memory bundles; compare ps lstart against artifact mtimes and merge dates. |
Stale in-memory omp extension bundles
Symptom class: an extension behaves as if unfixed even though the disk artifact
contains the fix — recurring handler timeouts, silence, or (multi-instance
coordination features) arbitration failures that look like code bugs. Root
cause: omp loads the bundle at session start; omp plugin upgrade on disk
does not touch the code already running in live sessions.
Recipe 1: date the sessions against the artifact
date
stat -c '%y %n' ~/.omp/plugins/node_modules/<pkg>/dist/index.js # last upgrade
ps -eo pid,lstart,etime,args | grep 'omp' | grep -v grep # each session's boot
Any session whose START predates the artifact mtime holds an older bundle —
for it, the "fix" never shipped. When the feature landed in git, compare
against the merge date, not the last upgrade (git log --format='%h %cI %s' main | grep -i <feature>): a session can predate the feature existing.
Fix is always: restart (/quit, then omp --resume <id>) — resume is
lossless. It is the user's live session; never kill it yourself.
Recipe 2: cross-process arbitration — a bypasser explains "simultaneous X"
When a feature serializes across sessions via files (e.g. dankvoice stage:
~/.cache/dankvoice/stage/ with lease.json = {holder,pid,expires}, one
<ISO>-<session>.json entry per queued item, FIFO = filename order, lease TTL
6 s), overlap between two actors proves at least one actor never consults
the directory — the mechanism can't serialize against a bypasser. Census the
queue live (watch -g -d 'ls <dir>; cat <dir>/lease.json'): a live, renewing
lease proves the new sessions coordinate; then Recipe 1 finds the bypasser.
Known residual hazard to note, not silently fix: a lease heartbeat is a timer on the holder's own event loop; a stall longer than the TTL lets a peer steal the lease mid-action. Mitigation = pid-liveness check in the steal path.
Verification
After restarts, the symptom must vanish while the queue shows traffic. If it persists, look for actors on OTHER hosts (file arbitration is per-box), or the TTL-steal hazard above.