Skip to content

Excuses (1) admitting a mistake comes with the fix in the same reply - #544

Closed
EdbertChan wants to merge 11 commits into
mainfrom
plan/excuses-1-admitting-a-mistake-comes-with-the-fix-in-the-same-reply
Closed

Excuses (1) admitting a mistake comes with the fix in the same reply#544
EdbertChan wants to merge 11 commits into
mainfrom
plan/excuses-1-admitting-a-mistake-comes-with-the-fix-in-the-same-reply

Conversation

@EdbertChan

@EdbertChan EdbertChan commented Sep 13, 2026

Copy link
Copy Markdown
Owner

Summary

When the agent admits a mistake, it must now fix it in that same reply. A revert, a check run, a fix, or a named task id all count.

Before this, an admission could end the turn. The agent said "You're right, I did not follow that instruction," then marked the undo done without undoing anything.

A look at 81 sampled excuse-shaped replies found 10 that were never fixed. In 9 of 20 real excuses, the person had to push before anything happened.

This adds one rule to the correction principle skill, plus two new examples: one where the rule fires, one where the fix already came in the reply.

Review Claim

The always-on correction principle requires that an admission of fault carry an action in the same reply: a revert, a check run, a fix, or a named task or issue id.

Review Lane

behavior

Review Unit

corpus-lesson

Safety Invariant

Text-only change to one principle skill and its two example files. No hook, script, or install behavior changes.

Slice Rationale

One rule added to corpus/skills/principle-flag-your-own-corrections/SKILL.md plus its two examples in tests/. The lane is behavior since the rule changes what the agent does after admitting fault, even though only skill text changes. The hook that enforces this rule is a separate workflow, and it needs the rule written down first.

Non-goals

Test Plan

Test Plan
  • python3 engine/skills/make-pr/scripts/preflight.py --base origin/main: exit 1. Every gate passes except the check that new rule text comes with code. This slice is text only, and the hook that enforces the rule is a separate workflow.
  • python3 scripts/check_codify_has_code.py --base origin/main --allow-prose-only: exit 0. Run by hand, as preflight.py directs for a text-only change.
$ python3 engine/skills/make-pr/scripts/preflight.py --base origin/main
unit    corpus-lesson: 3 file(s)
declare Review Unit: corpus-lesson
gate    python3 scripts/check_codify_has_code.py --base origin/main
        fail  new rule prose with no code change (thrash-reflect-automate step 3 without step 2):
gate    python3 scripts/check_skills_three_harnesses.py
        ok      skills three-harness check
gate    python3 scripts/check_ecosystem_boundaries.py
        ok      ecosystem boundaries
gate    python3 scripts/run_skill_scenarios.py
        ok	all 17 scenario(s) behaved as declared
fail    preflight: fix the above before gh pr create
exit=1

$ python3 scripts/check_codify_has_code.py --base origin/main --allow-prose-only
ok      codify-has-code: prose-only change explicitly allowed (--allow-prose-only)
exit=0
  • python3 scripts/check_skill_test_coverage.py --base origin/main --head HEAD: ok skill test coverage, exit 0
  • python3 scripts/check_skill_file_refs.py: ok skill file refs, exit 0
  • python3 scripts/check_no_dated_provenance.py: ok no dated provenance, exit 0
  • python3 scripts/check_no_new_comments.py: ok no new comments, exit 0
  • python3 scripts/run_skill_scenarios.py (run by preflight): ok all 17 scenario(s) behaved as declared
  • bash scripts/scrub-handoff-artifacts.sh: scrub-handoff-artifacts-ok, exit 0

Revert Plan

Revert Plan
  • Safe to revert? Yes
  • Revert command: git revert <merge-sha>
  • Post-revert steps: Re-run ./install.sh so installed skill copies match the reverted text.
  • Data migration? No

🤖 Generated with Claude Code


Note

Low Risk
Text-only updates to one principle skill and two example files; no hooks, scripts, or runtime behavior changes.

Overview
Admissions of fault must now include a same-reply action, not just disclosure and reflect. The principle-flag-your-own-corrections skill adds a fourth obligation: name what was done in that turn—a revert, check run, fix, or task/issue id—and limits “Want me to fix it?” to out-of-scope or irreversible cases. A short jidoka analogy frames admission as detect-and-stop, with the reply carrying the fix so bad state does not roll forward.

The fires and stays silent harness examples are rewritten around incomplete vs complete corrections (e.g. saying undo was done without reverting vs reapplying the fix and reporting the check in the same message), and the fire case now explicitly includes the new fourth obligation.

Reviewed by Cursor Bugbot for commit 834de84. Bugbot is set up for automated code reviews on this repo. Configure here.

EdbertChan and others added 11 commits September 13, 2026 06:33
…iew claim: principle-flag-your-own-corrections requires that an admission of fault carry an action in the same reply: a revert, a check run, a fix, or a named task or issue id.

Review lane: docs
Safety invariant: Text-only change to one principle skill and its example files; no hook, script, or install behavior changes.
Effectiveness measurement: The skill's fires example is the real 'You're right: I did not follow that instruction' turn that then marked an undo done without doing it, and the stays-silent example is an admission followed by the reapplied fix in the same reply; the repo's skill checks pass.
Slice rationale: One rule added to one principle skill plus its two examples.
Architectural effect: The always-on correction principle now defines what a complete admission contains.
Goal: Stop an admission of fault from being the end of the turn.
Motivation: A corpus reflect over 26,697 local transcripts sampled 81 excuse-shaped hits: 10 were excuses never fixed, and in 9 of 20 real excuses the human had to push before anything happened. Examples: 'You're right: I did not follow that instruction.' followed by a to-do marked done with nothing undone; 'Still waiting on your call: which items to apply' after which the named fix never landed.
Alternative considerations: A hook-only fix was set aside for this slice because the hook (a separate workflow) needs the rule it enforces written down first. Asking permission after the admission was set aside because a reversible in-scope fix does not need it.
Implementation details: Add one short rule to corpus/skills/principle-flag-your-own-corrections/SKILL.md in its existing structure and tone: an admission names the action taken in the same reply (revert, check run, fix, or a task/issue id). 'Want me to fix it?' is allowed only when the fix is out of scope or cannot be undone. Ground it with prior art: Toyota Production System jidoka, stop and fix the abnormality at once, https://global.toyota/en/company/vision-and-philosophy/production-system/ . Update tests/fires_example.md and tests/stays_silent_example.md with the two cases in Effectiveness measurement, paraphrased with no transcript paths.
Non-goals: No hook, script, or install change. No edit to cat-mode or CLAUDE.md files. Leave the files of open PRs #482, #500 and #528 alone; if a change would overlap them, stop and report instead.
Layer: docs
Feature state: active
Files:
- corpus/skills/principle-flag-your-own-corrections/SKILL.md
- corpus/skills/principle-flag-your-own-corrections/tests/fires_example.md
- corpus/skills/principle-flag-your-own-corrections/tests/stays_silent_example.md
Change types:
- corpus/skills/principle-flag-your-own-corrections/SKILL.md: modify
- corpus/skills/principle-flag-your-own-corrections/tests/fires_example.md: modify
- corpus/skills/principle-flag-your-own-corrections/tests/stays_silent_example.md: modify
Acceptance criteria:
- `python3 scripts/check_skill_test_coverage.py` exits 0.
- `python3 scripts/check_skill_file_refs.py` exits 0.
- `python3 scripts/check_no_dated_provenance.py` exits 0.
- `python3 scripts/check_no_new_comments.py` exits 0.

Exit code: 0
Invoker-Finalize-Id: c5465bfd-88b2-4ff9-81ad-f5b0b975ae34
…ew claim: `python3 scripts/check_no_new_comments.py` passes on the finished branch.

Review lane: proof
Safety invariant: Verification is read-only and alters no repository file.
Effectiveness measurement: The command's exit code is the direct measurement.
Slice rationale: One check per proof task.
Architectural effect: None; verification only.
Goal: Prove the slice.
Motivation: Running the check is the proof.
Alternative considerations: The full suite was not required because the slice touches one component with its own tests.
Implementation details: Run `python3 scripts/check_no_new_comments.py`.
Non-goals: No mutations.
Layer: app_regression
Feature state: active
Layer exception: allowed. Verification and the terminal scrub run after the docs commit so they check the final branch the PR will carry.
Acceptance criteria:
- The command exits 0.

Exit code: 0
…ew claim: `python3 scripts/check_skill_file_refs.py` passes on the finished branch.

Review lane: proof
Safety invariant: Verification is read-only and alters no repository file.
Effectiveness measurement: The command's exit code is the direct measurement.
Slice rationale: One check per proof task.
Architectural effect: None; verification only.
Goal: Prove the slice.
Motivation: Running the check is the proof.
Alternative considerations: The full suite was not required because the slice touches one component with its own tests.
Implementation details: Run `python3 scripts/check_skill_file_refs.py`.
Non-goals: No mutations.
Layer: app_regression
Feature state: active
Layer exception: allowed. Verification and the terminal scrub run after the docs commit so they check the final branch the PR will carry.
Acceptance criteria:
- The command exits 0.

Exit code: 0
…ew claim: `python3 scripts/check_no_dated_provenance.py` passes on the finished branch.

Review lane: proof
Safety invariant: Verification is read-only and alters no repository file.
Effectiveness measurement: The command's exit code is the direct measurement.
Slice rationale: One check per proof task.
Architectural effect: None; verification only.
Goal: Prove the slice.
Motivation: Running the check is the proof.
Alternative considerations: The full suite was not required because the slice touches one component with its own tests.
Implementation details: Run `python3 scripts/check_no_dated_provenance.py`.
Non-goals: No mutations.
Layer: app_regression
Feature state: active
Layer exception: allowed. Verification and the terminal scrub run after the docs commit so they check the final branch the PR will carry.
Acceptance criteria:
- The command exits 0.

Exit code: 0
…ew claim: `python3 scripts/check_skill_test_coverage.py` passes on the finished branch.

Review lane: proof
Safety invariant: Verification is read-only and alters no repository file.
Effectiveness measurement: The command's exit code is the direct measurement.
Slice rationale: One check per proof task.
Architectural effect: None; verification only.
Goal: Prove the slice.
Motivation: Running the check is the proof.
Alternative considerations: The full suite was not required because the slice touches one component with its own tests.
Implementation details: Run `python3 scripts/check_skill_test_coverage.py`.
Non-goals: No mutations.
Layer: app_regression
Feature state: active
Layer exception: allowed. Verification and the terminal scrub run after the docs commit so they check the final branch the PR will carry.
Acceptance criteria:
- The command exits 0.

Exit code: 0
Invoker-Finalize-Id: dc0921e6-adea-4f32-8df3-1e3fbfa68c3f
…No ephemeral inter-task handoff files remain in the worktree before the merge gate.

Review lane: cleanup
Safety invariant: The scrub script only checks for known handoff artifact names and never touches source, tests, or other repository files.
Effectiveness measurement: The script exits non-zero if any handoff artifact remains.
Slice rationale: Required terminal scrub for every implementation workflow.
Architectural effect: None; hygiene only.
Goal: Leave the branch free of handoff artifacts.
Motivation: Handoff files must not reach the PR.
Alternative considerations: Manual cleanup was set aside as non-deterministic.
Implementation details: Run scripts/scrub-handoff-artifacts.sh.
Non-goals: No product edits.
Layer: app_regression
Feature state: active
Layer exception: allowed. Verification and the terminal scrub run after the docs commit so they check the final branch the PR will carry.
Acceptance criteria:
- The command exits 0.

Exit code: 0
Invoker-Finalize-Id: bf5ea5fc-accc-4699-9fad-b1c7d8d5d8a4
…a7eb4b41a-bf403aae — Review claim: No ephemeral inter-task handoff files remain in the worktree before the merge gate.

Review lane: cleanup
Safety invariant: The scrub script only checks for known handoff artifact names and never touches source, tests, or other repository files.
Effectiveness measurement: The script exits non-zero if any handoff artifact remains.
Slice rationale: Required terminal scrub for every implementation workflow.
Architectural effect: None; hygiene only.
Goal: Leave the branch free of handoff artifacts.
Motivation: Handoff files must not reach the PR.
Alternative considerations: Manual cleanup was set aside as non-deterministic.
Implementation details: Run scripts/scrub-handoff-artifacts.sh.
Non-goals: No product edits.
Layer: app_regression
Feature state: active
Layer exception: allowed. Verification and the terminal scrub run after the docs commit so they check the final branch the PR will carry.
Acceptance criteria:
- The command exits 0.
@cursor

cursor Bot commented Sep 13, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_d8b66d7f-2999-467d-93b3-67e1858f29c2)

@EdbertChan

Copy link
Copy Markdown
Owner Author

Backtest against real labeled cases with the real model judge (not the unit tests' stand-in) found this not fit to merge. Closing to start over with the backtest as the first step, before any code.

Judging 12 real admissions with this rule caught 4 of 5 excuses but flagged 3 of 6 non-excuses.

@EdbertChan EdbertChan closed this Sep 13, 2026
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.

1 participant