Skip to content

fix(todo-check,implement): close undefined merge/resolution branches - #137

Merged
ultimatile merged 2 commits into
mainfrom
fix/133-todo-check-control-syntax
Jul 25, 2026
Merged

fix(todo-check,implement): close undefined merge/resolution branches#137
ultimatile merged 2 commits into
mainfrom
fix/133-todo-check-control-syntax

Conversation

@ultimatile

@ultimatile ultimatile commented Jul 25, 2026

Copy link
Copy Markdown
Owner

Summary

todo-check's merge step and unknown-resolution step were each a single dense paragraph of prose. Between them they held four branch-structure defects that reading the prose does not surface: a lane carrying an outcome vocabulary but no procedure, a dead end with no exit, an undefined cell encoding, and a recovery attached to a narrower trigger than its own criterion. Rendering the branching parts of both steps as guarded case-table blocks forces each undefined cell to be decided, so the closed defects — not the notation — are what this change delivers. Two passages are deliberately left as prose; the delta at the bottom says which, and reconciles this count of four against the five defects #133 lists.

Closes #133

Changes

  • skills/todo-check/SKILL.md — the merge step becomes a guarded block with two labelled sub-blocks: coverage of the returned mechanical rows against the slug set the quality-list/SKILL.md Items index predicts, and row rendering over single-lane items plus the three combinations a dual-lane item's two half-statuses can take (either half active, both halves N/A, anything else). Its discrepancy-adjudication paragraph stays prose. The unknown-resolution step becomes a two-pass block — settle the scope fact by the lane of the check being settled, then record the outcome — with the narrowed re-dispatch kept as headed prose below it rather than compressed into an arm, since it carries two verbatim replacement strings, a nested special case, and a preservation constraint that an arm line would drop. The output-format paragraph gains the halt path.
  • skills/implement/SKILL.md — the preflight step states what a halted preflight means for its caller.
  • .claude-plugin/marketplace.json — version bump.

Throughout, the scope description is the plain account of the planned change that the preflight's first step writes, and which the dispatch step embeds in the subagent's prompt.

Three previously undefined states are now decided:

  • The contextual lane had the outcome vocabulary — the step previously opened by offering a promotion to △ active with a concrete setup action or a downgrade to ⊘ N/A with a reason — but the procedure that followed it sat under a mechanical-lane guard, so one of the two lanes had none. It now settles the scope check the contextual pass recorded, in main context.
  • An unknown that cannot be settled at preflight time had no exit, while the step required every unknown resolved and the output format forbade ? unknown from the emitted table. It now surfaces to the user, naming what the row already carries, and emits no table.
  • A resolved dual-lane half had no defined cell encoding. Its own setup action, or its N/A reason, now joins whatever the other half already put in the cell, and the row's status is recomputed from both half-statuses — so a row already rendered △ active stays △ active.

Two further changes are clarifications rather than new outcomes:

  • The coverage check's recovery now fires on any deviation from its criterion, not only on a missing or duplicated slug. The criterion — that the returned rows cover exactly the predicted slug set — already rejected a slug from outside that set, such as a contextual-lane slug misrouted by a lane-tag misread; only the stated recovery was attached to the narrower trigger.
  • Four antecedents that resolved only by prose adjacency are re-anchored: "the same prompt" to the unmodified dispatch prompt, "the following read-the-body instruction" to the sentence that is kept, "which also drops the coverage check" to the narrowed re-dispatch whose single-item return is exempt, and "note which" to naming the active half.

Impact

todo-check can now terminate without emitting a table, which widens its outcome set from one shape to two. The only surface that consumes its active rows is skills/implement/SKILL.md's preflight step, updated in the same commit. The other references to todo-check — in README.md, skills/land-via-integration-branch/SKILL.md, and skills/quality-list/SKILL.md — name the skill's role or the lane split it shares with done-check and make no claim about its output, so none needs the new qualification.

Test plan

Reading the text is not evidence that an agent can execute it, so each new or widened arm got a fixture.

Method. Twelve runs, one per fixture. Each run is a fresh-context agent given exactly two things: the two rewritten steps verbatim, plus one fixture. The fixture supplies a synthetic six-item index with lane tags (three mechanical, two contextual, one dual-lane), a stated subagent return, the rows the contextual pass produced, and whatever further facts the situation needs — so no run can reach the real quality-list and every arm is selected from the text alone. Each run reports the arm it took by name and either the table it emits or its reason for emitting none; that report was compared against the arm the text specifies. The fixtures are scaffolding for prose rather than a test surface this repository carries, so they are not committed — this section is their record.

All twelve selected the expected arm. Five reached an emitted table:

  • a contextual unknown whose recorded scope check the scope description settles
  • a mechanical unknown whose per-answer verdicts are stated and whose settled answer is one of them, so the verdict is read off
  • a dual-lane row rendered △ active whose carried half then resolves active — both setup actions land in the one cell
  • the same row whose carried half instead resolves ⊘ N/A — the active half's setup action and the resolved half's reason both stand, and the row stays △ active
  • a fixture whose stated history is a short first return already re-dispatched with the prompt unchanged, and whose second return is complete — coverage passes and the run proceeds

Seven withheld the table:

  • a return carrying a slug from outside the predicted set, and a return carrying a duplicated slug — each re-dispatched with the prompt unchanged rather than accepted
  • a fixture whose stated history is a short first return whose prompt-unchanged re-dispatch also came back short — surfaced, with the mechanical lane left incomplete
  • an unknown whose scope fact cannot be settled at preflight time
  • an unsettlable carried half — surfaced while the row's △ active and the active half's setup action stand
  • a mechanical unknown whose per-answer verdicts are stated but whose settled answer falls outside them — routed to the narrowed re-dispatch rather than forced onto one of the stated verdicts
  • a mechanical unknown for which no per-answer verdict was stated — routed to the narrowed re-dispatch, and this run also confirmed the prompt surgery: the selection sentence replaced by Process only <slug>, the following read-the-body sentence kept, the single-item return exempt from the coverage check, and no item body read in main context

Four of the twelve selected an arm that dispatches a subagent: the two coverage re-dispatches and the two narrowed re-dispatches. For those the probe verifies the arm taken, and the prompt composed where the arm specifies one; the probe context has no subagent to answer, so each then stopped rather than continuing to the arm's designed outcome. The other eight never dispatch. Where a fixture needed a return that a dispatch would have produced — the repaired second return, the second short return — the fixture states it as given history, so the run reads it rather than obtaining it.

Every span the new text quotes from elsewhere in the file was verified present verbatim, and the mdformat hook configured in .pre-commit-config.yaml passes and leaves the blocks byte-identical.

Notes

The discrepancy adjudication in the merge step and the narrowed re-dispatch below the resolution step keep their original prose, so two gaps remain open in this file. A discrepant row's grounding is still undeclared, because the dispatch prompt does not say which account its return follows when the scope description and the codebase conflict; and the narrowed re-dispatch still defines no consumption of its return and no retry budget. Both are one mechanism rather than two: the re-dispatch is reachable from the adjudication as well as from the resolution step, so the budget has to be shared and the adjudication's corrective dispatch has to carry the established fact and its precedence. Closing them is #136.

Recovery semantics for a halted preflight are undefined here — the halt surfaces to the user and emits no table, and nothing states what a resumed preflight may reuse. That is #134.

skills/done-check/SKILL.md is not edited, so its merge step, which mirrors the one changed here, now diverges: it has no coverage check on its auditor's returned rows and no halt path. The divergence is deliberate. #133 records what a mirror edit would have to settle in done-check — a set of cells its own text does not determine, plus five provisions todo-check states that it lacks — and defers all of it, on the grounds that landing a notation change and that behavior change in one squash-merged commit would make neither reviewable.

Plan-vs-actual delta

Measured against #133's Scope, Out of scope, and Acceptance.

First, the counts, which do not line up on their face. #133 lists five defects plus one item it calls a clarification rather than a defect. The summary above counts four, and those four are #133's defects 1 through 3 plus that clarification — the set this change closes. Defects 4 and 5 are the subtractions below.

Scope subtractions

  • Defect 4 — neither of its two moves landed. The dispatch prompt gains no provenance clause fixing which account its return follows when the scope description and the codebase conflict — Phase 1: todo-check merge and unknown-resolution steps #133 carries that clause as its own Scope bullet as well as a move of this defect — and the merge step's adjudication keeps its unguarded default instead of a predicate over affected rows.
  • Defect 5 — the narrowed re-dispatch gains no defined return path and no retry budget.
  • Consequently the labelled discrepancy-adjudication section Phase 1: todo-check merge and unknown-resolution steps #133 specifies — the predicate, its per-origin consequences, and the one-re-dispatch-per-item bound — is absent.

Why they were carried rather than landed is in Notes above and in #136, which states the constraint on form that this attempt produced. In short: the two are one mechanism reachable from both steps, so they need a passage shared between them, and the scope was narrowed to the three block-local defects rather than land that passage in this change.

Scope additions

Reworded, same provision

  • Phase 1: todo-check merge and unknown-resolution steps #133 puts the carry-forward clause inside the dual-lane active arm; here it is a sentence after the block. The provision is unchanged — a half left unresolved at merge time carries its scope check to the resolution step.
  • Phase 1: todo-check merge and unknown-resolution steps #133 keys the resolution block's domain on rows; here it is keyed on unsettled scope checks, noting that a dual-lane row can carry two and that each check belongs to exactly one lane. Pass 1 branches on the lane of the check rather than of the row, so keying the domain on checks is what makes that branch well-defined.

What the two prose passages actually retain

Both were left as prose, but not identically:

  • The discrepancy-adjudication paragraph is byte-identical to its pre-change text. It only moved out of the merge step's single paragraph into a standalone one.
  • The narrowed re-dispatch keeps every provision of its pre-change text but is not identical to it: it gains a heading, and two of the four re-anchored antecedents are inside it — "the following read-the-body instruction" became a description of the sentence itself, and "which also drops the coverage check" became an explicit statement that its single-item return is exempt.

This distinction matters for the acceptance item below, so it is stated rather than folded into "the prose stands".

Acceptance

Performed against the landed text: the execution probes enumerated in the test plan above; reference resolution, with every step reference in the file resolving and no cross-skill reference pointing into either step; the verbatim quotation of the dispatch prompt's selection sentence; the formatter; and provision preservation, with "purely" surviving in both the dispatch step's prohibition and the resolution block's standing rule.

Not performed:

  • The discrepancy fixtures, the budget-chain fixture, and the producer probes for the provenance clause all target defects 4 and 5 and that clause. None landed, so none was run. They move to todo-check: adjudication and re-dispatch are one undefined mechanism #136's acceptance, where they are restated.
  • Phase 1: todo-check merge and unknown-resolution steps #133's completeness comparison — a fresh-context enumeration of every provision the old text has that the new lacks or weakens — was run against a superset of the landed text, before the scope was narrowed, and was not re-run on the landed form. What stands in for it is the paragraph above: the adjudication passage is byte-identical to the old text, and the narrowed re-dispatch's two changes replace a bare antecedent with its referent, which cannot drop a provision. That is an inspection of the diff, not a re-run, and is recorded here as one.

Out-of-scope churn

The four items in #133's Inconclusive / Deferred section are unchanged, and all four resolve when done-check's own change lands. #134 is unchanged. One new deferral was opened: #136.

Summary by CodeRabbit

  • Documentation

    • Clarified preflight behavior when checks halt, including when no results table is produced and work cannot begin.
    • Formalized result merging, coverage validation, unresolved-item handling, narrowed rechecks, and final status resolution.
    • Clarified rules for dual-lane items and ensured unknown statuses are resolved before completion.
  • Chores

    • Updated marketplace metadata to version 2026.7.27.

@coderabbitai ignore

Render the merge and unknown-resolution steps as guarded case-table
blocks, which forces each previously undefined cell to be decided.
Three branch-structure defects close:

- the contextual lane carried an outcome vocabulary but no resolution
  procedure; it now settles its recorded scope check in main context
- an unknown that cannot be settled at preflight time had no exit; it
  now surfaces to the user, naming what the row already carries
- a resolved dual-lane half had no defined cell encoding; its setup
  action or N/A reason now joins the active half's in the same cell,
  and the row's status is recomputed from both half-statuses

The coverage check's recovery now covers any deviation from its own
criterion, not only a missing or duplicated slug, and a halted
preflight emits no table at all. The preflight step in implement
states the consequence for its caller: there are then no active rows
to hand on, and the unit does not start.

The discrepancy-adjudication provenance and the narrowed re-dispatch's
return path and retry budget do not land here. They are one shared
mechanism spanning both steps, tracked in #136.

Refs #133
@ultimatile
ultimatile requested a review from Copilot July 25, 2026 14:56
@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The PR formalizes todo-check merge and unknown-resolution procedures, specifies no-table halt behavior, updates quaere-execution handoff guidance, and bumps the marketplace version.

Changes

Todo-check preflight flow

Layer / File(s) Summary
Merge and resolve preflight outcomes
skills/todo-check/SKILL.md
Defines mechanical-lane coverage checks, deterministic row rendering, narrowed re-dispatch, two-pass ? resolution, and halt behavior without emitting a table.
Execution handoff and release metadata
skills/implement/SKILL.md, .claude-plugin/marketplace.json
Prevents unit startup after a halted preflight, passes resolved rows to planning, and updates the marketplace version.

Estimated code review effort: 2 (Simple) | ~10 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Implementer
  participant todo-check
  participant quaere-execution
  participant Unit
  Implementer->>todo-check: run preflight
  todo-check->>todo-check: merge and resolve outcomes
  alt preflight completes
    todo-check-->>quaere-execution: provide resolved △ rows
    quaere-execution->>Unit: start planning and execution
  else preflight halts
    todo-check-->>Implementer: report halt without table
    Implementer-->>Unit: do not start
  end
Loading

Possibly related issues

Possibly related PRs

Suggested reviewers: copilot

Poem

A bunny checks each row just right,
Resolves the unknowns out of sight.
If preflight says, “Please wait,”
No unit hops beyond the gate.
A fresh version joins the trail—
Carrot-bright and detail-scale.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: resolving undefined merge and resolution branches in todo-check and implement.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/133-todo-check-control-syntax

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.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR clarifies and completes todo-check’s merge and unknown-resolution procedures by rewriting them into guarded case-table blocks that explicitly cover previously undefined branches, including new “halt without emitting a table” outcomes, and updates implement to define caller behavior when that halt occurs.

Changes:

  • Rewrites todo-check Step 4 (merge) and Step 5 (resolve ?) into guarded, explicitly-armed blocks, including halt paths that emit no table.
  • Updates implement’s preflight step to treat a halted todo-check run as blocking the start of the unit (no △ rows to hand off).
  • Bumps marketplace version to 2026.7.27.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
skills/todo-check/SKILL.md Replaces dense prose in merge/resolve steps with guarded blocks, adds explicit halt/no-table behavior, and updates output-format text accordingly.
skills/implement/SKILL.md Defines what a halted todo-check preflight implies for the caller (unit does not start).
.claude-plugin/marketplace.json Version bump to reflect the behavior change.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread skills/todo-check/SKILL.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@skills/todo-check/SKILL.md`:
- Around line 139-141: Update the discrepancy adjudication instructions in
SKILL.md so that when resolving each subagent discrepancy, you also recompute
the affected lane/half status based on the resolved applicability before
finalizing the row. Reapply the dual-lane rendering rule afterward, ensuring
stale △, ⊘, or ? verdicts are replaced and the final table neither skips
required setup nor invents work.
- Around line 117-130: Extend the coverage contract in
skills/todo-check/SKILL.md lines 117-130 to validate every return path,
including contextual results and merged rows, with the existing first-failure
redispatch and subsequent-failure halt behavior. At skills/todo-check/SKILL.md
line 187, require narrowed single-item responses to contain exactly one row for
the requested slug, rejecting missing, duplicate, or extra rows before
proceeding.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: aec6785f-5b7f-42d2-aa53-fb3dcf8ba04e

📥 Commits

Reviewing files that changed from the base of the PR and between 1fe87ef and 88da93c.

📒 Files selected for processing (3)
  • .claude-plugin/marketplace.json
  • skills/implement/SKILL.md
  • skills/todo-check/SKILL.md

Comment on lines +117 to +130
coverage — the subagent's returned mechanical rows against the
mechanical-lane slug set the index predicts. This applies to a
full-set dispatch; a narrowed single-item return (Step 5) is exempt:
exactly one row per predicted slug,
and no others → proceed
any other return (a slug missing,
duplicated, or outside the predicted
set), first occurrence → re-dispatch Step 2 with the
prompt unchanged; re-check
any other return, after that
re-dispatch → surface to the user; do not
proceed with the mechanical
lane incomplete, and do not
emit the table

@coderabbitai coderabbitai Bot Jul 25, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Enforce coverage on every return path.

The coverage contract currently validates only full mechanical dispatches. Contextual results and narrowed single-item redispatches can still be malformed while the workflow proceeds, violating the final one-row-per-item invariant.

  • skills/todo-check/SKILL.md#L117-L130: validate contextual results or the merged row set, using the same retry/halt behavior.
  • skills/todo-check/SKILL.md#L187-L187: require exactly one row for the requested slug and reject missing, duplicate, or extra rows.
🧰 Tools
🪛 SkillSpector (2.3.11)

[info] 44: [EA3] Scope Creep: Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Remediation: Limit the skill's scope to its documented purpose. Remove instructions that enable the agent to perform actions outside its stated functionality.

(Excessive Agency (EA3))


[warning] 125: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 128: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 129: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 130: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 155: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 156: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 157: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 160: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 164: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 166: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 167: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 168: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 169: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 170: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 171: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 172: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 173: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 176: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))


[warning] 177: [MP2] Context Window Stuffing: Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Remediation: Implement context-window management that detects and rejects padding or stuffing attempts. Prioritize system instructions over user-injected content.

(Memory Poisoning (MP2))

📍 Affects 1 file
  • skills/todo-check/SKILL.md#L117-L130 (this comment)
  • skills/todo-check/SKILL.md#L187-L187
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@skills/todo-check/SKILL.md` around lines 117 - 130, Extend the coverage
contract in skills/todo-check/SKILL.md lines 117-130 to validate every return
path, including contextual results and merged rows, with the existing
first-failure redispatch and subsequent-failure halt behavior. At
skills/todo-check/SKILL.md line 187, require narrowed single-item responses to
contain exactly one row for the requested slug, rejecting missing, duplicate, or
extra rows before proceeding.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Triaged as two separate findings with different owners; neither is fixed here.

The narrowed single-item return. Agreed. The text exempts that return from the whole-set check and then says nothing about whether it carries the requested slug at all. That is #133's defect 5 — "the narrowed re-dispatch has no return path" — which this pull request deliberately carries to #136, whose scope is to give that re-dispatch a defined return path and a shared retry budget. Your sharper framing (reject missing, duplicate, or extra rows for the requested slug) is recorded there.

The contextual lane and the merged set. Filed as #139, as a question rather than a mirrored arm. The mechanical check works on two independent readings of the index: the subagent derives its own item set in a fresh context, so the return can be compared against the index. The contextual rows are produced by main context from that same index, so a check there is main context comparing its output against a reading it already made — the misreading that dropped an item can pass the check meant to catch it. #139 records that defeater, the candidate remedies including a cross-agent check that escapes it, and a probe that settles whether the block's existing one-row-per-index-item obligation already forces the failure to surface.

Both are outside #133's scope, which limits this change to the merge and unknown-resolution steps.

Separately, on the attached SkillSpector output: the [MP2] Context Window Stuffing findings span the lines of the two new fenced blocks and appear to be reading the case tables' column alignment as padding. Flagging it because every remaining phase of #132 converts prose into this same shape, so the pattern will recur.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ultimatile, thanks for the detailed triage. The split is sensible:

  • The narrowed re-dispatch contract is a valid gap, now explicitly deferred to #136 along with its return-path and shared retry-budget design.
  • #139 appropriately treats contextual/merged coverage as an open design question rather than duplicating the mechanical-lane retry arm where it cannot provide independent validation.

I’ll leave this finding unresolved for this PR, since neither follow-up is implemented here.

Noted on SkillSpector’s [MP2] output as well: the aligned case-table formatting appears to be triggering a heuristic rather than identifying actionable context-stuffing behavior. 🐇

Comment thread skills/todo-check/SKILL.md
The merge step's domain line named the rule set by bare skill name
while the contextual step and the output-format paragraph both spell
`quality-list/SKILL.md`, which is where the index that is the single
source of truth for the item set actually lives. Align the domain
line with them, and with the same two surfaces in `done-check`.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

skills/todo-check/SKILL.md:115

  • In Step 4's guarded block domain line, the phrase "in the quality-list/SKILL.md Items index" reads like the Items index is a separate artifact named by that phrase, whereas elsewhere this skill uses the possessive form ("quality-list/SKILL.md's Items index"). Aligning the wording here removes ambiguity about where the index lives.
   domain: every item in the `quality-list/SKILL.md` Items index

@ultimatile
ultimatile merged commit decc5d4 into main Jul 25, 2026
2 checks passed
@ultimatile
ultimatile deleted the fix/133-todo-check-control-syntax branch July 27, 2026 20:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Phase 1: todo-check merge and unknown-resolution steps

2 participants