issue-work
The issue-work skill automates completing the next highest-priority GitHub issue by selecting it from a deterministically ordered backlog, implementing its done-condition, and landing the fix with witnessed test coverage and a commit that references the issue number. Use it when asked to work the backlog, complete the next important issue, or fix a specific issue end-to-end, but only for code implementations and execute-plan dispositions, never for issues protected by the SELF_MODIFY guard or those in cooling or gated states.
git clone --depth 1 https://github.com/anthony-chaudhary/dos-kernel /tmp/issue-work && cp -r /tmp/issue-work/.claude/skills/issue-work ~/.claude/skills/issue-workSKILL.md
# Issue-work — complete the next most important issue, witnessed > **The pick is an admission decision; the completion is a claim; only a > witness closes it.** Importance alone does not pick an issue — importance > × *feasibility* does (an issue whose fix surface the SELF_MODIFY guard > protects is not yours to take, however urgent). And "done" is never your > narration: it is the issue's done-condition made TRUE, pinned by a test, > landed in a commit whose subject `dos commit-audit` witnesses, with > `Fixes #N` left for git ancestry — not you — to close. Worked example: > [#12](https://github.com/anthony-chaudhary/dos-kernel/issues/12) → > commit `8e7f2f5` (the reference run of every step below). **Layering.** Dev tooling that operates ON the repo (the `/release` tier) — it names a vendor (`gh`/GitHub), so it lives in `.claude/skills/`, never `src/dos/skills/`. The closing half is [issue-verify](../issue-verify/SKILL.md); this skill is the completing half. **Public-repo note.** Issue comments and labels are public documents — no dev-machine paths, hostnames, or private-process prose. Leak-scan every drafted body (`python scripts/leak_scan.py --text-file <draft>`) before posting; if the scanner is absent, the hand rule is the floor. ## Step 1: Triage from the deterministic floor (skip if given an issue number) ```bash python scripts/backlog_triage.py --top 12 # the typed, ordered queue (docs/315) ``` The script types every open issue into a closed disposition set and orders the offerable rows deterministically: priority tier → `ready`-label bias → freshness (the kernel's cooldown + pick-priority folds over the lane-journal `OP_ATTEMPT` history, unit id `issue-N`) → FIFO. **The top row is the default pick.** The floor is deterministic-first, advisory-only (the JUDGE-rung split): you may deviate, but state the one-line reason — the operator reads it to audit the triage, not to re-do it. What each disposition hands you: - `READY (code)` — implement it; the steps below. - `READY (execute-plan)` — a design issue whose `docs/NN` plan exists: ship the plan's next unshipped phase (`dos verify` it first — never trust the plan's own status prose). - `NEEDS_PLAN (write-plan)` — the unit of work IS the `docs/NN` plan: write it, link it from the issue, and stop there (implementation is a later pick). - `COOLING` / `T1_GATED` / `OPERATOR_GATED` — not yours; surface it, don't pick it. Two residues the floor cannot read, still on you: (a) the T1 detection UNDER-matches (it fires only when the issue text literally names a guarded runtime file) — before building, re-check your pick's real fix surface against `_DISPATCH_RUNTIME_FILES` in `src/dos/self_modify.py`; if the fix must edit a file in that set, the PreToolUse hook will deny you and the issue is operator-gated (say so in your report; a NEW file under `src/dos/` is not in the set and is fine). (b) external blockage (a not-yet-published contract, a waiting upstream PR) lives in prose the floor doesn't parse — skip those with a stated reason. ## Step 2: Verify the issue's claims before building An issue body is a CLAIM about current behavior — probe it, don't trust it. Reproduce the defect and test the done-condition's examples against today's code *first*; pin what is actually true (#12's done-condition asserted a command "still DENIES today" that in fact never denied — the test that shipped pins reality, not the issue text). **Probe trap:** the live hook adjudicates YOUR tool calls with the OLD code. A Bash command (or heredoc) that merely names a kernel runtime path may be denied — write probes and drafts to a file OUTSIDE the repo and run them by path, and keep kernel-path literals out of command strings until your fix is live. ## Step 3: Implement inside the lane - Stay in the issue's lane; out-of-scope findings become NEW issues (`gh issue create`, with a done-condition), never commit riders. - **Find the twins before declaring done.** A change to hook/sensor logic has a Go fast-path twin (`go/internal/hook/`) plus a differential parity corpus: port the change, regenerate LF-safe (`python gen_corpus.py | tr -d '\r' > corpus.jsonl`), and run `go test ./...` from `go/`. Grep for the Python symbol name in `go/` — the ports cite their Python originals. - Closed-set changes prefer *under-matching*: an entry you are unsure of stays OUT (the conservative direction must be preserved by construction, and the PR should be able to say so). ## Step 4: Test with the hot-tree discipline Run the touched test file first, then the FULL suite foreground (`python -m pytest -q`, ~4 min — wait for the verdict). On failures: 1. Re-run the failing files in isolation. The shared working tree carries sibling loops' in-flight edits; README/workspace-config failures that pass isolated are the documented false positives. 2. A failure that touches YOUR surface is yours — fix it. A failure that doesn't is reported as "pre-existing, not mine", with the isolation evidence. ## Step 5: Commit — scoped, atomic, pathspec'd The index here is SHARED STATE and the sweep cuts both ways: a plain `git commit` after a narrow `git add` absorbs whatever a sibling left staged. One Bash call, pathspec on the commit itself: ```bash git add <your files> && git commit -F - -- <your files> <<'EOF' <type>(<scope>): <subject in the repo grammar> <body: what was wrong, what the fix does, what is preserved> Fixes #N EOF ``` - `Fixes #N` in the BODY; the subject keeps its grammar. NO co-author trailer. - Immediately verify: `git show --stat HEAD` contains exactly your files. Swept a sibling's staged work in anyway? `git reset --soft HEAD~1`, then re-commit with the pathspec form — their staged entries survive. - Do not push, tag, or release — those are outward-facing and stay with the operator (the commit closes the issue when someone else's push lands it). ## Step 6: Witness, then leave the evidence trail ```bash dos commit-aud
Adjudicate a GitHub issue's "this is resolved" claim from witnesses the claimant didn't author — then close it carrying the evidence, or refuse with the typed gap. Use when an issue looks already-solved, after landing a fix that should have closed one, or to sweep open issues for silently-resolved ones.
Cut a versioned release of the DOS kernel — bump the version, draft release notes, commit, tag, push to master, and create a GitHub release. The tag push triggers the gated PyPI publish pipeline (publish.yml); the skill surfaces the run and its approval gate.
Promote an already-shipped rolling release (vX.Y.Z) of the DOS kernel to a named stable channel — gated on a green kernel suite + a green third-party CI run on the candidate + a clean truth syscall + a soak window. Writes an evidence file and adds a stable/<codename> git tag on the same commit. Does NOT bump versions or build new artifacts.
One automatic plan-class lifecycle tick. Reads the DECLARED class set + transition list from the workspace `[lifecycle]` table (not a hardcoded taxonomy), evaluates each trigger, spawns a read-only JUDGE-rung adjudicator (the `dos.judges` seam — advisory, fail-to-abstain) to approve/defer each candidate transition, applies the gated transitions as plan-meta edits + one commit per cycle, and logs to the run archive. Failsafes (per-cycle cap, per-plan cooldown, a veto class) are `[lifecycle]` data; the judge content is a host `dos.judges` driver. Every path/class comes from `dos doctor --json`. Use to garden a plan portfolio's lifecycle automatically, judge-gated. The DOS lifecycle gardener (SKP Axis 5, docs/207 Phase 5c).
Run /dos-dispatch on a recurring cadence, alternating with /dos-replan when the backlog drains — the dispatch→replan→dispatch cycle. The continue/stop/next-mode decision is the kernel's typed loop decision, not inline prose: each iteration is classified (`dos gate`) into a verdict and the loop's counters (drained-twice, the unclear/dirty-zero breakers, the iteration cap) drive the next step. Several loops on disjoint lanes run concurrently, each taking its own lane lease via `dos arbitrate`. Driven entirely by `dos` verbs + the workspace's `dos.toml`. The DOS reference loop workflow (SKP Axis 5).
End-to-end plan-and-ship for one lane — snapshot the portfolio with /dos-next-up, take a lane lease via `dos arbitrate` so parallel dispatches don't collide, gate the empty case via `dos gate`, ship the packet, and archive the run under the configured run dir. Driven entirely by `dos` verbs + the workspace's `dos.toml`; names no host path, lane, or commit convention. Use when you want to plan and ship the next batch on one lane in a single command, with concurrency safety. The DOS reference dispatch workflow (SKP Axis 5).
Ground a "keep working until the goal is met" stop condition in a witness the agent did not author, instead of letting the agent self-certify "done". A harness goal/Stop-hook condition is normally checked by the model re-reading its OWN work — consistency, not grounding. This skill turns the operator's goal into checkable EFFECT claims and wires `dos hook stop` so the Stop is refused until git ancestry (a shipped phase) or an effect read-back corroborates the claimed effect. Driven by `dos` verbs and the workspace's own `dos.toml` — no host-specific paths, lanes, or commit conventions. Use when you want a self-stopping agent (or a `/loop` worker) to be unable to declare a goal complete on its own say-so. The single-agent self-stop analogue of `dos-witness-claim`.
Snapshot a repo's phased-plan portfolio and produce a parallel-agent dispatch packet, driven entirely by `dos` verbs and the workspace's own `dos.toml` — no host-specific paths, lanes, or commit conventions. Walks the configured plans glob, audits each candidate pick against `dos verify` for its true shipped/unshipped status, renders a self-contained packet to the configured output dir, and reports a typed gate verdict via `dos gate`. Use when you want a "where are we / what's next / who-does-what" snapshot of any repo that has a few plan docs and real commits. This is the DOS reference workflow (SKP Axis 5); a host may use it, fork it, or ignore it.