Break Change
Skill8 starsChanged 7 days agoMITView on GitHub
Use before a product-cut PR or after a removal to run 5-10 adversarial exploratory QA scenarios in a throwaway Obsidian vault, prove a deleted entrypoint is gone, and write a PASS/FINDINGS/INCONCLUSIVE report. Not a deterministic gate and not a replacement for /doctor, e2e, or the witness.
In this repository14 other files it gives its agents.
- AGENTS.mdAGENTS.md
- cavecrewSkill
- caveman-commitSkill
- caveman-compressSkill
- caveman-helpSkill
- caveman-reviewSkill
- cavemanSkill
- caveman-statsSkill
- Chaos MonkeySkill
- Probe FeatureSkill
- Ship ChangeSkill
- Verify Obsidian ChatSkill
- Verify PRSkill
- WorktreeSkill
The file
We split this skill into the rules it gives an agent
10 rules. About 0 are common, 7 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 39
No secrets: Do not put an API key, bearer token, or real vault data in a report, event, screenshot, or clip.
- Very specific: line 83
Read the PR body, change.json, and the matching feature-map journey.
- Very specific: line 102
Write one Scenario per risk in the generated spec.
- Distinctive: line 167
No import or route still wires it.
- Distinctive: line 172
When there is no specific work item, scan the feature map:
- Distinctive: line 186
When the change is user-visible, record both viewports.
- Very specific: line 199
Use a scenario that drives the changed journey, or add a disposable probe scenario with record.mark() at each decisive moment.
- Distinctive: line 217
Do not paste secrets, tokens, real vault paths, or private note bodies.
- Distinctive: line 252
If the change is trivial or not behavior-bearing, write a one-line waiver in the PR instead.
- Distinctive: line 275
Only a committed user-action check does that.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Break change
Try to break the change before a user does. Pick a small set of risky scenarios,
drive the real Obsidian app on a throwaway vault, and leave a report that a human
can audit. This is exploratory evidence. It is not a gate, not deterministic
proof, and not a replacement for /doctor, e2e, or the witness.
Inputs
- A PR, branch, commit range, or work item.
- The changed entrypoints and the matching feature-map rows.
- The lowest deterministic lane that already passes. If the change has no witness or no e2e proof, say so in the report; do not hide it with exploration.
Modes
| mode | use for |
targeted | The default. Attack the changed behavior and its nearest neighbors. |
removal | A command, setting, modal, route, or UI entrypoint was deleted. Prove it is gone and the neighbors still work. |
general | No specific change. Scan the feature map for partial and NONE rows and target 1-3 high-risk gaps. |
General live exploration (a live chaos monkey over a seeded vault) is
@chaos-monkey. This skill stays focused on a small, bounded, scripted-first
run.
Hard rules
- Throwaway vault only. The e2e lane copies
test/e2e/vaultinto a sandbox and loads the local plugin. Never point the harness at~/MyTestVaultor any real vault. Never use destructive tools on user notes. - No secrets. Do not put an API key, bearer token, or real vault data in a report, event, screenshot, or clip. Live mode reads the key from the local environment; never print it.
- Cap the run. 5-10 scenarios, at most 3 per surface, one attempt each. Stop after three failures with the same cause. The e2e wrapper has a 15 minute default timeout.
- No live model by default. Scripted turns use the
__AGENTIC_CHAT_E2E_TURNS__hook. A live run needs explicit user consent plus:BREAK_CHANGE_LIVE=1 BREAK_CHANGE_MAX_LIVE_TURNS=1..3. The template refuses a live run without that cap. - Label the evidence. State
scriptedorlivein the report. A scripted reply is never presented as a real model answer. - Clean up. The wrapper removes the generated spec after the run, including
on failure and interruption. The e2e service removes its sandbox vault. Run a
final
cleanupbefore you finish.
Procedure
1. Start the run
node .agents/skills/break-change/scripts/break-change.mjs init \
--work-item "PR #123: remove /endplan" \
--mode removal \
--pr 123This writes logs/break-change/<timestamp>/:
report.md report skeleton
run.json mode, head, base, status, cleanup
events.jsonl append-only evidence events
change.json diff stat, files, recent commits
pr.json PR body and files, when --pr is used
clips/ UI evidence output
artifacts/ scratch spaceIt also generates test/e2e/specs/break-change.<timestamp>.e2e.ts from
templates/scenario.e2e.ts. The generated spec is local and disposable.
2. Read the change
Read the PR body, change.json, and the matching feature-map journey. Name the
changed entrypoints before you write a scenario. For a removal, list every
surface that could still expose the old path.
3. Choose 5-10 scenarios
Attack the change, not the whole product. Use this table to spread the risk:
| category | example |
| primary path | The changed command, setting, modal, or tool still does the new thing. |
| removal | The old entrypoint is absent from /help, the registry, UI, docs, the slash-command table, the feature map, imports, and routes. |
| adjacent behavior | The command next to the removed one still works. |
| empty or invalid input | Missing argument, empty prompt, unknown command, malformed setting. |
| permission gate | Safe/YOLO/Plan or allow/deny still gates the changed path. |
| state and reload | Close, reopen, switch tab, reload the plugin, and check persistence. |
| race or interruption | Stop mid-turn, double-click, switch tabs while an approval is open. |
| docs and UI drift | Visible text, help, docs, and the feature map agree with the code. |
Write one Scenario per risk in the generated spec. Each scenario has an id
(S1...), a severity (S1 blocker to S4 low), an expected sentence, and a
run function. Keep the default self-check scenarios only when they are relevant;
replace them with the real risks.
4. Run the scenarios
node .agents/skills/break-change/scripts/break-change.mjs run \
--run logs/break-change/<timestamp>The wrapper:
- runs
npm run verify -- e2e <generated-spec>; - writes
run.log, parses the test counts, and copies newlogs/e2e-artifacts/directories into the run; - snapshots the spec to
spec.snapshot.e2e.ts; - removes the generated spec on success, failure, and
SIGINT/SIGTERM.
A non-zero exit is normal when a scenario finds a real problem. Read the counts: zero tests or every test skipped is a failure, not a pass. If you need another attempt, restore the snapshot:
node .agents/skills/break-change/scripts/break-change.mjs spec \
--run logs/break-change/<timestamp>Then edit, run, and clean up again. Do not exceed three attempts for one cause.
5. Removal audit
For a deleted command, setting, route, or UI entrypoint, search every surface:
node .agents/skills/break-change/scripts/break-change.mjs audit \
--run logs/break-change/<timestamp> \
--term endplan \
--term /endplanThe helper writes audit.json with these surfaces:
- command registry (
src/ui/commands.ts) /helpand the composer (src/ui/chat-view.ts)- UI and settings (
src/ui/,src/settings.ts) - docs (
README.md,docs/, changelog, mobile notes) - slash-command table (
.agents/skills/verify-obsidian-chat/features/commands-and-skills.md) - feature map (
.agents/skills/verify-obsidian-chat/features/) - imports and routes (
src/,src/main.ts,manifest.json) - tests and scripts
ABSENT means no hit. PRESENT is not automatically a failure: a removal note
in docs or a negative test is legitimate. Inspect every hit and explain it in the
report. Then prove the nearest surviving behavior still works with a scenario in
the same run.
A good removal report answers all of these:
/helpdoes not list it.- The registry does not resolve it.
- The UI has no control or route for it.
- Docs and the slash-command table do not tell users to use it.
- The feature map has no live row for it.
- No import or route still wires it.
- The adjacent command or setting still works.
6. General scan
When there is no specific work item, scan the feature map:
node .agents/skills/break-change/scripts/break-change.mjs scan \
--run logs/break-change/<timestamp> \
--limit 10scan.json lists partial and NONE rows with a risk score. Pick 1-3 high-risk
rows. Do not try to cover the whole map in one run; one good repro is worth more
than ten shallow checks.
7. UI evidence
When the change is user-visible, record both viewports. Use the probe harness so the whole display is in frame, including settings popouts:
npm run probe -- --scenario test/e2e/probe/scenarios/layout-smoke.e2e.ts \
--size 1280x1024 \
--out logs/break-change/<timestamp>/clips/desktop-1280x1024
npm run probe -- --scenario test/e2e/probe/scenarios/layout-smoke.e2e.ts \
--size 390x844 \
--out logs/break-change/<timestamp>/clips/mobile-390x844Use a scenario that drives the changed journey, or add a disposable probe
scenario with record.mark() at each decisive moment. In the report, name the
timestamps and mark labels a reviewer should watch. If clips are not possible,
write the waiver reason in ## UI evidence; the PR template requires it.
8. Write the report
Fill report.md with:
- severity per scenario and per finding (
S1blocker,S2high,S3medium,S4low); - exact repro (command, steps, fixture path);
- expected and actual behavior;
- evidence paths (
run.log,events.jsonl,e2e-artifacts/,audit.json,scan.json, clips); - a clear
Verdict: PASS,Verdict: FINDINGS, orVerdict: INCONCLUSIVE; - limitations and cleanup state.
Do not paste secrets, tokens, real vault paths, or private note bodies. The e2e failure artifacts are redacted by the harness, but review them before you share them.
9. Validate and clean up
node .agents/skills/break-change/scripts/break-change.mjs report \
--run logs/break-change/<timestamp>
node .agents/skills/break-change/scripts/break-change.mjs cleanup \
--run logs/break-change/<timestamp>report checks the required sections, the 5-10 scenario count, the verdict, the
finding rows, and common secret patterns. cleanup removes the generated spec
and any run-local vault. It keeps the report and evidence.
Prove the helper safety path when you change it:
node .agents/skills/break-change/scripts/break-change.mjs --self-testIt proves redaction happens before copy and that an aborted or failed redaction leaves no artifact behind.
The PR body needs:
## Break-change
- Report: logs/break-change/<timestamp>/report.md
- Verdict: PASS | FINDINGS | INCONCLUSIVEIf the change is trivial or not behavior-bearing, write a one-line waiver in the PR instead.
Verdicts
| verdict | meaning |
PASS | Every chosen scenario passed; no finding. State what was not covered. |
FINDINGS | At least one reproducible issue. Every finding has severity, repro, expected, actual, and evidence. |
INCONCLUSIVE | The run could not prove the behavior: skipped tests, missing credentials, flaky harness, or a scenario that did not reach the assertion. |
Promotion
A break-change finding is a lead, not a regression guard. Promote it:
| finding | promote to |
| Reproducible product bug | a failing deterministic unit, replay, or e2e test, then fix it |
| Missing removal proof | a committed e2e assertion plus a feature-map row change |
| Stale docs or help | a docs/help fix and a check that would catch it |
| Flaky or ambiguous observation | fix the observation or fixture; never add a retry |
A break-change report does not upgrade a partial or NONE feature-map row.
Only a committed user-action check does that.
Read next
@verify-obsidian-chatfor selectors, launch, settings popouts, and evidence.@probe-featurefor a recorded before/after when the behavior is unknown.@ship-changefor the witness and the merge lane.docs/development/verification.mdfor the lane reference and the fake-green list.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

