Files
command-center/agent/managed-skills/omp-extension-stale-module-audit/SKILL.md
T
Frank 8af40c402b chore(agent): commit the machine tier and the doctrine text the checkout was already running
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
2026-10-21 01:44:51 -07:00

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.