@azure-id/orc 1.7.0 → 1.7.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/CHANGELOG.md CHANGED
@@ -10,6 +10,48 @@ Format: `### v<version> — <title> _(<date>)_`.
10
10
 
11
11
  ---
12
12
 
13
+ ### v1.7.1 - the rules card now reaches the agent _(2026-09-14)_
14
+
15
+ **Still on the unscoped `orc` package?** Do this once first - your `orc upgrade`
16
+ is the pre-v0.56.0 one and cannot install itself. Full detail in the CAUTION at
17
+ the top of this file.
18
+
19
+ - **Step 1 - release the command from the old package:** `npm uninstall -g orc`
20
+ - **Step 2 - install the current package:** `npm i -g @azure-id/orc`
21
+ - **Step 3 - re-apply it to your project:** `orc update`
22
+
23
+ **Do not use `npm i -g -f`.** Full detail in v0.56.0 below.
24
+
25
+ In v1.7.0, subagents and the preflight showed the house rules only. Your project
26
+ rules and the ORC rules did not reach the agent.
27
+
28
+ **The cause.** `orc rules slice` built the card correctly. But each place that
29
+ builds an executor slice named only the `house_rules` card: the `/orc` Phase 3
30
+ dispatch step, `/orc-mini`, `/orc-fast`, `/orc-quick`, the Extra foreign
31
+ dispatch, and the executor contract. `/orc` Phase 3 also did not load
32
+ `rules.md`, and the `/orc` preflight template had no `rules:` row.
33
+
34
+ **The fix.**
35
+
36
+ - **A new slice field, `rules_card`.** It is the `text` of
37
+ `orc rules slice --lane <lane> --json`, put in verbatim directly under
38
+ `house_rules`. A front-end task adds `--pack ui`.
39
+ - **The executors read it.** They obey it after the house rules, and return
40
+ `rules_applied[]`, `rules_conflicts[]` and `rules_overridden[]`.
41
+ - **The `/orc` preflight prints `rules:`** - the CLI `line`, verbatim.
42
+ - **`rules.md` now says it clearly:** the `line` is the report, the `text` is
43
+ the card. Printing the line is not the same as sending the card.
44
+ - **Guards.** `rules_card` is a registered contract token, and a new test
45
+ checks that every dispatch site carries both cards.
46
+
47
+ **How to check it.** Run `orc rules slice --lane orc --json`. When
48
+ `.claude/orc/rules.md` has rules, `line` shows `yours N lines` and `text` starts
49
+ with `YOUR PROJECT'S RULES`. In a run, look for the `rules:` preflight row and
50
+ the three `rules_*` fields in each executor return. Run `orc update` in your
51
+ project to get the fixed skills.
52
+
53
+ ---
54
+
13
55
  ### v1.7.0 - the rules that keep the slop out _(2026-09-13)_
14
56
 
15
57
  **Still on the unscoped `orc` package?** Do this once first - your `orc upgrade`
package/README.md CHANGED
@@ -7,14 +7,14 @@
7
7
  *Intake → analyze → plan → score → parallel subagents → review → verify → ship.*
8
8
 
9
9
  ![npm](https://img.shields.io/npm/v/%40azure-id%2Forc?style=for-the-badge&color=cb3837&logo=npm)
10
- ![Version](https://img.shields.io/badge/version-1.7.0-blue.svg?style=for-the-badge)
10
+ ![Version](https://img.shields.io/badge/version-1.7.1-blue.svg?style=for-the-badge)
11
11
  ![License](https://img.shields.io/badge/license-MIT-green.svg?style=for-the-badge)
12
12
  ![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg?style=for-the-badge)
13
13
  ![Claude Code](https://img.shields.io/badge/Claude_Code-Skills-purple.svg?style=for-the-badge)
14
14
  ![Dependencies](https://img.shields.io/badge/dependencies-zero-lightgrey.svg?style=for-the-badge)
15
15
  ![GitHub stars](https://img.shields.io/github/stars/azure-id/orc?style=for-the-badge&color=yellow)
16
16
 
17
- **Latest: v1.7.0** · updated 2026-09-13 · [full changelog](CHANGELOG.md)
17
+ **Latest: v1.7.1** · updated 2026-09-14 · [full changelog](CHANGELOG.md)
18
18
 
19
19
  **On npm: [`@azure-id/orc`](https://www.npmjs.com/package/@azure-id/orc)** — `npm i -g @azure-id/orc`
20
20
 
@@ -630,108 +630,36 @@ a current audit: [EVAL-REPORT.md](EVAL-REPORT.md).
630
630
  **Full history: [CHANGELOG.md](CHANGELOG.md)** — or `orc changelog`, which prints
631
631
  only what is newer than the version you have.
632
632
 
633
- ### v1.7.0 - the rules that keep the slop out _(2026-09-13)_
633
+ ### v1.7.1 - the rules card now reaches the agent _(2026-09-14)_
634
634
 
635
- ORC writes a lot of prose and a lot of code, and both came out carrying the same
636
- recognisable defaults: sentences that say nothing in a confident shape, and code
637
- that is longer, more defensive and more abstract than the task asked for. There
638
- was one standing card against it - the seven-line house rules - and it is about
639
- CODE. Nothing said anything about the words.
640
-
641
- **`orc rules` is a second rule surface, and it has two halves that never mix.**
642
-
643
- - **ORC rules** - 65 rules in four packs, shipped, tagged, **read-only**. They
644
- change with `orc update` and with nothing else. `orc rules set --pack ...` is
645
- refused BY NAME, with the command that replaces it.
646
- - **Your rules** - `.claude/orc/rules.md`. Plain text, three headings, as much
647
- under each as you want. **They beat an ORC rule outright.**
648
-
649
- The packs: **`OSW` writing (23)**, **`OSC` code (22)**, **`OSD` delivery (10)** -
650
- what an agent reports about its OWN work - and **`OSU` UI (10)**, which rides per
651
- TASK rather than per lane, because a UI rule in a backend slice is tokens paid on
652
- every spawn for a rule that cannot apply.
653
-
654
- Three tiers, taken from `anti-slop`: **HARD** absolute, **PURPOSE** allowed with
655
- a written one-line reason, **LOCK** a consistency check. The purpose gate is the
656
- mechanism that matters - a ban list alone leaves a void, and a model fills a void
657
- with its most generic output.
658
-
659
- **Credit is a shipped artifact here, not a line in a commit message.** Every pack
660
- opens with its sources; `orc rules credits` prints author, handle, repository,
661
- licence, and what ORC took from each. Adapted from
662
- [`petergyang/no-ai-slop`](https://github.com/petergyang/no-ai-slop) (MIT),
663
- [`miqdadbadjuber/anti-slop`](https://github.com/miqdadbadjuber/anti-slop) (MIT),
664
- [`ehmo/slopkit`](https://github.com/ehmo/slopkit),
665
- [`BioInfo/slopless`](https://github.com/BioInfo/slopless), Andrej Karpathy's
666
- `CLAUDE.md`, Matty Cartwright's Anti-Slop Writing Rules, and three papers on LLM
667
- code smells.
635
+ In v1.7.0, subagents and the preflight showed the house rules only. Your project
636
+ rules and the ORC rules did not reach the agent.
668
637
 
669
- **Precedence: house rules > your rules > ORC rules.** The house card is CODE and
670
- BEHAVIOUR only - it says nothing about the words an agent writes, so it never
671
- overrules a writing rule. A project rule beats an ORC rule OUTRIGHT: the rule is
672
- removed from the slice and the removal is stated inside it.
673
-
674
- **An override is counted the only honest way.** The CLI counts ORC rule ids you
675
- NAMED, and says that is what it counted. A conflict you did not name is found by
676
- the agent at dispatch and comes back as `rules_conflicts[]` - a gap, never a
677
- silent choice. The CLI cannot parse intent, so it does not pretend to: the same
678
- decision `orc doc rules` made about its structural boundary, for the same reason.
679
-
680
- **`orc rules lint` is free, deterministic, and small on purpose.** It checks 13
681
- of the 65 - banned lexicon and phrases, em dash DENSITY (a dose rule, measured
682
- per file, because ORC's own docs use them), emoji headings, six comment shapes,
683
- artifact filenames, `outline: none`, UI buzzwords - and it prints, in every mode
684
- including `--json`: `not checked here: 52 rules. They need a reader, not a
685
- matcher.` A clean exit that stands in for a review nobody did is the failure that
686
- line prevents. It skips the rule packs themselves (a rule that bans a word has to
687
- print that word to define it) and anything marked `orc-rules-ignore`, and counts
688
- both rather than staying quiet.
689
-
690
- **Findings are advisory. There is no gate.** A style preference that fails a
691
- build gets switched off within a week, and then nothing is enforced at all.
692
-
693
- The card rides in every slice of **28 lanes** - every one that writes words or
694
- code. **`/orc-doc` is excluded by design**; it has `orc doc rules`. One assembler
695
- (`orc rules slice`), because a card built in twenty-eight spines is
696
- twenty-eight ideas of the precedence order, and because it is the only place the
697
- per-spawn token weight can be measured. Measured: **~3 600 tokens** per
698
- build-lane slice, ~2 200 for a prose lane.
699
-
700
- **`orc ui` gains a Rules panel** - the ladder, your textarea, the 65 read-only
701
- rows behind a filter, the credit table, and the lint.
638
+ **The cause.** `orc rules slice` built the card correctly, but each place that
639
+ builds an executor slice named only the `house_rules` card. `/orc` Phase 3 also
640
+ did not load `rules.md`, and the `/orc` preflight had no `rules:` row.
702
641
 
703
- ---
642
+ **The fix.**
643
+
644
+ - **A new slice field, `rules_card`** - the `text` of
645
+ `orc rules slice --lane <lane> --json`, put in verbatim directly under
646
+ `house_rules` in `/orc`, `/orc-mini`, `/orc-fast`, `/orc-quick` and the
647
+ Extra foreign dispatch.
648
+ - **The executors read it** and return `rules_applied[]`, `rules_conflicts[]`
649
+ and `rules_overridden[]`.
650
+ - **The `/orc` preflight prints `rules:`** - the CLI `line`, verbatim.
651
+ - **Guards** - `rules_card` is a registered contract token, and a test checks
652
+ every dispatch site.
704
653
 
705
- **`orc wiki`, one doc at a time.** Targeted refresh has existed since v0.33.0 and
706
- is not rebuilt. What was missing is the other half: **adding one topic** to a
707
- wiki that already exists. Until now a new coverage area only appeared as a
708
- by-product of the coverage-gap sweep during a delta refresh, so "add the
709
- remittance feature" had no path that did not re-plan every area in the repo.
710
-
711
- - **`/orc-wiki update <doc-or-topic>`** - the targeted refresh, under the name
712
- people actually type. A topic resolves to a doc first.
713
- - **`/orc-wiki add "<topic>"`** - A0-A7: resolve, scope, confirm, reserve, scan,
714
- write, sweep, check. Nothing spawns before the one confirmation turn.
715
- - **`orc wiki resolve <topic>`** - free, no scan. A MATCH must beat the runner-up
716
- by half again plus one; anything closer is **AMBIGUOUS and becomes a question**,
717
- because two docs a point apart is exactly where guessing costs a scan of the
718
- wrong area.
719
- - **`orc wiki add <slug> --covers ...`** - reserves a stub carrying
720
- `status: reserved` and a body that says nothing in it is evidence. A doc that
721
- lies is worse than a doc that is missing.
722
- - **`orc wiki refs [--check]`** - the DERIVED-REFERENCE sweep. After one doc
723
- changes, six surfaces are behind it: the registration, reserved rows, the
724
- orientation page, the architecture overview, the CLAUDE.md pointer's doc COUNT,
725
- and any crosslink tag anchored to a file that is gone. It **repairs only the
726
- registration**, because `orc wiki sync` is free and already the single writer.
727
- Everything else is reported with its command - a sweep that silently
728
- regenerated prose would be spending money nobody asked it to spend.
729
-
730
- The Knowledge panel gains a **One doc at a time** card for both halves.
654
+ **How to check it.** Run `orc rules slice --lane orc --json`. When
655
+ `.claude/orc/rules.md` has rules, `line` shows `yours N lines` and `text`
656
+ starts with `YOUR PROJECT'S RULES`. Run `orc update` in your project to get the
657
+ fixed skills.
731
658
 
732
659
  <details>
733
- <summary><strong>Earlier releases</strong> — 114 of them, titles only. Full text in <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
660
+ <summary><strong>Earlier releases</strong> — 115 of them, titles only. Full text in <a href="CHANGELOG.md">CHANGELOG.md</a>.</summary>
734
661
 
662
+ - **v1.7.0** — the rules that keep the slop out · _2026-09-13_
735
663
  - **v1.6.0** — the rule that can finally say no · _2026-09-07_
736
664
  - **v1.5.0** — the lane that runs the test · _2026-09-07_
737
665
  - **v1.4.2** — the panel that stops reloading, and the fields you could not read back · _2026-09-05_
@@ -162,6 +162,32 @@ const CONTRACTS = [
162
162
  "skills/orc/subskills/orc-execution/core.md",
163
163
  ],
164
164
  },
165
+ {
166
+ name: "rules_card slice field (v1.7.1 — the anti-slop card rides every dispatch slice, not only the preflight line)",
167
+ token: "rules_card",
168
+ files: [
169
+ "agents/orc-executor-haiku-4-5.md",
170
+ "agents/orc-executor-opus-4-7-high.md",
171
+ "agents/orc-executor-opus-4-7-med.md",
172
+ "agents/orc-executor-opus-4-8-high.md",
173
+ "agents/orc-executor-opus-5-high.md",
174
+ "agents/orc-executor-opus-5-low.md",
175
+ "agents/orc-executor-opus-5-med.md",
176
+ "agents/orc-executor-sonnet-4-6-high.md",
177
+ "agents/orc-executor-sonnet-4-6-med.md",
178
+ "agents/orc-executor-sonnet-5-high.md",
179
+ "skills/_shared/extra-dispatch.md",
180
+ "skills/_shared/phases/execution.md",
181
+ "skills/_shared/phases/rules.md",
182
+ "skills/orc/SKILL.md",
183
+ "skills/orc/references/preflight-report.md",
184
+ "skills/orc/subskills/orc-execution/SKILL.md",
185
+ "skills/orc/subskills/orc-execution/core.md",
186
+ "skills/orc-fast/SKILL.md",
187
+ "skills/orc-mini/SKILL.md",
188
+ "skills/orc-quick/SKILL.md",
189
+ ],
190
+ },
165
191
  {
166
192
  name: "validation_gate[] flow (codify -> slice -> review -> verify)",
167
193
  token: "validation_gate",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@azure-id/orc",
3
- "version": "1.7.0",
3
+ "version": "1.7.1",
4
4
  "description": "ORC — an orchestrator skill constellation for Claude Code: intake, planning, scored parallel subagents, code-pattern matching, review, verify, ship, plus a project knowledge-base wiki.",
5
5
  "bin": {
6
6
  "orc": "bin/cli.js"
@@ -25,6 +25,9 @@ never spawn other agents, never work outside your task slice.
25
25
  - house_rules — standing behavioral card (injected literally): surgical changes
26
26
  only, simplicity-first, no unrequested scope, boring-solution preference,
27
27
  never claim unobserved results, honest partial over false done
28
+ - rules_card — the anti-slop card (injected literally, directly under
29
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
30
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
28
31
  - log_digest — decisions from earlier waves; absorb before starting
29
32
  - pattern — resolved code-pattern for your task's language, or null. Present =
30
33
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -53,7 +56,8 @@ never spawn other agents, never work outside your task slice.
53
56
  is a corruption bug), and build/test output is always read whole. Canonical:
54
57
  `.claude/skills/_shared/read-ladder.md`.
55
58
  3. Implement the task within declared_files only. Obey every house_rules
56
- line. Follow every constraint. If
59
+ line, then every rules_card rule — two rules that disagree go in
60
+ rules_conflicts[], never a silent choice. Follow every constraint. If
57
61
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
58
62
  AND every enforceable validation_gate line (re-check your diff before
59
63
  returning; advisory gate lines never require new tooling). Create/update
@@ -108,6 +112,10 @@ never spawn other agents, never work outside your task slice.
108
112
  malformed. NOT required when you never repaired anything, and a loop that hit
109
113
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
110
114
  You RETURN it; the orchestrator writes the file. Never write it yourself.
115
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
116
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
117
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
118
+ replaced. Omit all three when no rules_card was supplied.
111
119
 
112
120
  Malformed returns = failure — including status=done with a runner present but
113
121
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -26,6 +26,9 @@ never spawn other agents, never work outside your task slice.
26
26
  - house_rules — standing behavioral card (injected literally): surgical changes
27
27
  only, simplicity-first, no unrequested scope, boring-solution preference,
28
28
  never claim unobserved results, honest partial over false done
29
+ - rules_card — the anti-slop card (injected literally, directly under
30
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
31
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
29
32
  - log_digest — decisions from earlier waves; absorb before starting
30
33
  - pattern — resolved code-pattern for your task's language, or null. Present =
31
34
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -54,7 +57,8 @@ never spawn other agents, never work outside your task slice.
54
57
  is a corruption bug), and build/test output is always read whole. Canonical:
55
58
  `.claude/skills/_shared/read-ladder.md`.
56
59
  3. Implement the task within declared_files only. Obey every house_rules
57
- line. Follow every constraint. If
60
+ line, then every rules_card rule — two rules that disagree go in
61
+ rules_conflicts[], never a silent choice. Follow every constraint. If
58
62
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
59
63
  AND every enforceable validation_gate line (re-check your diff before
60
64
  returning; advisory gate lines never require new tooling). Create/update
@@ -109,6 +113,10 @@ never spawn other agents, never work outside your task slice.
109
113
  malformed. NOT required when you never repaired anything, and a loop that hit
110
114
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
111
115
  You RETURN it; the orchestrator writes the file. Never write it yourself.
116
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
117
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
118
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
119
+ replaced. Omit all three when no rules_card was supplied.
112
120
 
113
121
  Malformed returns = failure — including status=done with a runner present but
114
122
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -26,6 +26,9 @@ never spawn other agents, never work outside your task slice.
26
26
  - house_rules — standing behavioral card (injected literally): surgical changes
27
27
  only, simplicity-first, no unrequested scope, boring-solution preference,
28
28
  never claim unobserved results, honest partial over false done
29
+ - rules_card — the anti-slop card (injected literally, directly under
30
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
31
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
29
32
  - log_digest — decisions from earlier waves; absorb before starting
30
33
  - pattern — resolved code-pattern for your task's language, or null. Present =
31
34
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -54,7 +57,8 @@ never spawn other agents, never work outside your task slice.
54
57
  is a corruption bug), and build/test output is always read whole. Canonical:
55
58
  `.claude/skills/_shared/read-ladder.md`.
56
59
  3. Implement the task within declared_files only. Obey every house_rules
57
- line. Follow every constraint. If
60
+ line, then every rules_card rule — two rules that disagree go in
61
+ rules_conflicts[], never a silent choice. Follow every constraint. If
58
62
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
59
63
  AND every enforceable validation_gate line (re-check your diff before
60
64
  returning; advisory gate lines never require new tooling). Create/update
@@ -109,6 +113,10 @@ never spawn other agents, never work outside your task slice.
109
113
  malformed. NOT required when you never repaired anything, and a loop that hit
110
114
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
111
115
  You RETURN it; the orchestrator writes the file. Never write it yourself.
116
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
117
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
118
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
119
+ replaced. Omit all three when no rules_card was supplied.
112
120
 
113
121
  Malformed returns = failure — including status=done with a runner present but
114
122
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -26,6 +26,9 @@ never spawn other agents, never work outside your task slice.
26
26
  - house_rules — standing behavioral card (injected literally): surgical changes
27
27
  only, simplicity-first, no unrequested scope, boring-solution preference,
28
28
  never claim unobserved results, honest partial over false done
29
+ - rules_card — the anti-slop card (injected literally, directly under
30
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
31
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
29
32
  - log_digest — decisions from earlier waves; absorb before starting
30
33
  - pattern — resolved code-pattern for your task's language, or null. Present =
31
34
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -54,7 +57,8 @@ never spawn other agents, never work outside your task slice.
54
57
  is a corruption bug), and build/test output is always read whole. Canonical:
55
58
  `.claude/skills/_shared/read-ladder.md`.
56
59
  3. Implement the task within declared_files only. Obey every house_rules
57
- line. Follow every constraint. If
60
+ line, then every rules_card rule — two rules that disagree go in
61
+ rules_conflicts[], never a silent choice. Follow every constraint. If
58
62
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
59
63
  AND every enforceable validation_gate line (re-check your diff before
60
64
  returning; advisory gate lines never require new tooling). Create/update
@@ -109,6 +113,10 @@ never spawn other agents, never work outside your task slice.
109
113
  malformed. NOT required when you never repaired anything, and a loop that hit
110
114
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
111
115
  You RETURN it; the orchestrator writes the file. Never write it yourself.
116
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
117
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
118
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
119
+ replaced. Omit all three when no rules_card was supplied.
112
120
 
113
121
  Malformed returns = failure — including status=done with a runner present but
114
122
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -26,6 +26,9 @@ never spawn other agents, never work outside your task slice.
26
26
  - house_rules — standing behavioral card (injected literally): surgical changes
27
27
  only, simplicity-first, no unrequested scope, boring-solution preference,
28
28
  never claim unobserved results, honest partial over false done
29
+ - rules_card — the anti-slop card (injected literally, directly under
30
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
31
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
29
32
  - log_digest — decisions from earlier waves; absorb before starting
30
33
  - pattern — resolved code-pattern for your task's language, or null. Present =
31
34
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -54,7 +57,8 @@ never spawn other agents, never work outside your task slice.
54
57
  is a corruption bug), and build/test output is always read whole. Canonical:
55
58
  `.claude/skills/_shared/read-ladder.md`.
56
59
  3. Implement the task within declared_files only. Obey every house_rules
57
- line. Follow every constraint. If
60
+ line, then every rules_card rule — two rules that disagree go in
61
+ rules_conflicts[], never a silent choice. Follow every constraint. If
58
62
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
59
63
  AND every enforceable validation_gate line (re-check your diff before
60
64
  returning; advisory gate lines never require new tooling). Create/update
@@ -109,6 +113,10 @@ never spawn other agents, never work outside your task slice.
109
113
  malformed. NOT required when you never repaired anything, and a loop that hit
110
114
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
111
115
  You RETURN it; the orchestrator writes the file. Never write it yourself.
116
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
117
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
118
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
119
+ replaced. Omit all three when no rules_card was supplied.
112
120
 
113
121
  Malformed returns = failure — including status=done with a runner present but
114
122
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -26,6 +26,9 @@ never spawn other agents, never work outside your task slice.
26
26
  - house_rules — standing behavioral card (injected literally): surgical changes
27
27
  only, simplicity-first, no unrequested scope, boring-solution preference,
28
28
  never claim unobserved results, honest partial over false done
29
+ - rules_card — the anti-slop card (injected literally, directly under
30
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
31
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
29
32
  - log_digest — decisions from earlier waves; absorb before starting
30
33
  - pattern — resolved code-pattern for your task's language, or null. Present =
31
34
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -54,7 +57,8 @@ never spawn other agents, never work outside your task slice.
54
57
  is a corruption bug), and build/test output is always read whole. Canonical:
55
58
  `.claude/skills/_shared/read-ladder.md`.
56
59
  3. Implement the task within declared_files only. Obey every house_rules
57
- line. Follow every constraint. If
60
+ line, then every rules_card rule — two rules that disagree go in
61
+ rules_conflicts[], never a silent choice. Follow every constraint. If
58
62
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
59
63
  AND every enforceable validation_gate line (re-check your diff before
60
64
  returning; advisory gate lines never require new tooling). Create/update
@@ -109,6 +113,10 @@ never spawn other agents, never work outside your task slice.
109
113
  malformed. NOT required when you never repaired anything, and a loop that hit
110
114
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
111
115
  You RETURN it; the orchestrator writes the file. Never write it yourself.
116
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
117
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
118
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
119
+ replaced. Omit all three when no rules_card was supplied.
112
120
 
113
121
  Malformed returns = failure — including status=done with a runner present but
114
122
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -26,6 +26,9 @@ never spawn other agents, never work outside your task slice.
26
26
  - house_rules — standing behavioral card (injected literally): surgical changes
27
27
  only, simplicity-first, no unrequested scope, boring-solution preference,
28
28
  never claim unobserved results, honest partial over false done
29
+ - rules_card — the anti-slop card (injected literally, directly under
30
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
31
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
29
32
  - log_digest — decisions from earlier waves; absorb before starting
30
33
  - pattern — resolved code-pattern for your task's language, or null. Present =
31
34
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -54,7 +57,8 @@ never spawn other agents, never work outside your task slice.
54
57
  is a corruption bug), and build/test output is always read whole. Canonical:
55
58
  `.claude/skills/_shared/read-ladder.md`.
56
59
  3. Implement the task within declared_files only. Obey every house_rules
57
- line. Follow every constraint. If
60
+ line, then every rules_card rule — two rules that disagree go in
61
+ rules_conflicts[], never a silent choice. Follow every constraint. If
58
62
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
59
63
  AND every enforceable validation_gate line (re-check your diff before
60
64
  returning; advisory gate lines never require new tooling). Create/update
@@ -109,6 +113,10 @@ never spawn other agents, never work outside your task slice.
109
113
  malformed. NOT required when you never repaired anything, and a loop that hit
110
114
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
111
115
  You RETURN it; the orchestrator writes the file. Never write it yourself.
116
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
117
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
118
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
119
+ replaced. Omit all three when no rules_card was supplied.
112
120
 
113
121
  Malformed returns = failure — including status=done with a runner present but
114
122
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -26,6 +26,9 @@ never spawn other agents, never work outside your task slice.
26
26
  - house_rules — standing behavioral card (injected literally): surgical changes
27
27
  only, simplicity-first, no unrequested scope, boring-solution preference,
28
28
  never claim unobserved results, honest partial over false done
29
+ - rules_card — the anti-slop card (injected literally, directly under
30
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
31
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
29
32
  - log_digest — decisions from earlier waves; absorb before starting
30
33
  - pattern — resolved code-pattern for your task's language, or null. Present =
31
34
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -54,7 +57,8 @@ never spawn other agents, never work outside your task slice.
54
57
  is a corruption bug), and build/test output is always read whole. Canonical:
55
58
  `.claude/skills/_shared/read-ladder.md`.
56
59
  3. Implement the task within declared_files only. Obey every house_rules
57
- line. Follow every constraint. If
60
+ line, then every rules_card rule — two rules that disagree go in
61
+ rules_conflicts[], never a silent choice. Follow every constraint. If
58
62
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
59
63
  AND every enforceable validation_gate line (re-check your diff before
60
64
  returning; advisory gate lines never require new tooling). Create/update
@@ -109,6 +113,10 @@ never spawn other agents, never work outside your task slice.
109
113
  malformed. NOT required when you never repaired anything, and a loop that hit
110
114
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
111
115
  You RETURN it; the orchestrator writes the file. Never write it yourself.
116
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
117
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
118
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
119
+ replaced. Omit all three when no rules_card was supplied.
112
120
 
113
121
  Malformed returns = failure — including status=done with a runner present but
114
122
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -26,6 +26,9 @@ never spawn other agents, never work outside your task slice.
26
26
  - house_rules — standing behavioral card (injected literally): surgical changes
27
27
  only, simplicity-first, no unrequested scope, boring-solution preference,
28
28
  never claim unobserved results, honest partial over false done
29
+ - rules_card — the anti-slop card (injected literally, directly under
30
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
31
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
29
32
  - log_digest — decisions from earlier waves; absorb before starting
30
33
  - pattern — resolved code-pattern for your task's language, or null. Present =
31
34
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -54,7 +57,8 @@ never spawn other agents, never work outside your task slice.
54
57
  is a corruption bug), and build/test output is always read whole. Canonical:
55
58
  `.claude/skills/_shared/read-ladder.md`.
56
59
  3. Implement the task within declared_files only. Obey every house_rules
57
- line. Follow every constraint. If
60
+ line, then every rules_card rule — two rules that disagree go in
61
+ rules_conflicts[], never a silent choice. Follow every constraint. If
58
62
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
59
63
  AND every enforceable validation_gate line (re-check your diff before
60
64
  returning; advisory gate lines never require new tooling). Create/update
@@ -109,6 +113,10 @@ never spawn other agents, never work outside your task slice.
109
113
  malformed. NOT required when you never repaired anything, and a loop that hit
110
114
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
111
115
  You RETURN it; the orchestrator writes the file. Never write it yourself.
116
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
117
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
118
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
119
+ replaced. Omit all three when no rules_card was supplied.
112
120
 
113
121
  Malformed returns = failure — including status=done with a runner present but
114
122
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -26,6 +26,9 @@ never spawn other agents, never work outside your task slice.
26
26
  - house_rules — standing behavioral card (injected literally): surgical changes
27
27
  only, simplicity-first, no unrequested scope, boring-solution preference,
28
28
  never claim unobserved results, honest partial over false done
29
+ - rules_card — the anti-slop card (injected literally, directly under
30
+ house_rules): YOUR PROJECT'S RULES, then ORC RULES. A project rule beats an ORC
31
+ rule; house_rules beat both, but only on code and behaviour. Absent = no card
29
32
  - log_digest — decisions from earlier waves; absorb before starting
30
33
  - pattern — resolved code-pattern for your task's language, or null. Present =
31
34
  {conventions[] you MUST MATCH, invariants[] that are BLOCKING, validation_gate[]
@@ -54,7 +57,8 @@ never spawn other agents, never work outside your task slice.
54
57
  is a corruption bug), and build/test output is always read whole. Canonical:
55
58
  `.claude/skills/_shared/read-ladder.md`.
56
59
  3. Implement the task within declared_files only. Obey every house_rules
57
- line. Follow every constraint. If
60
+ line, then every rules_card rule — two rules that disagree go in
61
+ rules_conflicts[], never a silent choice. Follow every constraint. If
58
62
  `pattern` is present, MATCH its conventions, satisfy every BLOCKING invariant
59
63
  AND every enforceable validation_gate line (re-check your diff before
60
64
  returning; advisory gate lines never require new tooling). Create/update
@@ -109,6 +113,10 @@ never spawn other agents, never work outside your task slice.
109
113
  malformed. NOT required when you never repaired anything, and a loop that hit
110
114
  tdd_loop_max and stopped returns `none` — an unsolved failure is not a gotcha.
111
115
  You RETURN it; the orchestrator writes the file. Never write it yourself.
116
+ - rules_applied[] · rules_conflicts[] · rules_overridden[] — REQUIRED when the
117
+ slice carried a rules_card (each may be empty; absent is malformed): the rule
118
+ ids you acted on, two rules that disagree, and the ORC ids a project rule
119
+ replaced. Omit all three when no rules_card was supplied.
112
120
 
113
121
  Malformed returns = failure — including status=done with a runner present but
114
122
  no evidence, or status=done with a non-empty unmet[]. needs_context cap 2 per task.
@@ -524,7 +524,7 @@ orc extra dispatch --task <slice.json> --json
524
524
 
525
525
  **The slice content is IDENTICAL to what a Claude executor would receive** — the
526
526
  task's `prompt`, `acceptance[]`, `tdd_spec` tests, the `house_rules` card, the
527
- resolved pattern, the scope-matched gotchas, `declared_files`, `grounding[]`.
527
+ `rules_card`, the resolved pattern, the scope-matched gotchas, `declared_files`, `grounding[]`.
528
528
  Only the transport differs. That is the property that keeps every gate
529
529
  downstream engine-blind, and it is why a foreign task needs no second slice
530
530
  builder.
@@ -42,7 +42,9 @@ the codifier); hold resolved patterns in run state.
42
42
  `TDD-RED`/`TDD-GREEN` per iteration; cap hit → STOP SEQUENCE + honest red
43
43
  report) and the `house_rules` card lines
44
44
  (`house-rules.md`, injected LITERALLY — read once per run, never
45
- a pointer); FE/BE and `db:postgres` tasks get the resolved `pattern`
45
+ a pointer) with the `rules_card` directly under it — the `text` of
46
+ `orc rules slice --lane <lane> --json`, VERBATIM, `--pack ui` added for a
47
+ front-end task (`rules.md`; the preflight `line` alone is NOT the card); FE/BE and `db:postgres` tasks get the resolved `pattern`
46
48
  injected literally (pattern-gate.md), and — with `gotchas: on` — the
47
49
  SCOPE-MATCHING gotchas beside it (glob vs this task's `declared_files`, cap 3,
48
50
  highest `hits` first; zero matches = NO block, never an empty one — NEVER
@@ -58,6 +58,11 @@ Nothing goes above 1. Nothing goes between 2 and 3. The assembler emits 2 and 3
58
58
  as one block in that order, so the lane's job is to place that block directly
59
59
  under the house card and before the task.
60
60
 
61
+ **The slice field is `rules_card`, and it is the `text` field — not the `line`.**
62
+ Run the command at DISPATCH, not only at preflight. The `line` tells the user
63
+ which rules are in force; the `text` is what the agent reads. A lane that prints
64
+ the line and injects only the house card has reported rules that no agent got.
65
+
61
66
  ## Precedence, and the one sentence that gets it wrong
62
67
 
63
68
  ```
@@ -198,7 +198,7 @@ them; they are never dispatched as subagents).
198
198
  - Phase 1 wiki grounding → `../_shared/phases/wiki-consult.md` + `references/preflight-report.md`
199
199
  - Phase 2 → `references/effort-and-mode.md`; tagging → `references/pattern-gate.md`
200
200
  - Phase 3 → `../_shared/phases/wave-grouping.md` + `log-protocol.md` + `../_shared/phases/house-rules.md`
201
- + `pattern-gate.md` (resolve gate); workers → `subskills/orc-execution/`;
201
+ + `../_shared/phases/rules.md` (the `rules_card` rides every slice) + `pattern-gate.md` (resolve gate); workers → `subskills/orc-execution/`;
202
202
  stops → `subskills/orc-checkpoint/SKILL.md` + `../_shared/phases/stop-resume.md`
203
203
  - Phase 5–6 → `subskills/orc-review-verify/`; FE tasks →
204
204
  `../orc-pattern/references/fe-a11y.md` + `fe-perf.md` (as `fe_rules[]`)
@@ -21,6 +21,7 @@ pattern: js cached · ts cached
21
21
  gotchas: 12 known · 3 match this change's files
22
22
  pact: 11 holding · 2 drifted · 3 uncheckable
23
23
  bound: 9 execute · 2 escalate · 1 refuse (2 stale)
24
+ rules: ORC 65 (W 23 · C 22 · D 10 · U 10) · yours 9 lines (P0 4 · P1 2 · P2 3) · 1 override
24
25
  after: src/payments — 2 shipped files rewritten within 30 days of run store-credit
25
26
  crosslink: 2 boundaries (payments-api) — advisory
26
27
  extra: ON — 4 of 9 tasks foreign · deepseek/deepseek-v4-flash via api [0,30)
@@ -60,6 +61,11 @@ waves: 3 planned — will pause after wave 2 (batch_pause_every=2)
60
61
  ACTIVE mode is named whenever a verdict is later printed (`boundary_gate: off`
61
62
  omits the line). Uncarded areas are `unknown`, never REFUSE. Canonical:
62
63
  `../../orc-boundary/references/gate.md`.
64
+ - **rules:** ALWAYS printed — the `line` field from `orc rules slice --lane orc
65
+ --json`, VERBATIM, never recounted. `yours none` is an answer (the project has
66
+ no `.claude/orc/rules.md` rules yet), not a failure. Name each override under
67
+ it. This line is the REPORT; the card itself is the `text` field, injected as
68
+ `rules_card` into every slice (`../../_shared/phases/rules.md`).
63
69
  - **after:** printed **ONLY when the area this run is about to touch has a recent
64
70
  churn signal** (`orc aftermath status --json`, exit 1 or 2, intersected with the
65
71
  plan's `declared_files`). A clean run prints nothing at all — the whole value of
@@ -26,7 +26,8 @@ contract); the summary below orients — on any conflict, `core.md` wins.
26
26
  2. Implement EXACTLY the task in the slice, touching only `declared_files[]`,
27
27
  honoring every `constraints[]` hard rule AND the standing `house_rules` card
28
28
  (surgical changes, simplicity-first, no unrequested scope, never claim
29
- unobserved results, honest partial over false done); create/update
29
+ unobserved results, honest partial over false done), then the `rules_card`
30
+ under it (project rules beat ORC rules; return the three `rules_*` fields); create/update
30
31
  tests for what you build.
31
32
  3. Run the proof: build/test for your changes, capturing `evidence`
32
33
  {command, exit_code, tail} VERBATIM (no runner → `no_runner_detected: true`);
@@ -59,6 +59,13 @@ subagent; the orchestrator never runs this itself.
59
59
  - house_rules — the standing behavioral card (injected literally,
60
60
  never a pointer): surgical changes, simplicity-first,
61
61
  no unrequested scope, boring-solution preference
62
+ - rules_card — the anti-slop card from `orc rules slice`, injected
63
+ literally directly under `house_rules`: the project's
64
+ rules, then ORC's. A project rule beats an ORC rule;
65
+ `house_rules` beat both on code and behaviour only.
66
+ Carried → return `rules_applied[]`,
67
+ `rules_conflicts[]`, `rules_overridden[]`
68
+ (`../../../_shared/return-validation.md` §5c)
62
69
  - log_digest — compacted decisions from prior waves; absorb before working
63
70
  - worktree_path — null unless worktrees mode
64
71
  - model, effort — informational (already applied by the caller)
@@ -74,7 +81,8 @@ subagent; the orchestrator never runs this itself.
74
81
  a FULL read before you edit it (an `old_string` rebuilt from an outline is a
75
82
  corruption bug), and build/test output is always read whole.
76
83
  3. Perform the task within `worktree_path` (or the current tree if null).
77
- Obey every `house_rules` line. Follow every constraint. If `pattern` is present, MATCH its conventions,
84
+ Obey every `house_rules` line, then every `rules_card` rule (two rules that
85
+ disagree go in `rules_conflicts[]`, never a silent choice). Follow every constraint. If `pattern` is present, MATCH its conventions,
78
86
  satisfy every BLOCKING invariant, and satisfy every enforceable
79
87
  `validation_gate[]` line (re-read your diff to confirm before returning;
80
88
  advisory gate lines are informational — never add tooling to meet one);
@@ -121,8 +121,8 @@ pinned in the agent file). **Under `opus5_only` it is `orc-executor-opus-5-low`*
121
121
  - **the read ladder** (`../_shared/read-ladder.md`): read only as far up as the
122
122
  question needs — a file the task will EDIT is read in full first. Precomputed
123
123
  knowledge REPLACING exploration is this lane; a directory sweep is not.
124
- - the standing `house_rules` card (`../_shared/phases/house-rules.md`,
125
- injected literally, same as full/mini)
124
+ - the standing `house_rules` card (`../_shared/phases/house-rules.md`, literal,
125
+ same as full/mini) + the `rules_card` under it (`orc rules slice` → `text`, verbatim)
126
126
  - constraints from the intent spec
127
127
  - **terse-return rule:** standard contract fields, NO narrative prose — files
128
128
  changed, one-line diff summary, smoke-relevant notes only.
@@ -52,9 +52,9 @@ Phase 0 intake (Q1–Q4, soft sign-off) + run folder + intent-spec
52
52
  Phase 1 planning (dispatch orc-planner-mini; analyst first only on real docs)
53
53
  → one-line complexity read (mini-ok? or recommend switch-to-full)
54
54
  Phase 3 dispatch ONE executor (orc-executor-sonnet-5-high) — slice carries
55
- the standing `house_rules` card (../_shared/phases/house-rules.md,
56
- injected literally) + the cached `postgres` pattern on a data-access
57
- task (cache HIT only) — collect + validate return
55
+ the standing `house_rules` card (../_shared/phases/house-rules.md, literal)
56
+ + the `rules_card` under it (`orc rules slice` → `text`, verbatim) + the
57
+ cached `postgres` pattern on a data-access task (cache HIT only) — collect + validate return
58
58
  Phase M SMOKE GATE — run build+test → GREEN proceed · RED block ship + surface
59
59
  Phase X MOCK EXAMPLE (config mock_example) — offer/build after a GREEN gate
60
60
  Phase T TEST-AUTHORING ASK (opt-in) — offer to write test cases (never run them)
@@ -202,7 +202,8 @@ Rules:
202
202
 
203
203
  Put in the slice: the change sketch, the Q2 answers, 2–3 acceptance bullets,
204
204
  the wiki **paths**, the cached pattern (whole text), the `house_rules` card
205
- (`../_shared/phases/house-rules.md`, whole text), PR comments with their
205
+ (`../_shared/phases/house-rules.md`, whole text), the `rules_card` under it
206
+ (`orc rules slice --lane orc-quick --json` → `text`, whole text), PR comments with their
206
207
  `file:line`, and a short-return rule (fields only, no long prose).
207
208
 
208
209
  For an **ad-hoc** dispatch, also tell the agent to report its own