`(& 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>
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>
Without an entry, scripts/build-hermes.py fails ("unmapped skill" — every
skill in skills/ must appear in mapping exactly once). Registered under
the pending block alongside using-yt-tools and using-vds-ops because the
skill has bidirectional file-system side effects (read/write
.tasks/NEXT_SESSION.md) and warrants a behavioral audit before promotion.
intended.category = productivity (mirrors using-tasks/setup-tasks —
workflow-state continuity primitive, not engineering toolchain).
Build now reports 28 skills (14 auto / 2 manual / 9 skip / 3 pending).
SKIPPED.md gains an entry under "Pending" with the intended block
preserved across MVP iterations.
Closes [session-handoff-hermes-mapping].
Promotion to mode: auto deferred to a separate post-audit task.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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>
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>
- skill-body-venv-invocation: venv activation documented in Prerequisites, step 0 added to flows, v0.2.2→0.2.3
- windows-powershell-path-doc-fix: README now covers both bash+PowerShell subshells, v0.1.5→0.1.6
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- [using-yt-tools-skill-body-venv-invocation]: SKILL.md Prereq/Steps не упоминает venv-activation / full-path invocation; concurrent сессия упёрлась в `yt-frames: command not found`.
- [using-yt-tools-windows-powershell-path-doc-fix]: prior fix покрыл только git-bash subshell, PowerShell subshell имеет ту же restart-after-winget проблему симметрично.
Origin: real-time observation в concurrent CC сессии после /reload-plugins (vitya@DESKTOP-NSEF0UK, 2026-05-20). Local-write workaround — gitea down.
[using-yt-tools-review] ⚪ → 🟢. Fresh-eyes subagent reviewer (no impl
priming) prošёл все 4 acceptance dimensions:
- Flow A PASS — URL OmJ-4B-mS-Y (Domain of Science, 11:06 en),
transcript header + paragraph segmentation OK, 3 frames at
4:23/4:41/8:16 visually consistent with chosen paragraphs.
- Flow B PASS — URL gCfzeONu3Mo (TED-Ed), 1 frame at 2:00, no
transcript dependency.
- Failure modes PASS — broken URL exit 1; --lang zz proxy для
no-captions exit 1 с available-langs hint; non-YouTube URL
«cannot extract video id».
- What NOT to do PASS — rules agent-side policy, CLI не
contradicts; --mode interval/scene flags существуют, но spec
явно их называет в prohibition (intentional).
3 nice-to-have findings зафайлены как ⚪ siblings:
- [using-yt-tools-empty-cache-dir-on-failure] — yt-transcript
mkdir до фетча captions, на abort оставляет пустую папку.
- [using-yt-tools-frames-multiline-stdout] — SKILL.md обещает
single-line EOF path, но yt-frames с N timestamps выдаёт N
строк «Wrote: <path>». Spec/CLI mismatch.
- [using-yt-tools-warning-mojibake] — yt-dlp warnings на Windows
console показывают «�» вместо unicode quotes (cp1251 vs UTF-8).
No blockers, no functional break. Закрытие по «findings зафайлены»
ветке review-acceptance.
Tasks_create через MCP сорвался на write-side (Gitea POST 404,
known bug cluster — preview OK, confirm fails); все 4 правки
сделаны через local-file edit.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fill the v0.1.0 stub body. Description rewritten to document two distinct flows
(was iterative-only, even though triggers already listed targeted-frames phrases):
- Flow A — iterative-watch (transcript → pick anchors → frames): for "what's
in this video / summary / о чём ролик / video summary / youtube transcript"
- Flow B — targeted-frames (frames only, no transcript): for "посмотри 1:23 /
покажи кадр на N / что показано на N" — user already named timestamps,
transcript fetch would be pure waste
Body sections filled (6): When/Prereq/Inputs/Steps/Failure/Side/NOT — Flow A
and Flow B distinguished throughout. Failure modes table covers missing CLI,
missing yt-dlp/ffmpeg (with Windows winget+PATH note), network/private/age-
gated, subs-disabled. What NOT to do explicitly forbids the "always-iterative"
trap that the v0.1.0 description implicitly invited.
Bump version 0.1.0 → 0.2.0 (MINOR — documents new capability set). Description
744 chars (under 900-char soft budget; well below ~1024 hard limit). Installed
to ~/.claude/skills/using-yt-tools/ via scripts/install.ps1 — harness skill-
listing renders full description, not truncated to H1.
STATUS.md: closes new [using-yt-tools-skill-body-fill] 🟢 (filed+closed
in-place since this is one body-fill task, not a multi-session workstream).
[using-yt-tools-review] stays 🔵 — body-fill blocker removed, but still
blocked on [using-yt-tools-trigger-smoke-clean-session] (needs fresh CC
session). Caveat recorded: body-fill was done by implementer instead of the
'fresh agent' the review-task originally specified — explicit user approval.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closed using-yt-tools-test-trigger as **partial** — CLI e2e +
iterative-flow on 3blue1brown «Vectors, Ch.1» (fNk_zzaMoSs, 9:51 EN)
exercised the primary path: yt-transcript ✓, yt-frames ✓, Read on
3 jpgs ✓, vision-anchored answer ✓. Trigger smoke (parts 1+2)
split out — it needs a clean CC session, which this one is not.
Filed 4 new ⚪ tasks:
- transcript-paragraphs-fix — _group_paragraphs collapses dense
captions into 1 block (broken on community/auto subs without
>4s gaps); single [0:00] anchor on a 9:51 video kills the
iterative-flow primary use-case.
- frames-stderr-fix — `error: yt-dlp source download failed:`
with empty tail when ffmpeg missing; real cause swallowed.
- windows-path-doc-fix — README should note restart-shell after
`winget install Gyan.FFmpeg` (user-PATH not picked up by the
currently-running git-bash subshell).
- trigger-smoke-clean-session — 10 positive + 3 false-positive
trigger probes, requires a fresh CC session.
Review (🔵) updated: 3 baseline impl tasks all 🟢, but the
acceptance criteria for Steps / Failure modes / What NOT to do
target SKILL.md body which is still empty stub. New blocker:
second-pass body fill (separate task — not filed here).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- using-yt-tools-install: ffmpeg 8.1.1 on PATH, venv populated,
yt-tools 0.1.0 editable, 4 CLIs respond, 67/67 unit tests pass
on this Windows host.
- using-yt-tools-hermes-mapping: registered as `pending` with
intended:{mode:auto, category:research}; build-hermes.py emits
26 skills (1 pending) and SKIPPED.md lists the entry. Promotion
to `auto` gated on using-yt-tools-test-trigger 🟢.
NB: triggers/url_pattern from the task block's yaml sketch don't
match the mapping schema — they live in SKILL.md description and
Hermes picks them up automatically. Build script only consumes
mode/category/reason/intended/replace-rules.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Behavioral fire-test of trigger phrases (10 parallel general-purpose subagents,
each phrase as isolated user message, META: skills_invoked= parsed) revealed
one false-positive: «restart-loop in books-pipeline» fired the skill despite
books-pipeline not being a NAS-hosted container — static-pass prediction
confirmed (implicit NAS-context discriminator, LLM keyed on `restart-loop`
without host check).
Tuning: extended skip-rule with non-NAS hosts examples
(`books-pipeline`, `vps-*` etc. — only the 6 listed above are NAS-hosted).
Description 941 chars / 1024 limit. PATCH bump (fix only, no new triggers).
Retest of NEG#3 → PASS (subagent quoted new skip-rule). Final 10/10.
Closes [using-synology-ops-test-trigger]; unblocks [using-synology-ops-review]
(ready, baseline tasks all 🟢, but body still <пусто> stub — separate debt).
dist-hermes/mcp/using-synology-ops/SKILL.md regenerated via build-hermes.py.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Step 1 now ships agent meta-paths inversions (`!.claude/`, `!.tasks/`,
`!.wiki/`, `!.brainstorm/`, `!.archive/`, `!.mcp/`, `!.mcp.json`,
`!MEMORY.md`) so own greenfield/upgrade projects re-enable visibility
against the global `core.excludesFile` cutter (`~/.config/git/ignore`)
that hides obvyaska from forks of upstream open-source. Without it any
fresh bootstrap landed an empty first commit on machines with the global
configured: setup-wiki/setup-tasks/Step 5 created .wiki/.tasks/CLAUDE.md
but git ignored them.
Two cases handled in Step 1:
- no .gitignore → write template (block included unconditionally)
- existing .gitignore → marker-based (`# AI обвеска — слой 2:`)
append-if-missing; idempotent on re-run
Smoke-tested in %TEMP%\test-bootstrap-meta-iso: all 3 acceptance
criteria pass + negative control (strip block → global hides) +
idempotency (re-run with marker present skips). Source concept:
workshop wiki concepts/meta-out-of-repo.md. Closes board task
[meta-isolation-bootstrap-skill-update].
MINOR bump (1.10.1 → 1.11.0) — new feature, backward-compat.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>