Skip to content

Project board decision rows can be listed but never opened #2041

Closed

Description

@HugoXK

Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment on this issue.

Written-by: FlyBot Lead
Claimed-by: FlyBot Lead
Claim-Id: 95933d41dc0c46eca230c105c4174339
Branch: dev/1-decision-open
Base: 00a3e67
At: 2026-11-01T13:05:13Z

Implementation: FlyBot (ours) — PR follows within 24h. Do not pick up without a pickup-ok comment.

Written-by: FlyBot Lead

What happens today

The Project board lists a project's decision files as rows: each row carries data-path and data-sha256 and nothing else — the row is a plain div, with no click target, no link, no copy action (core/src/client/project-board.js, the decision row in DecisionsSection). So a person reading the board can see that decisions/2026-10-31-…md exists and when it was last written, but cannot open it.

The only way to read a decision's text today is to ask a Bot, which reaches for the project_state tool (core/src/host/project-state.js, readProjectState), which already knows how to answer three states for one file: its text, absent, or too large, with MAX_BYTES bounding the read.

So the panel can name 200 decision files and open none of them.

Expected

  • A decision row is reachable and activatable: keyboard focus and activation work, and the row is a button or link rather than an inert div.
  • Activating a row expands that decision's text under the row, in place; activating it again collapses it. One row open at a time is enough; the open row must be identifiable in the test view.
  • The text comes from a host endpoint that accepts only a name this board read listed — the set the board itself produced for this render, including a name past the 200-row cut. A name outside that set answers not listed and is never read: no stat, no open, no content in the response.
  • The three states are the reader's own: text, absent, too large. A file over MAX_BYTES answers too large rather than being truncated silently.
  • A row whose file has since been deleted answers absent and stays a row; it does not become an error banner.
  • Nothing new is read as a side effect: the endpoint must not become a second, wider read path beside readProjectState.

Acceptance (red first)

Host tests (core/test/project-board.test.js or the reader's own suite, the Dev's call, recorded in the PR):

  1. A decision listed by the board opens and returns its text.
  2. A name outside the listed set (decisions/../outside.md, an absolute path, a name one level down under the decisions folder, a symlink) answers not listed and the file is provably not read — the case fails if the host stats or opens it.
  3. A file over the bound answers too large and no partial text is returned.
  4. A name that fell past the 200-row cut but is still on disk still opens (this depends on the past-cut fix that is already on main).
  5. A row whose file was deleted after listing answers absent.

Client tests (core/test/…client… in the existing style): activating a row asks for that row's path and renders the returned text under the row; activating again collapses it; a not listed/absent answer renders its own sentence and never a stack of raw HTML.

Scope

  • core/src/host/project-board.js (or the reader beside it): one endpoint that takes a project and a name, answers the reader's three states, and refuses anything not in the listing the board just produced.
  • core/src/client/project-board.js: the decision row becomes activatable, expands the text, collapses on a second activation, keyboard reachable.
  • Tests on both sides; docs/subsystems/core-host.md and the client doc row; changelog fragment.
  • core/client.js and patches/ds-bot/0008-client-bundle.patch regenerated by generate; the host mirror under patches/ds-bot/files/src/host/ likewise. Nothing else in the generated set may move.
  • Out of scope: editing a decision, opening more than one at a time, search, and any change to how decisions are written.

Neighbour issues (not this cut)

None of those gives a person a way to open a decision's text; this one does.

Dedupe

Searched before opening: decision file open/read panel across title and body, 46 / 101 / 19 results scanned, nearest #1809, #1818, #1772, #1749 (all closed, none about reading a decision's body from the board). No issue covers this.

Activity

  1. HugoXK commented on Nov 1, 2026

    @HugoXK
    ContributorAuthor

    Heartbeat

    Written-by: FlyBot Lead
    Still-working: 95933d41dc0c46eca230c105c4174339
    At: 2026-11-01T13:54:04Z

  2. HugoXK commented on Nov 1, 2026

    @HugoXK
    ContributorAuthor

    Heartbeat

    Written-by: FlyBot Lead
    Still-working: 95933d41dc0c46eca230c105c4174339
    At: 2026-11-01T13:54:12Z

  3. HugoXK commented on Nov 1, 2026

    @HugoXK
    ContributorAuthor

    Heartbeat

    Written-by: FlyBot Lead
    Still-working: 95933d41dc0c46eca230c105c4174339
    At: 2026-11-01T14:15:32Z

  4. HugoXK commented on Nov 1, 2026

    @HugoXK
    ContributorAuthor

    Release

    Written-by: FlyBot Lead
    Released: 95933d41dc0c46eca230c105c4174339
    Reason: shipped in #2046 (merged 816d1a8)
    At: 2026-11-01T14:33:50Z

  5. added 2 commits that reference this issue on Nov 1, 2026
    816d1a8
    212f151
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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions