Skip to content

Settings: a landing page that answers three questions, and a blurb for every screen (v0.21.266) - #69

Merged
QR-Madness merged 3 commits into
masterfrom
feat/settings-overview-and-blurbs
Aug 7, 2026
Merged

Settings: a landing page that answers three questions, and a blurb for every screen (v0.21.266)#69
QR-Madness merged 3 commits into
masterfrom
feat/settings-overview-and-blurbs

Conversation

@QR-Madness

Copy link
Copy Markdown
Owner

Wave 3.2 of the settings campaign. No per-key write-ups in this one — it lands the two things every remaining slice depends on, plus the comprehensive Overview.

Section blurbs — authored once, three surfaces

Per-key help answered "what is this knob". Nothing answered "what is this screen, and why would I come here". Every section hand-wrote its own header description (37 of them), the Overview showed bare link lists, and the generated reference had section headings with nothing under them.

settings_help.yaml gains a sections store keyed by screen id — all 21 screens authored, three fields each. ALL_SECTIONS in the registry is now the full screen directory: the 14 that own settings plus the 7 that configure their own subsystem (prompt layers, templates, themes) and previously had no server-side identity at all.

Manifest v3 carries them as a sections block — label, blurb, and writable-key count, the count derived from the entries in the same response so "22 settings" cannot drift from what the screen holds.

Unlike per-key help, this gates from day one: there are only ~20 screens, the Overview lists all of them, and a missing blurb is a bare link.

The chrome gap that was blocking the cadence

ModelPickerField lived outside the field kit and rendered its own label, so it could not take a binding. ~25 of the remaining keys are model-valued. Every one rendered with no default chip, no reset, no help popover, and no data-setting anchor — so Wave 2 search could find those keys and then fail to land on them.

It now renders through FieldShell when bound. Unbound callers (the profile editors, which have no manifest behind them) render exactly as before — asserted by test. Recall's two pickers and Conversation Context's three are backfilled; the golden section has no unanchored keys left.

Overview

  • Search where you land. State lifts out of SettingsNav into a shared context, so the Overview hosts its own box driving the same query, results inline. Mobile fix as much as anything: there the nav is a full-screen takeover.
  • Getting set up — three rows for the things nothing else works without, each read from the manifest, each a link to the screen that fixes it. A key counts as configured because the server reports a non-empty value, never because the value was inspected. The list disappears once every step is done.
  • Tiles gained substance — each screen's blurb and how many of its settings you've moved.
  • Still no reset from the digest, deliberately: rows land on the control, which has its own reset beside its help and its bounds.

Two defects found on the way

  • Every table in the generated reference rendered as literal pipe text. Blocks are joined with a blank line between them and the generator appended table rows one block at a time, so Markdown saw each row as its own paragraph. Shipped that way since Wave 1.
  • Two humanizers named the same setting differently — "Search · max results" in the nav's search, "Search · Max results" in the Overview digest, on the same screen.

The reference is also restructured to read like the app: one heading per screen in nav order, blurb, that screen's written-up settings, then a table of what is left. The old flat "documented keys, then a wall of tables" does not scale as the cadence fills in.

Verification

  • Backend suite green; task test:sterile 1243 OK
  • Client 487 tests (12 new: Overview suite, picker chrome, golden-section anchors); tsc clean
  • ruff check api/ clean; pyright baseline 0
  • task docs:check green, zero warnings; production build OK
  • Live walk, fresh tab, zero console errors: manifest reports v3 with 21 sections; tiles render blurb + changed-count; the setup list correctly hides on a fully-configured install (verified against the live manifest); typing in the Overview hero mirrors into the nav's box; searching "hyde model" lands on memory:recall_hyde_model with anchor, flash, dot, help and reset — a control that had none of it before. 375px pass, no horizontal overflow.

Assisted-by: Opus 5

Per-key help answered "what is this knob"; nothing answered "what is this
screen, and why would I come here". Every settings section hand-wrote its own
header description, the Overview showed bare link lists, and the generated
reference had section headings with nothing under them — three surfaces, three
copies, none of them shared.

`settings_help.yaml` gains a `sections` store keyed by screen id, three fields
(summary / what / why), all 21 screens authored. `ALL_SECTIONS` in the registry
is now the full screen directory: the 14 that own settings plus the 7 that
configure their own subsystem (prompt layers, templates, themes) and previously
had no server-side identity at all.

Manifest v3 carries them as a `sections` block with each screen's label, blurb,
and writable-key count — counts derived from the entries in the same response,
so "22 settings" cannot drift from what the screen holds.

The generated reference is restructured to read like the app: one heading per
screen in nav order, blurb, then that screen's written-up settings, then a table
of what is left. Previously it was one flat list of documented keys followed by
a wall of tables, which does not scale as the cadence fills in.

Fixes a real defect while there: every table on that page rendered as literal
pipe text. Blocks are joined with a blank line between them, and the generator
appended table rows one block at a time, so Markdown saw each row as its own
paragraph. Tables are now emitted as a single block.

Section blurbs gate fully from day one — there are only ~20 screens and the
Overview lists all of them, so unlike per-key help there is no cadence to run.

Assisted-by: Opus 5
The Overview knew what you'd changed. On a fresh install that is nothing, so
it said "everything is on its shipped default" and stopped — a landing page
with nothing to land on. The tiles beneath it were bare link lists.

**Search moved to where you land.** State lifts out of SettingsNav into a
shared context so the Overview hosts its own box driving the *same* query,
with results inline. This is a mobile fix as much as anything: there the nav
is a full-screen takeover, so a landing page whose only search lives in the
nav is not a landing page.

**Getting set up.** Three rows for the things nothing else works without —
connect a provider, pick a model per role, add a search key — each read from
the manifest and each a link to the screen that fixes it. A key counts as
configured because the server reports a non-empty value, never because the
value was inspected: secrets arrive redacted and stay that way. The list
disappears once every step is done rather than becoming a row of ticks.

**Tiles gained substance** — each screen's authored blurb and how many of its
settings you've moved, counted from the manifest so they cannot drift.

Still no reset from the digest, deliberately: rows land on the control, which
has its own reset beside its help and its bounds. A second write path from a
list with no context and no undo would be worse, not more convenient.

Two fixes found on the way:

`ModelPickerField` now takes the field kit's chrome. It sat outside the kit,
so every model-valued setting — the most common kind left in the settings
area, ~25 of them — rendered with no default chip, no reset, no help, and no
`data-setting` anchor. Settings search could find those keys and then fail to
land on them. Unbound callers (the profile editors, which have no manifest)
render exactly as before, asserted by test.

One humanizer, not two. Search capitalised the first letter of the whole path
and the digest capitalised each segment, so the same setting read as "Search ·
max results" in one list and "Search · Max results" in the other — on the same
screen.

Assisted-by: Opus 5
The Recall panel had the same hole the rest of the area did: its HyDE and
Self-Query model pickers shipped unbound, because the picker sat outside the
field kit. Both keys are fully written up, so search found them and then
dropped the user at the top of the section with no help beside the control.
Bound now — the exemplar has no unanchored keys left. Its test stub forwards
the anchor so a regression fails rather than passing silently.

ADR-17 gains the section-blurb property: the authored-once rule holds one level
up, and unlike per-key help it gates from day one — ~20 screens, and
`ALL_SECTIONS` is asserted against the client's SECTION_HIERARCHY.

The manifest endpoint test now pins to `MANIFEST_VERSION` rather than a literal
2; the shape assertions are the point, and a version bump is a deliberate act
elsewhere.

Release notes consolidated per the file's own rule (two web bullets into one,
two settings-fix bullets into one) to stay inside the size budget, and CLAUDE.md
trimmed back under its ceiling.

Assisted-by: Opus 5
@vercel

vercel Bot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agentx-docs-site Ready Ready Preview Aug 7, 2026 3:28pm

@QR-Madness
QR-Madness merged commit 4929ed1 into master Aug 7, 2026
4 checks passed
@QR-Madness
QR-Madness deleted the feat/settings-overview-and-blurbs branch August 7, 2026 15:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant