SIGN IN SIGN UP

docs(m176): amend the spec against the repository, before any code

The spec was written against a repository that no longer exists in six
places, and `AGENTS.orly.md` is explicit that a spec contradicting reality
loses. Amending first means nothing downstream is built against a spec
already known to be wrong.

M175 §6 deleted `make/test-integration.mk` and
`.github/workflows/test-integration.yml`. Evidence: `ls make/test-integration.mk`
→ No such file or directory; `make -qp | grep '^test-integration:'` → no output.
Six places still named that lane — Files Changed ×2, §8 prose, Dimension 8.2,
Test Specification row 8.2, rubric R5.

Replacing the name would have been the wrong fix. M176 genuinely needs live
Postgres and Redis; what it cannot do is JOIN a lane that no longer exists.
The Zig lane went because the Zig daemon is frozen, not because integration
testing ended. So the spec now describes a lane this milestone CREATES:

- `make test-integration-rustd`, named for the existing `test-unit-rustd` /
  `lint-rustd` family rather than reusing the freed `test-integration`, which
  would silently inherit the Zig suite's meaning.
- Built on `make/test-infra.mk`, which M175 KEPT — it is the
  disposable-environment half (compose services, port discovery, Redis TLS CA,
  schema reset) and `make/quality.mk:183` already consumes it. Only the lanes
  half was deleted.
- Declared as `verify.integration` in `.oracle/orly.json`, so `orly gate` and
  the rubric grade one boundary instead of the lane being a target nothing names.
- Run by its own workflow, because `test.yml` carries no `services:` block and
  its `test` aggregate is required — hanging a datastore job off it would make
  live Postgres a precondition for every PR in the repository.

A seventh imprecision is clarified rather than amended: Dimension 1.2's "runs
in the Zig test build". `build.zig` still carries its test steps and Zig 0.16.0
is installed, but no Zig test lane exists; the reverse crypto pass runs as
`zig run`, which is the precedent `make wire-fixtures` already set.

Also filled at PLAN, since EXECUTE may not start without them:

- The PR Intent handshake — intent restated, seven assumptions stated.
- §Coverage decision. codecov.yml's 100% was set when these crates were pure
  value types and its own comment says so. The route taken is to REACH 100, not
  move it: mockable I/O cores per M-MOCKABLE-SYSCALLS behind a `test-util`
  feature, and coverage measured across both lanes since `cargo llvm-cov` runs
  unit and `tests/` targets together. Moving the number stays available for a
  genuinely unreachable line, in the same commit, with the line named.
- §Visibility policy, answering the M175 review note. All 164 public fields are
  in `afd_wire`; `afd_core` has zero. That split is deliberate and kept: wire
  types are transparent serde payloads with no invariant to guard, while every
  crate here is private-by-default — a public field on a secret newtype lets a
  caller move the buffer out and bypass zeroize, which is Invariant 5 defeated
  by syntax.
- §8's credential enumeration, run at PLAN by key presence only, no value read.
  The finding that shapes §8: the datastore URLs are not developer-environment
  credentials at all — they are derived from compose at lane start, which is
  what lets the lane behave identically on a laptop and in CI.

SPEC TEMPLATE GATE: clean — no prohibited patterns, required sections present,
no placeholders, rubric quotes the declared commands.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
K
Kishore Kumar committed
b83cc911b32915a8ae08282d84ff465a7edc00fa
Parent: 9df2f0c