ReviewOS

stacks/uplink

feat(homepage): the three-text split is asserted twice and never shown

#24
Open glennmichael123 opened this 8 days ago ·
8 days ago

Part of #6.

The reply-splitting behaviour is the one mechanic on the page that a visitor cannot infer from what is shown. Both exchanges in the demo section are a single short ask and a single short answer, so nothing on the page shows what arrives when the answer is long: three texts, then the tail waiting behind more. That is the detail that makes the thin-link pitch concrete, and it is currently only prose.

What is there today

  • The exchanges array holds exactly two entries, each one ask and one reply, with a one-line note: resources/views/index.stx#L19-L30, notes at resources/views/index.stx#L23 and resources/views/index.stx#L28.
  • The split is asserted in the fourth how-it-works step, "split into at most three messages": resources/views/index.stx#L36.
  • It is asserted again in the bento cell, "A long reply is split into three texts, and the rest waits until you send more": resources/views/index.stx#L281.
  • more is listed in the keyword table with the gloss "the rest of a long reply", which names the word without showing it: resources/views/index.stx#L43.
  • The demo section is a @foreach over the array, so it already renders any number of entries, with u-reveal on the ask and u-reveal-late on the reply: resources/views/index.stx#L224-L236.
  • Those two classes are defined once, inside the reduced-motion media query and an @supports (animation-timeline: view()) guard, so a new entry needs no new CSS: resources/views/index.stx#L162-L169.
  • The satellite prefix is added by the template, not stored in the data: resources/views/index.stx#L231.
  • The section header promises real texts with a real date: "Two real texts, answered." and "Replies from September 27, 2026, exactly as Uplink sends them": resources/views/index.stx#L221-L222.
  • The real behaviour: the reply is chunked, the first maxParts parts go out now, the rest is stored on the conversation, and the last sent part gets a line appended reading (N more, text "more"): app/Uplink/uplink.ts#L436-L446, marker at app/Uplink/uplink.ts#L443.
  • Defaults that decide the shape of a real capture: replyPrefix is the satellite glyph plus a space, maxChars is 1200 and maxParts is 3: app/Uplink/config.ts#L58-L60.
  • The chunker cuts at a paragraph, then a line, then a sentence, then a word boundary, and rejects a boundary inside the first third of the window: app/Uplink/format.ts#L38-L47 and app/Uplink/format.ts#L56-L58.
  • more is matched only as a whole message, with continue reply as its alias: app/Uplink/commands.ts#L19-L20, app/Uplink/commands.ts#L24-L27.
  • The hero image is already the element the page loads first, at fetchpriority="high": resources/views/index.stx#L206-L215.
  • public/videos/ contains only a README, so no video asset exists yet.

Proposal

  1. Widen the entry shape in resources/views/index.stx#L19-L30 so one entry can carry a sequence of turns rather than a fixed ask and reply, keeping the two existing entries expressible in the new shape with no copy change.
  2. Add a third entry with the turns of one real run: the long ask, the parts that actually went out with the marker line on the last one, the literal more, and the continuation.
  3. Loop the turns inside the article at resources/views/index.stx#L224-L236, so the more turn and its continuation stay in the same article rather than being pushed apart by the space-y-14 gap at resources/views/index.stx#L224. Each ask keeps u-reveal, each reply keeps u-reveal-late.
  4. Write the third note in the same shape as resources/views/index.stx#L23 and resources/views/index.stx#L28: what the run did, how many parts it produced, how long it took.
  5. Update the header at resources/views/index.stx#L221, since "Two real texts" stops being true, and keep the date sentence at resources/views/index.stx#L222 true for the new capture.
  6. Do not shoot a screen recording for this. It carries no information the bubbles do not, the hero at resources/views/index.stx#L206-L215 is already the first paint, and a video needs a poster plus a reduced-motion story that the file's own no-client-script constraint at resources/views/index.stx#L12-L13 does not want. If a moving image is wanted later, the candidate is a muted looping WebM of the menubar flow in the download section with preload="none" and the existing public/images/menubar-setup.png as its poster, which resources/views/index.stx#L344 already ships.

Requirements

  • The text is a capture, not a mock-up. Run a real long task through Uplink and paste what Messages received. The header at resources/views/index.stx#L222 says "exactly as Uplink sends them", and that sentence is the page's whole credibility.
  • Do not fake the cut. The chunker never breaks a word and prefers a paragraph, line or sentence boundary, per app/Uplink/format.ts#L38-L47. A cut mid-word or an invented ellipsis would contradict the code.
  • The marker is verbatim. The last sent part ends with a newline and (N more, text "more") exactly as written at app/Uplink/uplink.ts#L443, with the real count. The reply bubble is whitespace-pre-line at resources/views/index.stx#L231, so the newline renders as written.
  • Leave the prefix out of the data. resources/views/index.stx#L231 prepends the satellite glyph, so each part rendered as its own bubble gets it, which matches what really arrives. Both existing entries already store unprefixed text.
  • The more bubble is the bare word. app/Uplink/commands.ts#L24-L27 matches only a whole message, so showing anything longer than more in that bubble would show something that would have gone to the agent as a task instead.
  • Keep the whole entry in one article. Two array entries would read as two unrelated conversations across the space-y-14 gap, which loses the point that the continuation belongs to the reply above it.
  • No new CSS and no script. Reuse u-reveal and u-reveal-late from resources/views/index.stx#L167-L168. No new keyframes, no new media query, no <script>.
  • No em-dash or en-dash. app/Uplink/format.ts#L25 converts both to a spaced hyphen on the way out, so a genuine capture already complies. Do not reintroduce one in the note or the new header.

Acceptance

  • resources/views/index.stx is the only file changed, and nothing is added under public/.
  • The demo section renders three entries, and the third shows a truncated reply carrying the marker line, a more from the user, and the continuation.
  • Feeding the third entry's reply text through toPlainText and chunk with maxChars 1200 minus the prefix length reproduces the parts shown, and the marker matches app/Uplink/uplink.ts#L443 including the count.
  • The section header no longer says "Two", and the date sentence is true of all three entries.
  • The built page adds no <script>, no <video> and no @keyframes relative to the current build.
  • With prefers-reduced-motion: reduce, and in a browser without animation-timeline: view(), the third entry is fully visible and static.
  • grep -nP '\x{2014}|\x{2013}' resources/views/index.stx returns nothing.

Sign in to comment on this issue.