fix(kyberforge): a dispatch table satisfies the reference-wiring rule

body-discipline.md required every reference load to use the literal
'If X, read references/file.md' form and called anything else a generic
pointer. ADR-0020's own cited dispatch exemplar, apm-workflow, uses a
bare table plus one closing line, so an author could not satisfy both --
and the rule reliably produced duplication in exactly the bodies the
contract exists to keep short.

Resolves #109 with its option 1: a table row already pairs a condition
with a target, so where a body dispatches, the table is the wiring. The
literal form is what a body needs when it loads a reference without a
table.

Two corrections to the issue as filed. There is no Vale conflict --
PaddingPhrase.yml only matches 'see references/ for more info' and never
fired on the exemplar, so this is a one-file prose fix and no rule
changes. And gitea-workflow carried the predicted duplication: a
three-row table restated underneath as three conditionals. Removed, body
227 -> 148 words.

Closes #109
This commit is contained in:
2026-08-30 15:07:16 +00:00
parent ff187ef9fc
commit 7e80c09b13
4 changed files with 30 additions and 12 deletions

View File

@@ -33,11 +33,7 @@ The invocation's shape selects exactly one branch.
| A bare number, with neither "issue" nor "PR" said | Resolve which domain the number belongs to | `references/number-resolution.md` |
| A named capability whose owning skill is unclear | Route to the domain skill that owns it | `references/skill-index.md` |
If the invocation carries no specific request, read `references/status-checkin.md`.
If the request references a bare number and never says "issue" or "PR", read `references/number-resolution.md`.
If the request names a capability but not which skill owns it, read `references/skill-index.md`.
Read only the reference file matching the selected branch — each is self-contained for its concern.
## Report

View File

@@ -33,11 +33,7 @@ The invocation's shape selects exactly one branch.
| A bare number, with neither "issue" nor "PR" said | Resolve which domain the number belongs to | `references/number-resolution.md` |
| A named capability whose owning skill is unclear | Route to the domain skill that owns it | `references/skill-index.md` |
If the invocation carries no specific request, read `references/status-checkin.md`.
If the request references a bare number and never says "issue" or "PR", read `references/number-resolution.md`.
If the request names a capability but not which skill owns it, read `references/skill-index.md`.
Read only the reference file matching the selected branch — each is self-contained for its concern.
## Report

View File

@@ -31,7 +31,16 @@ Include content the agent lacks:
Move to `references/`, behind an explicit "If X, read `references/<file>.md`" trigger — the literal
conditional form, never a generic pointer. Write the real filename in the skill under audit; the
angle brackets are a placeholder here, and a literal `references/file.md` in a body is an ERROR
from the ADR-0020 gate because no such file exists on disk. Move:
from the ADR-0020 gate because no such file exists on disk.
**A dispatch table satisfies this requirement on its own.** A table row already pairs a condition
with a target, which is exactly what the literal form encodes; restating each row underneath as a
prose conditional duplicates the routing in the one body whose whole purpose is to be short. Where a
body dispatches, audit the table for condition/target completeness and stop there — do not require
the conditional form as well. The literal form is what a body needs when it loads a reference
*without* a dispatch table: a single mid-procedure deepening, an escape hatch, an error path.
Move:
- Lookup tables and spec restatements
- Output schemas, templates and example blocks
@@ -76,6 +85,10 @@ The reference shape in this repo is `apm-workflow`: a **421-word body** dispatch
words — cite 421 when calibrating a body, or the conflation this section warns against reappears
in the finding itself.
Note its wiring: a three-column table (invocation, action, reference file) closed by one line,
*"Read only the reference file matching the requested action."* That is the endorsed shape, and it
is why the literal-conditional requirement above exempts a body that dispatches. Do not flag it.
## Gotchas sections
The highest-value construct in a body, and the easiest to fill with noise. A Gotcha must state a

View File

@@ -31,7 +31,16 @@ Include content the agent lacks:
Move to `references/`, behind an explicit "If X, read `references/<file>.md`" trigger — the literal
conditional form, never a generic pointer. Write the real filename in the skill under audit; the
angle brackets are a placeholder here, and a literal `references/file.md` in a body is an ERROR
from the ADR-0020 gate because no such file exists on disk. Move:
from the ADR-0020 gate because no such file exists on disk.
**A dispatch table satisfies this requirement on its own.** A table row already pairs a condition
with a target, which is exactly what the literal form encodes; restating each row underneath as a
prose conditional duplicates the routing in the one body whose whole purpose is to be short. Where a
body dispatches, audit the table for condition/target completeness and stop there — do not require
the conditional form as well. The literal form is what a body needs when it loads a reference
*without* a dispatch table: a single mid-procedure deepening, an escape hatch, an error path.
Move:
- Lookup tables and spec restatements
- Output schemas, templates and example blocks
@@ -76,6 +85,10 @@ The reference shape in this repo is `apm-workflow`: a **421-word body** dispatch
words — cite 421 when calibrating a body, or the conflation this section warns against reappears
in the finding itself.
Note its wiring: a three-column table (invocation, action, reference file) closed by one line,
*"Read only the reference file matching the requested action."* That is the endorsed shape, and it
is why the literal-conditional requirement above exempts a body that dispatches. Do not flag it.
## Gotchas sections
The highest-value construct in a body, and the easiest to fill with noise. A Gotcha must state a