From 13abe176fd97bbb9bf2b9fc3cac09408f0655411 Mon Sep 17 00:00:00 2001 From: vitya Date: Thu, 11 Jun 2026 12:57:39 +0300 Subject: [PATCH] feat(using-tasks): session lock guard v1.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .gitignore | 3 +++ .tasks/STATUS.md | 12 +++++------ dist/using-tasks.skill | Bin 6910 -> 9641 bytes skills/using-tasks/SKILL.md | 40 +++++++++++++++++++++++++----------- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 837d65d..7f1f7b4 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,6 @@ coverage/ # Per-machine Claude Code local settings — keep ignored despite !.claude/ above /.claude/settings.local.json + +# Runtime session lock — ephemeral, never committed (using-tasks skill) +.tasks/.lock diff --git a/.tasks/STATUS.md b/.tasks/STATUS.md index 23f1a28..bd86de5 100644 --- a/.tasks/STATUS.md +++ b/.tasks/STATUS.md @@ -1,5 +1,5 @@ # Task Board -_Updated: 2026-06-11 — meta-host-routing-review closed (VERDICT PASS; behavioral 8/8 via clean-context subagents — 5 pos→meta-host-routing, 3 neg routed away incl. known-Gitea Skip-clause; Steps verified vs live infra: yt-tools→OpeItcLoc03/meta-yt-tools dedicated host resolves, .common grep hits, excludesFile/auth.toml present; failure-modes→STOP+ask, What-NOT accurate; no blocking findings on skill v0.3.0. Observation: task acceptance «resolves .common» is stale — skill+reality route yt-tools to dedicated meta-yt-tools host. Caveat: -install + -hermes-mapping baselines remain ⚪ open — skill not in ~/.claude/skills nor hermes/mapping.yaml; review covers content+trigger-discrimination only, not live-harness activation). Ранее: task-format skill v0.1.0 created (TDD via writing-skills; RED 3-fail → GREEN 2-pass). Ранее: using-markitdown-cli-rewrite-review done (VERDICT PASS; SKILL.md без `mcp__markitdown__`, CLI-примеры совпадают с `markitdown 0.1.6 --help`, version 1.0.0→1.0.1 PATCH, dist консистентен; 1 informational finding — docker-контейнер респаунится из out-of-scope `~/.claude.json` MCP-регистрации → follow-up `using-markitdown-mcp-deregister` needs-human). Ранее: skill-using-system-snapshot-review done (VERDICT PASS 3/3; live tool-contract verify + 9-way fresh-context trigger test, 8 clean; 3 informational findings, none blocking — incl. missing deployment scaffold: skill not installed / not in hermes-mapping / no baseline tasks). Ранее: using-tasks-status-read-perf done (using-tasks 1.2.0→1.3.0; done-task archival rule fixes STATUS.md bloat; literal `tasks_get_status`-for-orientation swap NOT done — tool can't enumerate the board, documented). Ранее: session-break-using-tasks done (using-tasks 1.1.0→1.2.0; `session_break` marker — stop after close before claim-next). Ранее: delegate-task-review done (VERDICT PASS; smoke-test 6/6 fresh subagents, no blocking findings, 3 informational notes). Ранее: delegate-task-test-trigger done (pos 5/5, neg 2/3; FP на «создать задачу себе» → follow-up delegate-task-description-fp-fix, shipped v0.2.1). Ранее (2026-06-08): откат churn'а от агент-раннера (always-on dry-run): 5 тасок (using-yt-tools-rate-limit-guard, archive-roundtrip-test, skills-grouping-revisit, hermes-converter-ci, tdd-criteria-precommit-hook) спуриозно claimed/blocked из-за workspace-divergence бага раннера → возвращены в ⚪ ready. yt-tools re-scoped на plugin-репо `OpeItcLoc03/yt-tools` (исходный stub deprecated)._ +_Updated: 2026-06-11 — using-tasks-session-lock shipped (using-tasks 1.3.0→1.4.0; session lock guard: start step 1 + end step 1 + .gitignore + Structure docs). Ранее: meta-host-routing-review closed (VERDICT PASS; behavioral 8/8 via clean-context subagents — 5 pos→meta-host-routing, 3 neg routed away incl. known-Gitea Skip-clause; Steps verified vs live infra: yt-tools→OpeItcLoc03/meta-yt-tools dedicated host resolves, .common grep hits, excludesFile/auth.toml present; failure-modes→STOP+ask, What-NOT accurate; no blocking findings on skill v0.3.0. Observation: task acceptance «resolves .common» is stale — skill+reality route yt-tools to dedicated meta-yt-tools host. Caveat: -install + -hermes-mapping baselines remain ⚪ open — skill not in ~/.claude/skills nor hermes/mapping.yaml; review covers content+trigger-discrimination only, not live-harness activation). Ранее: task-format skill v0.1.0 created (TDD via writing-skills; RED 3-fail → GREEN 2-pass). Ранее: using-markitdown-cli-rewrite-review done (VERDICT PASS; SKILL.md без `mcp__markitdown__`, CLI-примеры совпадают с `markitdown 0.1.6 --help`, version 1.0.0→1.0.1 PATCH, dist консистентен; 1 informational finding — docker-контейнер респаунится из out-of-scope `~/.claude.json` MCP-регистрации → follow-up `using-markitdown-mcp-deregister` needs-human). Ранее: skill-using-system-snapshot-review done (VERDICT PASS 3/3; live tool-contract verify + 9-way fresh-context trigger test, 8 clean; 3 informational findings, none blocking — incl. missing deployment scaffold: skill not installed / not in hermes-mapping / no baseline tasks). Ранее: using-tasks-status-read-perf done (using-tasks 1.2.0→1.3.0; done-task archival rule fixes STATUS.md bloat; literal `tasks_get_status`-for-orientation swap NOT done — tool can't enumerate the board, documented). Ранее: session-break-using-tasks done (using-tasks 1.1.0→1.2.0; `session_break` marker — stop after close before claim-next). Ранее: delegate-task-review done (VERDICT PASS; smoke-test 6/6 fresh subagents, no blocking findings, 3 informational notes). Ранее: delegate-task-test-trigger done (pos 5/5, neg 2/3; FP на «создать задачу себе» → follow-up delegate-task-description-fp-fix, shipped v0.2.1). Ранее (2026-06-08): откат churn'а от агент-раннера (always-on dry-run): 5 тасок (using-yt-tools-rate-limit-guard, archive-roundtrip-test, skills-grouping-revisit, hermes-converter-ci, tdd-criteria-precommit-hook) спуриозно claimed/blocked из-за workspace-divergence бага раннера → возвращены в ⚪ ready. yt-tools re-scoped на plugin-репо `OpeItcLoc03/yt-tools` (исходный stub deprecated)._ + --- diff --git a/dist/using-tasks.skill b/dist/using-tasks.skill index af3e8e94d9e8182dda391ba23b67e94bffe26e03..ce15af1bd8774bd62e8410738e3fddbd18d9cf99 100644 GIT binary patch delta 6584 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 delta 3824 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 diff --git a/skills/using-tasks/SKILL.md b/skills/using-tasks/SKILL.md index 9cb62c9..c737daf 100644 --- a/skills/using-tasks/SKILL.md +++ b/skills/using-tasks/SKILL.md @@ -1,6 +1,6 @@ --- name: using-tasks -version: 1.3.0 +version: 1.4.0 description: > Policy skill for working with an existing `.tasks/` board (per-task files + STATUS.md). Use whenever the user is switching between tasks, resuming a paused task, starting a new @@ -35,6 +35,7 @@ If `.tasks/` is **missing**, or `STATUS.md` exists but is non-canonical (e.g. fl .tasks/ STATUS.md ← active board: 🔴 / 🟡 / ⚪ / 🔵 blocks, sorted by priority .md ← deep context per task, one file each + .lock ← runtime session lock; **gitignored** (never committed) archive/ YYYY-MM.md ← 🟢 done blocks moved off the board, one file per month ``` @@ -43,6 +44,8 @@ Commit `.tasks/` to git. Decision history is valuable; diffs show how thinking e `STATUS.md` is the **active** board — it must stay lean so orientation reads stay cheap. Closed 🟢 tasks are archived to `archive/YYYY-MM.md` once they pile up; see "### Archiving done tasks". +> **`.tasks/.lock` must be listed in `.gitignore`** (add `.tasks/.lock` to your project's `.gitignore`). The lock file is ephemeral runtime state, not project history — it must never be committed. + --- ## STATUS.md format @@ -115,23 +118,35 @@ Temporary hypotheses, links, names of people to consult. ## Agent operations ### Session start -1. Check if `.tasks/STATUS.md` exists. If not → invoke `setup-tasks` and stop here until it returns. -2. Read `STATUS.md` — this is the orientation read (see note below on why it's a local read, not an MCP call). -3. If user names a task, read its `.md`. -4. Confirm in one sentence: "We're in the middle of X, next step is Y." -5. Ask if the plan is still correct before doing anything. -6. If STATUS.md `_Updated` date is >3 days ago, flag it and ask user to confirm current state. -7. If `STATUS.md` holds **≥ 10** 🟢 done blocks, archive them first (see "### Archiving done tasks") so the board you orient on is lean. +1. **Session lock guard.** If `.tasks/` exists, read `.tasks/.lock`. + - **Active agent lock** — `type:"agent"` with `heartbeat` ≤ 10 minutes old: print the hard warning below and **require explicit user confirmation** before proceeding. Do not touch the board until the user confirms. + ``` + ⚠️ поллер ведёт — нельзя работать параллельно + ``` + (Substitute the `slug` field from the lock file if present, otherwise omit it.) + - **Stale lock** — any type whose TTL has expired (`type:"agent"` with `heartbeat` > 10 min ago; `type:"interactive"` with `started_at` > 2 h ago): silently overwrite. + - **Absent or stale lock** (including after user confirmation): write `.tasks/.lock`: + ```json + {"type":"interactive","started_at":"","ttl_minutes":120} + ``` +2. Check if `.tasks/STATUS.md` exists. If not → invoke `setup-tasks` and stop here until it returns. +3. Read `STATUS.md` — this is the orientation read (see note below on why it's a local read, not an MCP call). +4. If user names a task, read its `.md`. +5. Confirm in one sentence: "We're in the middle of X, next step is Y." +6. Ask if the plan is still correct before doing anything. +7. If STATUS.md `_Updated` date is >3 days ago, flag it and ask user to confirm current state. +8. If `STATUS.md` holds **≥ 10** 🟢 done blocks, archive them first (see "### Archiving done tasks") so the board you orient on is lean. > **Orient by reading the local `STATUS.md`, not an MCP call.** It is the live board and — kept lean by archival — cheap to read. Do **not** reach for projects-meta tools to enumerate the current project's board: > - `tasks_aggregate` is cache-based, cross-project, and does **not** index ready/done — its own docs say to read `.tasks/STATUS.md` directly for the current project. > - `tasks_get_status(target_project, slug)` returns a **single** task's live status (`{status, found}`) by a slug you already know — it cannot list the board. Use it only to check **one** known task (e.g. confirm a delegated task's board state, or detect async-human parking), never for orientation. ### Session end / pause / switch -1. Update `STATUS.md`: set current task to 🟡, update "Where I stopped" and "Next action". -2. Append to `.md` Decisions log any non-obvious choices made this session. -3. Move finished items to "Completed steps". -4. Commit: `git add .tasks/ && git commit -m "chore: update task status []"` +1. **Release session lock.** If `.tasks/.lock` exists and contains `"type":"interactive"`: delete `.tasks/.lock`. (Stale interactive locks are cleaned up here too; silently delete any interactive lock regardless of TTL.) +2. Update `STATUS.md`: set current task to 🟡, update "Where I stopped" and "Next action". +3. Append to `.md` Decisions log any non-obvious choices made this session. +4. Move finished items to "Completed steps". +5. Commit: `git add .tasks/ && git commit -m "chore: update task status []"` ### Task switch 1. Perform session-end operations for the current task. @@ -222,6 +237,7 @@ Pair: `using-projects-meta` declares local-first for **reads**; this rule extend ## Rules +- **Honour `.tasks/.lock`** — read the lock at session start before touching the board; write it after clearing the guard; delete it at session end/pause. Never skip the lock check when `.tasks/` exists. The lock file must be gitignored. - **Never lose "Where I stopped"** — most critical field. If unclear, ask before ending session. - **One sentence per STATUS.md field** — compress, don't write prose. - **Key files must be specific** — not "auth module" but `packages/auth/src/useAuth.ts:87`.