Feature plan: Step 1 · Step 2 · Step 3 · Step 4

Debug mode: enabled

Effort study: railspike-effort / v3/reply_continuation · Ledger.

Execution state

  • Step 3 approved; feature branch feat/reply-continuation; planning commit 22ea20c19 precedes implementation. Six stages locally implemented; physical phone/release acceptance remains pending. No additional requests.

  • Step 4 entry, 2026-10-23: scope v1/R1/P2, baseline 3776264ed2ae9345294d3e93c25221037f6cd6e3, Codex single exposed rater; 0.95 total reaffirmed. Reference verification and prior exposure inherited from Steps 1–3. No measurement, independent rating or accepted outcome.

  • Physical iPhone Safari/Firefox acceptance and deployment remain pending; no new dependencies or schema changes authorized/proposed.

Stage 1 - Immediate captured text submission

  • Changes: standard inline text replies save a captured operation before clearing, paint a pending card before identity/preparation waits and confirm in place; failure/Retry belong to that card. A new shared asset uses existing signing, card and draft helpers, leaving legacy consumers unchanged.

  • Verification: node tests/browser/reply_continuation.mjs passes real isolated signed posting with preparation held, immediate card/empty focused editor, no navigation, newer draft isolation, prepare failure/Retry and injected storage failure retaining original text. JS syntax, PHP renderer lint and diff checks pass.

  • Notes: Stage 1 only; reload/uncertain-response and image/dedicated/phone work remain in subsequent stages. Planning commit 22ea20c19 confirmed before summary/application changes.

Stage 2 - Concurrent and reload-safe text recovery

  • Changes: independently retained operations, send-order display, per-operation browser locks, reload restoration without automatic submission and canonical-post reconciliation before retry. Exact prepared targets persist before finalization; a definitive server expiry plus confirmed absence permits explicit renewal. Existing pageshow cleanup now preserves recoverable operation cards. Accepted cards yield to an already rendered canonical card.

  • Verification: expanded node tests/browser/reply_continuation.mjs passes overlapping identical intentional sends with reverse completion, lost accepted response/reload with zero repeat finalization, retained newer draft, two-tab Retry producing exactly one canonical post, storage failure and Stage 1 checks. JS syntax/diff checks pass. Server source confirms write-locked finalization and definitive expiry rejection; no schema/API change.

  • Notes: Stage 1 commit de8ae2bcb. First reload test exposed legacy pageshow removal of restored cards; fixed and rerun. Two-tab test uses native button activation directly to exercise simultaneous intent without Playwright waiting for a button hidden by the winning completion. Browser locks are required for safe cross-tab delivery; unsupported environments retain content with recovery feedback.

Stage 3 - Independent image submission and recovery

  • Changes: captured attachments detach from the active form immediately, retain raw/prepared bytes in browser IndexedDB and reuse the existing image preparation, signed-reference and multipart finalization contracts. Pending cards show the captured image; a memory copy and unload warning protect against failed durable storage. Image-reference construction is shared with legacy image submission.

  • Verification: node tests/browser/reply_continuation.mjs passes two overlapping real signed image replies/descriptions, immediate editor/attachment reset, newer draft isolation, lost accepted image response plus reload/reconciliation and exactly one canonical image post. Injected IndexedDB failure exposes keep-page-open recovery and succeeds on Retry after storage restoration. Stage 1/2 text cases remain passing; changed JS syntax and diff checks pass.

  • Notes: Stage 2 commit 91f1650fd. Raw bytes remain recoverable before preparation; exact prepared bytes are persisted before finalization. No external dependency or server schema/API change. Both-route phone/visual checks follow in Stages 4–6.

Stage 4 - Dedicated and stable desktop continuation

  • Changes: both standard reply routes use a bounded, scrollable local reply stack built with the existing safe pending-card component. Dedicated entry preserves parent context and target. Showing the stack compensates page geometry to keep the desktop editor at its writing position; background completion cannot grow the stack into the editor. Long text and images stay within the container.

  • Verification: node tests/browser/reply_continuation.mjs passes dedicated consecutive real submissions, unchanged URL/parent, empty focused editor and measured desktop editor position within 3px, plus long-content page-overflow and all Stage 1–3 scenarios. JS syntax and diff checks pass.

  • Notes: Stage 3 commit 62f54f3dd. Dedicated restoration correctly includes the browser's earlier accepted replies to the same parent; tests compare against that baseline rather than assuming an empty stack. Physical phone interaction follows next.

Stage 5 - Phone reading and one-tap re-entry

  • Changes: phone Send exits composing mode, blurs the keyboard, reveals the latest local reply above a compact fixed reply field, and resumes the existing composing panel on one native tap. The compact field reserves flow space and clears fixed theme status bars; zoom/tiny-viewport fallback remains ordinary flow.

  • Verification: real-route reply_continuation.mjs passes both entries across Light/Word97/Chicago/Midnight at 390×844, checking empty unfocused editor after Send, visible previous reply above the field, viewport/overflow bounds, native tap re-entry and newer draft surviving completion. reply_viewport.mjs passes existing draft/selection/menu/rotation/zoom/Forte checks. Visual review of dedicated Word97 and inline Midnight screenshots confirms reply/field/status-bar separation; supplementary captures cover all eight combinations in /tmp/reply-continuation-review/.

  • Notes: Stage 4 commit 9ef125447. Fixed an early reading-mode restore/reinsert loop that allowed scroll anchoring to obscure cards, plus theme status-bar overlap. Automated native focus/blur checks do not prove physical software-keyboard behavior. Actual iPhone Safari/Firefox acceptance remains pending; no deployment is claimed.

Physical phone acceptance (pending)

  1. In iPhone Safari and Firefox, test a standard thread and its dedicated reply page. Send several replies consecutively: each appears immediately, the keyboard closes, the previous reply remains visible and the compact field stays above any theme/status/home-indicator area.

  2. Tap the compact field once: the same editor opens the keyboard, with Post reachable and no overlap. Repeat with long text, selection, portrait/landscape, keyboard dismissal/reopening and zoom. Record iPhone/iOS/browser versions and any caret, scroll or viewport failures.

  3. Send an image, start a different draft/attachment before completion, and verify each post's content/parent. Interrupt connection, retry the failed card and verify the newer draft remains untouched. Reload an unresolved operation and use its explicit Retry; verify one canonical post and no silent resend. Keep the page open if recovery-storage feedback says the attachment is not yet safely stored.

  4. Production deployment/acceptance is separate; no merge, push or deployment is performed in this cycle. Automated browser engines and screenshots do not complete this device checklist.

Stage 6 - Acceptance, compatibility and closeout

  • Changes: wired continuation into deferred signing asset configuration; preserved legacy initialization/test environments; excluded the empty stack from first-paint layout; stored image bytes/metadata in IndexedDB for WebKit compatibility; released accepted attachment blobs in favor of canonical image URLs. Canonical confirmation compares the normalized prepared record, including whitespace-normalized bodies. Desktop correction runs before the next paint without stealing a newer draft; pointer Retry preserves composer focus and accessible busy/pending feedback. Caught an existing detached identity-hint synchronization rejection during navigation. Updated old reply browser assertions to test captured recovery and in-place completion.

  • Verification passed: REPLY_ALL_THEMES=1 REPLY_CONTINUATION_SCREENSHOTS=/tmp/reply-continuation-review node tests/browser/reply_continuation.mjs covers both standard routes at 1280px/390px across all 16 explicit themes, real signed text/images, delayed/reversed completion, intentional identical sends, storage failures, canonical whitespace normalization, lost responses/reload, two-tab recovery, definitive expired preparation renewal, desktop focus/geometry, phone sent-reply/field separation and native tap, anonymous and actual no-script publication. Firefox and WebKit pass the functional flow and both-route four-theme matrices using REPLY_BROWSER=firefox / REPLY_BROWSER=webkit; the focused Chromium recovery run also verifies switching the actual saved keypair after preparation, restoring it and retrying without modifying a newer draft.

  • Verification passed: php tests/run.php BrowserSigningNormalizationTest LazyComposeSigningTest OfflineOutboxComposeTest ImageContentTest LocalAppSmokeTest::testApplicationRendersCoreRoutes 93/93; reply_compose_focus.mjs (eight first-focus/paint/theme cases plus real recovery/no-script controls); reply_viewport_flow.mjs (both real routes with simulated keyboard, selection/validation/retry); reply_viewport.mjs; compose_layout_stability.mjs (24 standalone and 32 shared readiness cases, actual thread/reply and Outbox saves); image_content_browser.mjs (real signed thread/reply images, interrupted-response retry, anonymous-image refusal, protected delivery, Forte and backup/restore/rebuild); image_compose_transport.cjs; board_compose_focus.mjs (first-paint/focus/draft matrices, real failure/retry and no-script controls). Changed JS/PHP syntax, diff checks and all feature-document file links pass. Representative desktop Word97/Midnight and phone Word97/Midnight screenshots visually inspected; captures remain local, not product assets.

  • Notes: Stage 5 commit 8a6ddaca1. Early verification exposed/fixed mock-global assumptions, deferred-loader microtask expectations, hidden-stack spacing, File cloning in WebKit, Firefox pointer activation during composer blur and an unhandled background hint-sync rejection. A transient Chromium launch failure was rerun successfully. Initial identity test changed only the cached fingerprint, which normal key refresh repaired; the corrected test switches the actual saved keypair. These are ordinary in-scope corrections, not new scope or dependencies. No unresolved automated failure is carried forward. Physical iPhone acceptance, production deployment, full-suite execution and maintainer fit/acceptance remain unverified.

Local outcome and study closeout

  • Six planned stages implemented on feat/reply-continuation; planning commit 22ea20c19, stage commits de8ae2bcb, 91f1650fd, 62f54f3dd, 9ef125447, 8a6ddaca1, followed by this Stage 6 closeout commit (recorded in the handoff log). All approved normal-flow and automated recovery checks are complete; physical-device/release acceptance remains pending under the checklist above. No merge, push, deployment or source-comment reply performed.

  • 2026-10-23T14:58:10Z, study railspike-effort / v3/reply_continuation, scope v1/R1/P2, baseline 3776264ed2ae9345294d3e93c25221037f6cd6e3, Codex single exposed rater: projected total 0.95 preserved; separately labeled retrospective scope assessment 0.95. Existing signing/card/image contracts reduced new infrastructure; concurrent recovery and multi-engine/device interaction justified the near-anchor scope. No measured labor, independent rating, split outcome or accepted-count increment; maintainer comfortable-fit judgment and physical/production acceptance pending.

  • Dependency delta: zero; only project/platform code, existing approved tools and libraries. No manifest/lock/vendor changes, read-model schema change or todo.txt edit. Register, UI verification notes and cycle ledger are included in this authorized closeout.

Corrective follow-up — full accepted reply rendering

  • Request: User reports the accepted reply remains a stripped plain-text card with “Open reply”. Disposition: correction within approved canonical-component/reconciliation scope; no new feature or approval gate. The earlier tests verified delivery and recovery but did not require normal rendered content/actions after acceptance.

  • Intended correction: retain immediate pending feedback, then reconcile from the canonical thread's full post card in the background, with normal formatting/actions and no active-draft replacement or resend. Rendering failure must remain separate from publication failure and offer rendering-only recovery. Physical-device/deployment limits remain unchanged. Existing .test* files in the working tree are unrelated and preserved.

  • Corrected: accepted replies now replace the placeholder with the canonical thread post card, including complete rendered body, metadata and normal actions; no custom “Open reply” summary remains. Normal reaction binding and dedicated-page action scripts are reused. Render failures retain the posted content and offer a rendering-only Retry, never a fresh submission. Placeholder whitespace styling no longer applies to canonical markup.

  • Verification: reply_full_card.mjs passes both routes in Chromium/Firefox/WebKit, comparing complete canonical body HTML, end-of-long-reply text, normal controls, an actual signed Like, preserved newer draft/selection and failed-render Retry with zero publication requests. Chromium additionally passes both-route phone reading/re-entry in Light/Word97/Chicago/Midnight; inspected actual inline Midnight and dedicated Word97 screenshots in /tmp/reply-full-card-review/. REPLY_RECOVERY_ONLY=1 node tests/browser/reply_continuation.mjs passes existing delivery/recovery/identity/image/fallback checks; four focused route/lazy-loading PHP checks and changed syntax/diff checks pass. No dependency or schema delta.

  • Study correction checkpoint, 2026-10-23: same cycle/scope v1/R1/P2, exposed rater, 0.95 projected total reaffirmed and 0.95 retrospective scope assessment reaffirmed; prior flawed visual acceptance and scores retained above. No measured work or accepted outcome; physical iPhone and production acceptance remain pending.

Maintainer merge acceptance — 2026-10-23

  • User reviewed the full-card correction, said “Looks good” and explicitly authorized merge. This records functional acceptance for merge; no physical-device, production deployment or study sizing judgment is inferred.

  • Integrated current origin/main (682ab5b40) before merging: application code merged automatically; resolved planning index, effort ledger and UI checklist conflicts by retaining both work streams and keeping next-phase audit candidates at the checklist end.

  • Combined-tree verification: 93 focused PHP checks pass; reply_full_card.mjs passes complete body/actions, signed Like, draft/selection isolation and rendering-only retry on both routes, plus four-theme phone layout/re-entry checks. Diff checks pass; dependency delta remains zero. No push or deployment performed.

Corrective follow-up — ordinary page flow

  • Request: Remove the separate scrolling area for newly posted replies; the completed page should look as close as possible to a reload. Treat the bounded local stack as an implementation defect against the normal-page outcome, not a new interface feature.

  • Intended correction: insert reply cards directly before the existing composer in ordinary document flow; reconcile same-author grouping/bylines from canonical rendering without replacing the active form. Preserve immediate feedback, independent recovery and phone re-entry. Verification is recorded below. Concurrent effort-ledger/research edits are outside this correction and are preserved.

  • Changes: removed the local region and fixed-height/overflow CSS entirely. Pending and accepted cards are ordinary siblings immediately before the existing composer. Canonical byline markers support in-place reconciliation of same-author continuation classes, deferred metadata, hover times and reply counts without replacing bound controls or the active editor. Phone insertion respects the existing viewport spacer, and background completion follows the latest sent card only if the user has not scrolled elsewhere.

  • Long-history correction: the first full theme sweep timed out reopening a dedicated composer because restoring many accepted cards fetched the same thread repeatedly. Rendering now shares an in-flight canonical document, reconciles its metadata once, and fetches again only if the shared snapshot predates the requested post. A regression asserts that four restored replies use exactly one thread-page request.

  • Verification passed: reply_full_card.mjs in Chromium/Firefox/WebKit verifies no separate scrolling region, normal sibling placement, full body/actions, canonical grouping/byline parity after multiple sends, signed Like, retained draft/selection, rendering-only Retry and one-fetch restoration. Both routes pass phone reading/one-tap re-entry in Light/Word97/Chicago/Midnight. REPLY_ALL_THEMES=1 node tests/browser/reply_continuation.mjs passes all 16 desktop/phone themes plus concurrent text/image, reverse completion, identity/storage/expiry/reload/two-tab recovery and anonymous/no-script flows. Focused PHP 93/93; changed JS/PHP syntax and diff checks pass. Actual inline Midnight, dedicated Word97 phone and both desktop screenshots inspected in /tmp/reply-page-flow-final/; captures are supplementary local evidence.

  • Same cycle/scope and prior study snapshots retained; no new numeric rating, measurement or accepted-count claim. Current effort-ledger/research changes are unrelated and excluded from this correction's commit. Dependency delta zero; no schema, navigation destination, manifest, vendor or todo change. Physical iPhone/production acceptance remain pending. Branch fix/reply-page-flow; no merge, push or deployment performed for this correction.

Ordinary-flow merge acceptance — 2026-10-23

  • User explicitly authorized merging fix/reply-page-flow. Integrated current origin/main (32dc3d348) first; retained both independent effort-ledger cycle entries at the sole manual conflict and preserved upstream template/copy changes.

  • Combined-tree verification: focused PHP 93/93 and reply_full_card.mjs pass, including normal sibling placement, canonical grouping/byline parity, full actions, draft isolation, rendering-only recovery, shared restoration fetch and both-route four-theme phone re-entry. Diff checks pass; no new dependency or schema change.

  • Functional merge acceptance does not establish physical iPhone, production or study comfortable-fit acceptance. No push/deployment performed. The saved effort-study recovery stash remains untouched.