@bompus/house-rules 0.11.0 → 0.14.0

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.
Files changed (112) hide show
  1. package/CODE_OF_CONDUCT.md +83 -0
  2. package/README.md +102 -63
  3. package/compose.mjs +8 -2
  4. package/composition.mjs +11 -3
  5. package/config-view.mjs +18 -3
  6. package/config.mjs +74 -13
  7. package/docs/assets/overview.png +0 -0
  8. package/docs/configuration.md +85 -9
  9. package/package.json +4 -2
  10. package/rules/core.md +118 -209
  11. package/rules/modifiers/backlog-outline.md +25 -0
  12. package/rules/modifiers/backlog-visual.md +16 -0
  13. package/rules/modifiers/coded-offers.md +47 -17
  14. package/rules/modifiers/cross-session-relay.md +23 -0
  15. package/rules/modifiers/low-quota-handoff.md +4 -3
  16. package/rules/modifiers/model-default-questions.md +33 -0
  17. package/rules/modifiers/multi-agent.md +6 -2
  18. package/rules/modifiers/no-attribution.md +7 -1
  19. package/rules/modifiers/periodic-updates.md +25 -0
  20. package/rules/modifiers/plan-files.md +35 -3
  21. package/rules/modifiers/release-batching.md +4 -2
  22. package/rules/modifiers/shared-host-load.md +13 -42
  23. package/rules/modifiers/squash-landing.md +1 -1
  24. package/rules/modifiers/upstream-contributions.md +45 -0
  25. package/rules/modifiers/web-image-formats.md +35 -0
  26. package/rules/references/backlog-view.md +154 -0
  27. package/rules/references/landing.md +14 -14
  28. package/rules/references/multi-agent.md +6 -2
  29. package/rules/references/release-batching.md +37 -4
  30. package/rules/references/squash-landing.md +10 -4
  31. package/rules/references/thread-visuals.md +45 -0
  32. package/setup.mjs +87 -17
  33. package/skills/hr-agent-guidance-audit/SKILL.md +10 -5
  34. package/skills/hr-agent-guidance-audit/references/prune-workflow.md +72 -0
  35. package/skills/hr-agent-guidance-audit/references/records-and-lessons.md +1 -1
  36. package/skills/hr-agent-guidance-audit/references/retirement-verdicts.md +49 -0
  37. package/skills/hr-agent-guidance-refresh/SKILL.md +25 -57
  38. package/skills/hr-agent-guidance-refresh/references/verification.md +1 -1
  39. package/skills/hr-audit-choices/SKILL.md +1 -1
  40. package/skills/hr-benchmarking/SKILL.md +122 -159
  41. package/skills/hr-benchmarking/references/javascript.md +113 -0
  42. package/skills/hr-benchmarking/references/tools.md +62 -57
  43. package/skills/hr-better-accessibility/SKILL.md +1 -1
  44. package/skills/hr-better-accessibility/screen-readers.md +1 -0
  45. package/skills/hr-code-review/SKILL.md +19 -3
  46. package/skills/hr-code-review/agents/openai.yaml +1 -1
  47. package/skills/hr-code-review/references/acp-client.md +43 -0
  48. package/skills/{hr-change-impact/SKILL.md → hr-code-review/references/impact.md} +2 -12
  49. package/skills/hr-code-review/references/panel-adjudication.md +58 -0
  50. package/skills/hr-code-review/references/panel-plan.md +61 -0
  51. package/skills/hr-code-review/references/panel-recommendations.json +105 -0
  52. package/skills/hr-code-review/references/panel-recommendations.md +46 -0
  53. package/skills/hr-code-review/references/panel-setup.md +54 -0
  54. package/skills/hr-code-review/references/reviewer-role.md +31 -0
  55. package/skills/hr-code-review/scripts/acp-panel-client.mjs +299 -0
  56. package/skills/hr-code-review/scripts/check-receipts.mjs +263 -0
  57. package/skills/hr-code-review/scripts/panel-plan.mjs +69 -0
  58. package/skills/hr-code-review/scripts/panel-preferences.mjs +220 -0
  59. package/skills/hr-design-exploration/SKILL.md +24 -1
  60. package/skills/hr-design-exploration/agents/openai.yaml +2 -2
  61. package/skills/hr-diagnosing-bugs/SKILL.md +2 -2
  62. package/skills/hr-diagnosing-bugs/references/reporting.md +29 -4
  63. package/skills/hr-diagnosing-bugs/scripts/check-pr-offer.mjs +47 -0
  64. package/skills/hr-explain-code/SKILL.md +1 -1
  65. package/skills/hr-extract-shared-steps/SKILL.md +1 -1
  66. package/skills/hr-forgotten-work-audit/SKILL.md +130 -0
  67. package/skills/hr-forgotten-work-audit/references/brief-template.md +56 -0
  68. package/skills/hr-forgotten-work-audit/references/result-format.md +46 -0
  69. package/skills/hr-handoff/LICENSE +21 -0
  70. package/skills/hr-handoff/NOTICE.md +29 -0
  71. package/skills/hr-handoff/SKILL.md +24 -1
  72. package/skills/hr-handoff/references/reconciliation.md +25 -6
  73. package/skills/hr-handoff/references/successor-thread.md +76 -0
  74. package/skills/hr-handoff/scripts/check-reconciliation.mjs +48 -6
  75. package/skills/hr-house-rules-setup/SKILL.md +22 -8
  76. package/skills/hr-lean-plan/SKILL.md +4 -0
  77. package/skills/hr-maintainability-review/SKILL.md +14 -4
  78. package/skills/hr-maintainability-review/agents/openai.yaml +1 -1
  79. package/skills/hr-manual-qa/SKILL.md +1 -1
  80. package/skills/hr-ordering-tests/SKILL.md +1 -1
  81. package/skills/hr-plain-prose/SKILL.md +7 -4
  82. package/skills/hr-pr-followup/SKILL.md +6 -3
  83. package/skills/hr-pr-followup/references/review-helpers.md +40 -7
  84. package/skills/hr-pr-followup/scripts/check-landing.py +204 -0
  85. package/skills/hr-pr-followup/scripts/check-pr-review.ts +19 -8
  86. package/skills/hr-pr-followup/scripts/merge-pr.sh +100 -0
  87. package/skills/hr-pr-followup/scripts/verify-landed.sh +184 -0
  88. package/skills/hr-read-reddit/SKILL.md +1 -1
  89. package/skills/hr-research-shared-links/SKILL.md +103 -0
  90. package/skills/hr-sqlite/SKILL.md +174 -0
  91. package/skills/hr-sqlite/agents/openai.yaml +2 -0
  92. package/skills/hr-sqlite/references/evidence.md +94 -0
  93. package/skills/hr-sqlite/references/tool-decisions.md +39 -0
  94. package/skills/hr-sqlite/scripts/inspect-sqlite.py +245 -0
  95. package/skills/hr-stock-ui-audit/SKILL.md +1 -1
  96. package/skills/hr-test-audit/LICENSE +21 -0
  97. package/skills/hr-test-audit/NOTICE.md +67 -0
  98. package/skills/hr-usage-report/SKILL.md +90 -0
  99. package/skills/hr-usage-report/agents/openai.yaml +2 -0
  100. package/skills/hr-usage-report/assets/example-report.json +125 -0
  101. package/skills/hr-usage-report/assets/report-template.html +377 -0
  102. package/skills/hr-usage-report/scripts/render-report.ts +86 -0
  103. package/skills/hr-usage-report/scripts/usage-by-model.ts +499 -0
  104. package/skills/hr-what-next/SKILL.md +100 -10
  105. package/skills/hr-what-next/references/reporting.md +13 -22
  106. package/skills/hr-what-next/scripts/check-open-work.mjs +711 -0
  107. package/skills/hr-writing-pr/SKILL.md +29 -14
  108. package/skills/hr-writing-pr/scripts/benefit-chart.py +200 -0
  109. package/docs/npm-release.md +0 -45
  110. package/rules/modifiers/swarmail.md +0 -12
  111. package/skills/hr-benchmarking/references/priority-findings-20261006.md +0 -115
  112. package/skills/hr-change-impact/agents/openai.yaml +0 -5
@@ -0,0 +1,83 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
6
+
7
+ We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
8
+
9
+ ## Our Standards
10
+
11
+ Examples of behavior that contributes to a positive environment for our community include:
12
+
13
+ - Demonstrating empathy and kindness toward other people
14
+ - Being respectful of differing opinions, viewpoints, and experiences
15
+ - Giving and gracefully accepting constructive feedback
16
+ - Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
17
+ - Focusing on what is best not just for us as individuals, but for the overall community
18
+
19
+ Examples of unacceptable behavior include:
20
+
21
+ - The use of sexualized language or imagery, and sexual attention or advances of any kind
22
+ - Trolling, insulting or derogatory comments, and personal or political attacks
23
+ - Public or private harassment
24
+ - Publishing others' private information, such as a physical or email address, without their explicit permission
25
+ - Other conduct which could reasonably be considered inappropriate in a professional setting
26
+
27
+ ## Enforcement Responsibilities
28
+
29
+ Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
30
+
31
+ Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
32
+
33
+ ## Scope
34
+
35
+ This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
36
+
37
+ ## Enforcement
38
+
39
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement through the repository's private reporting form: on the [Security tab](https://github.com/bompus/house-rules/security), choose **Report a vulnerability** and say the report is about conduct. Only the maintainer can read it. All complaints will be reviewed and investigated promptly and fairly.
40
+
41
+ All community leaders are obligated to respect the privacy and security of the reporter of any incident.
42
+
43
+ ## Enforcement Guidelines
44
+
45
+ Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
46
+
47
+ ### 1. Correction
48
+
49
+ **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
50
+
51
+ **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
52
+
53
+ ### 2. Warning
54
+
55
+ **Community Impact**: A violation through a single incident or series of actions.
56
+
57
+ **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
58
+
59
+ ### 3. Temporary Ban
60
+
61
+ **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
62
+
63
+ **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
64
+
65
+ ### 4. Permanent Ban
66
+
67
+ **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
68
+
69
+ **Consequence**: A permanent ban from any sort of public interaction within the community.
70
+
71
+ ## Attribution
72
+
73
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
74
+
75
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
76
+
77
+ For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations].
78
+
79
+ [homepage]: https://www.contributor-covenant.org
80
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
81
+ [Mozilla CoC]: https://github.com/mozilla/diversity
82
+ [FAQ]: https://www.contributor-covenant.org/faq
83
+ [translations]: https://www.contributor-covenant.org/translations
package/README.md CHANGED
@@ -1,14 +1,22 @@
1
1
  <h1 align="center">
2
2
  <picture>
3
3
  <source media="(prefers-color-scheme: dark)" srcset="docs/assets/banner-dark.png">
4
- <img src="docs/assets/banner-light.png" alt="house-rules" width="100%">
4
+ <img src="docs/assets/banner-light.png" alt="house-rules: Working rules and skills for AI coding agents" width="100%">
5
5
  </picture>
6
6
  </h1>
7
7
 
8
8
  <p align="center">
9
9
  <a href="https://github.com/bompus/house-rules/actions/workflows/check.yml"><img src="https://github.com/bompus/house-rules/actions/workflows/check.yml/badge.svg" alt="CI status"></a>
10
- <a href="https://github.com/bompus/house-rules/releases/latest"><img src="https://img.shields.io/github/v/release/bompus/house-rules" alt="Latest release"></a>
11
- <a href="LICENSE"><img src="https://img.shields.io/github/license/bompus/house-rules" alt="MIT license"></a>
10
+ <a href="https://github.com/bompus/house-rules/releases/latest"><img src="https://badgen.net/github/release/bompus/house-rules" alt="Latest GitHub release"></a>
11
+ <a href="https://www.npmjs.com/package/@bompus/house-rules"><img src="https://badgen.net/npm/v/@bompus/house-rules" alt="Latest npm version"></a>
12
+ <a href="LICENSE"><img src="https://badgen.net/badge/license/MIT/blue" alt="MIT license"></a>
13
+ </p>
14
+
15
+ <p align="center">
16
+ <a href="rules/core.md">Core rules</a>&nbsp;·
17
+ <a href="#modifiers">Opt-in modifiers</a>&nbsp;·
18
+ <a href="#writing-your-own-sections">Your own layer</a>&nbsp;·
19
+ <a href="examples/project/AGENTS.md">Each repo's AGENTS.md</a>
12
20
  </p>
13
21
 
14
22
  A practical starting point for ordinary development with AI coding agents.
@@ -16,7 +24,7 @@ Fresh installs select eight skills for setup, review, diagnosis, explanation,
16
24
  planning, tests, writing and remaining work. Modifiers start off. Add guidance
17
25
  when a task needs it, and let each repository supply its own safeguards.
18
26
 
19
- <p align="center"><img src="docs/assets/overview.png" alt="The four layers composed into one rules file: core, opt-in modifiers, your layer and each repository's AGENTS.md. The eval figures in this illustration come from an early internal run and are not a current result." width="100%"></p>
27
+ <p align="center"><img src="docs/assets/overview.png" alt="The four layers: core, opt-in modifiers and your own layer are composed into one rules file, and each repository's AGENTS.md adds to it. Beside them, what a fresh install selects: core rules on, modifiers off, eight skills." width="100%"></p>
20
28
 
21
29
  If you are an AI agent reading this for your user, the prompt under
22
30
  [Evaluate it with your agent](#evaluate-it-with-your-agent) is the evaluation
@@ -28,10 +36,10 @@ don't install or copy anything on your own.
28
36
  1. **Core** (`rules/core.md`): the base every setup gets. Its first section is
29
37
  the end-of-reply check, so an agent that reads only the top of the file
30
38
  still knows when to keep working and when to stop and ask.
31
- 2. **Modifiers** (`rules/modifiers/`): opt-in preferences, such as coded
39
+ 2. **Optional rules**, called modifiers in the files (`rules/modifiers/`): opt-in preferences, such as coded
32
40
  option lists or squash-only landing. Each one replaces a core section or
33
41
  adds a section after one.
34
- 3. **Your layer** (by default `~/.config/house-rules/`): `house-rules.json`
42
+ 3. **Your own rules**, called your layer in the files (by default `~/.config/house-rules/`): `house-rules.json`
35
43
  names the modifiers you enable, `rules/` holds your own sections, and
36
44
  `skills/` holds your own skills. A skill there replaces the house-rules
37
45
  skill of the same name. The config's other keys are optional: `layers`
@@ -95,8 +103,9 @@ Updates preserve your existing config. An explicit `skills.include` list keeps
95
103
  later shipped additions off until selected. Browse the full catalog only when
96
104
  you want more choices.
97
105
 
98
- On a later run it keeps the previous skills directory under a dated name
99
- instead of deleting it. It never edits an agent host's files. The comment at
106
+ On a later run, if the composed skills changed, it keeps the previous skills
107
+ directory under a dated name instead of deleting it; if they match, it says so
108
+ and keeps nothing extra. It never edits an agent host's files. The comment at
100
109
  the top of `install.sh` lists the environment variables that change its paths
101
110
  or runtime; `install.ps1` takes the same variables. Some skill scripts need Bun
102
111
  even when Node.js composes the rules.
@@ -105,14 +114,16 @@ Then connect the composed file to your agent. Claude Code reads
105
114
  `@~/.config/house-rules/rules.md` on its own line in `~/.claude/CLAUDE.md`;
106
115
  other hosts take a copy in their user-level rules file, with the
107
116
  `house-rules-references/` directory placed beside it. Written rules link to the
108
- procedures in that directory; stdout and configuration previews keep them
109
- inline. See [reference output](docs/configuration.md#reference-output). To change modifiers or
117
+ procedures in that directory, which hold detail; an agent may act without opening
118
+ one, so each guard stays written in the rules themselves. Stdout and configuration
119
+ previews keep the procedures inline. See [reference output](docs/configuration.md#reference-output). To change modifiers or
110
120
  skills, change to the checkout directory and run `node compose.mjs setup`,
111
121
  or `bun compose.mjs setup` when Node.js is unavailable. Review the numbered
112
- choices and use `save` to change only the configuration. Then run the
113
- installer again.
122
+ choices and use `save` to change only the configuration. Setup then prints the
123
+ command that applies the selection: the installer for a checkout, or
124
+ `house-rules --config` for the npm package.
114
125
  The [configuration CLI guide](docs/configuration.md) covers status, previews,
115
- question preferences and safe writes. The
126
+ question preferences, optional panel preferences and safe writes. The
116
127
  `hr-house-rules-setup` skill preserves selections, offers relevant additions and connects
117
128
  hosts, and asks before it touches a host file.
118
129
 
@@ -161,13 +172,6 @@ and reconcile existing notice files before replacing them. A full
161
172
  skill, keep its entire directory, including any `NOTICE.md` and `LICENSE`.
162
173
  Personal layers must also carry notices required by their own sources.
163
174
 
164
- The `hr-navigation-retro` skill finds navigation failures in selected tool-call
165
- transcripts, then proposes fixes verified against current source. Any agent with
166
- file and shell access can run it. Supported inputs include Claude Code, Codex,
167
- OpenCode exports, Cursor CLI streams and ACP v1 recordings from other agents.
168
- See its [input limits](skills/hr-navigation-retro/references/inputs.md).
169
- It is explicit-only, requires Python 3.11+ and keeps reports local.
170
-
171
175
  ## Upgrading skill names
172
176
 
173
177
  All shipped skill names use `hr-`. Before updating an older installation,
@@ -191,9 +195,6 @@ repository's AGENTS.md or equivalent). Tell me:
191
195
  2. Which ones duplicate or conflict with what I already have.
192
196
  3. Whether to adopt it whole (compose.mjs plus my own layer) or copy single
193
197
  sections into my existing rules. Taking individual ideas is fine.
194
- If I run several agent sessions on one machine at once, also look at
195
- Swarmail (https://github.com/bompus/swarmail); house-rules has an opt-in
196
- modifier for it.
197
198
  Read only: don't install, compose or edit anything until I choose. When I
198
199
  adopt a section or idea, record its source in distributed notices, such as
199
200
  "Adapted from house-rules (https://github.com/bompus/house-rules)". Keep required
@@ -221,41 +222,58 @@ Use pnpm for JavaScript projects unless the repository uses another manager.
221
222
 
222
223
  The operations are `replaces:`, `after:`, `before:` and `removes:`; a
223
224
  `removes:` file has no body. A file without frontmatter is added at the end.
224
- Frontmatter may also hold `description:` and `requires:` (a comma-separated
225
- list of skills the section relies on); any other key is an error. Files apply
225
+ Frontmatter may also hold `description:`, `requires:` (a comma-separated
226
+ list of skills the section relies on; the core rules and any modifier that relies
227
+ on skills declare them, and composing warns when one is not in the composed
228
+ set) and `reference:` (a procedure file the section links to; see
229
+ [reference output](docs/configuration.md#reference-output)); any other key is an error. Files apply
226
230
  in name order, after the modifiers.
227
231
 
228
232
  ## Modifiers
229
233
 
230
- | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Modifier&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | What it does |
231
- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
232
- | `coded-offers` | Offers use numbered questions and coded options (`1A`, `1B`) so one short reply answers every decision. |
233
- | `effort-estimates` | Options that differ in cost, or work that waits on CI, a build or a deploy, carry a wall-clock estimate based on comparable finished work. Estimates from workers, docs or other models are converted the same way or dropped. |
234
- | `land-when-done` | Authorized repository work is not finished until it is in the remote default branch. |
235
- | `low-quota-handoff` | When the current model's usage allowance runs low, write a handoff before work stops. |
236
- | `multi-agent` | Work is split across delegated workers and several agent hosts; worker reports, review standards and cleanup checks account for all of them. |
237
- | `no-attribution` | Commits, pull requests and comments carry no agent or tool credit lines. |
238
- | `plan-files` | Multi-step work keeps a visible task list mirrored to a plan file with a ledger of every item's outcome. |
239
- | `question-cards` | Opt in to question cards beside complete text offers when the host supports them; availability and presentation can vary by host, provider and model. |
240
- | `release-batching` | Batch approved, compatible changes for releases and audit factual claims before releases or public announcements. |
241
- | `scratch-on-disk` | Task scratch lives on disk under the user data directory, never in RAM-backed `/tmp`. |
242
- | `shared-host-load` | Coordinate shared local work within host-defined resource budgets; isolate measurements and release reservations during remote waits. |
243
- | `solo-operator` | For repositories with one maintainer, the user's direction is the review; no review-gated steps. |
244
- | `squash-landing` | Pull requests land by squash merge after review-bot findings are handled, and the session's checkout moves off the landed branch. |
245
- | `swarmail` | Locate Swarmail-owned instructions and tool contracts for local session coordination. |
246
-
247
- Questions use text by default, with plain options or `coded-offers`. Text-only
248
- setups do not call question-card tools merely because a host exposes them.
249
- Enable `question-cards` only when you want cards too. Cards can be unavailable,
250
- skipped or shown unexpectedly across hosts, providers and models; the text
251
- offer remains usable on its own. `hr-house-rules-setup` asks which format you
252
- want and explains these limits before changing the configuration.
234
+ | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Modifier&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | What it does |
235
+ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
236
+ | `backlog-outline` | A backlog report adds a Markdown outline of every open item grouped by what it waits on; nothing is rendered, so it reads the same on every host. |
237
+ | `backlog-visual` | A backlog report adds one dark panel of every open item grouped by what it waits on, with a table for waiting items and one row per decision; hosts without a render tool get the same outline in Markdown. |
238
+ | `coded-offers` | Offers use numbered questions and coded options (`1A`, `1B`) so one short reply answers every decision. |
239
+ | `cross-session-relay` | Relayed work between sessions keeps its source and authorized scope, and an authorized push that changes inherited guidance or tooling is announced to the affected sessions. |
240
+ | `effort-estimates` | Options that differ in cost, or work that waits on CI, a build or a deploy, carry a wall-clock estimate based on comparable finished work. Estimates from workers, docs or other models are converted the same way or dropped. |
241
+ | `land-when-done` | Authorized repository work is not finished until it is in the remote default branch. |
242
+ | `low-quota-handoff` | When the current model's usage allowance runs low, write a handoff before work stops. |
243
+ | `model-default-questions` | Leave how questions are asked to your host and model, with no text-only or question-card instruction. |
244
+ | `multi-agent` | Work is split across delegated workers and several agent hosts; worker reports, review standards and cleanup checks account for all of them. |
245
+ | `no-attribution` | Commits, pull requests and comments carry no agent or tool credit lines unless the target repository asks for a disclosure. |
246
+ | `periodic-updates` | A job expected to run longer than about 10 minutes posts a short status update every 5 minutes by default, with progress, an ETA with its basis or "unmeasured", and findings so far, until the job ends; a watcher event that changes nothing gets at most one line. |
247
+ | `plan-files` | Multi-step work keeps a visible task list mirrored to a plan file with a ledger of every item's outcome. |
248
+ | `question-cards` | Opt in to question cards beside complete text offers when the host supports them; availability and presentation can vary by host, provider and model. |
249
+ | `release-batching` | Batch approved, compatible changes for releases and audit factual claims before releases or public announcements. |
250
+ | `scratch-on-disk` | Task scratch lives on disk under the user data directory, never in RAM-backed `/tmp`. |
251
+ | `shared-host-load` | On a shared machine, follow its resource budgets; without one, get operator direction before parallel workers or whole-repository commands, and use memory controls. |
252
+ | `solo-operator` | For repositories with one maintainer, the user's direction is the review; no review-gated steps. |
253
+ | `squash-landing` | Pull requests land by squash merge after review-bot findings are handled, and the session's checkout moves off the landed branch. |
254
+ | `upstream-contributions` | A measured optimization, fix or defect found in a third-party project is offered for submission to that project through its own contribution route. |
255
+ | `web-image-formats` | Prefer WebP for web raster images when it saves bytes at acceptable quality, with format exceptions and delivered-file checks. |
256
+
257
+ Questions use text only by default. Setup asks how you want questions asked:
258
+
259
+ - **Model default**: house-rules gives no instruction, so your model and host ask
260
+ their usual way (`model-default-questions`).
261
+ - **Text only**: plain text options, with or without short reply codes such as
262
+ `1A` (`coded-offers`). No question tools are called, even when the host
263
+ exposes them.
264
+ - **Clickable choices when available**: complete text options plus a
265
+ question card (`question-cards`). Cards can be unavailable, skipped or shown
266
+ unexpectedly across hosts, providers and models; the text offer remains usable
267
+ on its own.
268
+
269
+ `hr-house-rules-setup` asks which you want and explains these limits before
270
+ changing the configuration.
253
271
 
254
272
  ## Skills
255
273
 
256
274
  | Skill | Use it to |
257
275
  | --------------------------- | --------------------------------------------------------------------------------------------------------- |
258
- | `hr-agent-guidance-audit` | Audit a repository's agent guidance for stale, duplicated or conflicting rules. |
276
+ | `hr-agent-guidance-audit` | Audit agent guidance for stale or conflicting rules, and decide what to retire or merge. |
259
277
  | `hr-agent-guidance-refresh` | Re-read guidance that changed since the session started. |
260
278
  | `hr-api-exposure-check` | Keep API responses to the fields a consumer reads and the caller may see. |
261
279
  | `hr-audit-choices` | List and check the decisions made while implementing a task. |
@@ -265,50 +283,71 @@ want and explains these limits before changing the configuration.
265
283
  | `hr-better-layout` | Build and review grouping, alignment, spacing, responsive layout and clipping. |
266
284
  | `hr-better-typography` | Style and review type scales, wrapping, spacing, truncation and font loading. |
267
285
  | `hr-better-writing` | Write and review interface labels, errors, empty states and product terminology. |
268
- | `hr-change-impact` | Check what a change can break beyond its diff before merging. |
269
- | `hr-code-review` | Review a diff against the repository's standards and the originating request. |
270
- | `hr-design-exploration` | Compare four visual directions and refine the selected two toward one final design. |
286
+ | `hr-code-review` | Review a diff against standards and the request, and check what it can break beyond its lines. |
287
+ | `hr-design-exploration` | Compare visual directions, or variants of one component, and refine toward one design. |
271
288
  | `hr-diagnosing-bugs` | Work a hard bug or regression to a confirmed cause. |
272
289
  | `hr-explain-code` | Trace how existing code works, read-only, before changing it. |
273
290
  | `hr-extract-shared-steps` | Move operations repeated across workflows into shared functions. |
291
+ | `hr-forgotten-work-audit` | Audit past sessions, plans and handoffs for promised work that dropped off every list. |
274
292
  | `hr-handoff` | Write a handoff a fresh session can resume from. |
275
293
  | `hr-house-rules-setup` | Choose modifiers, create your layer and connect your hosts. |
276
294
  | `hr-issue-tracker-setup` | Configure project tracker, domain-term and ADR conventions; explicit-only. |
277
295
  | `hr-lean-plan` | Write or tighten an implementation plan with the fewest moving parts. |
278
- | `hr-maintainability-review` | Review a diff or entire codebase strictly for structure and maintainability. |
296
+ | `hr-maintainability-review` | Review a diff or entire codebase strictly for structure, over-engineering and leftover scaffolding. |
279
297
  | `hr-manual-qa` | Give reproducible human checks after reporting agent verification results. |
280
298
  | `hr-navigation-retro` | Audit navigation failures in selected transcripts and propose verified findability fixes; explicit-only. |
281
299
  | `hr-ordering-tests` | Enumerate event orderings through the real code to find race bugs. |
282
300
  | `hr-plain-prose` | Make text people read plain and specific. |
283
301
  | `hr-progress-report` | Report current task activity, milestone completion and remaining wall-clock time. |
284
- | `hr-pr-followup` | Address conflicts, feedback and failing checks for a requested PR; honor existing landing authority. |
302
+ | `hr-pr-followup` | Address conflicts, feedback and failing checks for a PR; landing authority; CodeRabbit and cubic gate. |
285
303
  | `hr-read-reddit` | Read Reddit feed output while supported; RSS support ends November 13, 2026. Partial web-search fallback. |
286
304
  | `hr-read-x-links` | Read the full content of X posts. |
305
+ | `hr-research-shared-links` | Research a shared link or repository in depth, compare it with your setup and rate each idea. |
287
306
  | `hr-split-to-prs` | Divide work into coherent PRs while preserving recovery points and verifying each slice. |
307
+ | `hr-sqlite` | Check settings, locking, queries and copies in SQLite code against measured findings. |
288
308
  | `hr-stock-ui-audit` | Find and triage template-default styling in frontend code. |
289
309
  | `hr-tdd` | Implement requested test-first work through one red-green slice at a time; simplify during review. |
290
310
  | `hr-test-audit` | Decide which new tests are worth keeping and which old ones to prune. |
311
+ | `hr-usage-report` | Measure where agent usage went by provider, model and role, and chart model comparisons. |
291
312
  | `hr-what-next` | Reconcile remaining session work and recommend priorities when asked what comes next. |
292
313
  | `hr-writing-for-agents` | Write skills, rules and other documents agents read. |
293
314
  | `hr-writing-pr` | Write a pull request title and body from the final diff. |
294
315
 
316
+ The `hr-navigation-retro` skill finds navigation failures in selected tool-call
317
+ transcripts, then proposes fixes verified against current source. Any agent with
318
+ file and shell access can run it. Supported inputs include Claude Code, Codex,
319
+ OpenCode exports, Cursor CLI streams and ACP v1 recordings from other agents.
320
+ See its [input limits](skills/hr-navigation-retro/references/inputs.md).
321
+ It is explicit-only, requires Python 3.11+ and keeps reports local.
322
+
295
323
  ## Checking the rules against your models
296
324
 
297
- `evals/end-of-reply/` runs short scenarios through any model CLI and grades
325
+ `evals/end-of-reply/` (in the GitHub repository, not the npm package) runs short scenarios through any model CLI. It grades
298
326
  whether the agent keeps working or ends with an offer at the right time,
299
- including when it reads only the first 80 lines. In a 2026-10-04 run of the
300
- three original scenarios against v0.5.7 on seven models, the rules passed 62 of
301
- 63 replies, against 26 for a one-sentence instruction and 21 with no rules; its
302
- README has the breakdown and limits.
327
+ including when it reads only the first 80 lines. A 2026-10-11 replay covered
328
+ its 18 scenarios, two runs each, on Claude Code 2.1.296 only, at revision
329
+ `efd4d7b`; `rules/core.md` has changed since. The rules scored
330
+ 22 of 36 replies with Opus 5.5 and 27 of 36 with Sonnet 5.5. A one-sentence
331
+ instruction scored 18 and 16, and no rules scored 17 and 16. The gains cluster
332
+ in follow-ups, parked findings, stacked offers and spin-offs, where the
333
+ controls scored 0. Two runs per scenario is a small sample, so read the counts,
334
+ not a percentage. No other agent was measured. The eval's README has the
335
+ breakdown and limits.
303
336
 
304
337
  ## Development
305
338
 
306
339
  ```bash
307
- node --test test/*.test.mjs # composer and eval grader (or: bun test test/)
308
- bun test skills/ # skill scripts
309
- npx oxlint . && npx oxfmt --check .
340
+ node --test test/*.test.mjs # composer and eval grader
341
+ bun test test/ # the same under Bun
342
+ bun test skills/ # skill scripts
343
+ npm run check:package -- --bun # npm tarball: packs, installs, runs the CLI
344
+ npx --yes oxlint@1.85.0 . && npx --yes oxfmt@0.70.0 --check .
310
345
  ```
311
346
 
347
+ These versions match the pins in `.github/workflows/check.yml`; an unpinned `npx`
348
+ fetches the latest release, whose formatting can differ from CI's. Change both
349
+ together.
350
+
312
351
  Oxfmt checks authored Markdown, HTML, JSON, JSONC, YAML, TOML and CSS as well
313
352
  as JavaScript and TypeScript. Test fixtures stay excluded because scanner
314
353
  tests depend on their exact text and line numbers. Package fields and
@@ -319,7 +358,7 @@ Set `HOUSE_RULES_TEST_TMP` to an existing directory to choose their scratch root
319
358
  otherwise they use the operating system temporary directory. Choose a disk-backed
320
359
  location when the system temporary directory is RAM-backed.
321
360
 
322
- CI runs the same checks on every push and pull request. See
361
+ CI runs these checks on every pull request and on pushes to `main`, and also runs the tests and the tarball check on Windows. See
323
362
  [CONTRIBUTING.md](CONTRIBUTING.md) before opening one.
324
363
 
325
364
  The local-reference gate runs in `test/guidance-links.test.mjs`. Audit another
package/compose.mjs CHANGED
@@ -51,7 +51,13 @@ function main(argv) {
51
51
  return;
52
52
  }
53
53
  const configPath = configurationPath(values.config);
54
- const config = JSON.parse(readFileSync(configPath, "utf8").replace(/^\uFEFF/, ""));
54
+ let config;
55
+ try {
56
+ config = JSON.parse(readFileSync(configPath, "utf8").replace(/^\uFEFF/, ""));
57
+ } catch (error) {
58
+ if (!(error instanceof SyntaxError)) throw error;
59
+ throw new Error(`${configPath} is not valid JSON (${error.message}); fix it or move it aside`);
60
+ }
55
61
  const { out, "skills-out": skillsOut, "references-out": explicitReferences } = values;
56
62
  if (explicitReferences && !out) throw new Error("--references-out requires --out");
57
63
  const referencesOut = out
@@ -102,7 +108,7 @@ function main(argv) {
102
108
  for (const f of NOTICES) cpSync(join(BASE, f), join(skillsOut, f));
103
109
  }
104
110
  console.error(
105
- `composed ${fragments.length} fragment(s), ${rules.split("\n").length} lines${skillsOut ? `, ${skills.size} skill(s)` : ""}`,
111
+ `composed ${rules.split("\n").length} lines of rules from ${fragments.length} optional or personal rule file(s)${skillsOut ? ` and ${skills.size} skill(s)` : ""}`,
106
112
  );
107
113
  }
108
114
 
package/composition.mjs CHANGED
@@ -14,6 +14,10 @@ const KEYS = [...OPS, "description", "requires", "reference"];
14
14
  // Windows line endings and a byte-order mark would otherwise hide frontmatter and headings.
15
15
  const normalize = (text) => text.replace(/^\uFEFF/, "").replace(/\r\n?/g, "\n");
16
16
 
17
+ // A YAML value may be wrapped in one pair of matching quotes; the text inside is the value.
18
+ const unquote = (value) =>
19
+ value.length > 1 && /^(["']).*\1$/.test(value) ? value.slice(1, -1) : value;
20
+
17
21
  // Minimal frontmatter: `key: value` lines between `---` fences.
18
22
  export function parseFragment(rawText, source) {
19
23
  const text = normalize(rawText);
@@ -22,7 +26,7 @@ export function parseFragment(rawText, source) {
22
26
  if (m) {
23
27
  for (const line of m[1].split("\n")) {
24
28
  const i = line.indexOf(":");
25
- if (i > 0) meta[line.slice(0, i).trim()] = line.slice(i + 1).trim();
29
+ if (i > 0) meta[line.slice(0, i).trim()] = unquote(line.slice(i + 1).trim());
26
30
  }
27
31
  }
28
32
  return { meta, body: (m ? text.slice(m[0].length) : text).trim(), source };
@@ -182,7 +186,10 @@ const layersOf = (config) => config.layers ?? ["."];
182
186
  function loadRawFragments(config, configDir) {
183
187
  const fragments = (config.modifiers ?? []).map((name) => {
184
188
  const path = join(BASE, "rules/modifiers", `${name}.md`);
185
- if (!existsSync(path)) throw new Error(`unknown modifier "${name}" (see --list)`);
189
+ if (!existsSync(path))
190
+ throw new Error(
191
+ `unknown modifier "${name}"; remove it from "modifiers" in the configuration file ("node compose.mjs --list" in the checkout, or "house-rules --list", shows the available names)`,
192
+ );
186
193
  return { ...parseFragment(readFileSync(path, "utf8"), `modifier ${name}`), path, root: BASE };
187
194
  });
188
195
  for (const layer of layersOf(config)) {
@@ -340,7 +347,8 @@ export function composeConfiguration(config, configDir, { referencesDirectory }
340
347
  const references = new Map([...candidates].map(([name, value]) => [name, value.text]));
341
348
  const skills = skillSources(config, configDir);
342
349
  const warnings = [];
343
- for (const f of fragments) {
350
+ const core = parseFragment(readFileSync(join(BASE, "rules/core.md"), "utf8"), "rules/core.md");
351
+ for (const f of [core, ...fragments]) {
344
352
  for (const need of (f.meta.requires ?? "")
345
353
  .split(",")
346
354
  .map((s) => s.trim())
package/config-view.mjs CHANGED
@@ -74,13 +74,16 @@ export function renderHelp() {
74
74
  " Selection",
75
75
  " --enable-modifier <name> --disable-modifier <name>",
76
76
  " --enable-skill <name> --disable-skill <name>",
77
- " --questions plain|coded|cards",
77
+ " --questions default|plain|coded|cards",
78
+ " --panel-file <json> Replace portable panel preferences (preview/set)",
79
+ " --expect-panel <revision> Require reviewed panel input when applying",
78
80
  "",
79
81
  " Output",
80
82
  " --config <path> --json --rules (preview only)",
81
83
  "",
82
84
  " Repeat toggle flags to change several selections together.",
83
85
  " Saving config does not regenerate output or connect agent hosts.",
86
+ " Panel preferences do not discover providers, enable a skill or run models.",
84
87
  "",
85
88
  ].join("\n");
86
89
  }
@@ -124,12 +127,24 @@ export function renderConfig(report) {
124
127
  }
125
128
  if (!removed.length && !added.length) detail("Selection order changed.");
126
129
  }
130
+ if (report.panel) {
131
+ section(report.panel.changed ? "Panel section replacement" : "Panel section unchanged");
132
+ detail(`Panel input revision ${report.panel.revision}`);
133
+ detail("Before");
134
+ for (const line of JSON.stringify(report.panel.before, null, 2).split("\n")) detail(line);
135
+ detail("After");
136
+ for (const line of JSON.stringify(report.panel.after, null, 2).split("\n")) detail(line);
137
+ detail(
138
+ `Preferences ${report.applied ? "configured" : "proposed"} only. Route access, effort and permissions are unverified.`,
139
+ );
140
+ }
127
141
  lines.push("");
128
142
  if (!report.applied) {
143
+ const panelGuard = report.panel ? ` --expect-panel ${report.panel.revision}` : "";
129
144
  detail(
130
145
  report.command === "set"
131
- ? `To save, repeat with --apply --expect ${report.revision}`
132
- : `To save, run config set with the same selection flags plus --apply --expect ${report.revision}`,
146
+ ? `To save, repeat with --apply --expect ${report.revision}${panelGuard}`
147
+ : `To save, run config set with the same selection flags plus --apply --expect ${report.revision}${panelGuard}`,
133
148
  );
134
149
  detail("Review personal rule overrides below before choosing a question format.");
135
150
  } else