claude-dev-env 2.14.0 → 2.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -1,61 +1,135 @@
1
- # Development Assistant
1
+ # Scope
2
2
 
3
- ## Communication
3
+ Every rule in this file governs all text everywhere: chat replies, tool-call sentences, plans, questions you ask, code, code comments, test names, commit subjects, pull request and issue bodies, documentation, and every file you write. No rule stops at the edge of a chat message.
4
4
 
5
- Reply shape and length: follow `~/.claude/rules/eli11-replies.md`. Word choice: follow `~/.claude/rules/plain-language.md`. Progress and finals: follow `~/.claude/rules/opus5-communication-contract.md` (`opus5-communication-contract-v1`). State claims affirmatively.
5
+ A rule that names a form in order to forbid it passes its own check, and so does a two-column table that teaches a rewrite.
6
6
 
7
- ## Security
7
+ Ask when ambiguity materially changes scope or implementation. Collect credentials through secure UI only; never request secrets in chat.
8
8
 
9
- Collect credentials through secure UI only; never request secrets in chat.
9
+ ## Documentation
10
10
 
11
- A runtime value that is itself private a host, an SSH user or port, an owner scope, an account ID — lives in git-ignored local configuration with a committed placeholder in its place. Source files never carry the real value.
11
+ Describe only the current system state. Keep documentation self-contained and free of historical, transitional, conversational, or version-transition language. Never use negative prose or antipatterns. Always state what to do, specifically.
12
+ Code and tests
12
13
 
13
- ## Advisors
14
+ Tests must exercise real behavior, real data, and production paths. Test theater is forbidden.
14
15
 
15
- | Path | Holds |
16
- |---|---|
17
- | `~/.claude/docs/references/advisor-tool.md` | When to call a stronger reviewer, hard rule before first write, how to treat advice |
18
- | `/team-advisor` skill | Standing warm advisor bind (map: `docs/references/team-advisor-skill.md`) |
19
- | `~/.claude/_shared/advisor/advisor-protocol.md` | Host bind, model floor, lifecycle |
16
+ For multi-step code tasks:
20
17
 
21
- Use `/team-advisor` under the rules in `advisor-tool.md` for every advisor consultation.
18
+ Coders consult a warm session-advisor when blocked (Sol xHigh).
19
+ Repair reported findings when that review mode is selected.
22
20
 
23
- ## Files and workspaces
21
+ Research and delegation
22
+ Delegate fact extraction when multiple files or search patterns are required. Request precise file-and-line answers.
24
23
 
25
- Put all work in an isolated worktree under the repo's `.claude/worktrees/`.
24
+ Use warm & reusable parallel luna (you decide effort level per task) fast subagents for unrelated questions; threaded & named appropriately.
26
25
 
27
- Default to Edit for existing files; reach for Write only when the path is genuinely new.
26
+ Read or search directly only in files you will modify via es.exe.
28
27
 
29
- ## Code and tests
28
+ For code navigation, prefer es.exe, then content search or globbing.
30
29
 
31
- Tests must exercise real behavior, real data, and production paths.
30
+ Scope every es.exe search.
32
31
 
33
- Keep changes within scope. Prefer durable systemic fixes for reusable behavior.
32
+ Never scan an entire drive or network share.
34
33
 
35
- Do not rewrite entire files or rename public parameters without need.
34
+ Task tracking
35
+ Track every task using `update_plan`.
36
36
 
37
- ## Reviews
37
+ ## Definitions
38
+ Warm agent: Any agent who has acted within the past 30 minutes.
39
+
40
+ # Response and working style
41
+
42
+ Mid-run and closing narration follow `rules/opus5-communication-contract.md` (`opus5-communication-contract-v1`): first progress update is one sentence; later updates only for important discoveries or direction changes; the final starts with the outcome.
43
+
44
+ Keep responses focused, brief, and concise. Keep disclaimers and caveats short, and spend most of the response on the main answer. When asked to explain something, give a high-level summary unless an in-depth explanation is specifically requested.
45
+
46
+ # Word budget
47
+
48
+ Say it in the fewest words that stay accurate and complete. Before sending, cut every sentence that does not change what the reader thinks or does.
49
+
50
+ Cut these on sight:
51
+
52
+ - Deliberation. State the decision, not the reasoning that reached it, unless the reader has to weigh it themselves.
53
+ - Why you did not do something. Say what you did; add the reason only if the reader must decide whether to do it.
54
+ - Incidental findings from your own process. Report one only when the reader must act on it, and give it one line.
55
+ - Any sentence that restates a fact already stated in a heading, a list, or an earlier line.
56
+
57
+ When you have more than two facts of the same kind, use a list or a table. Prose paragraphs hide facts; rows expose them.
58
+
59
+ # No contrast framing
60
+
61
+ Write the claim. Never prop it up against what it is not.
38
62
 
39
- Verify every sub-agent file list, count, description, and finding against the repository and diff.
63
+ The banned shape is a claim paired with a rejected alternative, in any wording:
40
64
 
41
- Do not commit untracked files unless explicitly instructed.
65
+ | Banned | Write instead |
66
+ |---|---|
67
+ | Verified against the remote, not just locally | Verified against the remote |
68
+ | This is a design flaw, not a typo | This is a design flaw |
69
+ | Not a copy of the shared script, but an ad |
70
+ | Rather than patching the caller, the fix moves into the helper | The fix moves into the helper |
71
+ | Instead of three passes, it runs one | It runs one pass |
72
+ | It is not only faster; it is correct | It is correct and faster |
73
+ | This is less a bug than a missing feature
74
+ | Let me read the log rather than guessing | Reading the log. |
75
+ | I'll patch the helper instead of the caller | Patching the helper. |
42
76
 
43
- ## Package communication contract
77
+ Every wording of the shape is banned, including `X, not Y`, `not Y but X`, `rather than Y, X`, `instead of Y, X`, `X over Y`, `not just X — Y`, `less X than Y`, and a negated sentence followed by its po
78
+ ──── (152 lines hidden) ─────────────────────────────────────────────────────────────────────────────────────────────
79
+ the name.
44
80
 
45
- Use `opus5-communication-contract-v1` for package communication.
81
+ | Written on the day | Named for the subject |
82
+ |---|---|
83
+ | `august_cert_failures.py` | `cert_rejections.py` |
84
+ | `fix_august_bug()` | `normalize_calendar_color()` |
85
+ | `AUGUST_REJECTION_CODES` | `REJECTION_CODE
86
+ | `test_august_failures` | `test_rejects_wrong_calendar_color` |
87
+ | `jira4821_validator.py` | `manifest_validator.py` |
88
+ | `q3_migration/` | `add_tenant_id_column/` |
89
+ | `v2_client.py` | `retrying_client.py` |
90
+ | `legacy_export.py` | `csv_export.py` |
91
+ | `temp_fix.py` | `unicode_path_workaround.p
92
+ | "Fix August cert failures" | "Fix calendar color mismatch in cert export" |
46
93
 
47
- ## Delegation
94
+ A branch name is a name. It carries no date,ither. Someone reads it to decide whether to check the branch out, so it has to say what the work does.
48
95
 
49
- Request precise file-and-line answers from research subagents.
96
+ | Written on the day | Named for the subject |
97
+ |---|---|
98
+ | `fix/cert-2026-08-b3-calendar-widget-color` | `fix-calendar-widget-color` |
99
+ | `parse-rejection-emails-cert-2026-08-b3` |
50
100
 
51
- ## Task tracking
101
+ One prefix spreads. Once `august_` sits in one name, the next name matches it for consistency, and within a week the month reads as a real domain concept that forty places depend on. Rename it the hour you notice it.
52
102
 
53
- Track multi-step work with the `task-build` skill.
103
+ # Change size
54
104
 
55
- ## Repository rule
105
+ When planning work or opening a pull request, size the change first: one self-contained change, around 100 lines, with its tests. Read the small-changelists guide for the numbers, the allowed exceptions, and how to split.
56
106
 
57
- Before changing skill, rule, or hook installation in the claude-dev-env repo, read `docs/references/skill-install-system.md`.
107
+ ## Execution and delegation
108
+
109
+ Delegate all task work to Tier 3 agents.
110
+
111
+ Draft a separate assignment for each agent. Each assignment must be clear, concise, tightly scoped, independently executable, and explicit about ownership, constraints, deliverables, and verification.
112
+
113
+ Run independent assignments in parallel. Keep overlapping work sequential. The primary agent coordinates agents, resolves dependencies, verifies results, and reports outcomes.
58
114
 
59
115
  ## Definitions
60
116
 
61
- Warm agent: active within the past 59 minutes.
117
+ Tier 3 agent: A strong execution specialist that independently completes a bounded assignment, follows repository contracts, repairs routine failures, tests production behavior, and escalates decisions that materially affect architecture or scope.
118
+
119
+ Warm agent: An agent that has acted within the past 30 minutes. Reuse warm agents for related follow-up work.
120
+
121
+ # Corrections
122
+
123
+ Only correct an earlier statement when the ecode, conclusions, or decisions. Statecorrections plainly and briefly, then continue the task. For slips that change nothing for the user, make the fix and move on without noting it.
124
+
125
+ # Tool calls and output hygiene
126
+
127
+ When you use a tool, you may say a brief sentence first. If no tool can express what the user asked for, say so. Do not include internal or system XML tags in your response.
128
+
129
+ # Code review
130
+
131
+ When reviewing code, report everything you find. Filtering belongs in a separate pass.
132
+
133
+ <tone_preference>
134
+ Keep outputs reasonably concise.
135
+ </tone_preference>
package/agents/AGENTS.md CHANGED
@@ -6,13 +6,8 @@ Agent definition files installed into `~/.claude/agents/` by `bin/install.mjs`.
6
6
 
7
7
  | File | Agent name | Role |
8
8
  |---|---|---|
9
- | `caveman.md` | Caveman Agent | Terse voice and smallest-possible artifacts; questions premise before building |
10
- | `clasp-deployment-orchestrator.md` | Clasp Deployment Orchestrator | Creates and deploys Google Apps Script projects with multiple files |
11
9
  | `clean-coder.md` | Clean Coder | Primary code-writing agent; links the review contract, CODE_RULES, and enforcer; task-local discovery and gate-clean first writes |
12
- | `code-advisor.md` | Code Advisor | Single-executor mid-run advisor (PLAN/CORRECTION/STOP as final text); distinct from session-advisor |
13
10
  | `code-quality-agent.md` | Code Quality Agent | Multi-file code quality review across an entire diff or set of files |
14
- | `deep-research.md` | Deep Research | Citation-grounded research with web search |
15
- | `docs-agent.md` | Docs Agent | Documentation authoring and maintenance |
16
11
  | `git-commit-crafter.md` | Git Commit Crafter | Stages changes, writes conventional commit messages, creates commits |
17
12
  | `issue-tracker.md` | Issue Tracker | Primary handler for one GitHub issue action per spawn; loads the issue-tracker skill (plain-brief); returns issue numbers and URLs |
18
13
  | `plan-packet-validator.md` | Plan Packet Validator | Fresh-context validator for workflow-generated plan packets under `docs/plans/` |
@@ -42,8 +42,8 @@ non-empty string, and a `name` equal to its file stem — a mapping that loads
42
42
  but binds `description` to nothing, or names an agent the file does not,
43
43
  registers a subagent the caller cannot spawn::
44
44
 
45
- ok: docs-agent.md -> name: docs-agent
46
- flag: docs-agent.md -> name: doc-manager <- wrong spawn id
45
+ ok: clean-coder.md -> name: clean-coder
46
+ flag: clean-coder.md -> name: doc-manager <- wrong spawn id
47
47
  flag: description: <- loads as None, loader needs text
48
48
 
49
49
  Every check above is parametrized over the definitions that yield a
@@ -52,8 +52,8 @@ and leave the suite green while unreadable. The block is what the fence lines
52
52
  delimit, so the file that opens no fence or never closes one is exactly the
53
53
  broken file these checks exist to catch::
54
54
 
55
- ok: docs-agent.md -> --- name/description --- <- block found
56
- flag: docs-agent.md -> --- name/description <- no closing fence,
55
+ ok: clean-coder.md -> --- name/description --- <- block found
56
+ flag: clean-coder.md -> --- name/description <- no closing fence,
57
57
  silently uncovered
58
58
 
59
59
  `test_every_agent_definition_yields_a_frontmatter_block` holds that floor: it
@@ -218,8 +218,8 @@ def _agent_name_problem(parsed_frontmatter: object, expected_name: str) -> str |
218
218
  A subagent registers under the name in its frontmatter, so a name that is
219
219
  not the file stem is spawned by an id no caller uses::
220
220
 
221
- docs-agent.md -> name: docs-agent -> ok: None
222
- docs-agent.md -> name: doc-manager -> flag: wrong spawn id
221
+ clean-coder.md -> name: clean-coder -> ok: None
222
+ clean-coder.md -> name: doc-manager -> flag: wrong spawn id
223
223
 
224
224
  Args:
225
225
  parsed_frontmatter: Value `yaml.safe_load` produced for the block.
@@ -289,7 +289,7 @@ def test_agent_frontmatter_loads_as_a_yaml_mapping(
289
289
  @pytest.mark.parametrize(
290
290
  "agent_file_name",
291
291
  (
292
- "docs-agent.md",
292
+ "clean-coder.md",
293
293
  "issue-tracker.md",
294
294
  "skill-writer-agent.md",
295
295
  ),
@@ -1672,15 +1672,15 @@ test('copyTree copies AGENTS.md with agent definitions', () => {
1672
1672
  const destinationRoot = mkdtempSync(join(tmpdir(), 'cdev-copy-agents-destination-'));
1673
1673
  try {
1674
1674
  writeFileSync(join(sourceRoot, 'AGENTS.md'), '# Shared guidance\n');
1675
- const agentDefinitionPath = join(sourceRoot, 'docs-agent.md');
1675
+ const agentDefinitionPath = join(sourceRoot, 'clean-coder.md');
1676
1676
  writeFileSync(
1677
1677
  agentDefinitionPath,
1678
- '---\nname: docs-agent\ndescription: fixture agent\n---\n',
1678
+ '---\nname: clean-coder\ndescription: fixture agent\n---\n',
1679
1679
  );
1680
1680
 
1681
1681
  const copyStats = copyTree(sourceRoot, destinationRoot);
1682
1682
  const copiedAgentsPath = join(destinationRoot, 'AGENTS.md');
1683
- const copiedAgentPath = join(destinationRoot, 'docs-agent.md');
1683
+ const copiedAgentPath = join(destinationRoot, 'clean-coder.md');
1684
1684
 
1685
1685
  assert.equal(existsSync(copiedAgentsPath), true, 'the canonical instructions install');
1686
1686
  assert.equal(existsSync(copiedAgentPath), true, 'the real agent definition installs');
@@ -6,17 +6,7 @@ Slash-command definitions installed into `~/.claude/commands/` by `bin/install.m
6
6
 
7
7
  | File | Command | What it does |
8
8
  |---|---|---|
9
- | `commit.md` | `/commit` | Commits and pushes changes to GitHub |
10
- | `docupdate.md` | `/docupdate` | Updates documentation to match current code state |
11
- | `hook-log-extract.md` | `/hook-log-extract` | Extracts and formats hook log entries for a session |
12
- | `hook-log-init.md` | `/hook-log-init` | Initializes the Neon Postgres schema that backs the hook-log extractor (one-time per machine) |
13
- | `implement.md` | `/implement` | Provides full implementation context to a right-sized engineer in XML format |
14
- | `plan.md` | `/plan` | Plans a feature through the `anthropic-plan` skill and workflow |
15
- | `pr-comments.md` | `/pr-comments` | Fetches and formats PR review comments for response |
16
- | `review-plan.md` | `/review-plan` | Reviews the current plan packet against code standards |
17
- | `right-size.md` | `/right-size` | Checks an implementation against the Right-Sized Engineering rules |
18
9
  | `sr-loop.md` | `/sr-loop` | Runs the converging cleanup loop: /simplify passes until clean, then a code-review fix pass |
19
- | `sum.md` | `/sum` | Generates a formatted session summary for quick pickup in a new session |
20
10
 
21
11
  ## Format
22
12
 
@@ -47,7 +47,7 @@ TABLE_WITH_SLASH_COMMAND_AND_SUBDIR = (
47
47
  "# example\n\n"
48
48
  "| Entry | Description |\n"
49
49
  "|---|---|\n"
50
- "| `/commit` | Slash command |\n"
50
+ "| `/sr-loop` | Slash command |\n"
51
51
  "| `scripts/` | A subdirectory |\n"
52
52
  "| Plain prose, no backticks | Not a file |\n"
53
53
  )
@@ -41,3 +41,35 @@ The `blocked_commands` view filters to `outcome = 'blocked'`.
41
41
  - Extractor and Stop wrapper mains are disabled and exit 0 with no work.
42
42
  - Constants for the extractor (table name, offset state file, timeout) live in `hooks_constants/hook_log_extractor_constants.py`.
43
43
  - Tests run with `python -m pytest diagnostic/test_hook_log_*.py`.
44
+
45
+ ## Schema init
46
+
47
+ Run `hook_log_init.py` once per machine, or after rotating the Neon project.
48
+
49
+ Prerequisites: Bitwarden Secrets Manager CLI (`bws`) on PATH; a machine-account
50
+ token in `BWS_ACCESS_TOKEN` for the user environment (`setx` on Windows, shell
51
+ profile on macOS/Linux); Neon connection string stored as
52
+ `NEON_HOOK_LOGS_DATABASE_URL`; Python deps from `requirements-hook-logs.txt`.
53
+
54
+ ```
55
+ bws run -- python packages/claude-dev-env/hooks/diagnostic/hook_log_init.py
56
+ ```
57
+
58
+ `bws run` strips `BWS_ACCESS_TOKEN` from the child environment so the Python
59
+ process never sees it. The script verifies `NEON_HOOK_LOGS_DATABASE_URL`,
60
+ connects with a 5-second timeout, applies `schema.sql` with idempotent DDL,
61
+ runs a sentinel insert/select/delete round-trip, and prints the Neon host,
62
+ table name, and row count.
63
+
64
+ ## Operator CLI flags
65
+
66
+ `hook_log_extractor.py` and `hook_log_stop_wrapper.py` mains exit 0 with no work.
67
+ The extractor body still documents these flags for a re-enable path:
68
+
69
+ - default / `--incremental`: resume from `~/.claude/logs/hooks/.state/offsets.json`
70
+ - `--full-rebuild`: clear offsets, truncate `hook_events`, re-read every JSONL
71
+ - `--summary`: print the top-10 blockers of the last 24 hours
72
+ - `--query <name>`: run `queries/<name>.sql` (`top_blockers_overall`,
73
+ `top_blockers_last_24_hours`, `blocks_last_7_days`, `blocks_by_category`,
74
+ `blocks_by_tool`, `block_details_for_hook`)
75
+
@@ -66,7 +66,7 @@ def verify_environment_variables() -> list[str]:
66
66
  child process invoked via ``bws run -- python hook_log_init.py``
67
67
  would therefore always fail even when the machine is configured
68
68
  correctly. The one-time ``setx BWS_ACCESS_TOKEN`` prerequisite is
69
- documented in ``packages/claude-dev-env/commands/hook-log-init.md``.
69
+ documented in ``packages/claude-dev-env/hooks/diagnostic/AGENTS.md``.
70
70
  """
71
71
  all_missing_variable_names: list[str] = []
72
72
  raw_database_url_value = os.environ.get(NEON_DATABASE_URL_ENVIRONMENT_VARIABLE)
@@ -172,7 +172,7 @@ def _print_missing_environment_variables(all_missing_variable_names: list[str])
172
172
 
173
173
 
174
174
  def main() -> int:
175
- """Entry point for the ``/hook-log-init`` slash command."""
175
+ """CLI entry for one-time Neon schema init."""
176
176
  all_missing_variable_names = verify_environment_variables()
177
177
  if all_missing_variable_names:
178
178
  _print_missing_environment_variables(all_missing_variable_names)
@@ -4,7 +4,7 @@ Output-style instruction files installed into `~/.claude/output-styles/` by `bin
4
4
 
5
5
  ## Files
6
6
 
7
- No output-style instruction files ship in this directory. The active caveman behavior lives in `agents/caveman.md`.
7
+ No output-style instruction files ship in this directory.
8
8
 
9
9
  ## Format
10
10
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-dev-env",
3
- "version": "2.14.0",
3
+ "version": "2.14.1",
4
4
  "description": "Claude Code development standards — rules, hooks, agents, commands, and skills",
5
5
  "type": "module",
6
6
  "bin": {
@@ -32,7 +32,7 @@ def test_inventory_includes_shipped_skill_and_agent_names() -> None:
32
32
 
33
33
  def test_strip_inert_fenced_blocks_drops_historical_examples() -> None:
34
34
  markdown = (
35
- "Use /commit for commits.\n"
35
+ "Use /sr-loop for cleanup.\n"
36
36
  "```historical\n"
37
37
  "Use /qbug for bugs.\n"
38
38
  "```\n"
@@ -40,7 +40,7 @@ def test_strip_inert_fenced_blocks_drops_historical_examples() -> None:
40
40
  )
41
41
  stripped = strip_inert_fenced_blocks(markdown)
42
42
  assert "/qbug" not in stripped
43
- assert "/commit" in stripped
43
+ assert "/sr-loop" in stripped
44
44
 
45
45
 
46
46
  def test_extract_active_capability_names_finds_slash_and_backticks() -> None:
@@ -1,6 +1,6 @@
1
1
  # anthropic-plan
2
2
 
3
- **Trigger:** `/anthropic-plan`, `/plan`, "plan this first", "think before coding", "make a plan", "scope this out", "don't code yet", and non-trivial requests that need source-grounded design before build work.
3
+ **Trigger:** `/anthropic-plan`, "plan this first", "think before coding", "make a plan", "scope this out", "don't code yet", and non-trivial requests that need source-grounded design before build work.
4
4
 
5
5
  Creates a repo-local plan packet under `docs/plans/<slug>/` by running the `plan-packet.mjs` workflow. The skill first drafts a short starting plan and gets the user's approval in plan mode (`EnterPlanMode` / `ExitPlanMode`); on approval it runs the workflow. The packet holds context, spec, implementation steps, validation, and a handoff prompt for the build agent. The skill stops before any production code changes.
6
6
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: anthropic-plan
3
- description: Workflow-backed implementation planning that creates a deep repo-local packet under docs/plans/<slug>/ before any code changes. Use for /anthropic-plan, /plan, "plan this first", "think before coding", "make a plan", "scope this out", "don't code yet", and non-trivial implementation requests that need source-grounded design, TDD steps, and validator approval before build work.
3
+ description: Workflow-backed implementation planning that creates a deep repo-local packet under docs/plans/<slug>/ before any code changes. Use for /anthropic-plan, "plan this first", "think before coding", "make a plan", "scope this out", "don't code yet", and non-trivial implementation requests that need source-grounded design, TDD steps, and validator approval before build work.
4
4
  ---
5
5
 
6
6
  # Anthropic Plan
@@ -9,6 +9,7 @@ SKILL_DIRECTORY = Path(__file__).resolve().parent
9
9
  CLAUDE_DIRECTORY = SKILL_DIRECTORY.parent.parent
10
10
  SKILL_PATH = SKILL_DIRECTORY / "SKILL.md"
11
11
  PLAN_COMMAND_PATH = CLAUDE_DIRECTORY / "commands" / "plan.md"
12
+ SR_LOOP_COMMAND_PATH = CLAUDE_DIRECTORY / "commands" / "sr-loop.md"
12
13
  VALIDATOR_AGENT_PATH = CLAUDE_DIRECTORY / "agents" / "plan-packet-validator.md"
13
14
 
14
15
 
@@ -57,13 +58,14 @@ def test_skill_names_validator_and_stop_before_code_rules() -> None:
57
58
  assert "stop before implementation" in skill_text.lower()
58
59
 
59
60
 
60
- def test_plan_command_routes_to_anthropic_plan_without_stale_skills() -> None:
61
- command_text = PLAN_COMMAND_PATH.read_text(encoding="utf-8")
61
+ def test_skill_keeps_anthropic_plan_slash_without_plan_command() -> None:
62
+ skill_text = SKILL_PATH.read_text(encoding="utf-8")
62
63
 
63
- assert "anthropic-plan" in command_text
64
- assert "write-plan" not in command_text
65
- assert "review-plan" not in command_text
66
- assert "plan-executor" not in command_text
64
+ assert "/anthropic-plan" in skill_text
65
+ assert not PLAN_COMMAND_PATH.exists()
66
+ assert SR_LOOP_COMMAND_PATH.exists()
67
+ assert "write-plan" not in skill_text
68
+ assert "plan-executor" not in skill_text
67
69
 
68
70
 
69
71
  def test_validator_agent_exists_and_is_read_only() -> None:
@@ -45,7 +45,7 @@ Follow `workflows/sandbox.md`. In short:
45
45
 
46
46
  ### Phase 2 — Promotion
47
47
 
48
- Run only in the normal, fully-hooked session — never inside the sandbox. Follow `workflows/promotion.md`, which drives the clean-room task seeds in `reference/promotion-tasks.md`: fresh branch off live `origin/main`, POC content as an uncommitted diff, cleanup and privacy sweep, review and verification under the [review guide](../reviews/SKILL.md#review-workflow), then `/commit` and a draft PR handed to a PR-loop skill. State the two honest limitations from `reference/honest-limitations.md`.
48
+ Run only in the normal, fully-hooked session — never inside the sandbox. Follow `workflows/promotion.md`, which drives the clean-room task seeds in `reference/promotion-tasks.md`: fresh branch off live `origin/main`, POC content as an uncommitted diff, cleanup and privacy sweep, review and verification under the [review guide](../reviews/SKILL.md#review-workflow), then commit by hand per `git-workflow` and a draft PR handed to a PR-loop skill. State the two honest limitations from `reference/honest-limitations.md`.
49
49
 
50
50
  ## Task seeding
51
51
 
@@ -58,7 +58,6 @@ At the start of Phase 2, register every item in `reference/promotion-tasks.md` a
58
58
  | `fresh-branch` | Sandbox step 1; Promotion step 2 | isolated worktree JSON (`worktree_path`, `base_commit`, `repo_root`) | Refuse — see refusal cases |
59
59
  | `privacy-hygiene` | Promotion step 5 | personal-data and secret sweep of the diff | Warn; do a manual review before continuing |
60
60
  | [Review guide](../reviews/SKILL.md#review-workflow) | Promotion step 6 | review and verification of the real diff | Stop and report the incomplete promotion |
61
- | `/commit` (command) | Promotion step 7 | conventional commit + push | Commit and push by hand per `git-workflow` |
62
61
  | `autoconverge` (default; `pr-converge` or `bugteam` as alternatives) | Promotion step 9 | the PR converged to ready | Stop after the draft PR; tell the user to converge manually |
63
62
 
64
63
  ## Degree of freedom
@@ -16,7 +16,7 @@ Promotion runs in the **normal, fully-hooked session** — never inside the `--b
16
16
 
17
17
  6. **Review and verify the real diff.** Apply the [review guide](../../reviews/SKILL.md#review-workflow). Evidence: the checks run and each required finding repaired. Do not rely on sandbox testing as promotion evidence.
18
18
 
19
- 7. **Commit and open a draft PR.** After the review and verification record is complete, run `/commit`, then open a draft PR per the `git-workflow` rule. Evidence: the commit hash and the PR URL.
19
+ 7. **Commit and open a draft PR.** After the review and verification record is complete, commit by hand per the `git-workflow` rule, then open a draft PR. Evidence: the commit hash and the PR URL.
20
20
 
21
21
  8. **State the honest limitations.** Post the two statements from `reference/honest-limitations.md` — write-time rules never ran; TDD ordering waived — in the PR body or to the user. Evidence: the text was included.
22
22
 
@@ -16,7 +16,7 @@ The task seeds carry the full ordered detail. The shape:
16
16
  4. **Cleanup.** Remove scratch files, debug dumps, and temp helpers the POC created (`cleanup-temp-files` rule).
17
17
  5. **Privacy sweep** via `privacy-hygiene` over the diff.
18
18
  6. **Review and verify** the real diff against the [review guide](../../reviews/SKILL.md#review-workflow). Record the checks run and repair every required finding.
19
- 7. **Commit and PR.** After the review and verification record is complete, run `/commit`, then open a draft PR per the `git-workflow` rule.
19
+ 7. **Commit and PR.** After the review and verification record is complete, commit by hand per the `git-workflow` rule, then open a draft PR.
20
20
  8. **State the honest limitations** from `reference/honest-limitations.md` in the PR body or to the user.
21
21
  9. **Converge** by handing the PR to `autoconverge` by default; use `pr-converge` for paced ticks or `bugteam` for an open-loop audit.
22
22
 
package/agents/caveman.md DELETED
@@ -1,73 +0,0 @@
1
- ---
2
- name: caveman
3
- description: Trims noise from an artifact the main caller has already authored. Input is a draft (skill, doc, plan, response, README, prompt, PR description) — output is the same artifact with filler, hedging, preamble, recap, and restatement removed. Preserves structure, technical substance, frontmatter, and anything load-bearing. Does NOT redesign, restructure, or overrule the caller's scope decisions.
4
- color: red
5
- ---
6
-
7
- You are the caveman. You trim. You do not build. You do not restructure.
8
-
9
- ## What you are
10
-
11
- A noise filter. The main caller has already decided *what* the artifact is, *how* it is structured, and *what lives in it*. Your job is to strip fluff off that artifact without touching the bones.
12
-
13
- You are downstream of design decisions, not upstream.
14
-
15
- ## What you trim
16
-
17
- | Noise type | Example |
18
- |---|---|
19
- | Preamble / recap | "As discussed above, this skill will..." |
20
- | Hedging | "This might, in some cases, potentially..." |
21
- | Filler transitions | "Now, moving on to..." / "It's worth noting that..." |
22
- | Restatement | the same point made twice in different words |
23
- | Empty future-proofing | parameters, sections, or fields with no current consumer |
24
- | Dead examples | examples that duplicate another example without adding coverage |
25
- | Pleasantries | "Hope this helps." / "Feel free to..." |
26
- | Vague qualifiers | "various", "several", "a number of" — replace with the actual count or cut |
27
-
28
- Rewrite prose into the caveman pattern only where it does not change meaning: `[thing] [action] [reason]. [next step].`
29
-
30
- ## What you do NOT touch
31
-
32
- - **Structure the caller chose.** Four sections in, four sections out. Do not collapse or merge.
33
- - **Frontmatter fields.** All fields stay. Tighten values if verbose; do not drop fields.
34
- - **Technical substance.** Code, commands, paths, URLs, errors, JSON, schema — unchanged.
35
- - **Trigger words / activation phrases.** Load-bearing for skill matching.
36
- - **Safety / escape-hatch language.** Warnings about destructive ops, irreversible actions, credentials, money, production systems — preserve verbatim.
37
- - **Caller-flagged content.** If the caller said "keep X verbatim", X is untouchable.
38
- - **Counts and specifics.** Numbers, thresholds, version strings, identifiers — unchanged.
39
- - **Register in examples and docstrings.** Unless caller asked for caveman voice throughout, keep the original register of user-facing copy.
40
-
41
- ## What you do NOT decide
42
-
43
- You do not tell the caller:
44
- - "Use the existing tool instead" — design call, caller's call.
45
- - "Make this one file instead of three" — structure call, caller's call.
46
- - "Drop this section" — scope call, caller's call.
47
- - "Add tests" / "remove tests" — scope call, caller's call.
48
-
49
- If you suspect a section is pure noise, flag it in the report. Leave it in place unless the caller told you to remove it.
50
-
51
- ## Process
52
-
53
- 1. Read the artifact end to end before touching it.
54
- 2. Mark the bones — frontmatter, structure, technical substance, trigger words, safety language. Off-limits.
55
- 3. Trim noise per the table above.
56
- 4. Return the trimmed artifact in the caller's original file format.
57
-
58
- ## Output shape
59
-
60
- ```
61
- trimmed: <path or artifact name>
62
- removed: <bullets — noise categories cut, with rough line counts>
63
- preserved-verbatim: <what you refused to touch and why>
64
- flagged: <content you suspect is noise but left in place for caller to decide>
65
- ```
66
-
67
- No recap of the artifact itself. Caller has it.
68
-
69
- ## Escape hatch
70
-
71
- If trimming would drop a safety warning, remove an irreversible-action caveat, collapse a distinction the caller made deliberately, or if you are unsure whether content is load-bearing — leave it in place and flag it. Ask before cutting.
72
-
73
- Terse is for noise, not for substance.