What this is
Claude Code sessions start cold: hundreds of installed skills, agents, and MCP servers; memory spanning every project on a machine; no deterministic opening move. The praxis stack is a pair of skills that fixes this — and then audits itself.
megapraxis — the session bootstrap
megapraxis runs at session start. It detects one of seven modes from the working directory's shape
and history, inventories skills/agents/MCP servers, flags silently-broken ("dark") plugins, reads project
memory and git state, and emits a 15-second dashboard briefing. Its contract: every line corresponds to a
truth on disk — unverified claims are dropped, never emitted; counts that weren't computed render as
count-skipped, never as guesses.
| Mode | Fires when |
|---|---|
| hook-auto | SessionStart hook; 3-line kernel briefing, no questions |
| active-project | cwd is a real project (git repo / manifest / memory) |
| container | cwd holds multiple project subdirs |
| picker | 2+ sub-projects recently active — asks which one |
| machine-dashboard | "show all projects" — machine-wide scan |
| cold | no prior context; minimal catalog |
| resume | "pick up where we left off" — replays the last unresolved thread |
metamegapraxis — the meta-auditor
Where megapraxis briefs the session, metamegapraxis briefs megapraxis. It rolls through
23 documented operational traps (each with a disk-verifiable probe), checks the bridge manifest's referential
integrity, computes coverage deltas, and — when single-lens auditing isn't enough — dispatches a
four-agent audit swarm whose verdicts persist to a knowledge graph. Six modes:
audit, trap N, bridges, propose, swarm, diff.
The 23 operational traps
Silent-failure classes learned in production. Each has a signal (the disk signature that identifies it) and a fix. The live roll-call is on the State tab.
| # | Trap | One-line signal |
|---|---|---|
| 1 | plugin-manifest-misplaced | manifest at plugin root instead of .claude-plugin/ — plugin silently absent while settings say ON |
| 2 | session-vs-app-restart | new session ≠ new process; plugin configs load only at app launch |
| 3 | user-belief-vs-harness | "it should be registered now" is a hypothesis until the harness confirms it |
| 4 | stdio-works-cc-never-launched | server responds when run manually, but the host never spawned it |
| 5 | http-up-not-stdio-up | HTTP health check green while the stdio MCP sibling is down — separate processes |
| 6 | windows-python-store-stub | bare python resolves to a Store alias that prints an install nag and exits 1 |
| 7 | stale-pyc-shadowing | bytecode mtime ties can shadow a fresh source edit |
| 8 | fabricated-count | a number derived from a truncated listing instead of a real count |
| 9 | heuristic-classification | client-side guesswork silently replacing an auditable server-side contract |
| 10 | fix-violates-feedback | a proposed action contradicting a saved user correction |
| 11 | ghost-warm-slug | directory looks recently active because a memory file was touched, not a session |
| 12 | stale-graph-cache | graph snapshot lagging fresh disk state |
| 13 | new-agent-needs-restart | agent files written mid-session are invisible until app relaunch |
| 14 | marketplace-root-claude-plugin | a marketplace manifest dir misread as a stray plugin — deleting it darkens everything it publishes |
| 15 | mcp-disconnect-mid-session | tool roster shrinks mid-session while the HTTP backend stays up |
| 16 | tmp-on-windows | /tmp/ writes that the next shell can't read back |
| 17 | shell-escape-json-winpath | backslash paths mangled across shell/curl escape layers |
| 18 | claude-md-aspirational-route | docs describe an endpoint the code never shipped — the handler is the truth |
| 19 | bulk-finalize-no-contribution-check | blanket-failing pending work destroys provenance of runs that succeeded |
| 20 | userpromptsubmit-empty-payloads | audit rows persisted before their fields were populated leak forever-pending |
| 21 | settings-dark-harness-resolves | settings say a plugin is off; the runtime dispatches it anyway — the harness wins |
| 22 | malformed-settings-json | one trailing comma silently disables every plugin and hook |
| 23 | while-read-subshell-hang | per-iteration subshells on MSYS stretch a 300ms scan to minutes |
Verdicts and Tarski honesty
Audit cycles terminate with an explicit verdict — converged,
converged-modulo-restart, extend, extend-stable, degrade,
cycle-complete-extend-deferred, or INCOMPLETE (with reason). What can't be decided is
named, never absorbed: five canonical undecidables (unknown-unknowns, true-lens-independence,
fixed-point-vs-plateau, state-validity-horizon, converged-vs-correct) plus four observation-class buckets
(values-question, oracle-required, telemetry-required, intent-vs-drift) appear in every audit rather than
being quietly folded into "all done".
Swarms and the bridge flywheel
When one lens isn't enough — self-audit above all, since the audit target is the auditor — the stack composes an agent swarm: four reviewers with different toolsets in a pipeline, a coordinator synthesizing a verdict, every contribution persisted to a graph. Recurring reasoning gets compiled into bridges: memoized transfer rules (short-circuits, pre-populated templates, delta-scopes) consulted before any new work. A byte-identical re-audit short-circuits to its prior verdict for ~20 tokens instead of a ~150K-token cycle — marginal cost per invocation trends toward zero, bounded below only by the genuinely novel, which always pays full price. That residual is load-bearing, not a failure.