Skip to content

planning: add jump-to-question and search for large interviews #5915

Description

@kyle-sexton

Severity: med

Problem

With 100+ questions there is no way to go straight to a question by number or find one by a word. No URL hash selects a question. The page never reads location.hash. The keyboard sheet maps "/" to the Show filter (index.html:493), and the filter offers only All, Open, Review, Pending and Answered. Each rail button's accessible name is its whole card (id, title, every "needs" chip, every state chip, the Claude preview; railItem, index.html:729-754), which is long for screen-reader navigation.

Expected

Typing a number or words jumps to or filters questions, and #Q100 in the URL opens Q100.

Suggested fix

  • Add a search box to the rail toolbar that matches id, short title and title, and bind "/" to it.
  • Read location.hash on load and on hashchange and call select() (index.html:1521); write the hash in select().
  • Give .qbtn an aria-label of id, short title and state, and move the rest into aria-describedby.

Acceptance criteria

  • Typing "100" then Enter selects Q100; typing "merge" filters to questions containing it.
  • Loading /#Q100 selects Q100.

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 2, 2026
  2. kyle-sexton commented on Oct 4, 2026

    @kyle-sexton
    MemberAuthor

    This was generated by AI during triage.

    Routing: human-gated, status: needs-decision, work-class: scoped (C3, feature), priority: medium (assessed default). The direction is clear, but it adds a new control and changes an existing key binding, so three small interaction choices need the owner before a worker builds it.

    Verified against current code:

    • The page never reads or writes location.hash. Basis: verified, no match for location.hash or hashchange in plugins/planning/surface/index.html.
    • "/" focuses the Show filter (All, Open, Review, Pending, Answered), and the keyboard sheet documents it as "Filter". Basis: verified, index.html:406, index.html:493, index.html:2059.
    • Each rail button's accessible name is its whole card: id, title, every chip and the Claude preview. Basis: verified, index.html:729-754 (railItem).

    Where I looked: the rail toolbar, railItem, select(), the key handler and keyboard sheet, and docs/out-of-scope/ (no match). DEFERRED.md parks nothing similar. #5796 and #5795 both list this item as out of their scope, so there is no cluster.

    Open decisions:

    1. The "/" key. Move "/" to the new search box, as the issue asks, and give the Show filter another unused key (RECOMMENDED; "f" is already Full-screen visual), or keep "/" on the filter and give search a different key. Moving it changes a documented shortcut.
    2. Search with the Show filter. RECOMMENDED: search narrows within the current Show filter (both apply), and the rail says when the filter hides matches. The alternative is that search ignores the Show filter while text is typed.
    3. Writing the hash. RECOMMENDED: select() replaces the hash (no new history entry per question), so Back leaves the page as today. The alternative pushes a history entry per selection, so Back walks the questions.

    Once these are answered, this can go to agent-ready with the brief below.

    Agent Brief

    Type: Feature
    Summary: In a large interview, the user can jump to a question by number, filter the rail by words, and open a question from the URL hash.

    Current behavior:
    The rail offers only the Show filter. No URL selects a question, and each rail button's accessible name is the whole card.

    Desired behavior (pending the decisions above):

    • A search box in the rail toolbar matches question id, short title and title. Typing a number and pressing Enter selects that question; typing words filters the rail to matching questions.
    • The search key and the filter key follow decision 1, and the keyboard sheet lists both.
    • Search and the Show filter combine per decision 2.
    • Loading the page with #Q100 selects Q100; a hashchange selects the named question; selecting a question updates the hash per decision 3. An unknown id in the hash leaves the selection unchanged.
    • Each rail button's accessible name is its id, short title and state; the other card content moves to an accessible description.

    Key interfaces:

    • The rail toolbar and its key bindings.
    • select(): reads and writes the hash.
    • railItem: accessible name and description of each rail button.

    Acceptance criteria:

    • Typing "100" then Enter selects Q100; typing "merge" filters the rail to questions containing it.
    • Loading /#Q100 selects Q100.
    • Each rail button's accessible name is id, short title and state.
    • UI tests in the planning surface test suite cover search, hash load and the accessible name.
    • The planning surface test suite passes.

    Out of scope:

  3. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    status: needs-decisionAwaiting a human or maintainer judgment call.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 4, 2026
  4. kyle-sexton commented on Oct 13, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded. The owner approved applying independently verified recommendations on 2026-10-12.

    Wants a rail search box, '#Q100' URL hash selection, and shorter accessible names for rail buttons. Needs-decision on three small interaction choices; nothing is built yet (no location.hash use on main).

    Verified by an independent fresh-context check (confirmed, risk low): gh issue view 5915 (OPEN, needs-decision, triage decisions 1-3); origin/main index.html:414 (filter aria-keyshortcuts '/'), :505 keyboard sheet ('/' Filter, 'f' Full-screen visual), :2104 ('/' focuses filter), :1029 Full screen (f); git grep location.hash/hashchange origin/main index.html: none

    Admission to an agent lane stays with the work-class rules and owner ratification.

  5. kyle-sexton commented on Oct 13, 2026

    @kyle-sexton
    MemberAuthor

    Owner batch-ratified this admission in an attended session on 2026-10-12: work-class: scoped. Rule: class C1-C3, no trust surface, the independent check confirmed the recorded decision, and no owner step remains.

  6. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 13, 2026
  7. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 18, 2026
  8. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 20, 2026
  9. melodic-automation-lanes commented on Oct 20, 2026

    @melodic-automation-lanes
    Contributor

    The work-resolve-issue lane stopped partway through this issue and needs a person.

    Why, in the run's own words:

    The run reported done but left a required check undone, so it is not finished.

    What the run says it did not do:

    • check-affected's shellcheck step failed with exit 3 on plugins/planning/surface/surface-checks.sh: the installed shellcheck prints its usage text and does not accept the --rcfile option the check passes. This run's only edit to that file is a number (162 to 171), so the failure comes from the enviro
    • The Playwright UI checks (surface-ui-c.test.sh, including the 9 new checks) were not run: this run's shell allowed only the named wrapper scripts, so the new tests are unexecuted and the page was not loaded in a browser.
    • The changelog fragment was written by hand because new-changelog-fragment refuses a detached HEAD; it passes check-changelog-fragments.
    • chmod +x on the changed .sh file could not be run in this shell; the file's existing mode was kept by the edit.

    Partial work is on the branch work-resolve-issue/issue-5915-39426047058-1. A retry continues from it; delete the branch first to start again from the default branch.

    Run: https://github.com/melodic-software/claude-code-plugins/actions/runs/39426047058

    To retry, remove needs-human and add agent-ready again.

  10. removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Oct 20, 2026
  11. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions