Hint panel omits the optional count argument after seed <table> #26

Closed
opened 2026-06-12 11:59:51 +01:00 by claude-clouddev1 · 1 comment
Collaborator

Found in manual testing.

Entering seed <table> (trailing space) shows the continuation
candidates set and --seed in the hint panel, but never mentions
the optional count argument at all
— even though count is the
most common thing a user types next (seed users 50).

Root cause

seed <table> is already a complete command (the count is
optional), so the ambient-hint ladder surfaces continuation
candidates (set, --seed). The count is a bare positional
number with no keyword/fixed token, so it produces no Tab
candidate and is therefore invisible.

An IntroProse HintMode (as used for the CREATE TABLE element slot)
does not work here: that mechanism only surfaces for an
incomplete required slot. For a complete command's optional
continuation, the outer Seq's successful match clears
pending_hint_mode before it can be shown (verified during the seed
Phase 2 work; the attempt was reverted).

What's needed

A general way to advertise optional positional non-keyword
arguments
(a bare number / path) in the hint panel alongside keyword
candidates. Options to weigh:

  • A hint-resolution path that surfaces a prose line for the position
    in addition to the candidate ladder, when an expected node is a
    bare NumberLit/BarePath with no candidate text.
  • A synthetic candidate placeholder (e.g. <count>) — but that muddies
    the "candidates are insertable tokens" contract.

Smallest visible scope: seed <table> should mention a row count
(default 20). Broader value: any command with an optional positional
number (none today besides seed, but the pattern will recur).

Severity: minor UX polish — count is documented in help seed and
seed <table> <n> works.

**Found in manual testing.** Entering `seed <table> ` (trailing space) shows the continuation candidates `set` and `--seed` in the hint panel, but **never mentions the optional `count` argument at all** — even though `count` is the most common thing a user types next (`seed users 50`). ### Root cause `seed <table> ` is already a *complete* command (the count is optional), so the ambient-hint ladder surfaces continuation **candidates** (`set`, `--seed`). The count is a bare positional **number** with no keyword/fixed token, so it produces no Tab candidate and is therefore invisible. An `IntroProse` HintMode (as used for the CREATE TABLE element slot) does **not** work here: that mechanism only surfaces for an *incomplete* required slot. For a complete command's optional continuation, the outer `Seq`'s successful match clears `pending_hint_mode` before it can be shown (verified during the seed Phase 2 work; the attempt was reverted). ### What's needed A general way to advertise **optional positional non-keyword arguments** (a bare number / path) in the hint panel alongside keyword candidates. Options to weigh: - A hint-resolution path that surfaces a prose line for the position *in addition to* the candidate ladder, when an expected node is a bare `NumberLit`/`BarePath` with no candidate text. - A synthetic candidate placeholder (e.g. `<count>`) — but that muddies the "candidates are insertable tokens" contract. Smallest visible scope: `seed <table>` should mention a row count (default 20). Broader value: any command with an optional positional number (none today besides seed, but the pattern will recur). Severity: minor UX polish — `count` is documented in `help seed` and `seed <table> <n>` works.
claude-clouddev1 added the enhancement label 2026-06-12 11:59:51 +01:00
Author
Collaborator

Fixed in ee3ccd8.

At seed <table> ▮ the hint panel now shows a prose line advertising the optional row count (and the other options), instead of only the set / --seed chips:

Optionally a row count, e.g. 50 (default 20); .column to fill one column on existing rows; set to pin a column; --seed to fix the RNG

Tab still cycles set / --seed (completion is independent of the hint render).

Mechanism (the prior attempt was reverted because pending_hint_mode is cleared by the trailing optionals): the existing IntroProse HintMode (ADR-0024 §HintMode-per-node, issue #4's CREATE-TABLE element hint) is the right tool — it shows prose that introduces a candidate-less position with the keyword alternatives folded in. To make it reach this position, walk_optional now stashes a skipped inner's IntroProse key into a new WalkContext.surviving_intro_hint (key + position) before the empty match clears pending_hint_mode. A position guard keeps it only when the skip position is the cursor, so it never leaks past a later-consumed set … clause, nor once the count is supplied. The resolver returns it ahead of the empty-expected short-circuit. The seed count is wrapped Hinted{IntroProse("hint.seed_count")}.

Scope (per the question on this issue): the prose mentions both the count and the seed <table>.<column> column-fill form. Only IntroProse is carried — ProseOnly/ForceProse and the CREATE-TABLE element (a required Repeated, unaffected) keep their existing paths. No AmbientHint/renderer change.

Behaviour (all tested):

  • seed users ▮ → count prose ✓ (both simple and advanced mode)
  • seed users 50 ▮set / --seed chips (count given, no hint) ✓
  • seed users set email='x' ▮ → no count leak past the clause ✓
  • seed users.email ▮ → count prose (count valid after column-fill) ✓

Decision recorded in ADR-0022 Amendment 7. +3 tests; full suite green (2436 pass, 1 ignored).

Fixed in `ee3ccd8`. At `seed <table> ▮` the hint panel now shows a prose line advertising the optional **row count** (and the other options), instead of only the `set` / `--seed` chips: > Optionally a row count, e.g. `50` (default 20); `.column` to fill one column on existing rows; `set` to pin a column; `--seed` to fix the RNG Tab still cycles `set` / `--seed` (completion is independent of the hint render). **Mechanism** (the prior attempt was reverted because `pending_hint_mode` is cleared by the trailing optionals): the existing `IntroProse` `HintMode` (ADR-0024 §HintMode-per-node, issue #4's CREATE-TABLE element hint) is the right tool — it shows prose that *introduces* a candidate-less position with the keyword alternatives folded in. To make it reach this position, `walk_optional` now stashes a skipped inner's `IntroProse` key into a new `WalkContext.surviving_intro_hint` (key + position) **before** the empty match clears `pending_hint_mode`. A **position guard** keeps it only when the skip position is the cursor, so it never leaks past a later-consumed `set …` clause, nor once the count is supplied. The resolver returns it ahead of the empty-expected short-circuit. The seed count is wrapped `Hinted{IntroProse("hint.seed_count")}`. Scope (per the question on this issue): the prose mentions **both** the count and the `seed <table>.<column>` column-fill form. Only `IntroProse` is carried — `ProseOnly`/`ForceProse` and the CREATE-TABLE element (a required `Repeated`, unaffected) keep their existing paths. No `AmbientHint`/renderer change. **Behaviour (all tested):** - `seed users ▮` → count prose ✓ (both simple **and** advanced mode) - `seed users 50 ▮` → `set` / `--seed` chips (count given, no hint) ✓ - `seed users set email='x' ▮` → no count leak past the clause ✓ - `seed users.email ▮` → count prose (count valid after column-fill) ✓ Decision recorded in **ADR-0022 Amendment 7**. +3 tests; full suite green (2436 pass, 1 ignored).
Sign in to join this conversation.