|
| 1 | +story: |
| 2 | + id: story-116 |
| 3 | + title: Every brief is titled for the behaviour it produces, defects included |
| 4 | + description: | |
| 5 | + Planned from the brief filed under key 169. |
| 6 | +
|
| 7 | + A brief's title is the line a developer reads in a tracker column, and |
| 8 | + nothing currently tells a writer how to pitch it. The three places that |
| 9 | + describe a title all say the same thing about what it is *not* — not part |
| 10 | + of what a brief is filed under, so phrase it freely — and nothing about |
| 11 | + what it should say. `schemas/story-brief.schema.json` goes further and |
| 12 | + teaches a split rule: "what is wrong where the brief states a defect, what |
| 13 | + should exist where it states work to be done". The result is that defects |
| 14 | + are titled for the state the system is in today — "A pending outbox entry |
| 15 | + never says why it is pending" — so a tracker column reads as a list of |
| 16 | + complaints rather than as a description of the system being built, and |
| 17 | + every line in it describes something that will not exist once the work |
| 18 | + lands. |
| 19 | +
|
| 20 | + This story replaces the split with one rule for every brief, defects |
| 21 | + included: a title states the finished behaviour, in the present tense, as |
| 22 | + though it already holds. "A pending outbox entry says why it is pending". |
| 23 | +
|
| 24 | + Obligations come with it, and the prompts must carry them or the rule makes |
| 25 | + titles worse. The behaviour named must identify this work and not its |
| 26 | + neighbours — "The outbox report is correct" is an end state and is useless, |
| 27 | + because it fits twenty defects; where an end-state title cannot be made |
| 28 | + specific, the title is underspecified rather than mis-framed, and the fix |
| 29 | + is a sharper behaviour rather than a return to naming the fault. And the |
| 30 | + body's opening line states what is wrong today for a defect, because that |
| 31 | + is what the case rests on and it is no longer in the title; the file:line |
| 32 | + evidence already lives there. |
| 33 | +
|
| 34 | + The fact that something is broken now is carried by `category` and |
| 35 | + `severity`, which are fields a board can sort and filter on, rather than by |
| 36 | + tone in a sentence. |
| 37 | +
|
| 38 | + The schema is where the split rule is taught and where the two prompts got |
| 39 | + it, so it is the site that must change first; the prompts are downstream of |
| 40 | + it and must not be left disagreeing with it. `prompts/assist.md` names a |
| 41 | + title only in passing, in a clause enumerating every field, and is included |
| 42 | + on the developer's decision so that the assist agent meets the rule before |
| 43 | + it reaches the skill rather than only inside it. |
| 44 | +
|
| 45 | + The slug rule is untouched and this story must not let the title rule leak |
| 46 | + into it. A title is safe to rewrite because it is outside the identity; a |
| 47 | + slug is not, because a rewritten one files a duplicate. |
| 48 | + workflow: story-workflow |
| 49 | + |
| 50 | +tasks: |
| 51 | + - Replace the `title` property's description in schemas/story-brief.schema.json with the single end-state rule, stated in the terms the schema uses for its other fields — what the field is for and why it is that way — covering the specificity obligation, the body's opening line for a defect, and category and severity as what carry the fact that something is broken now. Keep the existing clause saying a title is deliberately not part of what a brief is filed under, and why. |
| 52 | + - Give the title its own short section in prompts/inspector.md, placed immediately after the existing slug section, teaching the rule by example in the Inspector's own voice: a badly-pitched title beside its corrected form, and the underspecified case with what to do about it. |
| 53 | + - Restate the rule in plugin/skills/file-a-brief/SKILL.md in that document's own voice, with its own example, replacing the two lines at SKILL.md:43-44 that currently say a title may be as readable as you like. |
| 54 | + - Widen the title clause in prompts/assist.md so it names what a title should say rather than only who reads it. |
| 55 | + - Write a standing test module under tests/ holding the shipped schema and the three shipped documents to the new rule, and holding the slug rule unchanged. |
| 56 | + |
| 57 | +acceptance_criteria: |
| 58 | + - The `title` property description in schemas/story-brief.schema.json no longer states a rule that differs by whether the brief is a defect, and no longer contains the phrase "what is wrong where the brief states a defect". |
| 59 | + - That description states that a title says the behaviour the finished work produces, in the present tense, and states that this holds for a brief that reports a defect as well as for one that reports work to be done. |
| 60 | + - That description states that the behaviour a title names must distinguish this work from its neighbours, and that where it cannot the answer is a sharper behaviour rather than a return to naming the fault. |
| 61 | + - That description states that a defect brief's body opens by saying what is wrong today, and that `category` and `severity` are what carry the fact that something is broken now. |
| 62 | + - That description still states that a title is deliberately not part of what a brief is filed under, and still gives the reason: two writings phrase it differently and filing on the phrasing would file it twice. |
| 63 | + - prompts/inspector.md states the end-state title rule and shows at least one badly-pitched title beside its corrected form, and shows the underspecified case with the instruction to sharpen the behaviour rather than name the fault. |
| 64 | + - prompts/inspector.md no longer says that a title may be as readable as you like. |
| 65 | + - plugin/skills/file-a-brief/SKILL.md states the end-state title rule with an example of its own, in wording that is not a copy of the schema's sentence or of the Inspector prompt's. |
| 66 | + - plugin/skills/file-a-brief/SKILL.md no longer says that a title may be as readable as you like. |
| 67 | + - prompts/assist.md's clause about the title names what a title should say — the behaviour the finished work produces — rather than only that a human scans it in a list. |
| 68 | + - The slug derivation rule is byte-for-byte unchanged in prompts/inspector.md, in plugin/skills/file-a-brief/SKILL.md and in the schema's `slug` description, and each of those three still states that a slug is part of what a brief is filed under. |
| 69 | + - Neither prompt nor the skill instructs a writer to re-derive or rewrite the slug of work whose title is retitled. |
| 70 | + - The `severity` and `confidence` property descriptions and their enums are unchanged. |
| 71 | + - No field is added to or removed from schemas/story-brief.schema.json and its `required` list is unchanged. |
| 72 | + - A brief valid under the schema before this story is still valid under it after. |
| 73 | + - The existing suite passes, tests/test_a_brief_is_not_only_a_defect.py included. |
| 74 | + - A standing test module under tests/ reads the shipped schema, the two shipped prompts and the shipped skill document and fails if any of them stops carrying the end-state rule, and fails if any of them regains the superseded "as readable as you like" or split-rule wording. |
| 75 | + |
| 76 | +technical_plan: |
| 77 | + implementation_steps: |
| 78 | + - Rewrite the `title` description in schemas/story-brief.schema.json first, since it is the statement the other three are brought into line with. Write it in the register the neighbouring descriptions use — what the field is for and why it is that way — not as a list of instructions. |
| 79 | + - Check the new description against the constraint below before moving on - tests/test_a_brief_is_not_only_a_defect.py:398 fails any schema description that contains "defect" without also naming work to be done. |
| 80 | + - Add a title section to prompts/inspector.md immediately below the existing "[The slug, and what a brief is filed under]" section, leaving that section's slug bullets and its sentence about the title being outside the identity where they are. Edit only the sentence there that says the title may be as readable as you like. |
| 81 | + - Replace SKILL.md:43-44 with the rule in that document's voice and an example of its own, keeping the "### The slug" section above it untouched. |
| 82 | + - Widen the title clause in prompts/assist.md:48 in place, without disturbing the rest of that enumerating paragraph. |
| 83 | + - Have the tester write the standing module, holding the four shipped documents to the rule and holding the slug rule unchanged. Follow the convention tests/test_a_brief_is_not_only_a_defect.py established - read the shipped files live because they are the subject, carry the superseded wording as constants so each absence scan can be shown reporting something, and collapse whitespace before searching, because a sentence in a wrapped document is not a line. |
| 84 | + likely_file_changes: |
| 85 | + - file: schemas/story-brief.schema.json |
| 86 | + stage: implementer |
| 87 | + reason: The `title` property description is where the split rule is taught and where the two prompts got it; it is replaced with the single end-state rule. |
| 88 | + - file: prompts/inspector.md |
| 89 | + stage: implementer |
| 90 | + reason: The Inspector's whole instruction about titles is the sentence at 176-182 saying a title may be as readable as you like; it gains a title section teaching the end-state rule by example. |
| 91 | + - file: plugin/skills/file-a-brief/SKILL.md |
| 92 | + stage: implementer |
| 93 | + reason: Lines 43-44 say the same superseded thing to the assist agent and are replaced with the rule in the skill's own voice. |
| 94 | + - file: prompts/assist.md |
| 95 | + stage: implementer |
| 96 | + reason: The title clause at line 48 names only who reads a title; it is widened to name what a title should say, so the assist agent meets the rule before it reaches the skill. |
| 97 | + - file: tests/test_a_brief_is_titled_for_its_end_state.py |
| 98 | + stage: tester |
| 99 | + reason: The new standing module holding the shipped schema, the two prompts and the skill document to the end-state rule, and holding the slug rule unchanged. |
| 100 | + - file: .harness/docs/ARCHITECTURE.md |
| 101 | + stage: documenter |
| 102 | + reason: Records the decision that one title rule covers every brief including defects, why the schema is the site that changed first, and why the slug rule was deliberately left alone. |
| 103 | + |
| 104 | +scope: |
| 105 | + modify: |
| 106 | + - schemas/story-brief.schema.json |
| 107 | + - prompts/inspector.md |
| 108 | + - prompts/assist.md |
| 109 | + - plugin/skills/file-a-brief/SKILL.md |
| 110 | + - tests/ |
| 111 | + - .harness/docs/ARCHITECTURE.md |
| 112 | + do_not_modify: |
| 113 | + - orchestration/ |
| 114 | + - scripts/ |
| 115 | + - templates/ |
| 116 | + - .harness/query/ |
| 117 | + - .harness/sync/ |
| 118 | + - schemas/outbox-entry.schema.json |
| 119 | + - schemas/story.schema.json |
| 120 | + - schemas/harness-config.schema.json |
| 121 | + |
| 122 | +verification_requirements: |
| 123 | + - Confirm the schema's `title` description states one rule covering both a defect brief and a brief for work to be done, and states no rule that differs between them. |
| 124 | + - Confirm the schema's `title` description carries each part - present-tense finished behaviour, the specificity obligation with its remedy, the defect body's opening line, and category and severity as what carry that something is broken now - and still carries the reason a title is outside the identity. |
| 125 | + - Confirm prompts/inspector.md and plugin/skills/file-a-brief/SKILL.md each state the rule in wording that is not a copy of the other's or of the schema's, and that each carries at least one example of a badly-pitched title beside its corrected form. |
| 126 | + - Confirm prompts/assist.md's title clause names what a title should say. |
| 127 | + - Confirm the slug derivation rule is unchanged wherever it is stated, and that nothing added by this story asks a writer to re-derive a slug when a title changes. |
| 128 | + - Confirm the `severity` and `confidence` descriptions and enums, the declared fields and the `required` list are all unchanged, and that a brief valid before this story validates after it. |
| 129 | + - Confirm the new test module fails when the end-state rule is removed from any one of the four shipped documents, by showing each scan reporting the superseded wording it replaced. |
| 130 | + - Confirm the full suite passes, tests/test_a_brief_is_not_only_a_defect.py included. |
| 131 | + |
| 132 | +constraints: |
| 133 | + - The slug rule stays exactly as it is, in all three places that state it. A slug is part of what a brief is filed under and a rewritten one files a duplicate; a title is outside the identity, which is what makes it safe to rewrite. The story must not let the title rule leak into the slug rule. |
| 134 | + - Nothing in this story retitles a brief already filed, and nothing in it asks anyone to. A title is outside the identity, so a filed brief can be corrected in the tracker at any time and needs no story. |
| 135 | + - The severity and confidence scales are untouched. They are what carry the fact that something is broken now, and they are unaffected by how a title is pitched. |
| 136 | + - The identity a brief is filed under stays kind, category, sorted bare paths and slug. No code in this story computes, hashes or derives an identity. |
| 137 | + - tests/test_a_brief_is_not_only_a_defect.py:398 fails any schema description containing "defect" without also naming work to be done. The new `title` description says "defect" by design, so it must name work to be done as well. |
| 138 | + - The bare-repository-relative-paths rule, and the paragraph in the schema description stating it, are untouched. |
| 139 | + - No field is added to or removed from the brief schema, and its `required` list is unchanged, so a brief written before this story validates unchanged after it. |
| 140 | + - The rule is stated once in the schema and restated in each document's own voice. No prompt or skill quotes the schema's sentence at the reader. |
| 141 | + |
| 142 | +mandate: |
| 143 | + source: |
| 144 | + kind: human |
| 145 | + conferred_at: 2026-09-07 20:24:29 |
| 146 | + conferred_by: jerod.wilkerson <30474318+jerodw@users.noreply.github.com> |
| 147 | + recorded_by: l5-plan |
0 commit comments