Skip to content

RE-CUT: Offer the loop before starting it, and let a scheduled run answer for itself - #7

Open
drmikecrowe wants to merge 1 commit into
AmazingAng:mainfrom
drmikecrowe:contrib/opening-gate
Open

RE-CUT: Offer the loop before starting it, and let a scheduled run answer for itself#7
drmikecrowe wants to merge 1 commit into
AmazingAng:mainfrom
drmikecrowe:contrib/opening-gate

Conversation

@drmikecrowe

@drmikecrowe drmikecrowe commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

⚠️ Re-cut — the description below is the original and no longer matches the diff. It is kept as written so your review still reads against the text it answered. See the re-cut comment for what this PR now contains: 37 lines cut to 12, moved below the thesis paragraph, and the five rules you listed carried without their supporting argument.


Two related gaps at the front door of the skill.

The trigger has no cheap exit

The description already says to load this skill when the change touches a high-stakes domain even though the user did not ask. Nothing says what to do next — so the loop auto-fires: a spec, a setup plan, an approval request.

In practice that means a wrong guess costs a document nobody wanted. The auto path now opens with a one-sentence offer and stops: name the domain you saw, give two choices (full loop, or a normal fix with good tests), wait. The explicit path is unchanged, and a yes to the offer authorizes the loop only — the spec still needs its own approval.

An offer needs an addressee

Once an offer gate exists, a skill woken by cron, a loop prompt, or another agent's task has nobody to answer it, and a strict reading of "did the human ask?" stalls the run and delivers nothing.

So, two clauses:

  • A configured invocation that names this skill IS the ask, made in advance by whoever set it up. Don't re-offer what was already requested.
  • Where no reply is possible, record the domain and run the loop under the autonomous rules already in step 1 — spec still written, spec approval still not obtained (autonomous run), EVIDENCE still claiming correspondingly lower confidence. OFFER-and-stop is for when a reply is actually possible.

This second half came out of running the skill on a schedule, where the gate is the difference between a run that produces evidence and a run that produces one sentence nobody reads.

+37/-1, all in SKILL.md (new opening section, plus the description sentence that now says what the auto-trigger should do).


Part of a series from a fork that has been running this skill daily (drmikecrowe/old-coder). Independent of the other PRs. Draft so you can take it in any order, or none.

🤖 Generated with Claude Code

@drmikecrowe
drmikecrowe marked this pull request as ready for review August 12, 2026 15:30
@AmazingAng

Copy link
Copy Markdown
Owner

The problem is real and both halves of the answer are right — I want this, but not at this size or in this position.

The gap you found is genuine. The description says to load on a high-stakes heuristic even when nobody asked, and then says nothing about what to do next, so the loop auto-fires and a wrong guess costs a document nobody wanted. An offer that costs one sentence is the right shape.

The second half is the part I would not have thought of. A gate that assumes a live human deadlocks every cron run, loop prompt and agent-to-agent task — and "a configured invocation naming this skill IS the ask, made in advance by whoever set it up" is exactly right. So is falling through to the autonomous rules already in step 1 rather than stopping with an offer into an empty room. Please keep both clauses.

What I would like changed

Length and position. As it stands this is 37 lines placed above the thesis paragraph, so the first thing any agent reads is a routing decision rather than what the skill is for. SKILL.md also just came through a compression pass (the verification protocol was moved to a reference precisely to keep the main file readable), and this would put a sixth of the file in front of the opening argument.

Could you cut it to roughly 8-10 lines and place it immediately after the thesis paragraph? Concretely, what I think has to survive:

  • nobody asked + high-stakes heuristic → one-sentence offer, name the domain, two choices, stop
  • create nothing before the answer
  • a configured invocation naming this skill is the ask; do not re-offer it
  • no addressee → autonomous rules, not a stalled run
  • this offer is not spec approval

The supporting argument for each can go; the rules carry themselves.

Keep the description change as-is. The trigger contract belongs in frontmatter and yours is clearer than what is there now.

One flag rather than a request: this is the only PR in the series that changes when the skill fires, which makes it a positioning decision rather than a correctness fix. It is going to the repo owner as that, not as a nit. I expect it to land — I want to be explicit that it is being decided rather than waved through.

Related: this belongs to the same family as #6 and the isolation half of #9 — see my note on #6. A gate that cannot be answered and silently proceeds anyway is another mechanism reporting success while doing nothing, which is why the autonomous fallthrough clause matters as much as the offer itself.

@drmikecrowe
drmikecrowe marked this pull request as draft August 17, 2026 09:38
@drmikecrowe
drmikecrowe force-pushed the contrib/opening-gate branch from 8daa9c8 to 260ed1e Compare August 17, 2026 12:37
@drmikecrowe

Copy link
Copy Markdown
Contributor Author

Re-cut per your review. The description at the top of this PR is the original and no longer matches the diff — this comment is what the PR now contains.

Cut and moved. The opening section is 37 lines → 12, nine of them the rules themselves, and it now sits immediately after the thesis paragraph rather than above it, so the first thing an agent reads is still what the skill is for. All the supporting argument is gone; the five rules you named are the whole section.

The five rules, in order:

  • nobody asked + high-stakes heuristic → offer in one sentence, name the domain, two choices, stop
  • create nothing before the answer — no spec, no setup plan, no branch
  • a configured invocation naming this skill IS the ask; do not re-offer it
  • nobody to answer → never stall; proceed under step 1's autonomous rules with spec approval: not obtained (autonomous run)
  • the offer is not spec approval

What this does when it is broken. It is a routing rule with no checker, so an agent that ignores it starts the loop anyway and the original harm is unchanged — a document nobody wanted. What the rule can get wrong is the addressee test, and it fails asymmetrically, which is the part worth knowing:

  • Thinks a human is present when none is → the run stalls with an offer into an empty room and delivers nothing. Silent, and the failure you flagged.
  • Thinks nobody is present when someone is → it proceeds autonomously, and spec approval: not obtained (autonomous run) lands in EVIDENCE. Visible, and already downgrades the confidence claim.

Only the second leaves a trace. That asymmetry is the argument for writing the fallthrough as the default rather than the exception — the failure mode that reports nothing is the one to design away, and it is also why I would not want this rule to grow a mechanism that can silently decide "no reply is possible" without saying so.

One addition beyond "keep the description as-is" — flagging it rather than slipping it in. You said to keep the frontmatter description as it stood, and I have, with one clause added:

…the first and only act is to OFFER the loop in one sentence and stop, so a wrong guess costs a sentence and no files; but only where a reply is possible — an autonomous run records the domain and proceeds.

Without it the description promises an offer-and-stop that the body then tells you not to perform on an autonomous run, and a description contradicting the body is the same defect class you flagged on #6. It is the one clause of the fork's later rewrite I think belongs here; the rest of that rewrite (isolation language, "never pushes", extra trigger domains) is deliberately not in this diff. Strike the clause if you would rather the description stay exactly as you accepted it — the body still carries the rule.

Scope: one file, skills/old-coder/SKILL.md, +13/−1. Restacked fresh off main, so it carries only its own diff and is independent of #9 and #10. Still draft.

@drmikecrowe drmikecrowe changed the title Offer the loop before starting it, and let a scheduled run answer for itself RE-CUT: Offer the loop before starting it, and let a scheduled run answer for itself Aug 17, 2026
@drmikecrowe
drmikecrowe marked this pull request as ready for review August 17, 2026 12:39
@drmikecrowe

Copy link
Copy Markdown
Contributor Author

@AmazingAng -- Review this reworked instruction please

@AmazingAng

Copy link
Copy Markdown
Owner

The body is right and I want it. One change first, in the frontmatter rather than the prose.

The description is where this PR is expensive. It goes 557 → 817 characters, +47%. That is a different cost from the 13 lines in SKILL.md: the body is paid when the skill fires, the description is paid on every task, because it is what decides whether to load at all. For scale, old-coder-api's description is 480.

Two of the added clauses are argument rather than instruction, and both already exist in the body you wrote:

  • so a wrong guess costs a sentence and no files — the body says Create nothing before the answer, which is the rule; this is its justification.
  • but only where a reply is possible — an autonomous run records the domain and proceeds — this is bullet 4 nearly verbatim.

Cut those and the trigger contract is unchanged: load on the heuristic, offer, stop. Roughly 650 characters, no instruction lost. Keep the rest of the description change — it is clearer than what is there now, which was the original point.

The body itself I would not touch. Bullet 4 restating step 1's autonomous rule is duplication I am happy to pay for: it makes the section answerable without scrolling to step 1, and it is the clause a scheduled run depends on.

Two things worth telling you, since neither was true when I wrote the 08-14 review:

This got more valuable while it sat. old-coder-api now lives in this repo, and its trigger overlaps yours — "public API" is both a high-stakes domain here and that skill's subject. So a public API change currently fires old-coder's full loop and old-coder-api. With this PR, old-coder offers and stops, and the API work proceeds without two heavy loops opening at once. That composition argument did not exist before, and it is now part of why this lands.

#9 is merged (6bdcdd5), independent of this. The gitignored-content trap in its third paragraph turned out to be exactly the root cause of a real defect in this repo's own evidence binding, found a day after you wrote it: a working tree that had run pip install -e . hashed c80e8cccf0a1ed3a, while a clean worktree at the same commit hashed 939188446f61289c. Your paragraph describes the failure better than the postmortem did.

Push the trimmed description and I will merge.

… itself

The description says to load this skill on a high-stakes heuristic even when the
user did not ask, and then says nothing about what to do next -- so the loop
auto-fires and a wrong guess costs a spec, a setup plan and an approval request
that nobody wanted. An offer costing one sentence is the right shape.

Five rules, nine lines, placed after the thesis paragraph so the first thing an
agent reads is still what the skill is for rather than a routing decision:
offer and stop when nobody asked; create nothing before the answer; a
configured invocation naming this skill is itself the ask; never stall when
there is nobody to answer; and the offer is not spec approval.

The fourth rule is the one that is easy to leave out. A gate that assumes a live
human deadlocks every cron run, loop prompt and agent-to-agent task, and a gate
that cannot be answered and proceeds anyway is another mechanism reporting
success while doing nothing. So an unanswerable offer falls through to the
autonomous rules already in step 1.

The description gains the trigger contract and nothing else: load on the
heuristic, offer, stop. It goes 557 to 661 characters. Two earlier candidate
clauses are deliberately absent because both were argument rather than
instruction, and both already exist in the body -- "a wrong guess costs a
sentence and no files" is the justification for "create nothing before the
answer", and the autonomous-run qualifier is bullet four nearly verbatim. The
description is paid on every task, so it carries the contract and the body
carries the reasoning.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@drmikecrowe
drmikecrowe force-pushed the contrib/opening-gate branch from 260ed1e to 5a9df4e Compare August 18, 2026 08:56
@drmikecrowe

Copy link
Copy Markdown
Contributor Author

Trimmed and pushed. Both clauses you named are gone; the body is untouched.

Description: 817 → 661 characters. Against the 557 it started at, the trigger contract now costs +104 rather than +260.

Removed exactly the two you identified, and for the reason you gave — each was argument, and each already exists in the body:

  • so a wrong guess costs a sentence and no files — the justification for Create nothing before the answer
  • but only where a reply is possible — an autonomous run records the domain and proceeds — bullet 4, nearly verbatim

What is left is instruction only: load on the heuristic, offer in one sentence, stop. The framing you gave for why is the part I had wrong and want to record, since it generalises past this PR — the body is paid when the skill fires, the description on every task. A clause that repeats the body is cheap in one place and expensive in the other, and I was pricing both the same.

Rebased onto 6bdcdd5, so this is a diff against current main rather than the 08-14 tree. Mergeable, one file, +13/−1.

On composition with old-coder-api: that argument is better than the one I opened with. Two heavy loops firing on one public-API change is a concrete cost that shows up on every such task, where mine was the hypothetical of a document nobody wanted. Worth noting the two now interact in the description as well — "public API" appears as a high-stakes trigger here and as that skill's whole subject, so this PR is what stops the overlap from meaning both loops open at once.

On #9 and the hash divergence: c80e8cccf0a1ed3a versus 939188446f61289c at the same commit is a sharper demonstration than the paragraph deserves — it was written from having been bitten by the class, not from having measured an instance. Good to know the postmortem confirmed it rather than the other way round.

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.

2 participants