Commit Graph

100 Commits

Author SHA1 Message Date
8205f5d758 fix(session-inbox-monitor): UTF-8 OutputEncoding forward-guard in SessionStart hook (v0.2.2)
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>
2026-06-17 12:05:15 +03:00
29d5e9ffa8 fix(session-inbox-monitor): force UTF-8 on Stop-hook delivery + writer guide v0.2.1
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>
2026-06-17 11:06:00 +03:00
c3e1ce7b40 feat(session-inbox-monitor): SessionStart hook + fill SKILL body v0.2.0
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>
2026-06-17 10:48:50 +03:00
cf08fdeea7 feat(skills): add session-inbox-monitor v0.1.0 (promoted from .workshop/.brainstorm/session-inbox-monitor.md) 2026-06-17 10:28:47 +03:00
9954356a4a feat(setup-agents-task-runner): L2 installer skill for standing-duty service
poller-service-deploy-via-factory (fork 1). New skill v0.1.0 — installs the
standing-duty stack as platform-native services (systemd/launchd/winsw):
no node window, OS-supervised autostart+crash-restart, run-as-user, deploy-boundary.

- fetches winsw (pinned v2.12.0 + SHA256-verify, not vendored; STOP on placeholder)
- installs DISARMED: scope is runtime config (poller-scope.json), arming is a
  separate operator step via the appeals-inbox pult; never carries POLLER_PROJECTS/DRY_RUN
- confirmation gates: discovery (read-only) -> plan -> writes; rollback section
- tears down the legacy start-worker.ps1 Scheduled Task (no double-claim)
- dist/setup-agents-task-runner.skill rebuilt

[skip-tdd: visual] — installer docs + OS service config, no testable pure logic.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 10:28:47 +03:00
013913bcc2 feat(skills): inter-session-peer-discipline v0.1.1 — multi-session caveat
Add the channel contract (inbox = comms only; tasks via meta tasks_*)
and the multi-session caveat: don't assert a peer override from partial
vision — the human may have ratified in a channel you can't see; ask
first. Both earned 2026-06-16.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 11:12:54 +03:00
b292f1a5a2 feat(skills): add inter-session-peer-discipline
Codifies the inbox/peer-channel discipline that emerged 2026-06-16:
- a peer agent session's messages are proposals, not authority; the
  human is the only source of direction and scope.
- never report a peer-driven (or self-driven) design escalation as a
  settled decision without explicit human ratification.
- channel contract: the inbox carries discussion/help/notification only;
  tasks themselves go solely through meta tasks_* (board = source of truth).
- guards the echo-chamber failure mode (two sessions inflating scope past
  the human) and its circuit-breaker.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 10:39:10 +03:00
255dbc777f feat(skill): add ralph-loop-execution — agent inner loop with verifier oracle
Verifier field (exit-code oracle) + Attempts tracking + re-queue on fail.
Design: OpeItcLoc03/workshop/.brainstorm/ralph-loop-inner-execution.md
2026-06-15 22:51:16 +03:00
0016c458d1 feat(task-loop): new skill for in-session board draining v0.1.0
Interactive claim -> work -> close -> repeat loop in the current session;
no daemon, no spawned claude, no busy-poll. Coordinates with using-tasks
(.tasks/.lock, session_break gate, 10-min claim TTL -> tasks_heartbeat) and
project-discipline (push Rule 4, sensitive artifacts).

TDD (writing-skills RED-GREEN-REFACTOR):
- RED: 2 clean-context subagents revealed gaps A-E (claim scope, missed
  session_break + .lock, consult-gate boundary, paused-vs-blocked).
- GREEN: SKILL.md addresses all five; compliance subagent B clean.
- REFACTOR: closed CronCreate loophole in long-watch (separate session =
  daemon); mandate ScheduleWakeup on this session. Re-test passed.

Semver: 0.1.0 (initial).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 17:33:35 +03:00
13abe176fd feat(using-tasks): session lock guard v1.4.0
Adds `.tasks/.lock` awareness to the `using-tasks` skill:

- Session start new step 1: read `.tasks/.lock`; if type:"agent" with
  heartbeat ≤10 min → hard warning + require user confirmation; stale
  lock (TTL expired) → silently overwrite; absent/cleared → write
  type:"interactive" lock (120-min TTL).
- Session end new step 1: delete `.tasks/.lock` when type:"interactive".
- Structure section: `.lock` entry with gitignored callout.
- Rules bullet: "Honour `.tasks/.lock`".
- `.gitignore`: adds `.tasks/.lock` (ephemeral runtime state).
- dist/using-tasks.skill rebuilt.

Closes [using-tasks-session-lock].

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 12:57:48 +03:00
a71ed9bf07 feat(task-format): new skill v0.1.0 — poller task-block format reference
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>
2026-06-11 12:23:25 +03:00
fdc94e08cf refactor(using-markitdown): rewrite MCP→CLI, drop Docker section v1.0.1
Replace all mcp__markitdown__convert_to_markdown invocations with the
native `markitdown <path|url>` CLI (v0.1.6, on PATH). Outputs to stdout
or `-o <file>`; sees the full host filesystem, so the Docker bind-mount
caveat (host→container file:// translation, [Errno 2] /c:/Users/...) is
gone and that whole section is removed. Updated the ingest pattern (-o
straight into .wiki/raw/), gotchas table (command-not-found → check
`markitdown --version`), and contrast table header (CLI, not MCP).
Description triggers unchanged. PATCH bump 1.0.0→1.0.1; dist artifact
rebuilt.

Decommissioned the Docker MCP containers: no container is named
`markitdown-mcp` (the server spawns anonymous ones from
markitdown-mcp:latest, 3 had piled up); removed all by image ancestor.
Left mcpServers.markitdown in ~/.claude.json untouched (out of scope) —
flagged as a follow-up in the concept page.

Wiki: concepts/using-markitdown-cli-migration.md + index + log.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 20:48:18 +03:00
fedb6fc1cd fix(delegate-task): inherit review-task weight from impl (floor needs-claude) v0.2.3
Step 5 created the paired <slug>-review task without a `weight`, so fleet
routing/reconciler skipped it (root cause of manual patch c0af151). Now the
review task sets weight explicitly, inherited from the impl-task with a
needs-claude floor:
  impl needs-human  -> review needs-human
  impl needs-claude -> review needs-claude
  impl cheap-ok     -> review needs-claude (floor)

Floor (not pure inheritance) keeps the doc internally consistent with the
existing "What NOT to do" bullet that forbids cheap-ok for review tasks.
Added a What-NOT-to-do bullet against weightless review tasks. PATCH bump.
Wiki: concepts/delegate-task-review-weight.md + index + log.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 19:53:05 +03:00
afb1d1eb96 feat(using-tasks): done-task archival rule, fix STATUS.md bloat (v1.3.0)
MINOR bump 1.2.0 -> 1.3.0. Adds a done-task archival rule: when >=10
green done blocks pile up in STATUS.md (checked at Session start step 7
and Task completion step 7), move them verbatim to
.tasks/archive/YYYY-MM.md (append, monthly file, one-time header,
committed on its own), leaving only active/paused/ready/blocked on the
board. This is the root-cause fix for the recurring "huge STATUS.md"
complaint -- orientation still reads the local board, but the board is
kept small so the read stays cheap.

Deliberately did NOT follow the task's literal instruction to swap
Read STATUS.md for tasks_get_status in the orientation flow: that rests
on a factual error. tasks_get_status returns ONE task's live status by a
known slug and cannot enumerate the board; tasks_aggregate is
cross-project + cache-based and does not index ready/done (its docs say
read STATUS.md directly for the current project). So no projects-meta
tool replaces the orientation board-read. The skill now warns against
both tools for board enumeration and points tasks_get_status at its real
single-task use.

Concept page concepts/using-tasks-status-archival.md + index + log
document the deviation for the paired review task. TDD N/A (markdown
policy). hermes/mapping + install untouched (separate baseline tasks).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 16:50:37 +03:00
49e5c1dd5c feat(using-system-snapshot): new skill v0.1.0
Thin read-only skill wrapping the single meta_system_snapshot MCP call
(poller status + local docker + 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. Output = three lines,
one per section (docker lists only problem containers; tasks gives
Sigma active/blocked + busiest 2-3 projects). Liveness split documented
(poller+docker live, tasks from cache). Scope boundaries: deep single-
container diagnosis -> using-vds-ops / docker logs; precise per-task work
-> using-projects-meta. Read-only, no per-session grant.

Output shape verified by a live snapshot call 2026-06-09.
Wiki: concepts/using-system-snapshot-design.md + index + log.
TDD N/A (markdown policy artifact); behavioral smoke-test = paired
skill-using-system-snapshot-review task.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 16:44:34 +03:00
5e3c01622e feat(delegate-task): session_break authoring field [v0.2.2]
Add the authoring side of the `session_break` marker whose consumer
side shipped in using-tasks v1.2.0. At delegation time the author can
now mark a task so that, after it closes, an autonomous runner pauses
instead of chaining the next task.

- Pre-flight gate 5->6 questions: new Q (item 5, after notify) —
  "Session-break после этой задачи? (domain-switch / milestone /
  heavy infra)". Yes -> set session_break in body; no -> omit
  (default unchanged).
- Template trailer gains optional `[**session_break:** true |
  "<hint>"]` with inline comment (same lowercase frontmatter key
  using-tasks reads).
- Usage-guidance block: three set-it cases + tie to using-tasks
  Task-completion step 6 / SESSION BOUNDARY line.
- What-NOT-to-do bullet: don't set it routinely (real-boundary
  marker, not a default).
- Wiki concept page concepts/delegate-task-session-break.md
  (links using-tasks-session-break) + index + log.

PATCH bump: additive optional field + one pre-flight question, no
existing behaviour changed. Markdown policy artifact — no test
surface (TDD N/A). Closes [session-break-delegate-task].

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 16:38:52 +03:00
9a518fcb43 feat(using-tasks): session_break marker [v1.2.0]
Add a session_break marker so a task author can mark a task's
completion as a natural session boundary. After the task closes 🟢,
before tasks_claim_next, an autonomous agent prints the verbatim
SESSION BOUNDARY line and stops instead of chaining the next task.
Absent -> behaviour unchanged.

- STATUS.md format: optional **Session break:** field + new
  "### session_break marker" subsection (type bool|string, examples).
- Task completion step 6: after close, before claim-next, check the
  closed task's session_break; print boundary line + stop if present.
- Rules bullet "Honour session_break".
- Wiki concept page concepts/using-tasks-session-break.md + index + log.

MINOR bump: new optional capability, no existing behaviour changed.
Closes [session-break-using-tasks].

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 16:34:13 +03:00
8b22d16c20 fix(delegate-task): literal negative-clause kills self-task FP (0.2.0->0.2.1)
«создать задачу себе» false-positive-fired delegate-task instead of
using-tasks (5/5 trials, found by delegate-task-test-trigger). Root cause:
the self-task phrase shares the stem «создать задачу» with the positive
trigger «создать задачу на агента», and the abstract "Does NOT apply when
doing the work yourself" carve-out cannot beat a literal stem-match under
the using-superpowers 1%-rule.

Fix: make the negative literal + routed. Description now lists
«создать задачу себе» / «task for myself» / «поставить себе задачу»
-> using-tasks; body "Ne primenyaetsya" gains a self-assigned bullet plus a
disambiguator («на агента»/«агенту»/«в проект X» = delegate; «себе» = own
board). PATCH bump 0.2.0 -> 0.2.1.

Verification (fresh-context subagents, simulated available-skills registry,
no hint): positives 5/5 -> delegate-task (no regression); negative
«создать задачу себе на завтра» 4/5 -> using-tasks (was 0/5). The 1
residual miss reasoned correctly but tripped on an eval-harness artifact
(prompt forced skill-name-before-reasoning), not description ambiguity.

Wiki: concept page delegate-task-negative-trigger-fp.md + index/log.
Board: [delegate-task-description-fp-fix] -> done.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 12:42:44 +03:00
24db19b6b7 feat(hermes): map delegate-task as pending (MCP audit gate)
Add delegate-task to hermes/mapping.yaml. Mode: pending with intended {auto, mcp} — the skill calls mcp__projects-meta__tasks_create (cross-project Gitea side-effect), so it needs a behavioral audit via delegate-task-test-trigger before promotion to auto, mirroring the other MCP-touching pending entries (using-vds-ops, using-wiki-graph).

Bump delegate-task SKILL.md 0.1.0 -> 0.2.0 (project-discipline Rule 3).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 12:23:03 +03:00
5c6ee82b47 feat(delegate-task): add critical-infra gate to pre-flight (Q0)
New mandatory question 0: if task touches poller/MCP/deploy/CI infra →
weight: needs-human, no discussion. Prevents recursive self-modification
when poller is live.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-09 12:09:34 +03:00
f40cb77167 feat(skills): delegate-task v0.1.0 body — pre-flight gate, invoke template, steering-loop fields 2026-06-09 11:44:29 +03:00
1dc9ed3536 feat(skills): add delegate-task v0.1.0 (promoted from .workshop/.brainstorm/agent-task-delegation-format.md) 2026-06-09 11:43:17 +03:00
648b238b64 feat(using-wiki-graph): thin trigger skill for the wiki-graph MCP [v0.1.0]
skills/using-wiki-graph/SKILL.md — triggers on relational/structural wiki
questions («что связывает X и Y», path/neighbors/backlinks/orphans), routes to
mcp__wiki-graph__* instead of single-page reads (the 0%-recall failure mode).
Precondition: dense corpora only (modulair yes, sparse meta-wiki no).

hermes/mapping.yaml: registered as `pending` (intended auto/mcp, mirrors
using-vds-ops) — NOT promoted to auto; promotion gated on a
using-wiki-graph-test-trigger behavioral audit (instrument-touch).

Installed scoped via scripts/install.sh. Closes [wiki-graph-skill].
NOTE: build-hermes currently red on pre-existing unmapped skill 'meta-host-routing' (not this change).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-06 20:01:13 +03:00
8d7af3212b feat(private-dev-public-publish): fill skill body + review hardening v0.2.0
Second pass: filled the empty skeleton (When-to-use, Inputs, Steps, Failure
modes, Side effects, What-NOT) from the design archive
(.workshop/.archive/2026-05-29-skill-private-dev-public-publish.md). 0.1.0 -> 0.2.0.

Non-implementer subagent review found 3 findings, all fixed in this same increment:
- Step 5 dev->pub copy had no meta-exclusion -> would leak .wiki/.tasks/CLAUDE.md
  into the PUBLIC fork. Added explicit meta-exclude + .gitignore backstop +
  git-status check, plus a 4th failure mode for the leak.
- pub-folder origin was never established before Step 5 pushed to it -> Step 4 now
  clones the GitHub fork into pub (origin=fork, upstream=canonical).
- Step 3 "same base" was unmechanized -> clone fork, add gitea remote, push base.

Closes review task: all findings filed and resolved; no follow-ups needed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 17:07:36 +03:00
69091868cb feat(skills): add private-dev-public-publish v0.1.0
Skeleton (header + empty body) promoted from
.workshop/.brainstorm/skill-private-dev-public-publish.md. Body filled in a
second pass. No install/push/hermes — handled by baseline tasks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 16:57:36 +03:00
b065496deb fix(skills): meta-host-routing v0.3.0 — naming is meta-<project>, not <project>
v0.2.0 wrongly said the dedicated meta-host shares the project's name. Per
meta-out-of-repo design the convention is meta-<project> (e.g.
OpeItcLoc03/meta-yt-tools), so the bare <project> name stays free for a code
mirror. Fixed resolve step, example, and bootstrap instruction.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 13:33:52 +03:00
4355c34c18 feat(skills): meta-host-routing v0.2.0 — dedicated-host resolve + bootstrap
Resolve order now prefers a dedicated same-name Gitea meta-host (e.g.
OpeItcLoc03/yt-tools) over a shared host (.common). Adds Bootstrapping a
new meta-host section incl. the git add -f gotcha (global core.excludesFile
ignores .wiki/.tasks in fresh clones). yt-tools relocated to its own host
2026-05-27.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 13:33:51 +03:00
a19a23779a feat(skills): add meta-host-routing v0.1.0
Resolve where a project's meta lives before tasks_create/knowledge_ingest/
promotion. Github-hosted projects (or any 'not in cache' in projects-meta)
keep .tasks/.wiki in a sibling Gitea host repo (meta-out-of-repo design),
not in the github tree. Route MCP calls to the host, never guess.

Codified after an agent started writing yt-tools tasks into the github repo
instead of recalling yt-tools meta lives in .common.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 13:33:51 +03:00
957f4ab091 docs(using-yt-tools): align deprecation stub with shipped plugin install path (v0.4.1)
Stub claimed the plugin's SessionStart hook runs `pipx install yt-tools` (PyPI install). v1 retargeted to plugin-only distribution 2026-05-26 — the hook actually runs `pipx install --force "$CLAUDE_PLUGIN_ROOT[full]"` from the plugin's local clone (PyPI release deferred post-v1). Aligned 3 doc locations:

- frontmatter description (line 4) — describes local-clone install with [full]-default + core fallback.
- "Why the move" § (lines 17-20) — same alignment.
- "How to install the replacement" § (lines 31-35) — same alignment.
- "Source pointers" PyPI link (line 54) — qualifier "(deferred post-v1; not yet published)".

Frontmatter version bumped 0.4.0 → 0.4.1 (PATCH — docs-only, no behavior change). Stub still declares no trigger phrases — remains inert under invoke-by-name to avoid double-activation with the plugin's skill.

Closes part of yt-tools-distrib-docs-sync-pypi-deferred (R4 location 4-of-4).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 10:15:46 +03:00
d83c1c9fec chore(using-yt-tools): deprecate — migrated to OpeItcLoc03/yt-tools plugin (v0.4.0)
This skill is no longer maintained in claude-skills. The canonical source
is now skills/using-yt-tools/SKILL.md inside the OpeItcLoc03/yt-tools
plugin repository, distributed via the OpeItcLoc03/claude-plugins
marketplace.

Replaces the v0.3.2 fully-Russian SKILL body (~250 lines, 3 flows incl.
Locating binaries probe chain + Invoke pattern + Failure modes table) with
a short English deprecation stub.

Frontmatter changes:
- version: 0.3.2 → 0.4.0 (breaking — content reduced to stub, source
  location moved; pre-1.0 convention: minor bumps cover breaking moves)
- description: full English deprecation notice with install command for the
  plugin replacement; intentionally drops all trigger phrases so this stub
  cannot double-activate alongside the plugin's bundled skill once the user
  has installed the plugin.

Body: brief pointer prose — why the move, how to install the plugin
replacement, what to do with this directory after the plugin install
succeeds (delete it), and source pointers to the new repos and design doc.

The plugin distribution is the new source-of-truth: bug fixes, new flows,
trigger updates ship there. This stub will be removed once enough downstream
users have migrated (no fixed timeline; tracked in the yt-tools-distribution
review umbrella).
2026-05-26 08:25:18 +03:00
1dc286ce9f feat(using-yt-tools): add yt-listen support (audio/FFT) v0.3.2 2026-05-25 13:38:34 +03:00
3f8262b98e feat(retire): drop using-synology-ops skill — NAS decommissioned
Synology NAS permanently retired 2026-05-25. Removing dead-code:

- skills/using-synology-ops/ — source deleted
- dist-hermes/mcp/using-synology-ops/ — built artifact deleted
- hermes/mapping.yaml — entry removed
- skills/using-vds-ops/SKILL.md — stripped NAS-disambiguation
  clause from description + "Mirror of using-synology-ops" line
  from body; bumped 0.1.0 → 0.1.1 PATCH (wording cleanup post-
  retirement, no capability change)

Out of repo (user-config side, manual follow-up):
- ~/.claude/skills/using-synology-ops/ install dir
- ~/.claude.json mcp.synology-ops server entry (dead URL +
  bearer token, must drop)
- C:/Users/vitya/projects/synology-ops-mcp/ source repo —
  separate decision, out of this scope
2026-05-25 07:33:29 +03:00
f1be677b0a fix(session-handoff): hook command literal path [v0.3.3]
PostToolUse hook in `~/.claude/settings.json` was using
`$env:USERPROFILE` (PowerShell syntax), but Claude Code on
Windows runs hook commands through git-bash. Bash treats `$env`
as an empty variable, leaving `":USERPROFILE\..."` as the literal
`-File` argument — PowerShell fails with "invalid filename
format" and the hook never fires.

Install snippet in hooks/README.md now uses literal absolute
path `C:\Users\<you>\.claude\...` with a "Why literal path"
section explaining why `$env:VAR` / `%VAR%` / `~` all break
through the bash-harness chain on Windows.

Retracts the v0.3.0 "live-hook e2e smoke done" closure — that
result was from synthetic replay through the PowerShell tool,
which bypassed the broken harness chain. Real e2e verification
requires this fix plus a CC restart, then a substantive commit
to observe `additionalContext` surface.
2026-05-25 06:54:15 +03:00
790f1f41b8 docs(session-handoff): pwsh/powershell choice + restart-after-edit caveat [v0.3.2]
Two findings from live-hook e2e smoke 2026-05-25 on this Windows machine:

(1) README snippet was pwsh-only — PS 7 Core isn't on stock Windows. PS 5.1
(`powershell`) is always present and the hook script runs cleanly under both.
README now leads with `powershell` and notes the `pwsh` swap for PS 7+ users.

(2) Missing caveat that hooks load at Claude Code session start — mid-session
edits to ~/.claude/settings.json don't activate the hook until CC restart.
Without this note user would think the hook is broken after applying the
snippet (standalone smoke would pass but live in-session wouldn't fire).
Added explicit restart instruction + verification recipe.

Also: dist/session-handoff.skill now tracked (was missing since promotion —
inconsistent with other dist/*.skill artifacts that ship in repo).

PATCH bump 0.3.1 → 0.3.2 (docs-only, no behavioral change in hook or skill).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 00:24:23 +03:00
d089df7e9f fix(session-handoff): PowerShell hook body char count [v0.3.1]
`(& git log -1 --format='%b')` in PowerShell collapses multi-line subprocess
output into string[]. The threshold check used `$body.Length` which on a
string[] returns the line count, not char count — so the body>200 condition
was effectively comparing "more than 200 lines", which is much harder to
meet. Files-count saves it in practice for big commits, but small-file
big-message commits were under-detected.

Fix: join the array back into a single string with `-join "`n"` before
measuring length. Verified via stdin-pipe smoke against current HEAD:
body chars now report 1255 (vs 29 before — the line count).

POSIX `.sh` variant unaffected — `$()` collapses output and `${#var}` is
char count.

Bump 0.3.0 → 0.3.1 PATCH (bugfix, no behavior contract change).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 23:41:26 +03:00
cc6c321b57 feat(session-handoff): add PostToolUse commit-detector hook [v0.3.0]
Hooks live in skills/session-handoff/hooks/:
- commit-detector.ps1  Windows/PowerShell
- commit-detector.sh   POSIX (python3 for JSON parsing)
- README.md            opt-in instructions, cross-platform settings.json
                       snippets, smoke procedure

Hook reads PostToolUse stdin, detects substantive `git commit` (prefix
not in meta/docs/style/chore + fix typo, AND body >200 chars OR files >3).
On hit, emits hookSpecificOutput.additionalContext so Claude Code
surfaces a system reminder next iteration. Silent skip on --amend, failed
commits, non-git cwd, trivial prefix, below thresholds.

install.sh deliberately does NOT mutate settings.json — opt-in via the
README hook config snippet, applied once per machine. SKILL.md body
mentions the hook as an optional alternative to the agent-side
behavioral heuristic.

Bump 0.2.1 -> 0.3.0 MINOR (new opt-in capability, backward-compatible —
SKILL keeps working without the hook).

Deferred (separate follow-ups if needed):
- live-hook e2e smoke (would interfere with current session commits)
- rebase/cherry-pick batch deduplication

Closes [session-handoff-posttooluse-hook] (partial: stdin smoke,
live-hook deferred).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 23:36:04 +03:00
01bc7147c9 feat(project-bootstrap): canonical template + Step 5.6 add session-handoff trigger [v1.12.0]
CLAUDE.md.template gains `session handoff: read on start, write on end`
between `pull remote before work` and `follow project discipline`
(session-lifecycle clustering). Step 5.6 trigger->fulfiller table gains
the corresponding row (template ↔ table source-of-truth invariant).

Greenfield-bootstrap'ed projects now ship handoff trigger из коробки.
Existing projects unaffected — CLAUDE.md merge in Step 5 is idempotent
and respects user removals.

Bump 1.11.0 -> 1.12.0 MINOR (new canonical trigger = new capability,
backward-compatible). dist/project-bootstrap.skill rebuilt.

Closes [session-handoff-bootstrap-template-extend].
Unblocks [session-handoff-existing-projects-upgrade] Path B.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 23:10:03 +03:00
90c5be7c88 fix(skills): session-handoff yaml desc, double-quote [v0.2.1]
Bare-scalar description contained `: ` (colon-space) inside backticks
(`Триггер-строка CLAUDE.md ` + literal trigger-line containing `: `).
Strict YAML parser treated the inner `: ` as nested mapping → description
field dropped → harness fallback to H1 → skill listing showed
"session-handoff: session-handoff" (trigger phrases non-functional).

Fix: wrap entire description in double-quotes. Shrink 650→462 chars
(865→555 bytes) by moving substantive-commit heuristic, sliding-overwrite
detail, and project-scope clause to body Steps/Side/Failure sections
(already documented there). All 6 session-end triggers + 4 skip phrases
+ trigger-line preserved verbatim.

Bump 0.2.0 → 0.2.1 PATCH (frontmatter wording, no behavior change).
Closes [session-handoff-install]; unblocks [session-handoff-test-trigger].

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 21:56:30 +03:00
30330df63a feat(skills): session-handoff body filled, bump 0.1.0 -> 0.2.0
MINOR bump — skeleton (v0.1.0) gets functional 6-section body. Source: .workshop/.archive/2026-05-24-session-handoff-skill.md (Round 1 design + Round 2 resolved Q1-Q10).

Body sections: When to use (read/write triggers + skip patterns), Inputs (read/write), Steps (read 5 + write 5), Failure modes (incl. secret-detection abort), Side effects (sliding overwrite + git-tracked, no global state), What NOT to do (no auto-execute, no append-with-archive, no cross-project, no SessionEnd-hook dependency).

Still skeleton from claude-skills/ POV: no install.sh run, no push, no hermes/mapping.yaml entry — those remain in baseline tasks (session-handoff-install / -hermes-mapping / -test-trigger / -bootstrap-template-extend / -review umbrella).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 21:44:32 +03:00
eb9e9823ba feat(skills): add session-handoff v0.1.0
Promoted from .workshop/.brainstorm/session-handoff-skill.md (Round 1 design + Round 2 resolved 2026-05-24, Q1-Q10).

Skeleton only — header + empty 6-section body. Body filled in second pass from .workshop/.archive/2026-05-24-session-handoff-skill.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 21:44:32 +03:00
0accdccaac feat(using-interns): add grep_audit routing [v0.3.0]
Add 3 routing-table rows for the new deterministic `grep_audit` intern
per .wiki/concepts/interns-grep-audit-design.md §Layer 3:

  - grep_audit row — deterministic, no LLM call, zero cost
  - bulk_text_read vs grep_audit boundary — Q&A vs contains-check
  - always-ask uniform reminder — server opens file even sans LLM

Consistency adds: new Overview catalog row, Tool quick reference row,
prose note marking grep_audit as the catalog's first LLM-free intern.

Version 0.2.2 -> 0.3.0 (MINOR — new routing capability).

Closes [interns-grep-audit-skill-updates] on the .tasks board.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 08:02:57 +03:00
52922a6ce4 using-interns v0.2.2: proactive offer trigger
Скил активируется при распознавании task-shape (3+ файлов /
>400 строк / transcript distill), не только на явной фразе.
Без этого описанный workflow «Identify candidate → ask» не
запускался у агента до явной просьбы пользователя.
2026-05-21 23:31:51 +03:00
93a37f9aa5 feat(setup-wiki, using-wiki): add contradictions/ and open-questions/ as canonical page types
Extends Karpathy LLM Wiki canon with two new artifact types alongside
existing entities/concepts/packages/sources. Inspired by community
discussion that highlighted explicit tracking of surfaced tensions and
unanswered questions as missing aggregation points in the canonical
layout — they currently get scattered into concepts/ or lost in log.md.

Scope is schema-level only — no new ingest behaviour prescribed. Policy
on when to escalate an inline `> **Противоречие:**` flag into a
contradictions/<slug>.md page (and the analogous flow for
open-questions) stays the user's call.

setup-wiki [v1.0.0 → v1.1.0, MINOR — additive page types]:
- Discovery (Phase 1) now requires 6 content dirs for `noop` mode
- Phase 2 plan blocks list new dirs in greenfield + migrate
- CLAUDE.md schema template gains two page-type entries with status
  enums (contradictions: open|resolved|accepted-divergence;
  open-questions: open|answered|obsolete)
- index.md template gains two empty sections
- Phase 4a .gitkeep list, Phase 4b mkdir + touch, Phase 5 verify count
  (four → six dirs), Phase 6 report count all updated
- README.md layout tree + content-dirs sentence

using-wiki [v1.0.0 → v1.1.0, MINOR — additive type values]:
- Prerequisites: four → six content directories
- Page frontmatter type enum: + contradiction | open-question
- Per-type frontmatter extensions documented (status + affects/touches)
- File naming patterns: + contradictions/<slug>.md, open-questions/<slug>.md
- index.md sections-by-type list updated
- README.md mirrors SKILL.md changes

dist/: setup-wiki.skill + using-wiki.skill rebuilt.

project-bootstrap inline reference block intentionally untouched — it's
labelled "Reference (for context only — setup-wiki is the source of
truth)" and drift-tolerant by design.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 21:36:28 +03:00
ef3d38e79d feat(setup-interns, using-interns): secrets at ~/.config/projects-secrets/
Aligns claude-skills with secrets-out-of-common etap-1 migration: the
canonical home for plain-text local-dev secrets is now ~/.config/projects-secrets/,
outside any git tree.

setup-interns [v0.3.0 → v0.4.0, MINOR — write target changed]:
- Phase 1 drops gitignore-sanity check (no longer needed)
- Phase 2 plan block drops Gitignore line
- Phase 3 backs up ~/.config/projects-secrets/interns.env if present
- Phase 5 writes ~/.config/projects-secrets/interns.env (mkdir -p ahead)
- Phase 6 cwd documentation: secrets path no longer relative to cwd; uses
  INTERNS_SECRETS_PATH env var (or ~/.config default) — independent
- Common-mistakes drops "missing gitignore rule" entry

using-interns [v0.2.0 → v0.2.1, PATCH — wording]:
- Always-ask paths section reflects new canonical secrets home
- Prerequisites text updates setup-interns write target

interns-design.md (wiki concept): path refs updated for ASCII layer
  diagram, Layer 1 example block, Phase 5 description, comparison
  table, and final cross-cutting note. **/projects-secrets/** added
  to always-ask documentation pattern.

dist/: setup-interns.skill + using-interns.skill rebuilt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 14:22:51 +03:00
49f653256c feat(skills): add using-vds-ops v0.1.0 (promoted from OpeItcLoc03/vds-ops-mcp .wiki/concepts/vds-ops-mcp-design.md §6)
Skeleton only — header + empty 6-section body. Mirror of using-synology-ops
for the Rusonyx VDS docker stack. Body fill-in is a follow-up pass.

Baseline tasks created in OpeItcLoc03/claude-skills:
- using-vds-ops-install
- using-vds-ops-hermes-mapping (mode=pending, MCP tools touched)
- using-vds-ops-test-trigger
- using-vds-ops-review (umbrella, blocked-by impl)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 08:46:29 +03:00
7475d4d413 fix(using-yt-tools): add pipx-shim probe + anti-recreate-venv guard v0.3.1
Bug surfaced in field: agent in another session probed only legacy venv
location, found empty (post-pipx-migration), then took install-hint
verbatim and started recreating the venv we just deleted — destructive
cleanup paradox.

Three fixes:
- Add `~/.local/bin/yt-frames.exe` as known location #2 in probe chain
  (between PATH and legacy venv). pipx is now recommended install per
  yt-tools README; shim lives there.
- Rewrite install-hint to pipx-first (pip install --user pipx; pipx
  ensurepath; pipx install --editable ~/projects/.common/lib/yt-tools).
- Add explicit 'NOT to do' rule: do NOT recreate deleted venv if
  pipx-shim exists. Empty .venv/ + present pipx-shim means PATH issue
  (run pipx ensurepath + restart shell), not missing package.

Failure-modes table updated to reflect three-step probe chain and the
recreate-venv anti-pattern.
2026-05-20 15:09:42 +03:00
b827d06d9b fix(using-yt-tools): resolve binaries via venv/winget fallback v0.3.0
Skill no longer aborts on bare `Get-Command yt-frames` miss — binaries
installed in project-local venv or winget cache (Gyan.FFmpeg_*) are
valid install sites, just not on PATH for fresh shells.

New Step 0 in both flows: probe PATH first, then known install
locations (venv Scripts/bin, winget Gyan.FFmpeg_*/ffmpeg-*-full_build/bin);
abort only if both empty. PATH-prepend pattern documented (full-path
to yt-frames.exe is insufficient — child yt-dlp/ffmpeg need prepend
too).

Failure modes table updated: removed 'restart CC session' advice —
agent can't restart itself, and resolve-fallback makes it unnecessary.

MINOR bump per project-discipline (behaviour change in resolve logic).
2026-05-20 14:55:57 +03:00
971bcd9155 fix(using-yt-tools): document venv activation or full-path CLI invocation v0.2.2→0.2.3
Prerequisites: explicit table with two options (activate venv vs full-path).
Steps: added step 0 (venv activation) to both Flow A and Flow B.
Acceptance: agent can now invoke CLI without "command not found" error.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 14:43:37 +03:00
b2c1a213b3 fix(using-yt-tools): describe per-CLI stdout contract [v0.2.1→0.2.2]
Closes finding [using-yt-tools-frames-multiline-stdout]: the previous
"Last line каждого CLI's stdout — absolute path артефакта" wording matched
yt-transcript / yt-watch reality but quietly misled callers about yt-frames,
which emits one ``Wrote: <abs path>`` line per extracted frame (designed
that way per ``yt_tools/frames.py`` docstring so streaming consumers don't
have to parse a trailing summary; ``tests/test_cli_smoke.py:81`` enforces
the prefix).

Chose spec-fix over code-fix: changing yt-frames to bare paths would break
the existing piping/scraping contract — bigger surface than the docs typo
this finding actually is. SKILL.md now spells out per-CLI stdout shape and
notes warnings/errors go to stderr.

PATCH (wording clarification, no behavior change).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 13:35:51 +03:00
9fdd48b605 fix(using-yt-tools): tighten SKILL.md v0.2.0→0.2.1
- description: 860→340 chars (remove implementation fluff)
- timestamps: add bare seconds example (123 → 2:03)
- stdout: clarify "CLI designed for single-line EOF"
- cache: add cumulative warning (20 videos = 1-4 GB)
- failure modes: add malformed URL to yt-dlp failures

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 13:06:38 +03:00