agent: builder model: opus max_turns: 80 budget_usd: 22 —

Brief: #928 step 2c, yaml escapes decoded once in the grammar, taking over wip/y5-escapes-in-the-grammar (owner’s decisions 2026-10-30)

Read first: ADR-yaml-1 D4 (its last bullet: Scalar’s value is a private field read through text(), decoded with a binding inside text(..)) and D11, docs/briefs/yaml/y5-escapes-and-radix.md (step 2 there is this brief’s work; its report and debrief beside it), then packages/yaml/src/main.nika.

Pre-flight (first five turns; stop on a failure)

To build (each step a commit)

  1. Take the draft over. wip/y5-escapes-in-the-grammar (72df62ae) branches from before 7cde2178 (0x/0o), so apply its yaml changes three-way, never a checkout of the branch in the shared tree: git diff 72df62ae~1 72df62ae -- packages/yaml/src packages/yaml/tests | git apply -3; resolve against develop’s as_i64/as_f64; leave its nikaia.lock change out (regenerated by the build, commit it only if the package’s lock is tracked and changed).
  2. One pass, private value. Replace the draft’s peek(text(..)) (refused) with s:text(parts:DoublePart*); Scalar gets a private value: String (owned for a double-quoted scalar with an escape or a line break, a view otherwise, ADR-282 D12-D14), text() returns it for Double and folds Plain/Single on request; escaped() and the lazy decoding go; no second check of the digits anywhere (D11). If a struct of the package is named S, #1013 point 2 is fixed: keep the name.
  3. Tests (y5’s step 2 list): tests/quoted_scalars.nika gains "\x41", "é", " ", "\U0001F600"; tests/errors_carry_line_and_column.nika gains "\uD800", "\U00110000", "\x4G", "\u12" with line and column (YAML 1.2.2 5.7; the yaml-test-suite case where one exists). check --asserts on the package lists every scalar::from as proved: say so under Tests:.

Done when the package gate is green, each step committed and pushed, the last commit Part of #928. Changelog: none (package only).

Facts the last builders paid for

Rules (CLAUDE.md; this block is pasted into every brief, also a fix-forward)

Report (at most 15 lines, to exactly /home/user/Nikaia/docs/briefs/yaml/y5b-escapes.md.report.md)

Fields of docs/architect.md, Briefs and reports: Result: done|noop|partial|blocked (the bare word alone on that line: Result: done, never a summary after it, which cuts the batch, b869a 2026-10-27; Owner: is a question for the owner or none, never a role), Files, Commit, Body (optional, one paragraph for the commit message), Fixes, Pushed, Tests, Gate (green|red), Deviation, Found, Needs, Changelog, Owner, Disk freed, and for a move Rs2nika: (the kept N of M lines of rs2nika --score, then the three costliest hand edits; none for a task that moves no Rust, none (redesign) for a brief with Shape: redesign and no Convert: line). none where nothing, and then the bare word: Deviation: none (a note) cuts the batch (batch.nika compares exactly); a note goes into the commit message. Found: is only for a defect outside your change (it cuts the batch); a process event such as another session resetting or rewriting your files is no Found:, it goes under Needs: (m3a 2026-10-28); a converter draft that came out wrong is no Found:, it is one of the costliest edits under Rs2nika:, which the converter lane reads (e12-4b 2026-10-27); how you solved your own step goes into the commit message. Deviation: is only a step of the brief built otherwise than written or not built (a choice the brief left to you, such as keep what X needs and say so, is no deviation: it goes into the commit message; nor is building two steps in one commit when every step is built, e12-3a 2026-10-27, nor a step another commit on develop already built, shown by your test failing with that commit’s change reverted, b889 2026-10-27: name the commit in Body:, nor a test’s expected .stdout/.stderr taken from what the program really prints where the brief’s sketch of it was short or wrong, b934 2026-10-29: say so in Body:, nor a lowering that follows the ADR governing it where the brief’s expected lowering contradicts that ADR, b933 2026-10-29: name the ADR in Body:, nor re-keying an allow-list entry (KNOWN) whose hash changed for the same program and the same reason, b-fixforward-sweep2 2026-10-28: say so in Body:); how you verified (e.g. a test not run against the unfixed compiler) goes under Tests:. A noop says why under Tests: (what was probed), not under Deviation:. Final answer, one line: done <sha>, report <path> (or BLOCKED: ... / PUSH REJECTED ...).

Attribution: Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_01UVxJDveRM5qKZKyCqq6Y24

This site is open source. Improve this page.