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

Vote Identity Readiness — Step 4: Implementation Summary

Stage 1 - Complete existing-identity prewarm

  • Changes:

    • Added an existing-identity-only readiness path to vote-surface idle prewarming.

    • Existing stored keypairs now finish fingerprint, publication/verification, and identity-hint readiness before a vote; missing keypairs cannot enter generation from that path.

  • Verification:

    • node --check public/assets/browser_signing.js

    • php -l tests/BrowserSigningNormalizationTest.php

    • ./v3 test BrowserSigningNormalizationTest::testIdentityPrewarmFullyReadiesStoredVoteIdentity BrowserSigningNormalizationTest::testIdentityPrewarmWithoutStoredKeypairDoesNotCreateOrPublishIdentity — 2 passed.

  • Notes:

    • Full background readiness is restricted to vote surfaces; compose-only pages keep their prior lightweight prewarm behavior.

Stage 2 - Wire all reaction-page entry points

  • Changes:

    • Extended the canonical lazy signing loader to detect stored local keypairs on reaction-only pages and load signing assets during idle time.

    • Initialization now targets the full document, allowing the existing browser-signing initializer to discover reaction roots after lazy loading.

  • Verification:

    • node --check public/assets/lazy_compose_signing.js

    • php -l tests/LazyComposeSigningTest.php

    • ./v3 test LazyComposeSigningTest — 3 passed.

  • Notes:

    • Pages without a stored keypair do not load signing assets until existing compose intent or reaction-click behavior requests them.

Stage 3 - Join readiness at vote time

  • Changes:

    • Added explicit stored-vote-identity readiness states for idle work, including ready and failed states.

    • A ready identity now bypasses Preparing identity...; an in-flight or absent identity keeps existing progress feedback, and a failed prewarm requests visible verification/retry before writing a reaction.

  • Verification:

    • node --check public/assets/browser_signing.js

    • node --check public/assets/thread_reactions.js

    • php -l tests/BrowserSigningNormalizationTest.php

    • ./v3 test BrowserSigningNormalizationTest::testIdentityPrewarmFullyReadiesStoredVoteIdentity BrowserSigningNormalizationTest::testIdentityPrewarmWithoutStoredKeypairDoesNotCreateOrPublishIdentity BrowserSigningNormalizationTest::testPostReactionAppliesOptimisticStateBeforeFetchResolvesAndHidesAfterResponse BrowserSigningNormalizationTest::testPostReactionServerFailureRollsBackOptimisticState — 4 passed.

  • Notes:

    • Reaction writes and their existing pending/rollback behavior remain unchanged; readiness affects only the prerequisite and feedback timing.

Stage 4 - Release verification and recovery regression

  • Changes:

    • Corrected successful existing-identity prewarm to report the ready state consumed by reaction feedback.

    • Added regression coverage for that ready-state handoff.

  • Verification:

    • node --check public/assets/browser_signing.js public/assets/thread_reactions.js public/assets/lazy_compose_signing.js

    • php -l tests/BrowserSigningNormalizationTest.php && php -l tests/LazyComposeSigningTest.php

    • ./v3 test BrowserSigningNormalizationTest LazyComposeSigningTest LocalAppSmokeTest::testAssetFingerprintPathsUseContentHashFilenames LocalAppSmokeTest::testApplicationRendersCoreRoutes QuoteCardDisplayNumberTest::testQdbListingPagesLoadTheVoteButtonAndIdentityLoaderScripts — 80 passed.

    • A full ./v3 test run was started twice, but this environment ends long-running child commands without returning a terminal result; the focused suite above covers the changed browser logic, lazy asset loading, and application asset rendering.

  • Notes:

    • No database, endpoint, template, or no-JavaScript behavior changed.