Wiki Log
Append-only operation log. One entry per operation. Format:
Operations: init, ingest, query, lint, refactor, decision.
Parseable: grep "^## \[" .wiki/log.md | tail -20.
[2026-04-28] init | bootstrap empty wiki via project-bootstrap (old layout)
[2026-04-28] decision | repo-layout — flat skills/, committed dist/, bash + PS scripts
[2026-04-28] decision | build-notes — PS 5.1 Compress-Archive backslash bug; build.ps1 via .NET ZipArchive
[2026-04-28] decision | active-platform — skill chosen over global CLAUDE.md / project memory; default Windows; wired into project-bootstrap
[2026-04-28] refactor | wiki-realignment — fixed project-bootstrap Step 3 to create Karpathy-canonical layout
[2026-04-28] refactor | this repo's .wiki/ migrated to canonical layout (SUMMARY.md→index.md, source/→concepts/, added log.md/overview.md/CLAUDE.md schema, raw/README.md)
[2026-04-28] decision | context7-setup — switched to official plugin; --api-key injected into plugin's .mcp.json; three manual MCP entries removed
[2026-04-28] decision | setup-context7 skill — formalized the install/migrate algorithm; using-context7 gets a Prerequisites pointer; build.sh PS multi-arg bug fixed (loop instead of comma-joined -Names)
[2026-04-28] verify | setup-context7 — Vitya ran using-context7 in a session that needed setup; Prerequisites pointer triggered setup-context7; full flow worked end-to-end. Pattern (policy + setup split) validated.
[2026-04-28] decision | skill-vs-plugin — documented when a bare skill suffices vs when a plugin is required (slash commands, hooks, sub-agents, MCP via marketplace)
[2026-04-28] decision | skill-versioning — added version: 1.0.0 to 6 infra skills' frontmatter; project-bootstrap now writes .wiki/concepts/bootstrap-manifest.md per project
[2026-04-28] refactor | wiki split — wiki-maintainer renamed to using-wiki (policy); new setup-wiki skill owns greenfield creation and canon migration; project-bootstrap Step 3 delegates
[2026-04-28] refactor | tasks split — task-status-wiki renamed to using-tasks (policy); new setup-tasks skill owns greenfield + interactive migration (no auto-parsing of old flat STATUS.md); project-bootstrap Step 4 delegates
[2026-04-28] refactor | this repo's .tasks/ migrated to canonical layout — flat ## Done/## Backlog replaced by emoji-status board (7 ⚪ Ready blocks); historical Done entries dropped (preserved in git log); .bak ignored via .gitignore
[2026-04-28] cleanup | removed stale ~/.claude/skills/{wiki-maintainer,task-status-wiki}/ installs (replaced by using-wiki/using-tasks); 16 skills installed, no duplicates; context7 plugin (mcp__plugin_context7_context7__*) confirmed live after restart
[2026-04-28] decision | install-portability — install.sh/build.sh patched to drop mapfile+find -printf; stock macOS (bash 3.2 + BSD find) now works; verified on git-bash (16 skills discovered, sorted, installed; build.sh produces archive)
[2026-04-29] decision | projects-meta-skills — built setup-projects-meta (8-phase install of projects-meta-mcp + auth.toml + MCP registration) and using-projects-meta (runtime policy with local-first rule and two-step mutation); skill pair pattern applied for the 4th time (context7 / wiki / tasks / projects-meta); both built + installed; visible to the harness
[2026-04-30] refactor | projects-meta-skills — wiki path canon corrected: ~/projects/.wiki → ~/projects/projects-wiki/ (clone root), content at ~/projects/projects-wiki/.wiki/. Old path caused write/read mismatch bug (fixed upstream in commit 621a69f of projects-meta-mcp). Setup-projects-meta Phase 1 now detects legacy clone, Phase 4 re-clones to canon. Lesson: pull shared resources before relying on cached anchors
[2026-04-30] decision | using-projects-meta v1.1.0 — added mandatory Step 0 freshness gate: probe meta_status; if cache_age > 10min or errors > 0, node dist/sync.js; for shared-wiki writes unconditional git -C ~/projects/projects-wiki pull --ff-only; 401/403 → loud failure to user. Codifies the same-session lesson — projects-meta is a multi-machine bus, stale cache breaks read accuracy and write atomicity
[2026-04-28] decision | project-bootstrap@1.1.0 — added Step 5.6: detects superpowers@claude-plugins-official via ~/.claude/plugins/installed_plugins.json and prints install command + upstream link if missing; chat-only, never auto-installs (slash commands aren't callable from a skill, and silent plugin install is overreach)
[2026-04-28] doc | README.md + README.ru.md — new "Using skills in projects" / "Использование в проектах" section after install quick-start; describes project-bootstrap workflow (git, .gitignore, README, .wiki/, .tasks/, CLAUDE.md, manifest, superpowers-plugin check) and the init/upgrade modes
[2026-04-30] refactor | project-bootstrap re-run on this repo (upgrade mode) — setup-wiki noop, setup-tasks noop, CLAUDE.md unchanged (matches template), bootstrap-manifest.md written: project-bootstrap@1.1.0 / setup-wiki@1.0.0 / setup-tasks@1.0.0
[2026-04-30] decision | project-bootstrap@1.2.0 — CLAUDE.md template gains check across all projects (verbatim trigger from using-projects-meta description); installs auto-load cross-project tasks + shared-wiki access in every bootstrapped repo; no Step 5.7 dependency-check mirror — Prerequisites pointer in using-projects-meta is self-correcting; local CLAUDE.md, both READMEs, dist/.skill, projects-meta-skills concept page synced
[2026-04-30] decision | Step 5.7 mirror of Step 5.6 (projects-meta-mcp dependency detector / setup-projects-meta recommendation) accepted as future work; tracked as ⚪ Ready task [bootstrap-recommend-projects-meta]; deferred until first observed fresh-machine miss so detector signal is informed by real failure mode; concept page projects-meta-skills.md updated to reflect new stance
[2026-04-30] decision | project-bootstrap@1.3.0 — Step 5 upgrade path turned idempotent: read existing CLAUDE.md → substring-diff vs template → confirm → append-only-missing; closes silent gap where pre-1.2.0 projects never picked up new canonical triggers (check across all projects, we're on Windows); platform line preserved if user pinned a non-host one; concept page bootstrap-claude-md-merge.md written; README CLAUDE.md row updated to note idempotent merge
[2026-05-01] decision | pulling-before-work — new policy skill (v1.0.0): one git pull --ff-only at session start + on-demand re-sync; bootstrap template gains canonical trigger; project-bootstrap 1.3.0→1.4.0
[2026-05-01] decision | project-discipline — new policy skill (v0.1.0): four cross-project rules (conventions-over-defaults, master-only, semver-bumping, ask-before-push); bootstrap template gains canonical trigger; project-bootstrap 1.4.0→1.5.0; skill-versioning concept extended to all skills
[2026-05-01] ingest | shared-wiki packages/claude-skills — каталог всех 20 скиллов опубликован в projects-wiki (3 commits: page + index + log on Gitea, ae2cc9a..001cdd0); группировка bootstrap / wiki+tasks / MCP / caveman / discovery+platform; cross-link с concepts/setup-using-skill-pair и packages/projects-meta-mcp
[2026-05-05] ingest | concepts/interns-design
[2026-05-05] decision | interns-skills-mvp — shipped setup-interns v0.1.0 (8-phase install: detect .common/lib/interns-mcp/, pip install -e, .common/secrets/interns.env write, mcpServers.interns registration with absolute Python interpreter + cwd) and using-interns v0.1.0 (runtime policy mirroring project-discipline Rule 4: ask-mode default, conversational grant/revoke, always-ask paths for .env/secrets/keys/SSH/credentials with transitive rule, cost-cap >$0.10, session-end reset; routing hints for bulk_text_read + transcript_distill); project-bootstrap 1.5.0→1.6.0 with canonical CLAUDE.md trigger delegate to interns when allowed between follow project discipline and we're on Windows, Step 5 commentary paragraph, manifest table extended with both new skills + project-discipline row; root CLAUDE.md dogfood updated; both READMEs written; descriptions verified (setup-interns 899 chars, using-interns 814 chars, both under 900 budget); all three rebuilt + installed + listed by harness with full descriptions (no H1 fallback)
[2026-05-05] ingest | concepts/bootstrap-skill-deps-check
[2026-05-05] decision | bootstrap-skill-deps-check — project-bootstrap 1.6.0→1.7.0 collapses Step 5.6 from a single-skill detector (only superpowers plugin) into a generic trigger → fulfiller table walker. Map embedded in SKILL.md (9 rows: caveman, superpowers plugin, using-wiki, using-tasks, using-projects-meta, pulling-before-work, project-discipline, using-interns, active-platform); kind: skill vs kind: plugin flag drives the install command emitted in the recommendation block. Algorithm: read project's CLAUDE.md → match each line vs map (substring + tolower, mirrors Step 5 idempotent merge) → for each canonical match check disk (~/.claude/skills/<name>/SKILL.md or installed_plugins.json key); print one chat-only block listing every missing fulfiller + install commands, or one ✅ line if all satisfied. User-custom lines silently skipped; removed canonical lines silently skipped (respects user opt-out). Hard rule "never auto-install" carries over verbatim. Subsumes the deferred [bootstrap-recommend-projects-meta] task (closed by absorption — generic step handles using-projects-meta along with everything else). MCP-server-backed skills only check the using-X policy skill; setup-X self-fires on first use via Prerequisites pointer, bootstrap doesn't duplicate.
[2026-05-05] decision | compress-dedup — skills/compress/ was a stripped-down byte-for-byte dupe of skills/caveman-compress/ (scripts/ identical SHA256 across all 7 files; SKILL.md diff = name: + Process step 2; descriptions textually identical = arbitrary harness tie-break + double-counted listing budget). Kept caveman-compress canonical: it carries README.md (benchmarks table + caveman-toolkit branding) and SECURITY.md (Snyk false-positive writeup), and matches the caveman-* prefix invariant. Ported the better Process-step wording from compress into caveman-compress (cd <directory_containing_this_SKILL.md> instead of brittle cd caveman-compress which assumes cwd). Added version: 1.0.0 to caveman-compress frontmatter (first versioned release; aligns with skill-versioning concept). Deleted: skills/compress/, dist/compress.skill, ~/.claude/skills/compress/ (manual prune — install.sh has no prune step; future [install-ps1] task should add --prune flag). Rebuilt + reinstalled caveman-compress. Slash-command impact: /compress removed; /caveman-compress + /caveman:compress (toolkit-canonical) remain. Concept page concepts/compress-dedup.md written (rationale + rejected alternatives: alias-stub has no harness mechanism; "keep both" wastes listing budget; "delete caveman-compress" loses README + SECURITY).
[2026-05-05] design | active-platform-eval (paused) — combined [active-platform-tuning] + [active-platform-eval] into one workstream (eval is the tuning mechanism; "wait for 5 real signals" was a placeholder). Spec written at .wiki/concepts/active-platform-eval-design.md: 20-query trigger eval set balanced ≥3 should-trigger per OS (Win/Lin/Mac) + near-miss negatives, run in skill-creator/scripts/run_loop.py (5 iter, train/test split, model claude-opus-4-7) in parallel with manual body sweep (WSL clarity, BSD/macOS expansion, ambiguity policy). Workspace at .tasks/active-platform-eval/ (eval-set.json committed, iterations gitignored). Version bump 1.0.0 → 1.1.0 planned (MINOR). Pre-flight verified: claude CLI at C:\nvm4w\nodejs\claude.ps1 (Claude Code 2.1.128) + run_loop.py present in skill-creator install — both autoloop deps satisfied, no fallback needed. Per-task file at .tasks/active-platform-eval.md. Paused at user request before eval-set authorship; resume point is Q2 (write 20 queries solo vs run skill-creator HTML-review template for user edits first). Also fixed in same pause: [install-ps1] STATUS scope expanded to "paired install.sh + install.ps1, cross-platform parity, --prune flag" (lesson from [compress-dedup]).
[2026-05-05] ingest | concepts/interns-repo-read-design
[2026-05-06] ingest | concepts/hermes-skills-rollout-design
[2026-05-07] ingest | concepts/tdd-criteria-design
[2026-05-07] review | tdd-criteria v0.2.0 — 4 findings applied: trigger-loophole fix (removed session-authorship clause), composite-tasks + refactoring sections, expanded file-extension list, clarified wrapper line-count + spike-survivor fallback + foreign-schema fix; design doc synced
[2026-05-10] decision | project-bootstrap-meta-isolation — v1.11.0 ships meta-isolation block in .gitignore template + Step 1 upgrade-case append; restores agent meta-paths visibility against global core.excludesFile; smoke-tested greenfield + negative control + idempotency
[2026-05-22] ingest | concepts/interns-grep-audit-design
[2026-05-25] decision | session-handoff-skill-design — design rationale for the session-handoff skill captured in wiki after cluster 7/7 closure; sliding overwrite of .tasks/NEXT_SESSION.md, phrase whitelist + substantive-commit heuristic, opt-in PostToolUse hook, orient+ask default, source: ~/projects/.workshop/.archive/2026-05-24-session-handoff-skill.md Round 1 + Round 2
[2026-05-25] decision | install-cross-platform — install.{ps1,sh} paired-script parity contract documented; --prune / -Prune flag rationale (combined-with-install, global-scan ignores names filter, default-off, print-and-delete no prompt); shipped in commit 6cf0e98 with [skip-tdd: wrapper] carve-out + smoke-test evidence; closes 2/3 of [install-ps1] acceptance (the doc + flag), dist/-prune analogue deferred to build scripts
[2026-05-25] decision | install-cross-platform extended to build scripts — build.{ps1,sh} get the symmetric --prune / -Prune flag (removes dist/<name>.skill where <name> is not in skills/). Bash delegation to powershell.exe -File build.ps1 does NOT forward the flag — bash runs prune itself against the shared dist/. Both paths smoke-tested with fake stale .skill files against real dist/. Closes [install-ps1-build-prune-followup].
[2026-06-09] decision | delegate-task-negative-trigger-fp — delegate-task 0.2.0→0.2.1 (PATCH): fixed 5/5-consistent false-positive on «создать задачу себе». Root cause: self-task phrase shares stem «создать задачу» with the «создать задачу на агента» positive trigger; the abstract "Does NOT apply when doing the work yourself" carve-out can't beat a literal stem-match under the 1%-rule. Fix: made the negative literal + routed («создать задачу себе» / «task for myself» / «поставить себе задачу» → using-tasks) in description + body disambiguator («на агента»/«агенту» = delegate; «себе» = own board). Re-verified via fresh-context subagent trigger run: positives 5/5 (no regression), negative 4/5 → using-tasks (was 0/5); the 1 residual miss was an eval-harness artifact (forced skill-name-before-reasoning), not description ambiguity. Concept page written; reusable principle = put the exact colliding negative phrase with an explicit →sibling route, literal beats abstract.
[2026-06-09] decision | delegate-task-session-break — delegate-task 0.2.1→0.2.2 (PATCH): authoring side of the session_break marker (consumer = using-tasks v1.2.0). Added pre-flight Q6 (after notify): "Session-break после этой задачи? (domain-switch / milestone / heavy infra)"; if yes → set optional template field session_break: true | "<hint>" (trailer, next to weight/notify/allow_upgrade; same lowercase frontmatter key using-tasks reads). Usage guidance lists three set-it cases; What-NOT-to-do bullet warns against setting it routinely (it's a real-boundary marker, not a default). Wiki concept page concepts/delegate-task-session-break.md + index. Pairs with using-tasks-session-break.
[2026-06-09] decision | using-system-snapshot — new skill v0.1.0: thin read-only wrapper over the single mcp__projects-meta__meta_system_snapshot call (poller status + local docker containers + cached cross-project task summary). Replaces the scatter of tasklist + docker ps + manual meta_status. Core rule: no claim about poller / local-docker / task-load state without calling the tool in the current turn (memory + stale earlier snapshot ≠ evidence). Output = three lines, one per section (docker lists only problem containers; tasks gives Σ active/blocked + busiest 2–3). Liveness split documented: poller+docker live, tasks from cache (defer precise work to using-projects-meta Step 0). Scope boundaries: deep single-container diagnosis → using-vds-ops / docker logs; docker section is LOCAL, not the VDS. Read-only, no per-session grant (mirrors using-vds-ops). Output shape verified by a live call 2026-06-09. Concept page concepts/using-system-snapshot-design.md + index. TDD N/A (markdown policy artifact); behavioral smoke-test = paired skill-using-system-snapshot-review task.
[2026-06-09] review | using-system-snapshot v0.1.0 — VERDICT PASS on all 3 acceptance criteria (skill-using-system-snapshot-review). Tool contract verified by a live meta_system_snapshot call (output matches the documented poller/docker/tasks shape exactly). Behavioral trigger smoke = 9 fresh-context subagents over a simulated registry (real descriptions + using-vds-ops/using-projects-meta/using-tasks competitors, no expected-answer hint): 4/4 positives → using-system-snapshot; VDS-logs → using-vds-ops; mutate/full-board → using-projects-meta; docker-compose.yml edit → none (no FP on "docker" keyword). No-claim-without-snapshot rule explicit in 4 places; three-line output format confirmed achievable against the live payload. 3 informational findings (none blocking): (1) cross-project task-COUNT phrasings overlap with using-projects-meta — by-design, snapshot defers precise per-task work; (2) LOCAL-container deep diagnosis is unowned — vds-ops incident triggers grab local containers its VDS-only tools can't reach (vds-ops scoping, not this skill); (3) deployment scaffold missing — skill committed but not installed to ~/.claude/skills/, not in hermes/mapping.yaml, no -install/-hermes-mapping/-test-trigger baseline tasks; recommended follow-ups (hermes mode could be auto, read-only skill). Review outcome appended to concepts/using-system-snapshot-design.md.
[2026-06-09] decision | using-tasks-status-archival — using-tasks 1.2.0→1.3.0 (MINOR): added done-task archival rule to fix STATUS.md bloat ("huge STATUS.md" complaint). When ≥10 🟢 done blocks pile up — checked at session start (step 7) and after close (Task completion step 7) — move them verbatim to .tasks/archive/YYYY-MM.md (append, one file per month, one-time header), leaving only 🔴/🟡/⚪/🔵 on the board; committed on its own. Did NOT follow the task's literal instruction to replace Read STATUS.md with tasks_get_status for orientation: that tool returns a single task's live status by known slug ({status, found}) and cannot enumerate the board, and tasks_aggregate is cross-project + cache-based + doesn't index ready/done (its docs say read STATUS.md directly for the current project). So orientation stays a local board-read (kept cheap by archival); skill now warns against both tools for board enumeration and points tasks_get_status at its real single-task use. Core goal (kill the bloat) met by archival alone. Concept page concepts/using-tasks-status-archival.md + index. TDD N/A (markdown policy). Deviation flagged for paired review task using-tasks-status-read-perf-review.
[2026-06-09] decision | using-tasks-session-break — using-tasks 1.1.0→1.2.0 (MINOR): added the session_break marker. Task author sets session_break: true | "<hint>" in task frontmatter (mirrored as **Session break:** on the local board); after the task closes 🟢, before tasks_claim_next, an autonomous agent prints the verbatim line 🔚 SESSION BOUNDARY — [slug] закрыта. Рекомендую завершить текущую сессию. Следующий трек: [value | "см. STATUS.md"] and stops instead of chaining the next task. Absent → behaviour unchanged. Enforced in Task completion step 6 + Rules bullet + format docs. Marker not heuristic: the stop-point is an authoring choice, not a runner guess.
[2026-06-09] review | using-tasks-status-archival v1.3.0 — VERDICT PASS 3/3 (using-tasks-status-read-perf-review). Criterion «ориентация через tasks_get_status, не Read» is satisfied by a validated deviation, not a literal swap: re-verified against the live tool schema that tasks_get_status(target_project, slug)→{status, found} takes a required slug and returns ONE task — it cannot enumerate the board, so it cannot drive orientation; the implementer correctly rejected the impossible instruction and fixed the real problem (bloat→archival). No regression: orientation still reads local STATUS.md (Session start §2) and the «what's next» flow still reads the board — change is purely additive. Archival rule clear & complete (≥10 threshold, two trigger points, monthly append-only archive, verbatim blocks, dedicated commit, cross-referenced). One informational non-blocking note: this repo's own STATUS.md (>10 🟢) would itself trip the rule — dogfooding tracked separately as tasks-board-cleanup-2026-05. No follow-up tasks. Verdict appended to concepts/using-tasks-status-archival.md.
[2026-06-09] decision | delegate-task-review-weight — delegate-task 0.2.2→0.2.3 (PATCH): Step 5 (paired <slug>-review task) now sets an explicit weight, inherited from the impl-task with a needs-claude floor (impl needs-human→review needs-human; needs-claude→needs-claude; cheap-ok→needs-claude). Root cause of commit c0af151 ("add Weight: needs-claude to 4 review tasks — reconciler was skipping them"): the authoring skill omitted weight on review tasks, making them invisible to fleet routing. Floor (not pure inheritance) chosen to stay internally consistent with the skill's own "What NOT to do" bullet that forbids cheap-ok for review tasks — a cheap-ok impl would otherwise propagate a forbidden cheap-ok review. Added a What-NOT-to-do bullet against weightless review tasks. Concept page concepts/delegate-task-review-weight.md + index. TDD N/A (markdown policy artifact).
[2026-06-11] decision | task-format — new skill v0.1.0: public reference for the .tasks/STATUS.md task-block format the autonomous poller parses. Motivation: the field rules (**Weight:** capability/cost tier, **Notify:** <owner>/<repo> inbox target, header regex, status emoji) lived only in internal sources (projects-meta-mcp/src/lib/status-md.ts parser + status-md-writer.ts + .common/.wiki/concepts/agents-task-runner-ops.md); skills ship with factory to external users, the wiki/MCP-source don't. Scope kept distinct from delegate-task (creates tasks for others via tasks_create, the tool emits the format) and using-tasks (board claim/close mechanics) — task-format is the byte-level field reference for hand-edited blocks. Ground truth verified against source: header /^##\s+(\S+)\s+\[([^\]]+)\]\s+—\s+(.+)$/u; Weight ∈ {cheap-ok, needs-claude, needs-human}; claim gate excludes only needs-human (claim.ts), but a missing Weight finds no backend tier (fleet-router.js resolveBackend) → poller parks to 🔵 blocked, so Weight is operatively required for pickup. TDD per writing-skills: RED = 3 baseline subagents w/o skill (2/3 used ###/bullet headers the parser can't recognize, 2/3 omitted Weight inventing risk/tier/claimable-by, 2/3 put notify in prose, 1/3 used 🟢 for ready); GREEN = 2 fresh subagents w/ skill, both parser-valid incl. correct needs-human for the critical-infra scenario; REFACTOR = no new loopholes. Reference skill ~900 words (loads only when authoring a task block). Concept page concepts/task-format-design.md + index. Not yet installed to ~/.claude/skills/ or added to hermes mapping — deferred follow-up (mirrors using-system-snapshot deployment-scaffold note).
[2026-06-09] decision | using-markitdown-cli-migration — using-markitdown 1.0.0→1.0.1 (PATCH): rewrote the skill from the Docker-based mcp__markitdown__convert_to_markdown MCP tool to the native markitdown CLI (v0.1.6, on PATH). Tool block now markitdown <path|url> → stdout (or -o file); removed the whole "Docker-mount caveat (READ FIRST)" section (host→container file:// translation + [Errno 2] /c:/Users/... symptom are gone — CLI sees the full host FS). Updated the ingest pattern (use -o straight into .wiki/raw/), the gotchas table (command not found → check markitdown --version, install pip install markitdown[all]; dropped the MCP "tool not available / ToolSearch" row), and the contrast-table header (CLI, not MCP). Description frontmatter (the WHEN-to-use triggers) left unchanged. Container decommission: the task's literal docker stop/rm markitdown-mcp had no target — no container is named that; the MCP spawns anonymously-named containers from markitdown-mcp:latest per session (3 had piled up). Removed all by image ancestor (docker rm -f $(docker ps -aq --filter "ancestor=markitdown-mcp:latest")), verified none remain. Left the mcpServers.markitdown entry in ~/.claude.json untouched (out of scope; a container will respawn next session until it's deregistered — flagged as a follow-up). Concept page concepts/using-markitdown-cli-migration.md + index. TDD N/A (markdown skill).
[2026-06-17] decision | session-inbox-monitor-received-msg-fp — finding from session-inbox-monitor-test-trigger (VERDICT PASS, clean session, 7 unprimed clean-context subagents: pos 4/4 incl. CLAUDE.md-line P4, neg 2/3). The 1 FP: RU «обработай полученное письмо из инбокса» (N1) routed to session-inbox-monitor; the EN twin (N3) and the multi-machine-backend negative (N2) routed to none cleanly. Root cause = a new dimension on top of delegate-task-negative-trigger-fp: the carve-out is already literal+routed (NOT for handling a received message → inter-session-peer-discipline), but the route target inter-session-peer-discipline is not installed → no real competitor, so the nearest in-domain skill (session-inbox-monitor) wins by default; non-deterministic, self-corrects on body-load (cost = one wasted skill-load, not a wrong action; isomorphic to using-tasks-session-break session_break). New page concepts/session-inbox-monitor-received-msg-fp.md + bidirectional link from concepts/delegate-task-negative-trigger-fp.md + index. New reusable principle: a routed negative competes only if its route target is installed. Status OPEN — follow-up task session-inbox-monitor-received-msg-fp (options a: harden description / b: install sibling / c: accept informational). Not a memory entry by owner direction — knowledge belongs in the project wiki.
[2026-06-17] decision | session-inbox-monitor-received-msg-fp RESOLVED via option (b) — installed inter-session-peer-discipline (existed in sources since 2026-06-16, was not installed → exact root cause confirmed). install.ps1 -Names, byte-identical parity. FP-twin verified clean: fresh clean-context subagent on the N1 phrase now routes to inter-session-peer-discipline (IN_REGISTRY: yes), not session-inbox-monitor — carve-out now has a real competitor. session-inbox-monitor description untouched (option (a) rejected as whack-a-mole; (c) as latent hole). Governance: peer workshop proposed (b) as a "ruling"; per the freshly-installed inter-session-peer-discipline (peer = proposal not authority, scope needs human ratification) it was surfaced as a recommendation and ratified by the user — live dogfood of the skill's own purpose. concepts/session-inbox-monitor-received-msg-fp.md Status section updated open→resolved. Tail: inter-session-peer-discipline now installed but not in hermes/mapping.yaml — possible red build, flagged as separate follow-up.