Skip to content

feat(drafting-a-skill): close Dimension 4-8 gaps + redivide edit responsibility - #1632

Open
tvna wants to merge 67 commits into
mainfrom
claude/drafting-a-skill-implementation-lkdypz
Open

feat(drafting-a-skill): close Dimension 4-8 gaps + redivide edit responsibility#1632
tvna wants to merge 67 commits into
mainfrom
claude/drafting-a-skill-implementation-lkdypz

Conversation

@tvna

@tvna tvna commented Aug 31, 2026

Copy link
Copy Markdown
Owner

Summary

Closes formative-process gaps in drafting-a-skill's writing-time
guidance behind evaluating-skill-quality's Dimensions 4-8 (issue
#1630), then redivides responsibility between drafting-a-skill and
scorer-gated-skill-edits along a how-to-rewrite-vs-evaluate-the-result
axis (issue #1648), removing the now-redundant "Existing-skill-file
edit floor" issue #1630's own work added.

Facts

  • evaluating-skill-quality grades only a finished, static artifact --
    it never sees how a draft was produced (its own SKILL.md: "a gate
    on a finished, static artifact").
  • skills/drafting-a-skill/references/formative-quality-dimensions.md
    row 4 currently covers only 2-3 of rubric.md Dimension 4's 7
    requirements; rows 5-7 are similarly partial; row 8 is mislabeled
    (its content is a Dimension 4/8-adjacent concrete-example concern,
    not Dimension 8's real eval-driven-baseline content) -- confirmed by
    a full read of rubric.md (2419 lines) this session.
  • No skill in this repository's skills/ tree claims ownership of an
    ordinary, non-eval-driven edit to an existing SKILL.md --
    drafting-a-skill authors only from a blank page,
    scorer-gated-skill-edits requires a checkable scorer and held-out
    split as a hard Precondition-gate STOP -- confirmed by grepping the
    full tree this session.
  • drafting-a-skill's own description (1017/1024 chars, 99.3% of the
    shape checker's cap) restated its workflow rather than stating only a
    trigger, and its body stayed explanatory prose rather than the
    scannable principle-list/table form writing-skills
    (.claude/skills/writing-skills/SKILL.md) demonstrates -- raised
    directly by the issue owner and added as issue feat(drafting-a-skill): close formative-process gaps behind evaluating-skill-quality Dimensions 4-8, and the existing-skill-edit pipeline gap #1630's 4th ACM row.
  • drafting-a-skill/SKILL.md's Precondition excluded any existing
    SKILL.md target, and scorer-gated-skill-edits/SKILL.md's own Step
    3 never assigned who authors a proposed patch -- the repository owner
    requested reorganizing the boundary along a how-to-rewrite (
    drafting-a-skill, always) vs. evaluate-the-result (
    scorer-gated-skill-edits, always opt-in) axis instead, converged
    through eliciting-a-design and confirmed via a clairvoyance
    terminal handoff, filed as issue feat(drafting-a-skill,scorer-gated-skill-edits): redivide responsibility along how-to-rewrite vs evaluate-result #1648.

Assumptions

Risk / blast radius

Documentation/skill-definition edits only -- no runtime script behavior
changes. Blast radius is future drafting-a-skill dispatches (now the
single authoring path for any SKILL.md change, new or existing) and
future scorer-gated-skill-edits iterations (now explicitly dispatch
drafting-a-skill per iteration). No change to evaluating-skill-quality's
own rubric or scripts; no change to scorer-gated-skill-edits's own
Precondition gate, scorer/split requirement, or gate mechanics.

Rollback

Revert this PR's merge commit; no other repository state depends on
these skill-definition edits.

Verification

Restating issue #1630's Acceptance Criteria Map, row by row:

Criterion Proof method Result
drafting-a-skill must instruct writing workflows as ordered/copyable checklists, consistent terminology, feedback loops, matched-strictness templates. gitapex_check_skill_shape.py / gitapex_scan_execution_requirements_drift.py clean; row-4 bullets checked against rubric.md Dimension 4; Worked example diffed fact-for-fact. Done (Task A, commit 369c406e). 53/53 shape checks passed, no drift, full pytest suite (7828) passed, 44/44 local-preflight gates passed.
Other rubric dimensions (5-8) have the same shallow-mapping problem. Each addition checked against its cited dimension's own Fail/Pass bullets; row numbering (1-9) intact. Done (Task A, commit 369c406e). Rows 5-7 extended, row 8 rewritten into eval-preparation instruction; no requirement left unmapped.
Ordinary existing-skill edits are unowned on the pipeline. Checked against task-decomposition.md's row-to-task mapping rules and drafting-a-skill's Related-skills section. Done (Task B, commit 2e81efbb). New ## Existing-skill-file edit floor section added to task-decomposition.md; SKILL.md Step 3 carries a one-line pointer (body-length cap left only 1 line of headroom). 61/61 shape checks passed. Superseded by issue #1648's own boundary redivision below -- this floor is being removed in favor of a unified drafting-a-skill routing rule.
description (99.3% of cap) restates workflow rather than trigger-only; body stays explanatory prose rather than a scannable principle-list/table form. description re-measured (target: comfortably under the 90% Dimension-2 trigger); both shape checkers re-run; every existing cross-reference re-verified to resolve; content preserved fact-for-fact (no rule silently dropped in the compression). Done (commit b383faf9, refined by 3c044c0d). description: 250/1024 chars (24.4%, was 675 then 1017). Body Steps/Postcondition/Related skills/Notes restyled into tables/bullets, DbC skeleton and every citation kept intact. Both shape checkers clean (53/53, no drift). See notes below for the full follow-up chain.

Re-verified post-merge against origin/main (16-commit drift, clean auto-merge, drafting-a-skill/SKILL.md had a concurrent unrelated change): both shape checkers still pass (53/53, 61/61), full pytest suite (7828) still passes, all 44 local-preflight gates pass.

**Detailed implementation-history follow-ups (description/body rewrite content-preservation, the Live-collision-bullet/Worked-example/Line-wrap/Trigger-only-description follow-ups, issue #1648's Wave 1/Wave 2 implementation, Step 8's aggregate refactor+adversarial review with F1-F10 findings, and the scorer-gated-skill-edits line-wrap retraction) moved to a dedicated comment -- the PR body had grown past what a single pull_request_read call can return, which was blocking this session's own turn-terminal mergeable_state verification. Nothing in that comment changes what already happened; it is a relocation, not a rewrite.

Current status. All planned implementation work for issues #1630 and #1648 is complete and re-verified: both shape checkers clean across all three touched skills, full pytest suite passing, all 44 local-preflight gates passing, both fixture-coverage gates passing. drafting-a-pr-to-merge's own Step 8 independent review has now actually run (see ## Independent review verdict below) and returned NOT-CLEAN with specific, cited findings -- the small, mechanical ones fixed, the larger structural ones deliberately deferred with the repository owner's informed choice. Two required checks remain red:

This PR has no known content defect beyond what ## Independent review verdict discloses, no open review thread, and no merge conflict. It remains blocked on the two items above.

Independent review verdict

  • Verdict: NOT-CLEAN
  • Verified commit: 3bb34b8

Outer layer (GitHub-native reviewer). GitHub Copilot review requested (request_copilot_review) at 2026-09-01T07:44:43Z. No response posted within the 30-minute window (checked at 2026-09-01T08:47Z via get_reviews: empty). Per drafting-a-pr-to-merge Step 8's own rule, treated as unreachable for this run -- disclosed, not silently omitted.

Inner layer (reviewing-an-artifact, always runs). Step 0 eligibility check: this PR's diff is a Mixed target. The specialist-owned part (three skills/*/SKILL.md packages -- drafting-a-skill, executing-a-branch-plan, scorer-gated-skill-edits, each with its own references/ and metadata/gitapex.yaml) was deferred to evaluating-skill-quality, per Step 0's Mixed-target handling ("defer the specialist-owned part to its own named target, and continue Steps 1-6 against the remainder"). The remainder (evals/drafting-a-skill/*, evals/scorer-gated-skill-edits/*, docs/skill-eval-status.md, docs/superpowers/plans|specs/*.md -- all YAML fixtures, eval-status prose, and design docs, no executable code) was classified safe under Step 1 (an added-test/doc-update pattern with no security-tier signal anywhere in it, confirmed by a direct scan for secrets/injection/auth-bypass patterns across the full diff of that remainder) -- Steps 2-5's fan-out correctly skipped per Step 1's own rule, recorded here rather than silently passed.

Specialist deferral (evaluating-skill-quality), three independent isolated dispatches, one per touched SKILL.md package. Isolation mechanism: claude -p (CLI 2.1.252) from a working directory whose full ancestry carries no CLAUDE.md/AGENTS.md, --allowedTools "Read,Glob,Grep" (no permission-bypass flag), pointed only at a caller-created read-only snapshot of each target skill directory plus a copy of evaluating-skill-quality itself -- freshly re-verified this round with a two-control positive/negative test at this exact CLI version (recorded in skills/evaluating-skill-quality/references/adversarial-self-audit.md's Known entries, commit e753f9b8). Disclosed limitation, per each dispatch's own self-report: the harness's invoking-gitapex SessionStart-hook content (generic session-bootstrap procedure text, not target-specific framing or prior discussion) was still present in each dispatch's context -- this is a hook-injected mechanism distinct from the CLAUDE.md/AGENTS.md file-based leak the verified recipe closes, and was not itself excluded this round. Per Contaminated-dispatch disclosure, every finding below is accordingly provisional pending a genuinely hook-free re-run, though each dispatch reports it observed no redirection of its own grading judgment.

Round 1 through Round 9 (the initial three-skill independent dispatch, then repeated from-scratch re-reviews) moved to a dedicated comment, for the same token-budget reason as the Verification-section archive above. Summary: all three skills (drafting-a-skill, executing-a-branch-plan, scorer-gated-skill-edits) returned WELL-FORMED-NOT-MATURE on the initial dispatch; nine further from-scratch rounds (mostly concentrated on scorer-gated-skill-edits, whose concurrency-safety axis took until round 9 to genuinely close, plus three rounds returning to drafting-a-skill and executing-a-branch-plan) found and fixed real defects each time -- never only re-confirming the prior round's own claim. By round 9, executing-a-branch-plan's dimension 5 (progressive disclosure) stood as the single largest remaining structural gap: rubric.md's own "if acting on the typical request needs three files open, the split is wrong" line, which a 6-to-3 reference-file merge could not itself satisfy. See the archived comment for the full, cited round-by-round record.

Round 10 (commit d2eeb059): a Fable root-cause dispatch investigates whether dimension 5's own repeated executing-a-branch-plan finding is a rubric blind spot. Directed by the repository owner to check the rubric itself before any further restructuring of the skill. One isolated, read-only Fable dispatch (Read,Glob,Grep only, no write access) read rubric.md's full dimension 5 section plus enough of the rest of the rubric to know whether dimension 5 stands alone or interacts with another dimension, then read executing-a-branch-plan's current SKILL.md and all three reference files in full, weighing the counter-case seriously (is this skill genuinely a no-internal-branch-structure pipeline the rubric was never designed to judge, or is the repeated failure a correct signal that a 3+-mandatory-file skill is itself the defect) before concluding: dimension 5's own three internally-inconsistent thresholds, and its own cohesion check's Restraint paragraph (which explicitly defers multi-reference-file judgment to dimension 5 for exactly this skill's cohesion type), together hand judgment to dimension 5 for a cohesion-confirmed sequential pipeline with no caller-selectable narrower path and roughly 1,400 lines of genuinely mandatory content against the 500-line body cap -- but dimension 5 currently has no clause that can pass it. Exhaustive case analysis (in the dispatch's own report) shows every possible file-layout arrangement fails some dimension-5 clause. This is a genuine blind spot, not a misapplied rubric. Per this repository's own governance -- a shared, repository-wide rubric file used to review every skill goes through scorer-gated-skill-edits's own measured, held-out-gated edit process, not an ad hoc direct edit inside an unrelated PR -- filed as a new, separate issue (#1662), not attempted here, per the repository owner's own explicit direction to pursue the rubric fix separately and fix only this PR's own residual defect now.

The same dispatch separately found a real, independently actionable defect squarely within this PR's own scope: events-and-review-gate.md mixed every-run content (steps 5, 8) with roughly 200 lines of failure/resume-only content (loss/absence handling, freshness/hang detection, the step-7 failure-dispatch table, rollback) an ordinary clean run never reads -- a genuine progressive-disclosure improvement independent of whether the rubric ever changes. Fixed: extracted that content into a new failure-and-recovery.md, repointed every cross-reference (SKILL.md, threat-model-and-authorization.md, gitapex_check_task_full_verification.py, and the in-file links between the two split files), and recorded the change in the decision log alongside issue #1662 (d2eeb059). Four reference files exist now, but the typical request still opens exactly three (threat-model-and-authorization.md, decomposition-and-dispatch.md, events-and-review-gate.md) -- this split does not itself close dimension 5's three-file reading, which stays open pending issue #1662's rubric-level fix. Verified: shape checker 55/55 (up from 52/52 -- the new file's own three per-reference checks, the same +3-per-file pattern the earlier 6-to-3 merge showed in reverse), drift scanner shows only the same 4 pre-existing, confirmed-unrelated executionRequirements findings, full pytest (7883 passed, the count reflecting fixtures merged in from origin/main) and all 44 gitapex_gate_local_preflight.py gates passed on commit a0addc2c. Not yet independently re-reviewed by a fresh isolated round; disclosed as such, per this session's own consistent finding that every fix so far has needed at least one further round to fully confirm.

Round 11 (commit 851182ec): issue #1662's rubric fix merged (PR #1672); an isolated re-review against the new rubric confirms dimension 5 now passes. Per the repository owner's own request, ran an isolated, read-only Sonnet dispatch (Read,Glob,Grep only) against a fresh snapshot pairing origin/main's current evaluating-skill-quality (carrying issue #1662's new Dimension-5 exemption bullet) with this branch's own current executing-a-branch-plan (the 4-file split from Round 10). The dispatch independently re-derived cohesion at the rubric's own Procedure step 2 (not from the target's own "sequential" framing) and confirmed single-outcome sequential cohesion, no caller-selectable narrower path. It then independently verified both of the new exemption's conditions against actual measured content, not assumption: condition 1 (the cohesion check already found sequential/functional) holds from its own step-2 finding; condition 2 (every-use reference content demonstrably exceeds BODY_MAX_LINES even after real dimension-2 pruning) holds too -- measured every-use total (threat-model-and-authorization.md + decomposition-and-dispatch.md + events-and-review-gate.md) at 1,513 lines, still roughly 1,050-1,150 lines after applying concrete sediment/duplication/sprawl cuts it identified directly in the content, more than double the 500-line cap with zero room left in SKILL.md's own body (exactly 500/500 lines). It also independently re-verified failure-and-recovery.md is genuinely excluded from the every-use count -- grepped every cross-reference into it and confirmed none requires opening it to complete the ordinary path -- and checked for an easier file-count reduction (a 2-file or 1-file merge), finding none: a 1-file merge is already rejected in this skill's own decision log for risking the opposite-direction failure, and a 2-file merge would blend genuinely distinct domain boundaries (threat/authorization, decomposition/dispatch, events/review-gate) against dimension 5's own "organised by domain" rule. Dimension 5 now PASSES under the new exemption -- the split is reasonably minimized given a genuinely irreducible floor, not merely declared so.

The same dispatch found this skill's dimension 2 (conciseness) does not clear cleanly: real, cited sediment (quoted empirical-verification transcripts in threat-model-and-authorization.md), duplication (a two-variant-asymmetry pattern restated in full at least twice), and sprawl (plugin-only deployment detail inlined into every-use content rather than split by variant). It also found the Mixed-portability declaration (Step 4's own check) is not physically carried out for this skill: Claude-Code-specific mechanics (the Workflow tool, agentType, isolation:'worktree', the branch-plan-task subagent-type machinery) are disclosed in SKILL.md's own Notes prose but not split into a dedicated reference file, as the rubric's own Mixed rule names. Neither is fixed this round -- both disclosed here as this skill's new standing gaps, replacing dimension 5 as the largest one. Methodology caveat the dispatch disclosed about its own verdict: it ran inside a single dispatch process rather than the target skill's own prescribed further-nested-Agent-dispatch isolation for its own review steps, and could not execute gitapex_check_skill_shape.py directly in its sandboxed snapshot (applied its checks by hand against the same rules instead). This session independently re-ran the real shape checker and drift scanner against the actual repository afterward and recorded the confirmed verdict in metadata/gitapex.yaml (commit 851182ec): shape checker 55/55, drift scanner shows only the same 4 pre-existing, confirmed-unrelated executionRequirements findings, full pytest (7883 passed) and all 44 gitapex_gate_local_preflight.py gates passed on commit 3bb34b84.

Round 12 (commit 88908059): this skill's own dimension-2 finding fixed directly; the Mixed-portability finding investigated for a rubric blind spot and found to have one. Per the repository owner's own choice between round 11's two findings, dispatched one isolated, read-only Fable dispatch (Read,Glob,Grep only) to check whether either finding -- dimension 2 (sediment/duplication/sprawl) or the Mixed-portability physical-split requirement -- reveals a genuine rubric blind spot for this skill's specific shape, rather than being straightforwardly fixable defects. Conclusion, stated separately for each: dimension 2 is a correctly-flagged, ordinary defect, not a blind spot -- fixed here by pruning six sediment/duplication/sprawl passages from threat-model-and-authorization.md (584 to 539 lines), preserving every fact the dispatch flagged as load-bearing (the live-proxy caveat, the CLAUDE_PROJECT_DIR mechanism sentence, current residual bypass ceilings, the fuller Decision-7 restatement); no structural change. Mixed-portability, by contrast, is a genuine rubric blind spot: the rubric's own Mixed rule (Step 4) demands a file-level split for repository/platform-specific content, but every realistic layout for this skill's Claude-Code-specific content either adds a 4th every-use reference file (undermining the Dimension-5 exemption Round 11 just confirmed minimizes the every-use floor at 3 files) or folds it into the non-every-use failure-and-recovery.md, destroying that file's own failure/resume-only semantic contract and reopening dimension 5 outright. Per this repository's own governance for a shared, repository-wide rubric file, filed as a new, separate issue (#1676) rather than edited ad hoc inside this PR, following the same measured scorer-gated-skill-edits process issue #1662 already used. Verified: shape checker 55/55, drift scanner unchanged (same 4 pre-existing findings), full pytest (7883 passed) and all 44 gitapex_gate_local_preflight.py gates passed on commit 88908059. Not yet independently re-reviewed by a fresh isolated round; disclosed as such, per this session's own consistent pattern.

Round 13 (commit 8e836671): issue #1676's own rubric fix merged (PR #1677); an isolated re-verification (with one correction) confirms the Mixed-portability substitute is now satisfied. Per the repository owner's own direction, merged origin/main (bringing in the merged rubric fix, plus an unrelated gate-preconditions-mechanism PR #1675 this session reconciled into its own already-restructured file layout -- the new worktree-base precondition backstop content ported into decomposition-and-dispatch.md, every stale cross-reference repointed, verified via shape checker/drift scanner/full pytest/local-preflight before and after the merge commit). A separate session had already re-graded this skill against the new rubric directly on origin/main as part of PR #1677, self-reporting: both gating conditions met, all three positive requirements unmet (recorded in this skill's own decision log as a deferral entry). Per this session's own consistent discipline, that self-report was independently re-verified rather than accepted at face value.

An isolated Sonnet dispatch (Read,Glob,Grep only) re-derived the finding from primary text and initially disagreed with condition 2 (whether the Claude-Code-specific content is reached on every ordinary run, given Step 6's Workflow-tool-vs-sequential-fallback fork) -- reading two passages (threat-model-and-authorization.md's own empirical-verification-scope note, and decomposition-and-dispatch.md's own Consent/portability note) as evidence the primary path is opt-in and therefore not the "ordinary" case. Direct re-read of both passages, done before acting on the dispatch's own conclusion, found this was a misreading: the first passage describes this skill's own authoring-session testing limitation (could not literally exercise the Workflow tool for live verification), not a deployment-time gate; the second describes a permission-prompt UX detail ("Default, accept edits: Every run" unless pre-approved) -- friction, not unavailability. Both conditions confirmed met on this corrected re-read, agreeing with the deferral entry's own condition-1/2 claims (though independently re-derived, not deferred to).

Of the three positive requirements, requirement 2 (the SKILL.md Notes declaration naming non-portable steps and their portable alternative) was found already largely met on direct re-read, contra the deferral entry's own claim. Requirements 1 and 3 were genuinely unmet and fixed this round: SKILL.md's Notes portability paragraph split into distinct Non-portable (Claude-Code-specific) / Portable bold-lead-in sections (net-zero line growth, keeping the body at exactly 500/500) naming the worktree-base precondition backstop explicitly; a new, non-every-use references/porting-boundary-map.md enumerates every Claude-Code-specific touchpoint this skill carries (the Workflow tool, agentType, isolation:'worktree', the branch-plan-task subagent type, both PreToolUse hook backstops, the SubagentStop verification hook) and its portable alternative or disclosed lack thereof. One authoring defect caught and fixed along the way: an inline-code span split across a hard-wrap line broke the shape checker's per-line backtick parsing, tripping no-bare-issue-citation on an adjacent issue reference -- fixed by keeping the span on one line, a useful confirmation that this checker's per-line parsing has this exact blind spot for any future edit. The Mixed-portability substitute is now satisfied. Verified: shape checker 56/56, drift scanner unchanged (same 4 pre-existing findings), full pytest (7976 passed) and all 44 gitapex_gate_local_preflight.py gates passed on commit 8e836671. Not yet independently re-reviewed by a fresh isolated round; disclosed as such, per this session's own consistent pattern.

Round 14 (commit 0a295d1f): three genuinely fresh, isolated review rounds -- one per skill, run against the PR branch's own actual checkout -- found and fixed real defects in two of the three standing Why-NOT-CLEAN items; the third stays open, genuinely disputed between two independent reviewers rather than adjudicated unilaterally. Prompted by the repository owner's own request to move toward resolving independent-review-pending. Methodology note, disclosed for completeness: the first pass of dispatches searched this session's own local checkout rather than the PR branch itself, producing two false "content does not exist" alarms for executing-a-branch-plan and scorer-gated-skill-edits; caught before drawing any conclusion, corrected by checking out a git worktree at the PR branch's actual head and re-dispatching against it.

drafting-a-skill's baseCommit-consistency question. Two independent isolated dispatches reached opposite verdicts on the same mkdir-fix decision-log entry: one traced the cited baseCommit against real git parentage and found it names a commit one hop further back than the entry-adding commit's own true immediate parent (a concrete inconsistency, by a strict "must equal literal git HEAD at authoring time" reading); the other argued the citation is correct as a file-scoped pre-fix anchor (the last commit at which this skill's own files still lacked the fix), since the intervening commit belongs to an unrelated skill entirely. A third, self-run check found a third candidate value under yet a different scoping rule. Given three plausible values under three different readings of an underspecified convention, and no consensus even among independent reviewers, this stays genuinely open and disclosed -- not adjudicated unilaterally in either direction this round.

scorer-gated-skill-edits's round-9 substance and citation integrity. A fresh, isolated review independently re-derived (not accepted from the round-9 entry's own claim) that Cleanup's refusal-precondition text, the rejected-edit log's file locus, and the axis-7 concurrency mechanism are all real, concretely-checkable, and correctly implemented -- confirming the substance the earlier round-9 entry only self-reported. It also found a genuine defect: all four of this skill's own outcome.baseCommit decision-log citations point at real but unrelated commits in other skills' own history, not the true immediate parent of the commit that actually added each entry -- broken citations, though every entry's own substantive claim independently checks out against the real commit diffs once traced by hand. A fifth, smaller misattribution: SKILL.md Step 5 claimed the split.md Kept-edit-log citation was already made in step 4's worked example; it is actually in step 7. Fixed, commit f74325a2: all four baseCommit values corrected to each entry's own entry-adding commit's true immediate parent (verified via git show/git log against every candidate); Step 5's cross-reference corrected. Verified: shape checker 49/49, drift scanner clean.

executing-a-branch-plan's Mixed-portability substitute, requirement 1. A fresh, isolated review found Round 13's own fix overclaimed requirement 1 ("portable and non-portable content isolated under distinct headings"): the Notes section used bold inline lead-ins (**Non-portable...**, **Portable:**) inside one flowing ## Notes paragraph, never an actual Markdown heading -- this SKILL.md carried no ### anywhere in the whole file. The rubric's own internal use of "heading" elsewhere, and the substitute's own "never blended sentence-by-sentence" / "genuinely enumerate ... never accepted" bar, argue for the stricter, literal reading over a looser "clearly demarcated paragraphs" one. Fixed, commit c4ac264b: promoted both labels to real ### Non-portable (Claude-Code-specific) / ### Portable subheadings. Net-zero body-line growth held via a tighter prose rewrap of the surrounding Notes paragraphs (verified via a whole-file word-frequency diff against the prior commit -- no wording dropped, only headings added and two lowercase-to-capitalized "step" -> "Step" changes at the new paragraph-initial positions). All four gating conditions and positive requirements for the Mixed-portability substitute are now independently confirmed met.

Also this round: merged origin/main (17 commits, including PR #1701's python-path-resolution fix -- the same fix that had been blocking this session's own earlier PR-body write attempts on this same PR, before the repository owner pointed at the merged fix) to close the behind-base local-preflight gate. One real content conflict (SKILL.md's Step 8 dispatch text, where origin/main's own unrelated issue-#1560 commits added agentType/subagent_type naming and fixed a self-contradiction) and two modify/delete conflicts (origin/main had independently edited two reference files this branch had already deleted and merged into its own restructured 4-file layout) -- resolved by porting origin/main's substantive text into this branch's own current file locations and repointing six now-dangling cross-references in agents/branch-plan-task.md, .claude/agents/branch-plan-task.md, and agents/review-persona.md; full account in a dedicated comment.

Verified on commit 0a295d1f (after the merge and both fixes): shape checker 56/56 (executing-a-branch-plan), 49/49 (scorer-gated-skill-edits), 53/53 (drafting-a-skill, unchanged); drift scanner unchanged (same 4 pre-existing findings on executing-a-branch-plan, none on the other two); full pytest suite 8006/8006 passed; all 44 gitapex_gate_local_preflight.py gates passed. Not yet independently re-reviewed by a fresh isolated round beyond this round's own three dispatches; disclosed as such, per this session's own consistent pattern.

Why NOT-CLEAN, not CLEAN. After rounds 4-9, every skill has now received at least four from-scratch re-reviews, and every dimension gap either round surfaced is fixed or explicitly, honestly disclosed as a named residual -- no dimension is silently left unaddressed. One standing item remains open; two are now independently confirmed closed as of Round 14:

  • drafting-a-skill: round 6 fixed two of the three sub-findings under its own dimension-6 gap (the resume-time sweep's context-1 scope; the undeclared git tool). The third -- the baseCommit-consistency question -- was independently re-examined twice this round by two separate dispatches reaching opposite conclusions (see Round 14 above), plus a third candidate value found on direct re-check. Genuinely disputed among independent reviewers, not a settled ambiguity this session can adjudicate unilaterally; stays disclosed, not resolved.
  • scorer-gated-skill-edits: round 9's two minor gaps (Cleanup's undisclosed refusal preconditions; the rejected-edit log's own missing file locus) and axis 7's concurrency mechanism are now independently confirmed real and correctly implemented by Round 14's own fresh, isolated review (not merely self-reported, as the round-9 entry originally was) -- see Round 14 above. That same review found and this round fixed a citation-integrity defect (four broken outcome.baseCommit values, one Step-5 misattribution) unrelated to the substance itself. This item is now believed closed on independently-verified grounds.
  • executing-a-branch-plan: dimension 5 (major) passed as of Round 11 (issue fix(evaluating-skill-quality): dimension 5 (Progressive disclosure) has no passing configuration for a cohesion-confirmed, over-cap sequential-pipeline skill #1662's rubric fix). Dimension 2 (sediment/duplication/sprawl) was fixed as of Round 12. Mixed-portability's requirement 1, found by Round 14's fresh review to have been only bold inline lead-ins rather than actual headings despite Round 13's own claim, is now fixed -- real ### subheadings promoted, verified independently this round. All four gating conditions/positive requirements for the Mixed-portability substitute are now independently confirmed met. This item is now believed closed on independently-verified grounds.

Recording Verdict: CLEAN here would still be the self-certifying misuse this gate's own script docstring warns against, while drafting-a-skill's own baseCommit question stays genuinely open between independent reviewers. This check stays red until the repository owner either directs further work on that one remaining item, or accepts the current disclosed state (two of three items independently confirmed closed, one genuinely disputed) and records a different disposition.

Separately, addressed this round: skill-audit-disclosure (the ## Skill audit evidence section below) is now populated -- a real battle-testing-a-skill PASS verdict against drafting-a-skill (required, not waivable, since this PR changed its frontmatter description), an evaluating-skill-quality aggregate verdict, adversarial-coverage-mapping for both security-relevant skills, an adversarial review of both new design docs, and an honest NOT-RUN for the two checker-script disclosures (all four flagged scripts' changes this PR are comment/docstring-only, with no new detection logic to review or construct a defeat test against). See that section for the full account. eval-gate's pre-existing infrastructure defect (issue #1304) remains unaffected.

Skill audit evidence

  • battle-testing-a-skill: PASS
  • evaluating-skill-quality: WELL-FORMED-NOT-MATURE
  • adversarial-coverage-mapping: RAN
  • design-doc-adversarial-review: RAN
  • checker-script-adversarial-review: NOT-RUN
  • defeat-test-disclosure: NOT-RUN

battle-testing-a-skill: PASS, dispatched against drafting-a-skill (required as a real verdict, not waivable, since this PR changed its frontmatter description: line). One isolated fresh dispatch (no model-aware routing requested), cold-enumerated the 22 adversarial dimensions before reading the target. 17/17 applicable dimensions PASS with concrete quoted evidence each (structural dispatch-identity branching, StageDeviated{action: escalate} events, decode-before-trust rules, ground-truth reconciliation for its own persisted log, explicit non-authoritative-verdict framing for downstream consumers); dimension 14 (Adversarial regression corpus) graded INDETERMINATE since the isolated snapshot did not include evals/drafting-a-skill/ to inspect directly, per the dispatch's own instruction not to fabricate a verdict from indirect narrative; 5 dimensions (18-22) correctly N/A for a workflow-authoring skill with no legal/regulatory/financial claims.

evaluating-skill-quality: WELL-FORMED-NOT-MATURE, the current aggregate state across all three touched skills -- see the ## Independent review verdict section below for the full round-by-round record. None has yet reached WELL-FORMED-AND-MATURE; every dimension gap found across 6-9 rounds per skill is either fixed or explicitly, honestly disclosed as a named residual, not silently left unaddressed.

adversarial-coverage-mapping: RAN, for both skills the calling workflow's own security-relevance heuristic flagged: drafting-a-skill (6 rounds of isolated, cold, adversarial re-review this PR, each grading fresh from scratch rather than only re-checking the prior finding) and scorer-gated-skill-edits (9 rounds, same discipline).

design-doc-adversarial-review: RAN, one isolated dispatch adversarially critiqued both new design docs (docs/superpowers/specs/2026-08-31-drafting-a-skill-scorer-gated-boundary-design.md, .../2026-08-31-drafting-a-skill-formative-process-gaps-design.md) against internal consistency, decision justification, unstated assumptions, disclosed trade-offs, missed edge cases, follow-through gaps, and scope match -- finding 11 defects (an uncited "44 gates" figure breaking the doc's own citation standard, a Non-goals section contradicted by the same doc's own new pre-ship gate requirement, an unaddressed failure path for a deferred one-time review, among others). All 11 are about the documents' own rigor and completeness, not about live defects in the shipped skill content they guided -- that content has been separately, extensively re-verified via the many evaluating-skill-quality rounds already disclosed above. Not retroactively fixed in the design docs themselves: this session treats a design doc, once it has guided real and independently-verified implementation, as historical record, the same convention already applied to docs/superpowers/plans/*.md throughout this PR's own decision logs.

checker-script-adversarial-review: NOT-RUN and defeat-test-disclosure: NOT-RUN, for the four flagged scripts this PR touches (skills/executing-a-branch-plan/scripts/_gitapex_path_normalize.py, gitapex_check_file_ownership_conflicts.py, gitapex_check_task_bash_safety.py, gitapex_check_task_full_verification.py). Every change to all four is comment-, docstring-, or string-literal-only -- updated cross-references to filenames renamed by the reference-file merge above, or (for gitapex_check_task_bash_safety.py, round 3, commits 43c7f49b/852f1acb/3b7effb8) a narration-comment cleanup independently AST-verified to be a zero-functional-change diff, with the file's own 155-test suite and the full 259-test directory suite passing unchanged. No new or changed detection logic exists in any of the four to adversarially review or construct a defeat test against; NOT-RUN is this check's own documented, honest answer for exactly this case ("a docstring-only or lint-only edit... has no new detection logic to construct a defeat test against, so disallowing an honest NOT-RUN would only pressure toward a fabricated one" -- gitapex_gate_skill_audit_disclosure.py's own docstring).

Checklist

  • Tests pass locally
  • Docs updated if behavior changed
  • Issue number cited in every commit
  • If this PR adds/modifies a skills/*/SKILL.md, a docs/superpowers/specs/*.md design doc, a security-relevant skill, or a deterministic checker script (skills/*/scripts/*.py, evals/scripts/*.py, .github/scripts/*.py), a ## Skill audit evidence section discloses the required verdicts/waivers (see .github/scripts/gitapex_gate_skill_audit_disclosure.py)
  • If this PR adds a new Kept-edit-log entry to any evals/*/split.md, that entry discloses a Transfer check line (see .github/scripts/gitapex_gate_transfer_check_disclosure.py)
  • If this PR adds or increases a skills/*/SKILL.md's Stop-boundary bullets or named dispatch branches, evals//tasks/*.yaml gained at least as many new fixtures (see .github/scripts/gitapex_gate_skill_branch_fixture_coverage.py)

Merge gate: independent review

This PR is also subject to the independent-review-pending required
status check (see .github/workflows/independent-review-pending.yml /
.github/scripts/gitapex_gate_independent_review_pending.py). It stays
pending/failing until a ## Independent review verdict section naming
this PR's current head commit is recorded in this body --
drafting-a-pr-to-merge's own Step 8 records it once its independent
review completes. There is nothing for you to do here now: do not
pre-fill this section yourself, and do not remove this note.

Related Issue

Closes #1630
Closes #1648
Refs #1662
Refs #1676
Refs #1677

Execution log

PlanApproved{run_id: e2c59a9}
TaskStarted{run_id: e2c59a9, task_id: A}
TaskStarted{run_id: e2c59a9, task_id: B}
TaskCompleted{run_id: e2c59a9, task_id: A, commit_sha: 369c406}
TaskCompleted{run_id: e2c59a9, task_id: B, commit_sha: 2e81efb}
PlanApproved{run_id: 9d93b9a0}
TaskStarted{run_id: 9d93b9a0, task_id: A}
TaskStarted{run_id: 9d93b9a0, task_id: C}
TaskCompleted{run_id: 9d93b9a0, task_id: A, commit_sha: 74b7a57}
TaskCompleted{run_id: 9d93b9a0, task_id: C, commit_sha: 8d25613}

claude added 2 commits August 31, 2026 12:53
Documents the gap evaluating-skill-quality's process-blind grading
exposes in drafting-a-skill's writing-time guidance across Dimensions
4-8, plus the unowned existing-skill-edit case between drafting-a-skill
and scorer-gated-skill-edits.

Refs #1630

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euzusy42MsxhCaikPpHCri
2-task decomposition (Task A: drafting-a-skill formative-quality-
dimensions.md rows 4-8 + SKILL.md style/worked-example/eval-scaffold;
Task B: executing-a-branch-plan existing-skill-edit process floor),
no file-ownership or interface-dependency edge between them, both
assigned to wave 1.

Refs #1630

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euzusy42MsxhCaikPpHCri
@tvna
tvna deployed to ruleset-verify August 31, 2026 13:09 — with GitHub Actions Active
@coderabbitai

coderabbitai Bot commented Aug 31, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: c565300c-8fa4-4516-9386-1fd99e7a059a


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Aug 31, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.66%. Comparing base (9db591d) to head (0a295d1).

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #1632   +/-   ##
=======================================
  Coverage   99.66%   99.66%           
=======================================
  Files         152      152           
  Lines       24792    24792           
  Branches     2981     2981           
=======================================
  Hits        24710    24710           
  Misses         82       82           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

claude added 3 commits August 31, 2026 14:53
…ture worked example

Extend formative-quality-dimensions.md row 4 (terminology, checklists,
feedback loops, templates, branch triggers reusing Step 3's cohesion
enumeration, plus the relocated concrete-example content), rows 5-7
(reference naming/link-context; forward-slash paths, Server:tool naming,
no-install-assumed phrasing, default+escape-hatch framing, Portable
convention/authority-path rules; script error handling, no unexplained
constants, Interface-vs-Implementation comments, single ownership), and
rewrite row 8 into an eval-preparation instruction (>=3 scenarios
including the guardrail case, an evals/<skill>/ fixture skeleton).

Add one SKILL.md Step 2 style bullet cross-referencing row 4 without
restating it, a new Step 6 sub-step for the eval-scaffolding preparation,
and restructure the Worked example section's three candidates from prose
into per-candidate Step-keyed bullet lists with every stated fact
preserved unchanged.

Both skills/evaluating-skill-quality shape/drift checkers run clean
against skills/drafting-a-skill/.

Refs #1630
…tep 3 tasks

Issue #1630, ACM row 3: a task decomposed at Step 3 whose Planned ops
edit an existing SKILL.md, and is not itself routed to
scorer-gated-skill-edits by a stated scorer/held-out-split precondition,
now has a minimum process floor instead of none.

- Step 3's own body now also classifies whether a task's Planned ops
  edit an existing SKILL.md, pointing to task-decomposition.md's full
  rule set (kept to one added line to stay inside the body-length
  checker's 500-line cap, 500/500 after this change).
- task-decomposition.md gains a new "Existing-skill-file edit floor"
  section, sibling to Irreversibility classification: such a task must
  run gitapex_check_skill_shape.py against the edited skill directory
  and sweep every touched section against drafting-a-skill's
  formative-quality-dimensions.md before it may report complete -- a
  minimum floor only, never a re-entry into drafting-a-skill's
  Design-by-Contract structure or scorer-gated-skill-edits's own
  measured-iteration procedure.
- metadata/gitapex.yaml: added scorer-gated-skill-edits to relatedTo
  and a new decision reference recording the change.

Placement: SKILL.md's Related-skills section already carries the
sibling "new skill directory -> drafting-a-skill" rule, but the
500-line body cap left no room there for a second full bullet, so the
actionable rule content lives in task-decomposition.md (also the
better fit per that file's own Load-bearing vs. on-demand dimension --
this floor only matters for a subset of tasks); Step 3's own body
carries the one-line pointer that keeps it discoverable from the same
place the irreversibility classification already is.

gitapex_check_skill_shape.py: 61/61 checks pass against
skills/executing-a-branch-plan. Full repo suite (pytest, 7828 tests;
gitapex_gate_local_preflight.py, 44/44 gates) passes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@tvna
tvna deployed to ruleset-verify August 31, 2026 14:57 — with GitHub Actions Active
Step 6's eval-scaffolding bullet duplicated formative-quality-
dimensions.md row 8's own cell (scenario count, guardrail case,
one-prompt-file-per-scenario, preparation-only boundary) across nine
lines, while the adjacent Step 2 bullet already points at row 4
without restating it. Rewritten as the same pointer shape.

Found by the Step 8 refactor/simplify pass over the accumulated diff
for issue #1630.

Refs #1630

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euzusy42MsxhCaikPpHCri
@tvna
tvna deployed to ruleset-verify August 31, 2026 15:08 — with GitHub Actions Active
…-8/floor conflict, fixture-layout mismatch, dispatch gap

Independently-executed Task A (rewrote formative-quality-dimensions.md
row 8 into an artifact-producing "Eval preparation" instruction) and
Task B (added an existing-SKILL.md-edit floor that sweeps every row of
that same table) each had no visibility into the other's diff. Read
together, the floor obliged every ordinary SKILL.md edit task to author
evals/<skill>/ fixtures -- contradicting the design doc's own "minimum
floor... nothing more" and its Non-goal against new eval-execution
infrastructure. The floor now excludes row 8 by name.

Also fixed, found by the same Step 8 adversarial review:
- Row 8 named a fixture layout this repository does not use (a
  per-scenario *.md file directly under evals/<skill>/); corrected to
  the real, gate-enforced shape (eval.yaml beside tasks/<scenario>.yaml).
- drafting-a-skill Step 6's own completion criterion did not mention
  the new eval-scaffold sub-step, so a draft with no scaffold satisfied
  every stated finish line; the criterion now names it.
- The floor's obligation had no delivery path to the worktree-isolated
  task agent that must actually run it; now stated as an in-band
  dispatch-prompt citation, the same pattern SKILL.md step 6 already
  uses for code-quality-principles.md.
- A load-timing note in formative-quality-dimensions.md's own opening
  ("not required reading before Step 2 begins") appeared to contradict
  Step 2's new row-4 pointer; reconciled inline.

Both skills' metadata/gitapex.yaml decision logs updated per each
skill's own append-in-the-same-round convention.

Refs #1630

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Euzusy42MsxhCaikPpHCri
@tvna
tvna deployed to ruleset-verify August 31, 2026 15:27 — with GitHub Actions Active
…ple-list form

Trim SKILL.md's frontmatter description to state only what triggers it
and what it does, dropping the workflow-summary sentence dimension 2's
own conciseness bar flags (was 99.3% of the 1024-char cap). Restyle the
body toward the more scannable table/list/bullet form used by
writing-skills, adding a Steps summary table and an inline
body-vs-metadata table, and converting Postcondition, Related skills,
and Notes from prose paragraphs into bulleted/tabular form.

A dedicated content-preservation review caught real regressions in the
first pass: dropped Precondition/Postcondition definitions, a dropped
anti-abuse guard on Step 7's escalation branch, dropped completion
loops in Steps 4/6, and terminology/wording drift (including two
eval-fixture-matching regressions surfaced only by the full pytest
run: a header line-wrap change and a "fresh dispatch"/"independent,
fresh dispatch" word-order change that broke exact-substring fixture
matching). All are restored; both skill-shape and
execution-requirements-drift checkers pass clean, and the full pytest
suite plus local preflight (44/44 gates) pass.

Refs #1630
@tvna
tvna deployed to ruleset-verify August 31, 2026 18:12 — with GitHub Actions Active

tvna commented Aug 31, 2026

Copy link
Copy Markdown
Owner Author

CI status at b383faf9: two known, blocked checks

skill-audit-disclosure and independent-review-pending are both failing on this head commit. Both share the same root cause, and it is not something this session can fix right now.

Why both fail: this PR modifies two SKILL.md files (skills/drafting-a-skill/SKILL.md, skills/executing-a-branch-plan/SKILL.md), which requires a ## Skill audit evidence section (verdicts/waivers from evaluating-skill-quality/battle-testing-a-skill) and, separately, a ## Independent review verdict section before independent-review-pending can clear. Both require dispatching those review skills through a mechanism verified to exclude this repository's own CLAUDE.md/AGENTS.md from the dispatched context (skills/evaluating-skill-quality/references/adversarial-self-audit.md's Isolation verification requirement) -- reviewing a skill-definition change with the very instructions that change edits already loaded would not be an independent check.

What blocks fixing it: no dispatch mechanism available in this session passes that verification. An Agent-tool dispatch inherits this repo's CLAUDE.md/AGENTS.md by design. A claude -p subprocess dispatch (the documented alternative) hangs / times out consistently in this session's own environment, tested from multiple working directories with multiple flag combinations -- root cause unconfirmed, tentatively an OAuth-token file-descriptor inheritance issue across an independent subprocess. Per this repository's own "No verified mechanism available" protocol, falling back to an unverified mechanism to force these two checks green is explicitly the wrong move, not a shortcut worth taking.

Disposition: this is a disclosed, planned handoff to a different, verified environment to complete the Skill Audit Evidence dispatch -- not a silent gap. No re-run: this is a deterministic, diff-related failure (missing required sections), not a suspected flake, so re-running would not change the outcome. Keeping this PR watched until both checks are green.


Generated by Claude Code

Repository owner determined the Related-skills Live-collision bullet's
routing-risk framing is unnecessary: this skill is dispatched via
executing-a-branch-plan Step 6's own explicit branch-plan-task agent()
call, not selected through model description-routing, so a
still-present vendored writing-skills copy or skill-creator (verified
still present on disk in this session's own environment, despite
apm.yml/apm.lock.yaml no longer declaring the retired
obra/superpowers dependency) creates no actual routing collision for
this skill.

Removed the bullet. Its still-valid never-import-RED-GREEN-REFACTOR
fact (writing-skills' own testing methodology, deliberately not
adopted here) folded into the existing Notes Attribution bullet
instead of being dropped outright. Recorded as a decision entry in
metadata/gitapex.yaml. Both shape checkers clean (53/53, no drift),
full pytest suite (7828 passed), local preflight (44/44 gates) pass.

Refs #1630
@tvna
tvna deployed to ruleset-verify August 31, 2026 18:34 — with GitHub Actions Active
…er form

Restyled the Worked example section further toward writing-skills own
presentational patterns: the first candidate's Step 2 now shows its
actual frontmatter (name/description) as a fenced YAML code block
instead of describing it in prose; the second candidate's
earning-test failure is now a Bad/Good fenced-code-block pair (an
over-populated Precondition/Postcondition/Non-goals section vs. the
corrected single-Step form), rather than one prose bullet each.

File grew from 392 to 425 lines, well inside BODY_MAX_LINES=500, so
no other section needed trimming. Both shape checkers clean (53/53,
no drift), full pytest suite (7828 passed), local preflight (44/44
gates) pass.

Refs #1630
@tvna
tvna deployed to ruleset-verify August 31, 2026 18:47 — with GitHub Actions Active
…ide in this skill

Repository owner determined the ~72-column manual line-wrap this
skill's own SKILL.md and references/ files carried was an
unenforced, non-repository-wide habit (docs/skill-authoring-
standards.md states no such rule, gitapex_check_skill_shape.py's 53
checks include no line-length check, and a comparison skill --
eliciting-a-design/SKILL.md -- routinely carries 100-400+ char lines
with no wrap at all). Since this skill is meant to be used as the
vehicle for refactoring other existing skills going forward, an
unexamined formatting habit here risked propagating into every
future draft.

Reflowed every prose paragraph and bullet in SKILL.md and all five
references/*.md files into single natural-length lines (frontmatter,
tables, and fenced code blocks left untouched). Verified
content-preservation two independent ways (whitespace-normalized
exact match; a hyphen-aware "-\n" -> "-" regex reconstruction
compared against the same normalization) for every file -- both
methods agree exactly, zero content drift.

Found and fixed a latent rendering bug the old hard-wrap habit
carried: 8 line-wrap points fell exactly on a hyphen inside a
compound identifier (untrusted-input-triage,
formative-quality-dimensions.md, mechanism-fit-and-cohesion.md,
gitapex-cross-links.md, references/contract-structure.md), which
CommonMark's own soft-line-break-to-space rule was already silently
corrupting into "untrusted-input- triage" etc. at render time. Fixed
by treating a trailing single hyphen (not "--") as a mid-word join
point during reflow.

The Worked example's own embedded frontmatter code block also had
its `description:` field un-wrapped to one line, and reordered to
lead with the trigger clause ("Use whenever...") before the
capability clause ("Explains..."), matching this skill's own real
frontmatter's trigger-first shape and dimension 1's what+when
requirement -- the prior order buried the trigger condition after a
workflow-summary-shaped opening clause.

gitapex_check_skill_shape.py's Check E (exercises-declaration
absolute resolution) keys Stop-boundary bullets and Procedure/Steps
items on their full single-physical-line text; un-wrapping changed
every multi-line bullet's identity, so all six
evals/drafting-a-skill/tasks/*.yaml fixtures whose `expected.exercises`
declared a now-stale line-wrapped fragment are updated to the new
full-line text (exact string, casefolded).

Both shape checkers clean (53/53, no drift), full pytest suite (7828
passed), local preflight (44/44 gates) pass.

Refs #1630
@tvna
tvna deployed to ruleset-verify August 31, 2026 19:02 — with GitHub Actions Active
…e fix

Repository owner: a description's "what it does" clause should be
minimized wherever possible, and its "when" clause may be omitted
entirely for a pipeline-only skill like this one, since no model ever
reads it to make a live routing decision. Applied to this skill's own
description: dropped the workflow-summary sentence and all three
Distinct-from clauses, keeping only the pipeline-only dispatch-condition
sentence (675 -> 250 chars, 24.4% of the shape checker's cap).

Separately, corrected Step 4's own "Real collision found?" remedy,
which had conflated two different things: a Distinct-from clause is a
targeted fallback for invocation triggers that stay genuinely adjacent
even after narrowing, not a routine response to two skills merely
sounding functionally similar. This skill's own now-removed
Distinct-from clauses were exactly that misuse. Also trimmed the
Worked example's curl-command-explainer sample description to its
trigger clause only, as a second worked instance of the same
principle.

Found via CI (split-fixture-coverage, head ad834c9): the line-wrap
retraction changed the Stop-boundary bullet identity
gitapex_gate_split_fixture_coverage.py's delta-scoped check keys on,
leaving "Never loop back into scorer-gated-skill-edits-shaped
iterative editing..." with no fixture whose expected.exercises
resolved to its new full-line text. Added that declaration to
evals/drafting-a-skill/tasks/existing-skill-routes-away.yaml, whose
own scenario already exercises exactly that boundary.

Both shape checkers clean (53/53, no drift), full pytest suite (7828
passed), local preflight (44/44 gates) pass.

Refs #1630
@tvna
tvna deployed to ruleset-verify August 31, 2026 19:14 — with GitHub Actions Active

tvna commented Aug 31, 2026

Copy link
Copy Markdown
Owner Author

eval-gate failure: pre-existing, already-filed infrastructure defect

eval-gate failed on head ad834c94 (job log: error: model CLI exited 1: with empty stderr, ~2s after the step started, right after the "Run touched skills' evals suites" step invokes evals/scripts/gitapex_run_eval_suite.py against evals/drafting-a-skill/eval.yaml).

This is not this PR's own failure. The exact signature -- error: model CLI exited 1: (empty stderr) -- matches issue #1304 (fix(waza-eval-gate): live eval runs fail with "model CLI exited 1" and empty stderr, repo-wide) precisely: same error text, same timing (~2-2.3s), reproduced there on two unrelated branches touching different skills' suites with different fixture content. That issue's own investigation ruled out fixture content as the cause and left the root cause open (candidates: an expired/misconfigured ANTHROPIC_API_KEY, a behavior change in the pinned @anthropic-ai/claude-code CLI version, or a missing env var in the hermetic subprocess environment) -- still unconfirmed and unfixed as of this comment, per the issue's own current state.

No fix exists yet to port into this PR. eval-gate is also not a required status check (.github/rulesets/main.json does not list it, and issue #1304's own "Risk / blast radius" section confirms this explicitly), so it does not block merge. Standing down on this failure without a re-run: it is not a suspected flake (the failure is deterministic and repo-wide per #1304's own evidence, not something a re-run would resolve), so the one-re-run allowance does not apply here. Keeping this PR watched.


Generated by Claude Code

… boundary

Repository owner requested reorganizing the responsibility split
between drafting-a-skill and scorer-gated-skill-edits along a new
axis: how a SKILL.md gets rewritten (drafting-a-skill, new or
existing target alike) vs. evaluating the result of a change
(scorer-gated-skill-edits, always opt-in), rather than the current
new-skill-vs-existing-skill split. Converged through eliciting-a-design
(four sections presented and approved individually) and confirmed via
a clairvoyance terminal handoff.

Under the new division, the "Existing-skill-file edit floor" added
earlier this session (issue #1630, PR #1632) becomes redundant --
every SKILL.md edit routes to drafting-a-skill's own full procedure
instead of a lighter, separate floor -- and is scoped for removal.

Refs #1648
@tvna
tvna deployed to ruleset-verify August 31, 2026 19:46 — with GitHub Actions Active
…y redivision

Decomposes issue #1648's 5-row ACM into three tasks: Task A rewrites
drafting-a-skill/SKILL.md's Precondition/Step 1/Step 7/Postcondition/
Related skills; Task B rewrites scorer-gated-skill-edits/SKILL.md's
Step 3 and adds a new pre-ship full-review requirement, sequenced
after Task A via an explicit interface-dependency edge (both tasks
state the same cross-skill dispatch contract, learning from the
prior Branch Plan on this branch judging an analogous pair to have
no edge, which Step 8's own review later found a real collision in
anyway); Task C removes the now-redundant Existing-skill-file edit
floor and consolidates routing. Wave 1: {A, C}. Wave 2: {B}.

Refs #1648
…f events-and-review-gate.md

A Fable root-cause dispatch on the standing dimension-5 gap (issue #1648)
found a real, separate residual defect: events-and-review-gate.md mixed
every-run content (steps 5, 8) with roughly 200 lines an ordinary clean
run never reads (loss/absence handling, freshness/hang detection, the
step-7 failure-dispatch table, and rollback). Extract that content into
a new failure-and-recovery.md, repoint every cross-reference (SKILL.md,
threat-model-and-authorization.md, gitapex_check_task_full_verification.py,
and the in-file links between the two split files), and record the
change in the decision log alongside issue #1662, the new tracking issue
for the rubric-level fix the same dispatch identified (dimension 5 has
no satisfiable clause for a cohesion-confirmed sequential-pipeline skill
over the body cap). This split is a genuine progressive-disclosure gain
on its own terms, but does not by itself close dimension 5: the typical
request still opens three reference files, and that gap stays open
pending issue #1662.

Refs #1648, #1662
Resolves the behind-base gate (issue #985) before pushing the
events-and-review-gate.md split.

# Conflicts:
#	docs/skill-eval-status.md
…g dimension 5 now passes

Issue #1662's rubric-level fix merged (PR #1672). An isolated re-review
against the new rubric text -- independently re-deriving cohesion,
verifying both new-exemption conditions against actual measured line
counts, and checking whether an easier file-count reduction is
available -- confirms dimension 5 now passes for this skill's current
4-file split. Overall verdict stays WELL-FORMED-NOT-MATURE: the same
review found dimension 2 (sediment/duplication/sprawl) and the
Mixed-portability physical-split gap remain open, disclosed here rather
than fixed.

Refs #1662
@tvna
tvna deployed to ruleset-verify September 2, 2026 13:37 — with GitHub Actions Active

tvna commented Sep 2, 2026

Copy link
Copy Markdown
Owner Author

Verification section archive (Content-preservation review through Current status)

Moved out of the PR body per this repository's own token-budget constraint on pull_request_read(method=&#34;get&#34;) -- the PR body had grown past what a single read of it can return, which was blocking this session's own turn-terminal mergeable_state verification obligation. This comment preserves the detailed implementation-history record verbatim; the PR body now carries only a summary pointer to this comment. Nothing here changes -- this is a relocation, not a rewrite.


Content-preservation review on the description/body rewrite (row 4). An independent subagent dispatch compared the pre-rewrite and post-rewrite SKILL.md section-by-section and returned FAIL on the first pass: dropped Precondition/Postcondition definitions in Step 2 (which the Notes section's own Dimension-9 Broad-bar claim depends on), a dropped anti-abuse guard on Step 7's escalation branch ("not a general-purpose way to defer a hard-to-fix finding"), dropped completion-loop language in Steps 4 and 6, and assorted terminology/wording drift. All were restored. Separately, the full pytest run -- not covered by the content-preservation review itself -- surfaced two further regressions the review could not catch: a Step-1 header line-wrap change and a Step-7 "fresh dispatch" word-order change, both of which broke tests/test_gitapex_gate_split_fixture_coverage.py's exact-substring matching against evals/drafting-a-skill/tasks/normal.yaml and injected-self-certification-probe.yaml. Both restored to their original wrap/word-order; the related paraphrase-drift lint (tests/test_gitapex_lint_fixture_assertions.py::test_repository_wide_fixtures_have_no_unreviewed_blocking_findings) passes again. Final state, all committed as b383faf9: both shape checkers clean, full pytest suite (7828 passed), local preflight (44/44 gates) passed.

Live-collision-bullet follow-up (commit 2e1b74b9). The repository owner flagged the Related-skills "Live collision" bullet (framing writing-skills/skill-creator as a routing-collision risk for this skill) as no longer worth carrying. Verified before acting: origin/main was already fully merged into this branch (0 commits behind), so no rebase/merge was actually pending; the vendored .claude/skills/writing-skills/ directory is real and still present on disk in this session's own environment despite apm.yml/apm.lock.yaml no longer declaring the retired obra/superpowers dependency (apm install does not prune an already-deployed, gitignored copy). The owner's stated rationale holds regardless: this skill is dispatched via executing-a-branch-plan Step 6's own explicit branch-plan-task agent() call, not selected through model description-routing, so a still-present vendored copy creates no actual routing collision for this skill. The bullet was removed; its still-valid never-import-RED-GREEN-REFACTOR fact (writing-skills' own testing methodology, deliberately not adopted here) was folded into the existing Notes Attribution bullet rather than dropped, and the decision recorded in metadata/gitapex.yaml. Both shape checkers clean (53/53, no drift), full pytest suite (7828 passed), local preflight (44/44 gates) passed.

Worked-example code-block follow-up (commit d96be457). The repository owner asked for the Worked example section to be rendered in code-block/frontmatter form, matching writing-skills' own Bad/Good code-block presentational pattern more directly. The first candidate's Step 2 now shows its actual frontmatter (name/description) as a fenced YAML code block instead of describing it in prose; the second candidate's earning-test failure is now a Bad/Good fenced-code-block pair (an over-populated Precondition/Postcondition/Non-goals section vs. the corrected single-Step form) instead of one prose bullet each. SKILL.md grew from 392 to 425 lines, well inside BODY_MAX_LINES=500, so the owner's contingency instruction (delete the ## Notes section first if a line-count problem occurred, since issue #901's own Acceptance Criteria Map already plans to migrate most of it into metadata/gitapex.yaml) did not need to be exercised. Both shape checkers clean (53/53, no drift), full pytest suite (7828 passed), local preflight (44/44 gates) passed.

Line-wrap retraction (commit ad834c94). The repository owner asked why the body wrapped at seemingly arbitrary points, and after confirming this was an unenforced ~72-column manual habit specific to this skill (docs/skill-authoring-standards.md states no such rule, the shape checker has no line-length check, and eliciting-a-design/SKILL.md routinely carries 100-400+ char lines with no wrap), asked for it to be retracted repository-wide within this skill -- since this skill is meant to be the vehicle for refactoring other existing skills going forward, an unexamined habit here risked propagating into every future draft. Reflowed every prose paragraph/bullet in SKILL.md and all five references/*.md files into single natural-length lines (frontmatter, tables, and fenced code blocks left untouched); content-preservation verified two independent ways per file (whitespace-normalized exact match, and a hyphen-aware reconstruction), both agreeing exactly. Found and fixed a latent rendering bug the old habit carried: 8 wrap points fell exactly on a hyphen inside a compound identifier (e.g. untrusted-input-triage), which CommonMark's own soft-break-to-space rule was silently corrupting into a spurious space at render time. Also un-wrapped the Worked example's own embedded frontmatter description: field to one line. Un-wrapping changed the full-line identity gitapex_check_skill_shape.py's Check E keys Stop-boundary bullets and Procedure/Steps items on, so all six evals/drafting-a-skill/tasks/*.yaml fixtures whose expected.exercises declared a now-stale line-wrapped fragment were updated to the new full-line text. Both shape checkers clean (53/53, no drift), full pytest suite (7828 passed), local preflight (44/44 gates) passed.

Trigger-only description follow-up (commit 3c044c0d). The repository owner: a description's "what it does" clause should be minimized wherever possible, and its "when" clause may be omitted entirely for a pipeline-only skill like this one, since no model ever reads it to make a live routing decision. Applied here: dropped the workflow-summary sentence and all three Distinct-from clauses from this skill's own description, keeping only the pipeline-only dispatch-condition sentence (675 -> 250 chars, 24.4% of cap). Separately corrected Step 4's own "Real collision found?" remedy, which had conflated two different things: a Distinct-from clause is a targeted fallback for invocation triggers that stay genuinely adjacent even after narrowing, not a routine response to two skills merely sounding functionally similar -- this skill's own now-removed Distinct-from clauses were exactly that misuse. Also trimmed the Worked example's curl-command-explainer sample description to its trigger clause only, dropping its "what it does" clause, as a second worked instance of the same principle. Separately, CI (split-fixture-coverage, head ad834c94) found the line-wrap retraction had changed the Stop-boundary bullet identity that gate's delta-scoped check keys on, leaving "Never loop back into scorer-gated-skill-edits-shaped iterative editing..." with no fixture whose expected.exercises resolved to its new full-line text; added that declaration to evals/drafting-a-skill/tasks/existing-skill-routes-away.yaml, whose own scenario already exercises exactly that boundary. Both shape checkers clean (53/53, no drift), full pytest suite (7828 passed), local preflight (44/44 gates) passed.

Boundary redivision (issue #1648, Wave 1 complete). Converged through eliciting-a-design (four sections approved individually across three AskUserQuestion rounds) and a clairvoyance terminal handoff; design doc committed at 3d656d93; issue #1648 filed and independently re-verified via planning-a-branch-from-an-issue; task list committed at 2ff00c34 (three tasks: A rewrites drafting-a-skill/SKILL.md's Precondition/Step 7, B rewrites scorer-gated-skill-edits/SKILL.md's Step 3 sequenced after A via an explicit interface-dependency edge, C removes the "Existing-skill-file edit floor" and consolidates routing).

Wave 1 (A and C, no interface-dependency edge between them) executed in isolated worktrees, each independently passing its own full pytest suite and gitapex_gate_local_preflight.py before merge-back. review-persona screening on both diffs found only the expected, unconditional check-3 hard flag (an existing governance-file edit -- drafting-a-skill/SKILL.md, executing-a-branch-plan/SKILL.md) with checks 2 and 4-8 clean on both; the commit-message provenance scan was clean on both. Merged Task A (a4d5465d) then Task C (da1aca9c); the two touched one shared file (evals/drafting-a-skill/tasks/existing-skill-routes-away.yaml) -- Task A's own citation-only fix, needed to pass its own gate, versus Task C's deliberate retirement of that same file, since its scenario tested exactly the Precondition bullet Task A's own merge already removed -- resolved as a modify/delete conflict by taking Task C's retire decision, the one the design actually calls for.

Merging the two independently-clean worktrees surfaced one interaction neither task's own isolated run could catch: gitapex_gate_skill_branch_fixture_coverage.py's delta-scoped check, run directly against the real origin/main merge-base, failed on the merged state. drafting-a-skill/SKILL.md still declares 7 Stop-boundary bullets (Task A reworded 3 of them, and the gate's delta scan keys on exact bullet text -- all 7 already counted as "new" content this PR introduced once the earlier line-wrap retraction reflowed every bullet onto one line), while the fixture count had dropped to 6 once Task C retired existing-skill-routes-away.yaml. Fixed (commit be3b3ddd) by adding not-the-scorer-loop.yaml, a new fixture covering the one Stop-boundary bullet no prior fixture in this suite exercised (the reworded "never treat this skill as itself the scorer-gated iterative-editing loop" boundary -- the bullet most central to this issue's own redivision), restoring 7-fixture/7-branch parity; also regenerated docs/skill-eval-status.md (6 -> 7) and rewrote evals/drafting-a-skill/eval-status.md's own stale summary, which still described the retired fixture as present.

Re-verified on the fully merged, pushed state (head be3b3ddd): full pytest suite (7736 passed, run with the 4 real-bash-oracle pin/differential test files excluded per this environment's own worktree-isolation constraint) and all 44 gitapex_gate_local_preflight.py gates passed, including behind-base (no drift against origin/main) and skill-eval-status-doc-drift; gitapex_gate_skill_branch_fixture_coverage.py itself re-verified directly against the real origin/main merge-base content (7 branches, 7 fixtures, passes).

Wave 2 complete (Task B: scorer-gated-skill-edits Step 3 rewrite, commit 87ca81cc). Sequenced after Task A per the interface-dependency edge, Task B rewrote scorer-gated-skill-edits/SKILL.md's Step 3 to dispatch drafting-a-skill for patch authoring (quoting drafting-a-skill's own final committed Step 7 wording verbatim in a blockquote) and added a new Step 9 ("Required: run drafting-a-skill's own Step 7 once, before filing the PR"). gitapex_check_task_commit_provenance.py flagged an undisclosed AI-provenance trailer in Task B's own commit message (hard block, no PR-body-trailer exception for commit messages); fixed via git commit --amend in Task B's own worktree before merging, producing the clean commit 87ca81cc. Merged cleanly (no conflicts with Wave 1's already-merged state).

Step 8 aggregate review (mandatory two-pass review over the full accumulated diff, per executing-a-branch-plan's own Decision 12). Two separate, fresh subagent dispatches ran over the complete diff before proceeding: a refactor/simplify pass, then an independent adversarial code review.

The refactor pass found and fixed 3 mid-backtick line-wrap corruptions inside Task B's own new Step 3 blockquote (commit 0a5e56ff).

The adversarial pass returned 10 findings (F1-F10), all verified and either fixed or explicitly disclosed as a known gap rather than silently left. Fixed, committed together as 4fbb873a:

  • F1: drafting-a-skill/SKILL.md's Precondition was missing the third dispatch context (scorer-gated-skill-edits's own Step 9 pre-ship review); added, and Step 7 restructured into an unconditional-dispatch branch (Context 1/3) vs. a deferred branch (Context 2).
  • F2: several drafting-a-skill sections (Precondition bullet 2, Step 1 header, Step 2's axis-fill bullet, Postcondition, Output) named only the ACM-Planned-ops input, omitting the iteration-finding input Context 2 actually supplies (which has no ACM row at all); generalized to name both.
  • F3: two Related-skills rows (executing-a-branch-plan's own vs. drafting-a-skill bullet, and drafting-a-skill's own scorer-gated-skill-edits row) understated the relationship after the redivision; reworded to reflect it accurately.
  • F4, F6 (partial): fixed a scorer-gated-skill-edits/SKILL.md line wrongly treating a sibling-skill mention as a dependency without exempting drafting-a-skill (now a real, named dependency after Task B); fixed a Notes/Portability paragraph miscounting "one instruction" that does not resolve inside the skill's own directory as "two"; corrected several fixtures' output_not_icontains negation-trap bans across both skills' evals/*/tasks/*.yaml (a ban must not be a phrase the correct, resisting answer would itself naturally state in denial).
  • F9, F10: fixed a stale present-tense reference in evals/drafting-a-skill/eval-status.md to the already-retired existing-skill-routes-away.yaml fixture; re-synced three fixtures' expected.exercises citations to the F1/F2-reworded text.
  • F5 (disclosed, not fixed): the adversarial review also found Step 9's required fix-and-refile path names no re-gate/superseding-record obligation. Every wording attempted to fix this in scorer-gated-skill-edits/SKILL.md pushed the file past its 500-line body cap with no version tight enough to trust; rather than ship cryptic wording just to fit, this was disclosed as a named, reasoned gap in evals/scorer-gated-skill-edits/eval-status.md instead.
  • F7 (disclosed, not fixed): the two new fixtures Task B's own gate work added (step3-dispatches-drafting-a-skill.yaml, step9-pre-ship-review-required.yaml) have no split.json train/selection/test assignment and no negative-control pairing, which is this skill's own Step 2 held-out-coverage rule -- disclosed in the same eval-status.md as an open test-design task, not silently assumed solved.

Re-verified after 4fbb873a: both shape checkers clean, full pytest suite passed, all 44 local-preflight gates passed.

scorer-gated-skill-edits line-wrap retraction (commit a61bf767). Per repository owner request, retracted the same unenforced ~72-column manual line-wrap habit from scorer-gated-skill-edits/SKILL.md and its two references/*.md files, exactly as already done for drafting-a-skill above (same rationale: docs/skill-authoring-standards.md states no such rule, and the shape checker has no line-length check). Reflowed to one logical line per bullet/paragraph/blockquote entry, preserving frontmatter, fenced code blocks, headings, and tables verbatim. SKILL.md: 500 -> 116 lines; worked-example.md: ~97 -> 88 lines; skillopt-mapping.md: 67 -> 67 lines. Content preservation verified two independent ways per file (whitespace-normalized exact match, and byte-identical fenced-code/frontmatter span comparison).

The reflow changed every Stop-boundary bullet's and Procedure item's first line, which gitapex_gate_split_fixture_coverage.py Check E keys on to detect "new" branch content -- since this skill had zero pre-existing expected.exercises citations before this round, the delta-scoped demand flagged all 13 Stop-boundary + 9 Procedure items as needing coverage. Resolved by adding citations to 15 existing fixtures and authoring 6 new fixtures for genuine gaps (step8-recommended-not-required, blind-spot-pass-cannot-be-silent, pre-edit-state-via-git-show-not-mutation, isolated-scorer-registration-unconfirmed, ordinal-change-needs-cross-reference-sweep, restraint-check-corroboration-must-be-real). Two bugs found and fixed along the way: a leading-&#34;- &#34;-marker citation mismatch across 8 files (the resolver strips a bullet's own leading - marker before comparing, so a citation that includes it never resolves), and a duplicate exercises: YAML key in one fixture from a batch-insert script's flawed skip-check.

Regenerated docs/skill-eval-status.md (scorer-gated-skill-edits fixture count 17 -> 23). Re-verified: full pytest suite (7736 passed, run with the 4 real-bash-oracle pin/differential test files excluded per this environment's own worktree-isolation constraint) and gitapex_gate_local_preflight.py (44/44 gates PASS).

Current status. All planned implementation work for issues #1630 and #1648 is complete and re-verified on the current head (77a51760): both shape checkers clean across all three touched skills, full pytest suite passing, all 44 local-preflight gates passing, both fixture-coverage gates (gitapex_gate_skill_branch_fixture_coverage.py and gitapex_gate_split_fixture_coverage.py) passing. drafting-a-pr-to-merge's own Step 8 independent review has now actually run (see ## Independent review verdict below) and returned NOT-CLEAN with specific, cited findings -- the small, mechanical ones fixed this round, the larger structural ones deliberately deferred with the repository owner's informed choice. Two required checks remain red:

  • independent-review-pending -- Step 8 ran; verdict is honestly NOT-CLEAN per the section below, not a silent gap.
  • skill-audit-disclosure -- see ## Skill audit evidence below, now populated this round.
  • eval-gate (not a required check) -- fails with the exact error: model CLI exited 1 signature tracked in issue fix(waza-eval-gate): live eval runs fail with "model CLI exited 1" and empty stderr, repo-wide #1304, a pre-existing, repo-wide infrastructure defect unrelated to this PR's own content (see the PR comment at 2026-08-31T19:16:11Z).

This PR has no known content defect beyond what ## Independent review verdict discloses, no open review thread, and no merge conflict. It remains blocked on the two items above.


Generated by Claude Code

tvna commented Sep 2, 2026

Copy link
Copy Markdown
Owner Author

Independent review verdict archive (Round 1 initial dispatches through Round 9)

Moved out of the PR body for the same token-budget reason as the sibling Verification-section archive comment above. This comment preserves Round 1 (the initial three-skill independent dispatch), Round 2, Rounds 3-6 (scorer-gated-skill-edits alone), Round 3 for the other two skills, Round 4, Round 5, and Rounds 6/8/9 verbatim. Round 10, Round 11, and the current "Why NOT-CLEAN" verdict remain in the PR body itself -- this archive is history, not the live verdict.


All three dispatches returned WELL-FORMED-NOT-MATURE (shape checks clean; nine-dimension maturity not fully cleared):

  • drafting-a-skill: shape 53/53 PASS, no drift. Gaps found: dimension 1 (invocation-mode mismatch -- frontmatter allowed automatic model invocation despite the skill's own absolute "never invoke directly" claim), dimension 5 (Mixed-portability repo-specific content blended into contract-structure.md/mechanism-fit-and-cohesion.md rather than confined to the dedicated gitapex-cross-links.md), dimension 6 (an already-disclosed, open TOCTOU concurrency residual on a simultaneous blank-page start). Fixed this round: dimension 1 -- added disable-model-invocation: true (commit 77a51760); user-invocable stays at its true default, so /drafting-a-skill still works, only automatic model-choice invocation is now blocked. Deferred: dimensions 5 and 6 (structural reference-file split; an accepted, already-disclosed race).

  • executing-a-branch-plan: shape 61/61 PASS; the 4-finding executionRequirements drift is confirmed pre-existing to this PR (independently verified via git stash against the pre-PR baseline this session), not attributed here. Gaps found: dimension 2 (minor -- recurring correction-provenance narration across 4 sites), dimension 5 (major -- the declared Adaptive capability assumption is contradicted by a near-500-line-cap body and a universally-mandatory reference read), dimension 6 (minor -- one real gap in the state-management sub-check's axis 5, the reverse ground-truth-to-record reconciliation direction, amid an otherwise-strong 10/11-axis framework), dimension 7 (minor -- gitapex_check_task_commit_provenance.py reuses outward-artifact-preflight's gitapex_scan_provenance.py by file path but that dependency was undeclared in metadata/gitapex.yaml). Fixed this round: dimension 7 -- added outward-artifact-preflight to skillDependencies.requires (commit 77a51760). Deferred: dimensions 2, 5, 6 (narration cleanup across reference files; an Adaptive-vs-Frontier re-declaration or a real body-size reduction; a new reverse-reconciliation resume step) -- each a real structural change, not a mechanical fix.

  • scorer-gated-skill-edits: shape 47/47 PASS, no drift. Gaps found: dimension 2 (minor, self-disclosed and corroborated -- run-record field enumeration grew the body by roughly a third), dimension 4 (major -- Step 1's fragile multi-check runner-pinning sequence is one unbroken prose paragraph, not a checklist), dimension 5 (major -- references/split.schema.json was never linked from any file, and the declared Mixed-portability split was disclosed in Notes but not actually carried out), dimension 6 (major -- all three bundled JSON schemas' $id fields hardcoded this repository's own GitHub blob path, asserting false provenance the moment a copy travels with a vendored skill; Step 8 cited its own issue/PR as inline-code #218/#216 rather than a full URL). Fixed this round: dimension 5's unlinked-reference half -- linked references/split.schema.json from Step 2 (commit 77a51760); dimension 6 in full -- repointed all three schemas' $id to a repository-independent https://gitapex.io/schemas/scorer-gated-skill-edits/... domain (matching evaluating-skill-quality's own schema convention) and converted the Step 8 issue/PR citation to full URLs. Deferred: dimension 2 (run-record field count); dimension 4 (Step 1's prose-to-checklist restructure); dimension 5's Mixed-split-not-carried-out half (the repo-specific runner detail stays woven through the main Procedure rather than isolated into a dedicated reference file).

All three skills' shape checkers and drift scanners re-ran clean after the fixes above (53/53, 61/61, 47/47; drafting-a-skill/scorer-gated-skill-edits no drift, executing-a-branch-plan's pre-existing drift unchanged); full pytest suite (7736 passed) and all 44 gitapex_gate_local_preflight.py gates passed on commit 77a51760.

Round 2 (commit 80d9f7d5). fable-authored fixes applied directly to the working tree, then independently re-reviewed by isolated sonnet dispatches per skill, from scratch. drafting-a-skill and executing-a-branch-plan each had one new major finding (a stale decision log describing removed apparatus; a capability-assumption self-contradiction) plus minor findings, all fixed and re-verified. scorer-gated-skill-edits surfaced two new findings -- dimension 2 (cross-file duplication between SKILL.md step 7 and eval-run.schema.json) and dimension 6-major (the eleven-axis state-management sub-check: 5 clear Fails plus 1 mixed axis) -- deliberately deferred this round to avoid the quality-degrades-with-volume risk of fixing three skills' worth of structural findings in one pass; disclosed in full rather than silently dropped.

Rounds 3-6 (commits b9f77b4b..2c01cdd7): closing scorer-gated-skill-edits alone, to the point of diminishing returns. With the repository owner's explicit approval to continue, four further isolated sonnet re-reviews ran against this one skill, each grading fresh from scratch rather than only re-checking the prior finding -- the discipline that let each round catch what the previous round's own fix had missed, not just confirm it:

  • Round 3 confirmed round 2's dimension-2 duplication fix holds, and found the state-management fixes had reduced the axis-Fail count from 5 to 1 (axis 7, concurrency) plus 2 narrower residuals (axes 5, 9) -- but surfaced two fresh findings of its own: a live, systematic bug (references/skillopt-mapping.md cited seven step numbers against SKILL.md's own Procedure, every one stale by the same offset since round 1 inserted a new step 1 -- the exact cross-reference-drift failure this skill's own Step 3 mandates sweeping for, found live in the skill whose entire purpose is catching it), and one unhedged Mixed-portability passage (gitapex-specific waza/CI-workflow detail with no hedge, unlike its own sibling bullet). Both fixed; axes 5 and 9 also closed with a bidirectional reconciliation rule and a "where it sits" trust-boundary statement.
  • Round 4 confirmed every one of the round-3 fixes, leaving axis 7 (concurrency) as the sole remaining gap, and rejected round 3's own attempted fix for it (a disclosed best-effort timestamp heuristic) as not meeting any of the axis's five required Pass disjuncts (serialization, single-writer, partition, locking, race-removing construction) -- disclosure of a race is not the same as closing it.
  • Round 5 rejected the next attempt (reframing the existing record-identity rule as a must) on a sharper technical ground: a mandate is not a mechanism. No collision-safe algorithm was actually specified, the schema left the identity field optional, and the skill's own text already conceded two same-day runs share date+commit -- exactly the pair two uncoordinated invocations would both compute.
  • Round 6 (final): this fix specified a genuine collision-avoiding construction -- each run record's filename now carries a secrets.token_hex(4)-class high-entropy random component every invocation generates independently, not a small ordinal or bare timestamp -- and the round-6 review independently confirmed this is a real fix, not a relabeling: 32 bits of entropy is sufficient against axis 7's own accidental-collision (not adversarial) threat model, and the schema/prose are now mutually consistent about what does and doesn't provide the guarantee. The review named one further, more precisely-scoped standing gap the fix does not reach: a second, distinct writer class -- two full concurrent invocations of this skill proposing different edits against the same target SKILL.md, sharing one working tree -- races on whose edit commits first, with no enforced isolation (the skill's own git-conflict argument for this case explicitly depends on a worktree-isolation precondition it discloses but does not itself require or check). The review closed with an explicit recommendation not to run a seventh round, framing this as the disclosed, final standing gap rather than something to keep chasing; two concrete remedies were named for whoever picks this up next (an enforced worktree-isolation precondition, or a write-side optimistic-lock check mirroring the read-side git show : construction this skill already uses) but neither was attempted this round, per that same review's own advice to stop here.

Every round's fix was independently re-verified in this session (not only per the dispatching sonnet review's own self-report): shape checker 49/49 throughout, no executionRequirements drift, full pytest suite (7828 passed) and all 44 gitapex_gate_local_preflight.py gates passing after every commit in this range.

Round 3 for the other two skills (commits 64c495a3..3b7effb8): drafting-a-skill and executing-a-branch-plan's own first from-scratch re-review since round 2. With the repository owner's explicit direction to return to these two skills' own unaddressed items rather than continue scorer-gated-skill-edits further, two fresh isolated sonnet re-reviews ran, one per skill, each grading from scratch rather than re-checking round 2's findings only -- the same discipline the scorer-gated-skill-edits rounds above already used. Both surfaced genuinely new findings neither round 1 nor round 2 had named:

  • drafting-a-skill (commit 64c495a3): the review found Step 2's own decision-log-content bullet was missing locus/precedence, trust-boundary, and store-fit statements that a decision-log entry (commit c3010a1a) shows were once present -- root-caused via git log -S/git show to the same 5552931b "pipeline-only re-scope, delete Step 2/3/9" commit already implicated in an earlier round's finding, a second, previously undetected instance of collateral content loss from that one commit. Restored, expanded with read-back-reconciliation (a baseCommit that doesn't resolve, or a claimed fix verifiably absent from the current body, is itself a new decision-log entry disclosing the gap) and loss/absence-handling (a missing/truncated/unparseable sidecar is never read as "nothing was decided yet") rules the original text never had. Also fixed 3 stale cross-references the same commit left behind (contract-structure.md, guidance-form-and-sdo.md x2, citing the deleted apparatus's former Step numbering) and disclosed the disable-model-invocation frontmatter field's Claude-Code/Cursor-specific scope in the compatibility field (a PROPOSE_COMPATIBILITY finding). 3 decision-log entries plus 1 caveat entry added disclosing the backfill, per this file's own "never silently backfilled" convention. Verified: shape checker 53/53, drift scanner clean.
  • executing-a-branch-plan (commits 43c7f49b, 852f1acb, 3b7effb8): the review found one residual dimension-2 correction-provenance narration site in references/threat-model-and-authorization.md (fixed -- dropped the discovery-provenance clause, kept the substantive issue citation) and a dimension-6/state-management axis-7 Fail: no guard against two independent invocations of this skill running against the same Branch Plan's PR at once, only the internal single-write race was disclosed. Closed by reusing the existing branch-plan-executing label as a real test-and-set ownership signal (not a disclosed heuristic -- the lesson the scorer-gated-skill-edits axis-7 saga above already paid for): before applying the label (Step 5) or writing any subsequent event (Steps 6-9), the same fetch checks the label is either absent (safe to claim) or present-and-applied-by-this-run (safe to continue); present-and-not-ours is a stop and escalate. Wired a pointer into SKILL.md's own Step 5/6 text so the mechanism is actually invoked by the procedure, not left living only in the reference file (the review's own incompleteness finding); trimmed elsewhere to keep the body at exactly the 500-line cap. Separately, a dimension-7 major finding: scripts/gitapex_check_task_bash_safety.py's 297-line module docstring plus inline comments carried 40+ correction-provenance narration instances ("Found live by Step 8 independent review, Nth round") across the file's 3060 lines -- the same anti-pattern already fixed at 5 sites elsewhere this session, found here at file-wide scale. Rewrote every affected docstring/comment as a present-tense statement of the bypass class or false-positive trap it defends against, dropping the discovery-provenance framing entirely; zero functional code changed (AST-verified, this file's own 155-test suite and the full 259-test directory suite pass unchanged). The rewrite's own comment-only diff tripped gitapex_gate_function_body_test_coverage.py's heuristic on 41 functions (a changed comment line inside a function body reads as a changed body line); waived each via the gate's own documented # function-body-test-coverage: WAIVED: escape hatch, citing the unchanged test suite as the actual proof. Verified: shape checker 61/61, drift scanner shows only the same 4 pre-existing, confirmed-unrelated executionRequirements findings (unchanged).

Both fixes independently re-verified in this session: full pytest suite (7828 passed) and all 44 gitapex_gate_local_preflight.py gates passed after every commit in this range.

Round 4 (commits 5e351522..074c848c): fresh isolated re-reviews of all three skills, each grading from scratch. Each surfaced genuinely new findings beyond round 3's own:

  • drafting-a-skill (5e351522, 83eb216e): two stale "Step 5" citations in guidance-form-and-sdo.md corrected to "Step 3"; state-management axis 9's outbound half (a decision-log summary's own content contract) restored, a second collateral-loss instance from the same re-scope commit round 3 already found once; axis 7's prior "closed" framing found scoped only to the blank-page writer class, with a second writer class (concurrent edits to an existing target) disclosed as open rather than left silently uncovered.
  • executing-a-branch-plan (074c848c): the last residual correction-provenance-narration site in threat-model-and-authorization.md's Full-verification exit condition rewritten as plain present-tense fact.
  • scorer-gated-skill-edits round 7 (f2c32043): the round-6 worktree-isolation fix was found to be an unenforced assertion -- git worktree add creates the directory but nothing relocates execution into it. Restructured into named sub-steps (Check/Self-establish/Relocate/Scope/Landing-time rule/Cleanup) adding the missing explicit cd plus a re-verified completion criterion.

All three skills' shape checkers and drift scanners re-ran clean after these fixes; full pytest (7828 passed) and all 44 gitapex_gate_local_preflight.py gates passed throughout.

Round 5 (commits c13c6437..d807ff1d): a fresh re-review of every round-4 fix finds two of the three fixes were not actually closed, and surfaces the largest remaining structural gap.

  • drafting-a-skill: the round-4 axis-7 disclosure was internally self-contradictory (Step 2's own mkdir bullet names a non-worktree-isolated "sequential-fallback run" as real for executing-a-branch-plan, while the sidecar-race sentence a few lines later claimed that same caller "always" runs isolated) -- corrected to disclose the race as genuinely open under that fallback, not a future-caller hypothetical. The axis-5 reverse-reconciliation sentence added in round 4 was found to be a same-round writer self-check, not what axis 5 actually requires (a resume-time sweep catching a writer that crashed mid-round before logging) -- replaced with a real resume-time sweep: at resume, scan git log on the draft's own files since the log's last entry for undisclosed commits. That same axis-5 sentence's own addition was found to carry no decision-log entry of its own -- a live instance of the exact drift it prohibits, backfilled and disclosed via a new caveat entry (c13c6437).
  • executing-a-branch-plan: round 4 found dimension 5 (major) -- the ordinary execution path forces 5-6 mandatory reference files open, exceeding rubric.md's own "if acting on the typical request needs three files open, the split is wrong" line. Investigated whether the rubric's own narrow dispatch-self-guard exemption applies to any of the five (it does not -- each varies with the target Branch Plan's own content) and whether any complexity-scale exception exists elsewhere in the rubric (it does not). Merged the five files by lifecycle axis into two -- decomposition-and-dispatch.md and events-and-review-gate.md -- alongside the already-standalone threat-model-and-authorization.md, going from 6 to 3 reference files with every heading demoted one level (text unchanged, so every anchor slug survives) and roughly 25 cross-references repointed across SKILL.md, the threat-model reference, 3 bundled scripts, and one test docstring (d807ff1d, plus a small function-body-test-coverage waiver fix).
  • scorer-gated-skill-edits round 8: independently confirmed the round-7 Relocate fix is a genuine, checkable construction closing axis 7 for real. Found the same round's new Cleanup sub-step named git worktree prune as the way to clear a stale worktree -- per git's own docs, prune only clears admin metadata for a working tree already removed by other means, it does not itself remove one still on disk. Corrected to the actual removal commands (git worktree remove, git branch -d), prune's real scope stated.

Rounds 6/8/9 (commits 1ef5add8..3374f0b8): confirming every round-5 fix from scratch surfaces further real defects in two skills, and a genuine misreading in the third.

  • drafting-a-skill round 6: confirmed axis-7 and axis-5's mechanism now hold, but found the new resume-time sweep was scoped only to dispatch context 2, though the Precondition already lets context 1 target an existing SKILL.md too -- an equally in-scope resume case with no equivalent sweep. Broadened to either context. Also found the sweep's own git log invocation was undeclared in executionRequirements.tools.shell -- declared (1ef5add8).
  • scorer-gated-skill-edits round 9: reconfirmed axis 7 solid, found two minor gaps -- Cleanup's git worktree remove/git branch -d each have a real refusal precondition (uncommitted changes; an unmerged branch) with no fallback stated, and Step 5's rejected-edit log never named its own file locus. Both fixed: a confirm-before-forcing fallback added; the locus stated as evals//split.md, the same file already cited for the Kept-edit log (be8ee116).
  • executing-a-branch-plan round 5: confirmed the round-5 reference-file merge itself introduced no new defect (links/anchors resolve, no dangling reference), but corrected a misreading in how round 4's own finding had been closed -- rubric.md's text reads "if acting on the typical request needs three files open, the split is wrong": three is the failure condition itself, not an acceptable ceiling the 6-to-3 merge could satisfy by reaching it. Two further restructurings were considered and declined, by the repository owner's own direction, rather than attempted unilaterally: arguing threat-model-and-authorization.md qualifies for the rubric's own dispatch-self-guard exemption (a rubric-interpretation call the round-5 review itself named as belonging to the repository owner's own process, not a single review session), and merging all three files into one (risking a new dimension-5 failure from the opposite direction -- a single 1700+-line file). The prior entry's overclaim was corrected via a caveat, and the standing gap recorded and disclosed (3374f0b8) rather than pursued further this session.

Every fix across rounds 4-9 was independently re-verified in this session: shape checkers clean throughout (drafting-a-skill 53/53, scorer-gated-skill-edits 49/49, executing-a-branch-plan 52/52 after the merge -- down from 61/61 before it, tracking the reduced reference-file count), executing-a-branch-plan's drift scanner shows only the same 4 pre-existing, confirmed-unrelated executionRequirements findings throughout, full pytest (7828 passed) and all 44 gitapex_gate_local_preflight.py gates passed after every commit in this range.


Generated by Claude Code

…sprawl

Fable-verified findings (isolated dispatch, no rubric blind spot on
this dimension): threat-model-and-authorization.md carried quoted
empirical-verification transcripts as changelog-style sediment, a
two-variant deployment asymmetry restated in full at comparable length
twice, and inlined plugin-distributed-only detail read on every run.

Pruned six passages (584 -> 539 lines), preserving every fact the
analysis flagged as load-bearing: the live-proxy caveat,
CLAUDE_PROJECT_DIR mechanism, residual bypass ceilings, and the fuller
Decision-7 restatement. No structural change; shape checker 55/55,
drift scanner unchanged (4 pre-existing findings), full suite green.

The same dispatch found the Mixed-portability finding is a genuine
rubric blind spot instead: the file-level-split rule conflicts with
dimension 5's just-closed sequential-pipeline exemption for this
target's shape. Filed as its own rubric-level fix, issue #1676, via
the same governed scorer-gated-skill-edits process issue #1662 used --
not implemented here.

Refs #1648, #1662, #1676
@tvna
tvna deployed to ruleset-verify September 2, 2026 14:29 — with GitHub Actions Active
The file's paragraphs were hard-wrapped at roughly 72 characters,
inherited from a copy-paste-style edit when the content was split out
of events-and-review-gate.md. No repository convention requires this
column width in a references/*.md prose file, and the wrap
occasionally broke a sentence mid-clause (e.g. a hyphenated compound
split across a line boundary). Reflowed every paragraph and bullet
item into a single line; headings, blank-line paragraph breaks, and
the bullet lists are unchanged in structure. No wording changed --
verified content-identical modulo whitespace against the prior
revision.

Shape checker 54/54 (one fewer than before: the file's own TOC check
no longer applies once it drops under the 100-line threshold, not a
regression), drift scanner unchanged (same 4 pre-existing findings),
full pytest suite (7883 passed), all 44 local-preflight gates passed.

Refs #1648
…ll-implementation-lkdypz

Brings in two independently-merged main-branch efforts that landed while
this branch was in flight:

- PR #1677 (issue #1676): rubric.md's Mixed-portability substitute for a
  Dimension-5-exempted target, plus that same session's own re-grade of
  executing-a-branch-plan's Mixed-portability finding against it (kept
  as its own deferral decision-log entry, appended after mine rather
  than overwritten).
- PR #1675 (issues #1508/#1566): a new worktree-base precondition
  backstop (gitapex_check_task_worktree_base.py), chained into
  check_task_bash_safety.sh.

Conflict resolution:
- metadata/gitapex.yaml: kept this branch's full decision log and
  Frontier/requires/relatedTo values (main's own copy predates this
  branch's own fork and never carried any of that), appended main's new
  #1676 deferral entry, and added one missing decision-log entry for
  this branch's own prior failure-and-recovery.md reformatting commit.
- references/execution-and-dispatch.md: this branch already retired
  this file (split into decomposition-and-dispatch.md /
  events-and-review-gate.md / failure-and-recovery.md, per issue
  #1662's own Round 10). Ported main's new "Worktree-base precondition
  backstop" subsection into decomposition-and-dispatch.md's own
  "Execution and dispatch" section (matching where its sibling
  subsections already live), demoted from ## to ###, and repointed
  every stale execution-and-dispatch.md cross-reference (in
  threat-model-and-authorization.md and
  gitapex_check_task_worktree_base.py/its test) to
  decomposition-and-dispatch.md.

Verified post-merge: shape checker 54/54, drift scanner unchanged (same
4 pre-existing findings), full pytest suite passing (the one run mid-
merge showed 7 gitapex_gate_commit_citation.py failures -- confirmed a
transient artifact of running the suite while .git/MERGE_HEAD existed,
merge_in_progress()'s own by-design merge-commit exemption, not a real
defect; re-verified clean after this commit), all 44 local-preflight
gates passed.

Refs #1648, #1662, #1676
@tvna
tvna deployed to ruleset-verify September 2, 2026 21:53 — with GitHub Actions Active
…porting-boundary-map.md

Round 13: independently re-verified issue #1676's own re-grade
(recorded in the decision log as a deferral entry, condition 1-2 met,
requirements 1-3 not met) rather than accepting it at face value.

An isolated Sonnet dispatch initially disputed condition 2 (whether the
Claude-Code-specific content is reached on every ordinary run, given
Step 6's Workflow-tool-vs-sequential-fallback fork), reading two
passages in threat-model-and-authorization.md and
decomposition-and-dispatch.md as evidence the primary path is opt-in.
Direct re-read of both passages found they describe this skill's own
authoring-session testing limitations (could not literally exercise
the Workflow tool for live verification) and a permission-prompt UX
detail ("Every run" unless pre-approved) -- neither is a deployment-
time gating claim. Conditions 1-2 confirmed met.

Closed the two unmet requirements:
- Requirement 1 (distinct-heading isolation): split SKILL.md's Notes
  portability paragraph into "Non-portable (Claude-Code-specific)" and
  "Portable" bold-lead-in sections -- net-zero line growth (16 lines
  either way), keeping the body at exactly 500/500.
- Requirement 3 (porting-boundary-map file): new
  references/porting-boundary-map.md, non-every-use, enumerating every
  Claude-Code-specific touchpoint (Workflow tool, agentType,
  isolation:'worktree', the branch-plan-task subagent type, both
  PreToolUse hook backstops, the SubagentStop verification hook) and
  its portable alternative or lack thereof.
- Requirement 2 (Notes declaration) was found already largely met on
  independent re-read, contra the deferral entry's own claim.

One authoring defect caught and fixed along the way: an inline-code
span (`evaluating-skill-quality/references/rubric.md`) split across a
hard-wrap line broke the shape checker's per-line backtick parsing,
tripping no-bare-issue-citation on an adjacent `#1676` reference --
fixed by keeping the span on one line.

Verified: shape checker 56/56, drift scanner unchanged (same 4
pre-existing findings), full pytest (7976 passed) and all 44
local-preflight gates passed.

Refs #1648, #1676
@tvna
tvna deployed to ruleset-verify September 2, 2026 22:17 — with GitHub Actions Active
…citations

An independent fresh review (run to close PR #1632's own Why-NOT-CLEAN
gap) found all four outcome.baseCommit values in
metadata/gitapex.yaml pointed at real but unrelated commits in other
skills' own history, not the true immediate parent of the commit that
added each entry. Each entry's own substantive claim independently
checks out against the actual commit diffs -- only the citation was
broken, verified via `git show`/`git log` against every candidate.

Corrected the boundary-redivision, axis-7-closed, Cleanup-git-command,
and round-9 entries to their own entry-adding commit's true immediate
parent. Also fixed SKILL.md Step 5's own misattribution: the
`split.md` Kept-edit-log citation it names lives in this file's own
step 7 (the run-record corroboration text), not step 4's worked
example, which never mentions `split.md` at all.

Refs #1648

shape checker: 49/49. drift scanner: clean.
…ings

An independent fresh review (run to close PR #1632's own Why-NOT-CLEAN
gap) found requirement 1 of the Mixed-portability substitute
(rubric.md dimension 5) was overclaimed by the deferral/corroboration
entries in metadata/gitapex.yaml: the Notes section used bold inline
lead-ins (`**Non-portable...**`, `**Portable:**`) inside one flowing
paragraph, never an actual Markdown heading -- this SKILL.md carried
no `###` anywhere. rubric.md's own internal use of "heading" elsewhere
supports a literal reading of the substitute's own requirement text.

Promoted both labels to real `### Non-portable (Claude-Code-specific)`
/ `### Portable` subheadings. Net-zero body-line growth held via a
tighter prose rewrap of the surrounding Notes paragraphs (no wording
dropped, verified by a whole-file word-frequency diff against the
prior commit).

Refs #1676

shape checker: 56/56 (body-length: 500/500 lines). drift scanner:
unchanged (same 4 pre-existing findings).
…ll-implementation-lkdypz

# Conflicts:
#	skills/executing-a-branch-plan/SKILL.md
#	skills/executing-a-branch-plan/references/execution-and-dispatch.md
#	skills/executing-a-branch-plan/references/refactor-and-review-gate.md
@tvna
tvna deployed to ruleset-verify September 3, 2026 04:44 — with GitHub Actions Active

tvna commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

Merge conflict resolution (commit 0a295d1f)

Merged origin/main (17 commits, including PR #1701's python-path-resolution fix and PR #1699) to close this branch's behind-base gate before pushing two provenance fixes found by a fresh independent review. Two conflict classes:

Content conflict -- skills/executing-a-branch-plan/SKILL.md Step 8 text. origin/main (issue #1560's own unrelated commits) rewrote Step 8's dispatch text to name agentType: 'branch-plan-task'/subagent_type: 'review-persona' explicitly and fix a self-contradiction (a confirmed correctness-bug fix must land in the calling main thread only, never the refactor pass's own behavior-preserving-only subagent). This branch's own commit history had already restructured the reference-file layout (6 files → 4). Resolution: kept this branch's own file paths (failure-and-recovery.md, decomposition-and-dispatch.md) while adopting origin/main's substantive text improvement.

Modify/delete -- references/execution-and-dispatch.md and references/refactor-and-review-gate.md. Both files were deleted on this branch (their content merged into decomposition-and-dispatch.md / events-and-review-gate.md during the earlier reference-file restructuring); origin/main had independently edited them (adding a new "Step 8's two dispatches" subsection, and the same agentType/subagent_type naming fix). Resolution: ported both edits into their current-branch destination file, re-deleted the two superseded files, and repointed six dangling file-path citations in agents/branch-plan-task.md, .claude/agents/branch-plan-task.md, and agents/review-persona.md that origin/main's own commits had written against the old file names.

Re-verified after resolution: shape checker 56/56 (executing-a-branch-plan), 49/49 (scorer-gated-skill-edits), 53/53 (drafting-a-skill); drift scanner unchanged (same 4 pre-existing findings on executing-a-branch-plan, none elsewhere); full pytest suite 8006/8006 passed; all 44 gitapex_gate_local_preflight.py gates passed.


Generated by Claude Code


Generated by Claude Code

tvna commented Sep 3, 2026

Copy link
Copy Markdown
Owner Author

CI red: pytest job failure is not this PR's own defect

The pytest required check fails on commit 0a295d1f with FAILED tests/test_gitapex_check_pr_duplicate_issue_properties.py::test_any_non_empty_reason_is_detected_regardless_of_casing_or_bullet - AssertionError: assert False (reason=&#39;~~~&#39;).

Root-caused: has_duplicate_waiver() in hooks/gitapex_check_pr_duplicate_issue.py -- a file neither this PR nor any of its three commits touch -- misdetects a Duplicate-PR-waiver: line whose disclosed reason is itself fence-shaped (~~~) as opening an unterminated code fence, silently stripping the reason before the waiver regex ever sees it. Confirmed via direct, deterministic function call (not Hypothesis randomness) that this reproduces identically on origin/main (commit 2ce6c2f5), independent of this PR entirely. This is the same bug class already found and fixed once in a sibling file (issue #1432 / PR #1440); that fix explicitly left this file's own copy unaddressed, since it had not yet been confirmed as the same bug here.

Filed as issue #1714, with the exact, already-adversarially-hardened fix pattern from PR #1440 to port (not re-derive). Per this PR's own narrow scope (skills/executing-a-branch-plan/ and skills/scorer-gated-skill-edits/ only, per its own Risk/blast-radius section), the fix lands in a separate branch/PR rather than widening this one.


Generated by Claude Code


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants