From ae9861b827fe1b5f6dafebe4d69ded967dea9d3b Mon Sep 17 00:00:00 2001 From: Edbert Chan <1916223+EdbertChan@users.noreply.github.com> Date: Fri, 9 Oct 2026 16:13:52 -0700 Subject: [PATCH 1/3] cat-mode: local-only repos end in a local merge, never GitHub Co-Authored-By: Claude Sonnet 5.5 Change-Id: I26c788b179793511a9191bede9861bd8521bc347 --- corpus/skills/cat-mode/SKILL.md | 3 ++- .../cat-mode/tests/fires_local_only_no_github.md | 2 ++ .../tests/stays_silent_remote_repo_publishes.md | 2 ++ corpus/skills/cat-mode/tests/test_artifact_sweeps.py | 10 ++++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 corpus/skills/cat-mode/tests/fires_local_only_no_github.md create mode 100644 corpus/skills/cat-mode/tests/stays_silent_remote_repo_publishes.md diff --git a/corpus/skills/cat-mode/SKILL.md b/corpus/skills/cat-mode/SKILL.md index 3464274d..35b86924 100644 --- a/corpus/skills/cat-mode/SKILL.md +++ b/corpus/skills/cat-mode/SKILL.md @@ -22,7 +22,8 @@ Once direction is set, act — don't ask permission for each sub-step. One fully - **Under an active `/loop`-style standing directive, don't end a report with "want me to continue?"** A trailing question is a permission request. Treat the next obvious step as already authorized; report what you found AND what you're doing next. Ask only for a destructive/production action or a real fork with no default. - **Keep named follow-ups attached to durable/background execution until the directive is complete. Completion includes every invoked skill's required landing phase.** Waiting on CI, a queue, or a subagent means sleep/wake with a clock-time ETA stated to the user, never a poll loop; on wake, resume without restatement. Arming a watcher and yielding is not waiting. -- **Commit, push, and open the PR automatically once the change is verified — don't wait to be asked.** The user says "commit and push" and "make a pr for this" / "make a pr stack" as trailing commands; treat publication as the standing default after shippable work, not a separate ask. Follow the installed `make-pr` / `draft-pr` skill (Invoker: Mergify stack via `safe-stack-push` when that repo uses stacks). "Land" means through to landed: fix CI, resolve conflicts, and deploy once merged. Still stop for: user said not to PR, plan-only / no code yet, unfinished todos they are mid-driving, or a dirty tree that mixes unrelated work that needs an explicit split first. Absent "land," deploys and other production-visible actions still get asked first. +- **Commit, push, and open the PR automatically once the change is verified — don't wait to be asked.** The user says "commit and push" and "make a pr for this" / "make a pr stack" as trailing commands; treat publication as the standing default after shippable work, not a separate ask. Follow the installed `make-pr` / `draft-pr` skill (Invoker: Mergify stack via `safe-stack-push` when that repo uses stacks). "Land" means through to landed: fix CI, resolve conflicts, and deploy once merged. Still stop for: user said not to PR, the repo is local-only (see the next bullet), plan-only / no code yet, unfinished todos they are mid-driving, or a dirty tree that mixes unrelated work that needs an explicit split first. Absent "land," deploys and other production-visible actions still get asked first. +- **A local-only repo ends in a local branch and a local merge, never GitHub.** When the repo has no GitHub remote, or the user says local or don't use GitHub, every apply, PR, or plan flow ends in a local branch and a local merge. Never push, run `gh`, or probe GitHub credentials. Ask once if unsure. Point Invoker's `repoUrl` at the repo's local folder and finish with a local merge, not a pull request. - **A named multi-step done-gate stays locked until receipt.** When the user names a close-out (for example full backfill plus PR), finish with a receipt before opening new product scope or plan attachments. - **Do not race publication against a live long job in the same thread.** Run commit-scoped preflight before drafting the PR body; finish or park the backfill ownership hand-off first. - **Cursor `/pr-skill` is not Invoker's merge-gate.** Invoker merge-gate and PR-split sessions publish via installed `invoker-make-pr` + create-pr.mjs / `gh api`; implement/slice tasks do not publish PRs. Do not diagnose `__merge__` / merge-clone sessions as "/pr-skill didn't fire" — the always-on `/pr-skill` rule is scoped to Cursor chat, so a merge-clone session was never inside it and its silence is expected. diff --git a/corpus/skills/cat-mode/tests/fires_local_only_no_github.md b/corpus/skills/cat-mode/tests/fires_local_only_no_github.md new file mode 100644 index 00000000..6bda9d6d --- /dev/null +++ b/corpus/skills/cat-mode/tests/fires_local_only_no_github.md @@ -0,0 +1,2 @@ +User: "Apply this plan. The repo is local, don't use GitHub." +Assistant: I work on a local branch, point Invoker at the repo's local folder, finish with a local merge, and run no push, no gh, and no credential probe. diff --git a/corpus/skills/cat-mode/tests/stays_silent_remote_repo_publishes.md b/corpus/skills/cat-mode/tests/stays_silent_remote_repo_publishes.md new file mode 100644 index 00000000..490f77bd --- /dev/null +++ b/corpus/skills/cat-mode/tests/stays_silent_remote_repo_publishes.md @@ -0,0 +1,2 @@ +User: "Verified. Ship it." (repo has a GitHub remote, nobody said local) +Assistant: I git push the branch and open the PR with make-pr, as the standing default. diff --git a/corpus/skills/cat-mode/tests/test_artifact_sweeps.py b/corpus/skills/cat-mode/tests/test_artifact_sweeps.py index 3ef67b1f..75d2925b 100644 --- a/corpus/skills/cat-mode/tests/test_artifact_sweeps.py +++ b/corpus/skills/cat-mode/tests/test_artifact_sweeps.py @@ -22,6 +22,16 @@ def test_correction_surface_rule_has_trigger_fixture(self): for required in ("raw data", "aggregate table", "chart source", "live Sheet read-back"): self.assertIn(required, fixture) + def test_local_only_rule_has_fixtures(self): + skill = (SKILL_DIR / "SKILL.md").read_text(encoding="utf-8") + fires = (SKILL_DIR / "tests" / "fires_local_only_no_github.md").read_text(encoding="utf-8") + silent = (SKILL_DIR / "tests" / "stays_silent_remote_repo_publishes.md").read_text(encoding="utf-8") + + self.assertIn("A local-only repo ends in a local branch and a local merge", skill) + self.assertIn("local merge", fires) + self.assertNotIn("git push", fires.split("Assistant:")[1]) + self.assertIn("git push", silent) + if __name__ == "__main__": unittest.main() From df8f867340fd875be63f9ac0a3cb7588319293cb Mon Sep 17 00:00:00 2001 From: CI Bot Date: Tue, 13 Oct 2026 06:05:52 +0000 Subject: [PATCH 2/3] cat-mode: avoid backticked gh reference --- corpus/skills/cat-mode/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/corpus/skills/cat-mode/SKILL.md b/corpus/skills/cat-mode/SKILL.md index 35b86924..3c924ed2 100644 --- a/corpus/skills/cat-mode/SKILL.md +++ b/corpus/skills/cat-mode/SKILL.md @@ -23,7 +23,7 @@ Once direction is set, act — don't ask permission for each sub-step. One fully - **Under an active `/loop`-style standing directive, don't end a report with "want me to continue?"** A trailing question is a permission request. Treat the next obvious step as already authorized; report what you found AND what you're doing next. Ask only for a destructive/production action or a real fork with no default. - **Keep named follow-ups attached to durable/background execution until the directive is complete. Completion includes every invoked skill's required landing phase.** Waiting on CI, a queue, or a subagent means sleep/wake with a clock-time ETA stated to the user, never a poll loop; on wake, resume without restatement. Arming a watcher and yielding is not waiting. - **Commit, push, and open the PR automatically once the change is verified — don't wait to be asked.** The user says "commit and push" and "make a pr for this" / "make a pr stack" as trailing commands; treat publication as the standing default after shippable work, not a separate ask. Follow the installed `make-pr` / `draft-pr` skill (Invoker: Mergify stack via `safe-stack-push` when that repo uses stacks). "Land" means through to landed: fix CI, resolve conflicts, and deploy once merged. Still stop for: user said not to PR, the repo is local-only (see the next bullet), plan-only / no code yet, unfinished todos they are mid-driving, or a dirty tree that mixes unrelated work that needs an explicit split first. Absent "land," deploys and other production-visible actions still get asked first. -- **A local-only repo ends in a local branch and a local merge, never GitHub.** When the repo has no GitHub remote, or the user says local or don't use GitHub, every apply, PR, or plan flow ends in a local branch and a local merge. Never push, run `gh`, or probe GitHub credentials. Ask once if unsure. Point Invoker's `repoUrl` at the repo's local folder and finish with a local merge, not a pull request. +- **A local-only repo ends in a local branch and a local merge, never GitHub.** When the repo has no GitHub remote, or the user says local or don't use GitHub, every apply, PR, or plan flow ends in a local branch and a local merge. Never push, run the GitHub CLI, or probe GitHub credentials. Ask once if unsure. Point Invoker's `repoUrl` at the repo's local folder and finish with a local merge, not a pull request. - **A named multi-step done-gate stays locked until receipt.** When the user names a close-out (for example full backfill plus PR), finish with a receipt before opening new product scope or plan attachments. - **Do not race publication against a live long job in the same thread.** Run commit-scoped preflight before drafting the PR body; finish or park the backfill ownership hand-off first. - **Cursor `/pr-skill` is not Invoker's merge-gate.** Invoker merge-gate and PR-split sessions publish via installed `invoker-make-pr` + create-pr.mjs / `gh api`; implement/slice tasks do not publish PRs. Do not diagnose `__merge__` / merge-clone sessions as "/pr-skill didn't fire" — the always-on `/pr-skill` rule is scoped to Cursor chat, so a merge-clone session was never inside it and its silence is expected. From c79e01980b803505a20717af27d4dbaca303d98a Mon Sep 17 00:00:00 2001 From: CI Bot Date: Tue, 13 Oct 2026 06:06:11 +0000 Subject: [PATCH 3/3] =?UTF-8?q?invoker:=20wf-1791870257543-107/repair=20?= =?UTF-8?q?=E2=80=94=20Repair=20PR=20#1378:=20failed=5Fchecks:=20test;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Exit code: 0