Skip to content

docs: idea register + ADR-016/017 stubs - #775

Open
lilyshen0722 wants to merge 3 commits into
mainfrom
docs/idea-register-and-adr-stubs
Open

docs: idea register + ADR-016/017 stubs#775
lilyshen0722 wants to merge 3 commits into
mainfrom
docs/idea-register-and-adr-stubs

Conversation

@lilyshen0722

Copy link
Copy Markdown
Contributor

Docs only — no code.

docs/plans/idea-register.md — an append-only inbox so ideas have somewhere to go the moment they happen, rather than living in a chat log. ~30 entries from this session across product structure, attention routing, runtime/commercial, AX, hardening, network primitives and process. Each has a status (raw/decided/building/parked/rejected) and graduates: a decision becomes an ADR, a body of work becomes an issue.

The point is that cutting something from a sprint stops being the same as forgetting it — cut items sit at parked with a trigger.

ADR-016 — pod model and visibility. Holds the problem shape: the creation flow's Team/Private choice sets one field and nothing else, communityListed has no writer at all, and "Private" means three different things in three surfaces.

ADR-017 — attention routing. Holds the reframe that humans will not sit and watch, so the primitive is deciding what deserves a human rather than gating every action — and names anti-spam as the unsolved problem rather than pretending it is solved.

Both are marked Proposed — not yet decided and say so in the body. They are not decisions.

Tracked as #768 and #769 under milestone #11.

lilyshen0722 and others added 3 commits July 27, 2026 17:39
"Load older messages" worked on the anonymous showcase route but did nothing in
a pod you had actually joined. Not a broken feature — it was never built there.
PR #764 added paging to the showcase reader only; the authenticated path fired
exactly one `?limit=50` request, kept no cursor, and exposed no way to ask for
anything older, so any conversation past 50 messages was simply unreachable.

The backend already supported it: messageController accepts `before`, and both
readers bottom out in the same PGMessage.findByPodId. The entire gap was
client-side.

- useV2PodDetail gains hasMore / loadingOlder / loadOlder. End-of-history is
  inferred from a short page, since this endpoint returns a bare array with no
  envelope and changing that shape would break every existing consumer.
- Pages are merged by id rather than concatenated: the socket can deliver a
  message while the request is in flight, and a plain concat would duplicate it.
- V2PodChat renders the pager at the top of the scroll container, styled to
  match the showcase pill so the two reading surfaces agree.

Two scroll defects had to be fixed or the feature would have looked broken:

- the auto-scroll effect keyed on `messages.length`, so prepending a page threw
  the reader from the older message they had just asked for straight back to
  the bottom. It now keys on the newest message's id, so prepends are ignored.
- a prepend changes scrollHeight and jumps the viewport, so the reader's
  position is held by restoring distance-from-bottom, which is invariant under
  a prepend.

6 hook tests: cursor correctness, prepend order, dedupe against an overlapping
socket message, no-op on an empty pod, and hasMore surviving a failed request
so the button stays retryable. Frontend suite 69/69, 316 tests. Lint at
baseline.

Needs a real-browser check after deploy — jsdom has no layout engine, so the
scroll-anchor behaviour specifically is not covered by these tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DMeWzgFxsfBcjoLVLewEES
The register is an append-only inbox so a thought has somewhere to go the
moment it happens; it graduates to an ADR when it becomes a decision, or an
issue when it becomes work. ADR-016 (pod model) and ADR-017 (attention
routing) are explicitly stubs holding the shape of each problem — neither is
a decision and neither should be cited as one.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reframe that simplifies the mechanism. The draft assumed a judge model watching
from outside and inferring what deserves escalation. But the agent already
knows what it is uncertain about — a judge has to reconstruct that after the
fact, expensively and worse.

Give the agent a budget of human interrupts instead. Scarcity becomes real from
its side, so conserving is its own interest. That deletes the judge from v1 and
demotes it to a fallback for agents that misreport.

Also records the prior art: Claude Code and Codex already ship attention
routing as a permission model — pre-declare the boundary, interrupt only on a
crossing. Their prompt blocks because a human is present; ours must queue
because nobody is. That is the entire delta, and it is far smaller than
building a judge.

And why AX becomes load-bearing rather than courtesy: an agent rationing a
scarce resource needs to see its budget, know what it may already do without
asking, and make a request a human can resolve in seconds.

Two weaknesses recorded rather than glossed: the framing is bad user-facing
copy, and budgeted self-reporting leans on model calibration — over-spending
self-corrects, under-asking produces silence, which looks like success.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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