Repository navigation
feat: release E15, text placed in symbols - #259
Open
AlexandreGallais wants to merge 764 commits into
Open
AlexandreGallais wants to merge 764 commits into
AlexandreGallais wants to merge 764 commits into
Conversation
Closes: EN-069 Rule-docs: none affected, tooling only, no rule in docs/domain changed Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Refs: EN-069
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Decided by the Product Owner on 2026-10-17: a tool that is slower than it needs to be costs the agent check-again rounds, not only seconds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Add tools/api-pages, a crate of the workspace that reads the library's exports from src/index.ts through its barrels with oxc_parser, resolves each name of a type with oxc_semantic (type parameter, import or global of the language), and writes one Markdown page per exported function, type alias and constant, their index and the sidebar file, in the Markdown TypeDoc's plugin wrote. The Oxc crates are pinned at 0.153.0 (2026-10-05, release notes read), each with its row under Crates in docs/tooling/dependencies.md, which tests/package.test.ts now checks against Cargo.toml. The rule of no crates.io dependency names the reviewed ones as its exception. Refs: EN-072.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Run api-pages on a library of its own, modules of src/ copied unchanged, and compare each of its 11 pages byte for byte with the page TypeDoc wrote for them on 2026-10-17: a function with a function-typed parameter, one with a constrained type parameter, object, intersection, indexed-access and function-type aliases, constants of a literal value, of a readonly tuple and of a nested object type. The index and the sidebar are checked too, sorted by kind and by name. On the whole library the pages differ from TypeDoc's on 10 of 537, each where TypeDoc printed the compiler's resolved type instead of the written one: an alias such as Alignment written out as its union, a union's members reordered, ArrayBufferLike added as a default type argument, and the parentheses of an array of an intersection dropped. Refs: EN-072.T2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Before writing any page, api-pages fails and names each case with its file and line, as TypeDoc's validation did with warnings as errors: an export or a property of its object types without a TSDoc block (and an @PARAM naming no parameter, which TypeDoc warned about), a {@link} naming nothing exported, and a name of the library's own, declared or imported, that a public signature reaches though the API does not export it. A local alias of the module is written out instead, as the compiler showed it to TypeDoc. Each check has a test that plants its case in a copy of the fixture library and sees the run fail without writing a page; each test was seen failing once with its check broken. The crate's tests cover 97 % of its lines. Refs: EN-072.T3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
npm run docs:api now runs tools/api-pages, which writes docs/api and its sidebar file api-sidebar.json, read by the site's configuration. typedoc, typedoc-plugin-markdown, typedoc-vitepress-theme, typedoc.json and tsdoc.json, which extended TypeDoc's, are removed with their rows; TypeScript 6 stays for typescript-eslint alone until EN-085. The docs describe the generator, its checks and how its pages differ from TypeDoc's; REF-TYPEDOC-VALIDATION and REF-TSDOC are read and listed. npm run docs:build builds the site with the generated pages, every link resolving; docs:api takes 0.35 s against 3.5 s. Refs: EN-072.T4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Closes: EN-072 Rule-docs: none affected, a tooling story that changes no rule of docs/domain/ Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Refs: EN-072
Vitest's global setup reads tests/inter-regular.ttf once, in the main process, and provides its bytes; interRegularFile() gives each caller a fresh copy. Inter's tables and the Shared Sans tables are built at a test file's first call, frozen, and kept for that file: the 193 test files that import the fixtures no longer read and rebuild Inter on import. One test proves the reading by its length and digest. Refs: EN-089.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
A test lists the font files of tests/ and fails when any TypeScript file other than tests/font-files-setup.ts names one. The faces of the shared tables collection are compared by length and SHA-256 rather than byte by byte, which brings that test from 2.3 s to 75 ms and back under Vitest's 5 s limit. The story records the lane's timings before and after, and what EN-090 can reuse. Refs: EN-089.T2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Closes: EN-089 Rule-docs: none affected, test tooling only, no domain rule changed Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Refs: EN-089
… the run totals EN-091 in F19, EN-092 in F20, two drafted stories in F21, and the Product Owner's view of the tooling in E17's goal (2026-10-17). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
oxlint 1.87.0 and oxlint-tsgolint 7.0.2004, each over 7 days old, their release notes read. `.oxlintrc.json` comes from `@oxlint/migrate --type-aware` on `eslint/`: 432 native rules, 82 of them dropped before anything is enabled, each with its reason in note 0023 and the story (the compiler refuses the code, or a kept rule or setting forbids it: classes, `this`, accessors, `enum`, `for…in`, `let`, labels, `!`, CommonJS). 350 rules are left, 46 of them type-aware. Refs: EN-074.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Each scope of `eslint/scopes/` that sets a native rule is an override of `.oxlintrc.json`, checked on a probe file of each scope; the globs without a slash are written `./…`, which oxlint matches at the root only, as ESLint does. The five unstable rules worth keeping are named explicitly; three are dropped with their reason. A test keeps the overrides equal to the scopes. Refs: EN-074.T2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
122 findings in 11 rules, each decided in the story: code fixed for `no-deprecated` (rule defaults in `meta`), two JSDoc readings, `prefer-global-this`, a callback reference and an inferred predicate; ESLint's reading restored by an option where oxlint reads more (type parameters) or where two kept rules contradict (`NaN`, catch bindings, `undefined` seeds). `prefer-destructuring` runs natively with the same options. Refs: EN-074.T3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The 33 drops of note 0023 hold against the code. Four kept rules are dropped as well, each tried on a probe file: the compiler, `no-bitwise`, `no-continue` and the formatter already refuse what they report; the rewrite stories EN-078 to EN-080 lose them. Of the core rules oxlint lacks, `consistent-this` and `strict` guard nothing here, so EN-075 no longer rewrites `consistent-this`. 228 of the 265 are kept. Refs: EN-074.T4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
`npm run lint`, `lint:fix`, `fix` and the pre-commit run oxlint before ESLint. ESLint's configuration ends by turning off every rule that `.oxlintrc.json` names and the 125 rules the triage dropped. The directives of oxlint's rules become `oxlint-disable`, which ESLint ignores; the register of exceptions reads both kinds. New tests check that no rule runs in both linters, that oxlint runs no dropped rule and gets ESLint's TypeScript targets. Lint time: 62 s before, 1 to 1.3 s for oxlint, 31 to 56 s with the ESLint rules left. Refs: EN-074.T5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
F19's criteria 3 and 11 follow the triage EN-074 confirmed against the code: consistent-this dropped, 228 rules kept and 37 dropped. Closes: EN-074 Rule-docs: none affected, a tooling change: no rule of docs/domain/ changes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Refs: EN-074
It parses Inter whole and took 5.0 s in a loaded pre-push run; the other whole-face tests of the file already have 20 s. Refs: EN-089 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Inventory of every test of the repository, classed by kind and by claim, with the duplicate pairs by file and line, the pairs read and kept, and the timings before. Refs: EN-090.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
…ilt once Merge the identical triangle tests of regularPolygonContour, the turned triangle into the property of regularPolygonAsFreeShape, the equal-radius base property into the per-corner one, and the two collection tests of parseFontFace. Move the sample of 731 000 colors to exactColorToHex, whose round trip it proves, and give wholeValuesToHex a property for its own claim. Build that sample at its first use (builtOnce, shared by the fixtures) instead of at each import of the tests barrel. Refs: EN-090.T2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
…s once Split Vitest into two projects: shared, whose files share a worker's modules (isolate false) for src, tests, scripts, eslint, the hooks and the docs, and isolated, the playground, whose page keeps module state and whose tests mock the library. The backlog and named-calculation tests read their files once, frozen. Remove the walk through US-033's test card, every step of which has its own test. Refs: EN-090.T3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Each page of AGENTS.md, CLAUDE.md, .claude/rules, .claude/skills and .claude/agents in words and tokens, the first request of each agent type, and every rule given an id for the trace of T2. Refs: EN-096.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
AGENTS.md, CLAUDE.md, the rule files, the skills and the agent types state each rule with its reason, in one place: AGENTS.md for every agent, CLAUDE.md for Claude Code alone, a skill or a rule file for its task or area, project-rules as the digest of AGENTS.md. The repeated rules are merged, the run's rules of EN-086 kept, and the tooling rule on Git tests widened as EN-099 asked. The story traces each old rule to its new place. Refs: EN-096.T2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The pages total 39,500 tokens against 44,900, the main thread's instructions 6,300 against 7,000; a story worker starts about 660 tokens lighter, the types preloading project-rules alone 30 to 310 heavier. Refs: EN-096.T3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Closes: EN-096 Rule-docs: none affected, no rule of docs/domain/ changed Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The run's progress page published as a claude.ai Artifact was dropped after the Product Owner saw it, on 2026-10-17: it was not useful. The crate tools/progress-page, its npm script progress:page and its rows in the tooling docs go; nothing writes .git/metrics/progress.html nor progress-page.json any more. run-totals keeps projects_dir and count_run in its library, which its own binary uses for run:end, metrics:session -- --run and the status line, with the cache run-cache.json; count_run returns the tokens only, the cache it returned being read by the page alone. Refs: EN-087 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
…t page The run no longer publishes a progress page at its start, after each merge nor at its stop: the commits and the status line show its progress. The section The progress page of docs/tooling/agent.md goes with the tool it described. Refs: EN-087 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The story gets its decision of 2026-10-17: the page was not useful once seen on a live run, so it was removed, and what run-totals kept from it. It stays done, its work delivered then removed. For the main thread: the feedback row, the improvement row of 2026-10-16 opened again, and F20's criterion 5. Refs: EN-087 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Refs: EN-087
Refs: EN-087 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
…rial Check the agent's rules, skills and docs after the four rewrites, the light evolvability review, the Opus and Sonnet story workers compared, the first request after EN-096, and the frictions of F20's run for the improvement log. Correct EN-066's T3, which named EN-096 as the Sonnet story. Refs: CHK-021.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Closes: CHK-021 Rule-docs: none affected Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Refs: CHK-021
… its base The audit found check-handback taking the worktree's folder for the story id: a folder named otherwise found no feature, and the commits were then counted over the whole history (934 listed once). The story now comes from the branch, then the folder; the base is the feature branch, or origin/develop for an epic's own story, found by the worktree crate's functions instead of a copy of them; with no base the naming is not checked; a refusal lists ten commits and counts the rest. story_of_branch moves to the worktree crate. The tests run Git with an empty home and no system config. agent.md and EN-088 say who is checked and that SubagentHandback exists only in auto mode (REF-CC-HOOKS read again). Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The audit found git:commit --push pushing develop from the main checkout, which takes merged pull requests only; a feature branch stays pushable, since the main thread writes the shared files of a merge there. The binary's tests now run Git with an empty home and no system config, and prove that sync on main is refused before its fetch. Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The audit found the hook skipping every line after a here-string or a shift, so a later page read passed; cutting a quoted address at a & or a ;; refusing installers piped into sh, archives into tar, link checks to /dev/null, files saved under a name that is not a page's and registry hosts; and telling an agent without the library's tools to call library_get. A library_get whose fetch fails before any answer is now recorded as failed, so the page is no longer refused for good. The tests cover each case and the hook's limits. Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The audit found library-pages started through cargo run on every Bash call, waiting on cargo's build lock during a check:all, for up to 600 seconds. Its Bash handlers now carry an if filter, Bash(*curl*) and Bash(*wget*): a command the hook refuses names one, /usr/bin/curl and sh -c too, so no refusal is lost (REF-CC-PERMISSIONS, read for the wildcard). WebFetch keeps its handler. It and check-handback stop after 30 seconds instead of 600. A test reads the settings and fails if a filter or a timeout changes. The settings change was allowed on 2026-10-17, no guard weakened. Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The audit found no Rust test tagged with an F20 criterion, so the backlog test would fail once F20 is done. The tests proving criteria 1, 3, 4, 6 and 7 now carry their f20_acN_ names; criterion 8 gets a test that each rewrite as principles measures its pages at 2.30 characters per token and traces its rules; criterion 5, struck through when the Product Owner dropped it on 2026-10-17, is left out of the criteria to trace. EN-098's figures, estimated at characters / 4, are restated at 2.30 so that the four rewrites compare. Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
A cache given to run_tokens is now proved read, and a stale tally proved dropped with its tokens; a second session's transcript is counted; the run's duration is matched by its form, no longer flaky across a second. parked_story refuses a front matter never closed, and each parked story must hold its question. The context test tells the task from a later user line and counts one row per type; the usage snapshot drops a window without its reset time; a tally comment says what it checks. Rust files the audit touched are formatted by cargo fmt. Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The rule read as if a binary that runs git removed every inherited GIT_* variable, which git-sequences, check-handback and run-totals do not: run by the agent in the real repository, they inherit no hook's GIT_DIR. The rule is the tests': each removes them from every command it starts, git itself or a binary that runs it. Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
The audit found the story files listed by three copies of the same code, in worktree-new, git-sequences and check-handback. The worktree crate now exports story_files, which each calls. The other duplicates it found, the tests' clean helpers and the JSON and usage readers, wait for F21's test-support crate (EN-103). Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
…-checks npm run mutate on the new crates' main files caught 19 mutations and left two: a usage field missing counted as 1 in context:size, and a negative offset in the run cache read as 1. A test now covers each, and fails with the mutation written back by hand. Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Each finding of the auditor and the verifier with its outcome and commit, the mutation spot-checks, the breadth checks, the sources and questions F21 needs and the light evolvability check. Refs: AUD-022.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Closes: AUD-022 Rule-docs: none affected Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Each of F20's seven criteria left after criterion 5 was struck, its tagged tests run again and the command a person would run: the first requests per agent type from the run's own transcripts, the models, the hand-backs checked during the run, the run's totals, the week's limit, git:sync, a curl sent to the library, and the pages' size today. Refs: VAL-021.T1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Twelve lines drafted by val:prepare and each tried: the first requests per agent type, the models and the decision to keep the story worker on Opus, the hand-back line, the run's totals on the status line and in the session report, the week's limit, the run skill's parked questions and pushes, git:sync, git:commit, a curl sent to the library, the library's uses per project and the conventions' size. Refs: VAL-021.T2 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
What F20 changed in plain words, with the figures before and after: the first request per agent type, the models and the Sonnet trial, the four rewrites' size, the Git sequences in one call, pages read from the library, the hand-back check, a run's totals and its stops, what was tried then dropped, the audit's findings and the commands to try; listed in the guide's index. Refs: VAL-021.T3 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
F20 validated by the agent on 2026-10-18 under ADR-0072: the decisions of the validation (criterion 5 struck, the Sonnet trial inconclusive and the story worker kept on Opus to confirm, the phone push left to the Product Owner's setting, the library's project recorded once merged), the result of the 12 lines, and the journal entry and an improvement row for the main thread. Refs: VAL-021.T4 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
Validated by the agent under ADR-0072 on 2026-10-18; the state of E17. The journal entry is in the story, for the main thread. Closes: VAL-021 Closes: F20 Rule-docs: none affected, a tooling validation Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01478CPLTLtRpwam8ZEemroe
feat(tooling): F20, a context diet for every agent
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release
E15 — Place text in symbols (F05, F14, F16, F15, F17), validated by the Product Owner on 2026-10-15 and 2026-10-16, reviewed at REV-003. To be merged by the Product Owner with a merge commit once the CI is green (
docs/tooling/releases.md).Before merging
E15's epic file lists a step before E15's release: a release without an extra commit on
main(release-please'srelease-prstep ondevelop, onlygithub-releaseonmain). It is not done yet; decide whether to make it first, or to release as before and bringdevelopup tomainafterwards.E15 itself stays
in-progressuntil its retrospective (RET-003).🤖 Generated with Claude Code