Closes session-inbox-monitor-encoding-guard-followup (finding from -review
structural audit item E, CONCERN).
inbox-monitor.ps1 emitted ConvertTo-Json (incl. the interpolated inbox path)
to a redirected pipe under WinPS 5.1 without setting [Console]::OutputEncoding
— the same context that mojibaked stop-dispatcher. ASCII-safe today, but the
inbox path is user-data, so a non-ASCII path/content would mangle the inject.
- Add [Console]::OutputEncoding + $OutputEncoding = UTF8 after the $ProjectDir
gate (mirror of stop-dispatcher.ps1). Comment text kept pure ASCII.
- Regression under WinPS 5.1: parse 0 errors; ran hook against a Cyrillic-path
project, read raw stdout bytes as no-BOM UTF-8 -> JSON valid, Cyrillic path
round-trips intact.
- Re-deployed to ~/.claude/hooks/inbox-monitor.ps1, SHA256 byte-identical.
- SKILL.md Mojibake failure-mode extended; version 0.2.1 -> 0.2.2 (PATCH).
install/hermes/dist not rebuilt — PATCH needs only reload-plugins; the runtime
hook is deployed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Self-contained checklists + sources for the three tracks that unblock together:
session-inbox-monitor-review (umbrella), inter-session-peer-discipline-test-trigger,
and -review. Includes the clean-context-subagent method, acceptance items, design
sources, and the resolved FP note.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Un-reds the hermes build (build fails on unmapped skills in skills/; this skill
landed in sources 2026-06-16 unmapped). Entry is mode:pending, intended auto/meta
— a purely behavioral governance skill (no tool-side effects) that should pass a
non-implementer test-trigger + review before auto-firing. Filed ⚪
inter-session-peer-discipline-test-trigger + 🔵 -review.
Zone confirmed claude-skills (skill lives in this repo). Human-ratified; workshop
coordinated as a peer proposal, not authority (per the skill itself). YAML validated
(33 skills, 9 pending). Schema version untouched.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Root cause confirmed: the carve-out routed to inter-session-peer-discipline,
which existed in sources but was not installed -> no competitor in the registry,
nearest in-domain skill won. Fix = install the sibling (byte-identical parity).
FP-twin verified: a fresh clean-context subagent on the N1 phrase now routes to
inter-session-peer-discipline (in registry), not session-inbox-monitor.
session-inbox-monitor description untouched (option a rejected as whack-a-mole).
Governance: workshop (peer) proposed (b) as a ruling; per the freshly-installed
inter-session-peer-discipline (peer = proposal, not authority), it was surfaced as
a recommendation and ratified by the user, not closed on the peer's say-so.
Closes session-inbox-monitor-received-msg-fp. Wiki concept Status open->resolved.
Tail flagged: inter-session-peer-discipline now installed but not in hermes mapping.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
-review next (NON-implementer session only); open informational FP follow-up
session-inbox-monitor-received-msg-fp. Autopush grant resets next session.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
session-inbox-monitor-hermes-mapping -> done: added to hermes/mapping.yaml
pending section, mode:pending + intended {auto, productivity} (mirrors the
session-handoff sibling). Reason cites the settings.json mutation, the OS
process kills, and the Windows-PowerShell hook needing a Linux port for Hermes.
Schema version untouched (schema, not content). YAML validated (32 skills).
session-inbox-monitor-install -> done: install.ps1 -Names session-inbox-monitor,
byte-identical (diff 0), v0.2.1; activation confirmed live this session (harness
picked the skill into available-skills with full description, no /reload-plugins).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Closes session-inbox-monitor-stophook-utf8-fix. Cyrillic message bodies arrived
as mojibake when force-delivered via the Stop-hook block reason.
Root cause: ~/.claude/hooks/stop-dispatcher.ps1 reads bodies with -Encoding UTF8
(fine) but did NOT set [Console]::OutputEncoding, so ConvertTo-Json to stdout
under a harness-spawned redirected pipe (WinPS 5.1) emitted in OEM cp866.
Fix applied to the machine-local hook (not in git): set
[Console]::OutputEncoding/$OutputEncoding = UTF8 at the top. In-situ RED->GREEN
verified through the real Stop-hook path: a Cyrillic pangram that previously came
back as mojibake now delivers clean; no-loop holds.
Repo changes: SKILL.md Failure modes documents the encoding contract for inbox
writers (no-BOM UTF-8 LF; WriteAllText, not Set-Content -Encoding utf8 which BOMs
under 5.1); bump 0.2.0 -> 0.2.1 PATCH. stop-dispatcher.ps1 multi-machine
propagation is the workshop setup's concern (notified).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
session-inbox-monitor-stophook-blockfix-proof -> done. Live proof: planted a
self-test message in .claude-inbox/, ended the turn, and the Stop hook force-
re-invoked the session with the message as a decision:block reason (no user
Enter). No-loop confirmed (inbox empty after delivery, message in .read/). The
live Monitor also paged the same file end-to-end.
Finding (orthogonal to the block mechanism, independently confirmed by workshop):
Cyrillic message bodies arrive as mojibake on inject. On-disk file is clean
UTF-8; stop-dispatcher.ps1 reads with -Encoding UTF8 (line 44) but does NOT set
[Console]::OutputEncoding, so ConvertTo-Json to stdout under harness-spawn
(WinPS 5.1, redirected pipe) encodes as OEM cp866. Start-Process repro does not
reproduce (inherits UTF-8) -> harness-spawn-specific, in-situ verify only.
Filed session-inbox-monitor-stophook-utf8-fix.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Core content task of the session-inbox-monitor line. Two deliverables:
1. SessionStart hook `skills/session-inbox-monitor/hooks/inbox-monitor.ps1`
(versioned for multi-machine rollout; deployed to ~/.claude/hooks/ and
registered in ~/.claude/settings.json SessionStart):
- sweep: Get-CimInstance | Stop-Process orphaned monitors of THIS inbox,
matched by sentinel CLAUDE_INBOX_MONITOR + inbox path (a /clear leaves
the poll process alive -> re-raise without sweep stacks duplicates);
- inject: hookSpecificOutput.additionalContext with the exact persistent
Monitor command (Monitor tool, not background Bash);
- opt-in gate: fires only on .claude-inbox/ dir or CLAUDE.md trigger line.
ASCII-only (em-dash -> mojibake under WinPS 5.1 without BOM, fixed).
2. SKILL.md body filled (When to use / Inputs / Steps / Deployment /
Failure modes / Side effects / What NOT to do); bump 0.1.0 -> 0.2.0 MINOR.
Headless: no hook-level signal exists (verified via claude-code-guide) ->
agent-side best-effort skip, default errs toward raising (false-skip in
interactive loses the feature; false-raise in headless is a harmless no-op).
Live-verified: inject -> valid JSON; sweep -> killed a planted orphan (PASS);
real Monitor tool spawns a bash process carrying the sentinel (sweep will
find real orphans); settings.json stays valid. Sweep over-match edge and
multi-session-per-project limit documented honestly in Failure modes.
Closes [session-inbox-monitor-sessionstart-hook].
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Live clean-session run (this session did NOT install the skill). Probe
confirmed subagents inherit the REAL installed registry (task-loop present,
description verbatim = SKILL.md) — upgrade over dev-time simulated proxy.
Trigger-discrimination: positives 6/6 -> task-loop; negatives clean
(delegate-task, using-tasks after deconfound, configure-poller -> none with
explicit task-loop exclusion); task-loop false-positive 0/3.
Behavioral (skill body loaded) 4/4: consult-gate human-only -> STOP before
close; session_break -> SESSION BOUNDARY + STOP; empty -> stop+report no poll;
long-watch -> single ScheduleWakeup >=1200s, not CronCreate.
Finding (informational, non-blocking): session_break is the fragile gate — its
STOP semantics live only in the body (step 6), invert to soft-checkpoint when
reasoning from description alone; correct with body loaded. No fix needed
(rule triple-stated; using-tasks is REQUIRED SUB-SKILL). No follow-up filed.
All 3 task-loop deployment baselines (install / hermes-mapping / test-trigger)
now closed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
task-loop orchestrates the projects-meta board cycle (tasks_claim_next /
tasks_close / tasks_update / tasks_heartbeat) and may arm a long ScheduleWakeup —
critical-infra-adjacent, so it lands in the behavioral-audit pending tier, not auto.
Promotion to auto gated on task-loop-test-trigger. Schema version untouched.
Closes [task-loop-hermes-mapping] (baseline 2/3).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
install.ps1 -Names task-loop → ~/.claude/skills/task-loop/SKILL.md (diff-identical to
source, v0.1.0). Post-/reload-plugins task-loop appears in available-skills with full
description (YAML parsed, RU/EN triggers present). Unblocks task-loop-test-trigger
(🔵→⚪ ready, needs clean session for live behavioral run).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Skill-review checkpoint for meta-host-routing v0.3.0 (non-implementer).
Behavioral smoke-test 8/8 via clean-context subagents: 5/5 positive
trigger phrases (RU+EN) route to meta-host-routing, 3/3 negatives routed
away (using-projects-meta / delegate-task[Skip-clause] / using-tasks).
Zero false positives. Steps verified against live infra: yt-tools resolves
to dedicated host OpeItcLoc03/meta-yt-tools (projects-meta tracks it),
.common grep returns hits, excludesFile + ~/.config/git/ignore + auth.toml
present. Failure modes -> STOP+ask; What-NOT-to-do accurate. No blocking
findings on the skill.
Observation (not a skill defect): the review-task acceptance criterion
'resolves .common' is stale — skill v0.3.0 and reality route yt-tools to
the dedicated meta-yt-tools host; .common now holds only the done-archive.
Caveat: -install and -hermes-mapping baselines remain open (skill not in
~/.claude/skills nor hermes/mapping.yaml); this review covers content +
trigger discrimination only, not live-harness activation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Public reference for the on-disk .tasks/STATUS.md block format the autonomous
poller parses: header regex, status emoji, and the **Weight:** / **Notify:** /
**Requirements:** fields. Ships with factory where the internal wiki and MCP
source can't reach. Distinct from delegate-task (MCP-tool delegation) and
using-tasks (board mechanics).
Authored via superpowers:writing-skills TDD:
- RED: 3 baseline subagents w/o skill — 2/3 used ###/bullet headers the parser
cannot recognize as a task, 2/3 omitted **Weight:** (invented risk/tier/
claimable-by), 2/3 put notify in prose, 1/3 used 🟢 for a ready task.
- GREEN: 2 fresh subagents w/ skill — both parser-valid, incl. correct
**Weight:** needs-human for the critical-infra scenario.
- REFACTOR: no new format loopholes.
Ground truth verified vs live source (status-md.ts parser, claim.ts gate,
fleet-router.js routing): missing Weight finds no backend tier -> poller parks
to blocked, so Weight is operatively required for pickup.
Closes [create-task-format-for-poller-skill]. Install to ~/.claude/skills +
hermes mapping deferred as follow-up.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>