# Attribute Stories to Source Requirements

You are the lineage attribution agent. You are given one imported source file and the complete
list of stories that already exist for this Target. Identify the distinct requirements the source
states, and for each one name the stories that implement it.

This is a matching task against a closed set. Every story you may name is listed in `<stories>`.
You are not decomposing work, proposing new stories, or judging whether the existing stories are
correct.

## Method

1. Read the source and identify each distinct requirement it states. A requirement is a thing the
   system must do, at whatever granularity the author wrote it. One sentence may state one
   requirement that several stories implement — for example "add a table and show it on screen"
   is one requirement implemented by a schema story, a route story, and a view story. Do not split
   a requirement to make the mapping tidier, and do not merge two requirements that a reader would
   act on separately.
2. Give each requirement a short kebab-case name that describes it. The name is an identifier, not
   a summary: `mark-book-read`, not `the-reader-can-mark-a-book-as-read`.
3. For each requirement, list every story that implements any part of it. A story may implement
   more than one requirement; a requirement may need more than one story.
4. List any story that implements no requirement in the source as `<unattached>`. This is expected
   and correct for foundational work — application scaffolding, configuration, shared UI framing,
   test harnesses — that the author never asked for by name. Do not force such a story onto an
   unrelated requirement.

## Rules

- Use only story ids that appear in `<stories>`. Never invent one.
- Every story must appear exactly once, either inside a `stories` attribute or as `<unattached>`.
- Quote the requirement text verbatim from the source in the tag body. Do not paraphrase it.
- Emit nothing but the tags below. No preamble, no commentary, no explanation.

## Output

```text
<requirement name="add-remove-books" stories="add-book,remove-book,database">
The reader can add a book with a title and author, view the books in the order added, and remove a book.
</requirement>
<requirement name="reject-empty-fields" stories="validate-book">
An empty title or author is rejected with a clear error message.
</requirement>
<unattached story="architecture"/>
<unattached story="ui-general"/>
```

# Attribution job

<source name="stage_contract.sh">
#!/bin/sh
# stage_contract.sh — governed gates for boundaries not represented by one toml-test slice.
set -eu

if [ $# -ne 1 ]; then
  echo "usage: stage_contract.sh <architecture|decoder>" >&2
  exit 2
fi

case "$1" in
  architecture)
    test -f go.mod
    if grep -Eq '^[[:space:]]*require[[:space:](]' go.mod; then
      echo "go.mod declares a forbidden third-party dependency" >&2
      exit 1
    fi
    go build ./cmd/toml-decoder
    ;;
  decoder)
    go build -o toml-decoder ./cmd/toml-decoder
    stage_dir="$(mktemp -d)"
    trap 'rm -rf "$stage_dir"' EXIT HUP INT TERM

    printf 'answer = 42\n' | ./toml-decoder >"$stage_dir/valid.json" 2>"$stage_dir/valid.err"
    test ! -s "$stage_dir/valid.err"
    python - "$stage_dir/valid.json" <<'PY'
import json
import sys

with open(sys.argv[1], encoding="utf-8") as stream:
    decoded = json.load(stream)
assert decoded == {"answer": {"type": "integer", "value": "42"}}
PY

    if printf 'answer = [\n' | ./toml-decoder >"$stage_dir/invalid.out" 2>"$stage_dir/invalid.err"; then
      echo "malformed TOML exited successfully" >&2
      exit 1
    fi
    test ! -s "$stage_dir/invalid.out"
    test -s "$stage_dir/invalid.err"
    ;;
  *)
    echo "unknown stage contract: $1" >&2
    exit 2
    ;;
esac
</source>

<stories>
  <story id="architecture" implements="ARCHITECTURE.md">Establish the standard-library-only Go module and decoder command.</story>
  <story id="decoder-contract" implements="FEATURE-Decoder-Contract.md">Implement the TOML decoder stdin, tagged-JSON, diagnostic, and exit-status contract.</story>
  <story id="parser-strings" implements="FEATURE-Strings.md">Parse TOML basic, literal, and multiline string values.</story>
  <story id="parser-keys" implements="FEATURE-Keys.md">Parse TOML key forms and enforce key-definition semantics.</story>
  <story id="parser-lexical-scalars" implements="FEATURE-Lexical-Scalars.md">Parse TOML booleans, integers, and floating-point scalar values.</story>
  <story id="parser-lexical-boundaries" implements="FEATURE-Lexical-Boundaries.md">Handle TOML comments, whitespace, line endings, UTF-8, and control-character rules.</story>
  <story id="parser-tables" implements="FEATURE-Tables.md">Parse standard tables and arrays of tables with ordering and conflict rules.</story>
  <story id="parser-datetimes" implements="FEATURE-Datetimes.md">Parse and format TOML offset and local date/time values.</story>
  <story id="parser-arrays-inline" implements="FEATURE-Arrays-Inline.md">Parse arrays and inline tables with closure and conflict semantics.</story>
  <story id="conformance" implements="FEATURE-Conformance.md">Assemble the completed parser and verify the complete TOML 1.0.0 suite.</story>
</stories>
