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

Automatic Guest Identity — Step 4: Implementation Summary

Stage 1 - Operator feature flag and runtime configuration

  • Changes:

    • Added the mutable, default-off FORUM_AUTOMATIC_GUEST_KEYPAIR_ENABLED operator flag to the canonical registry and Feature Flags page.

    • Exposed its effective value through the existing layout browser-identity options contract.

    • Added evaluator and rendered-page coverage.

  • Verification:

    • php -l passed for changed PHP/template/test files.

    • ./v3 test FeatureFlagEvaluatorTest LocalAppSmokeTest::testAutomaticGuestKeypairFlagRendersBrowserRuntimeOption — 15 passed.

  • Notes:

    • The flag is site-record and environment overridable; no browser behavior changes until Stage 2 consumes the option.

Stage 2 - Automatic browser-local guest preparation

  • Changes:

    • Load the existing OpenPGP/browser-signing runtime on normal pages only when the operator flag is enabled.

    • Added a no-prompt automatic guest preparation path that defaults to deferred public-key publication.

    • Made first use finish required publication after any in-progress background preparation, preserving one keypair and one coordinator.

  • Verification:

    • php -l passed for the changed renderer and tests.

    • ./v3 test BrowserSigningNormalizationTest::testAutomaticGuestIdentityDefersPublicationUntilFirstSignedAction BrowserSigningNormalizationTest::testAutomaticGuestIdentityPreservesExistingBrowserKeypair BrowserSigningNormalizationTest::testIdentityPrewarmDoesNotGenerateOrLinkIdentity LocalAppSmokeTest::testAutomaticGuestKeypairFlagRendersBrowserRuntimeOption — 4 passed.

  • Notes:

    • Background setup failures are intentionally silent; a subsequent signed action or Account Key page uses the established recovery path.

Stage 3 - Per-browser publication preference

  • Changes:

    • Added an Account Key control for this browser's automatic-guest publication preference, defaulting to first signed use.

    • Persisted the immediate choice only in browser storage and immediately published an existing unpublished key when the visitor explicitly enables it.

    • Kept existing account-key generation/import publication behavior unchanged and reused the canonical publication and private-site authentication paths.

  • Verification:

    • php -l passed for the Account Key template and changed tests.

    • ./v3 test BrowserSigningNormalizationTest::testAutomaticGuestIdentityDefersPublicationUntilFirstSignedAction BrowserSigningNormalizationTest::testAutomaticGuestIdentityPreservesExistingBrowserKeypair BrowserSigningNormalizationTest::testAutomaticGuestIdentityPublishesImmediatelyWhenBrowserPreferenceIsSet BrowserSigningNormalizationTest::testAccountGuestPublicationPreferencePersistsAndPublishesCurrentKey LocalAppSmokeTest::testAutomaticGuestKeypairFlagRendersBrowserRuntimeOption — 5 passed.

  • Notes:

    • The control is deliberately on Account Key, not the operator Feature Flags page, because it governs only the local browser identity.

Stage 4 - Release verification and operations guidance

  • Changes:

    • Documented Feature Flags enablement, browser-local/private-key boundary, publication choices, static-artifact rebuild, and rollback in the README and production runbook.

    • Added static-board-artifact coverage for the enabled runtime setting and identity assets.

    • Restored the flat normal signed-action readiness path after the broader suite identified an added promise boundary that delayed existing duplicate-submit flows.

  • Verification:

    • php -l tests/LocalAppSmokeTest.php passed.

    • ./v3 test LocalAppSmokeTest::testAutomaticGuestKeypairFlagIsIncludedInStaticBoardArtifact — 1 passed.

    • ./v3 test FeatureFlagEvaluatorTest BrowserSigningNormalizationTest LocalAppSmokeTest — 212 passed, 0 failed.

    • git diff --check passed; all four plan-navigation targets exist.

  • Notes:

    • The full-suite static-artifact health-check test intentionally logs its simulated missing-asset diagnostic while passing.

    • Rollback disables future automatic preparation only; it does not and cannot delete browser-local keypairs.