Skip to content

Stale "every non-invite_only posture forces email verification" statements after #20389: settings console text (4 locales) and the identity-auth platform checklist #20413

Closed

Description

@hotlong

Filing-gate: ③ maintainer-directed task
Blocked-by: #20389

Filed on the maintainer's instruction in session session_d8bf7d34-4f31-407d-ac85-6cb849eec4bf (2026-09-28), verbatim: 「直接开卡吧」. The finding was surfaced by the os-dev on #20389 (report comment 5865880545) and escalated by the contract review on PR #20406 (comment 5866574059). It sat outside that claim's file surface, so the dev stopped on it, as required.

Why

Once #20406 lands, posture open is forced-on only by default: a deployment can turn verification off (emailAndPassword.requireEmailVerification: false, or OS_AUTH_REQUIRE_EMAIL_VERIFICATION=false). email_domain stays forced. The statements below still say every non-invite_only posture forces verification. That is wrong beside a deployment opt-out, which the console shows as a locked env value.

Every location (read at main 7db1332f19)

  1. packages/services/service-settings/src/manifests/auth.manifest.ts: the audience group description (「Postures other than invitation-only force email verification on.」) and the audience_posture help (「Any posture other than invite_only forces email verification on …」).
  2. The same two strings in packages/services/service-settings/src/translations/: en.ts (description and help), zh-CN.ts (description 「除「仅限邀请」外的口径会强制开启邮箱验证」 and help), es-ES.ts (description and help), and ja-JP.ts (the same keys; the dev named it, but the PM's keyword grep did not match its wording, so locate it by key).
  3. docs/qa/platform-checklist/areas/identity-auth.json knownGaps: 「on a permitting posture, requireEmailVerification is FORCED on (feat(spec,auth)!: one declared audience posture for who may self-register into an app — invite_only|email_domain|open, default invite_only #11739)」, and 「audience is config-only … no env knob」. The dev reported a settings env override for the posture exists; that half is unverified by the PM and must be checked before it is rewritten.

Acceptance

Each location states the rule as shipped: email_domain always forces verification; open forces it unless the deployment opts out; a console-stored false under open is refused. The four locales stay in step (settings-translation-coverage.test.ts).

Reader

The domain:services execution seat, once #20389 closes. Item 3 lives in the domain:devx docs/qa surface: fold it in, or split it at triage.

Dedupe

Search (open + closed) on 2026-09-28: audience_posture help forces verification → 2 hits, knownGaps requireEmailVerification forced → 2. Both are #20389 / #20406. No existing card.

Activity

  1. added
    bugSomething isn't working
    domain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    area:identityLogin and identity — sign-up, sessions, organization membership, SSO
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Sep 28, 2026
  2. hotlong commented on Sep 28, 2026

    @hotlong
    ContributorAuthor

    Unlocked 2026-09-28T09:15Z: Blocked-by: #20389 is closed (PR #20406 merged as 65352b7d6d), so this card moves pm:blocked → pm:queue. The statements it lists are now wrong on main rather than prospectively.

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 28, 2026
  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_017B6YKCGu8CTY2KBWgwaHAs
    Account: os-warren (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-20413-verification-posture-statements
    Worktree: objectstack-issue-20413
    Domain: domain:services
    Seat: domain:services#1
    File surface: packages/services/service-settings/src/manifests/auth.manifest.ts (the audience group description and the audience_posture help); the same keys in packages/services/service-settings/src/translations/ en.ts, zh-CN.ts, es-ES.ts, ja-JP.ts; docs/qa/platform-checklist/areas/identity-auth.json (knownGaps, card item 3, folded in as the card offers: a domain:devx surface, declared here); .changeset/20413-*.md. ⛔ No plugin-auth source, ⛔ no packages/spec. (Stop on breach; explain in the report.)
    Container & model: M, mode:subagent, model: opus (dispatch-gates --tier on 789b2ae5: no path-derived mandate, floor sonnet · default opus · ceiling fable). This is text, but each statement must be re-measured against the shipped rule first, so it is not mechanical.
    Clause-②: no
    Thread-read: 5866972701
    Serial constraints cleared: read at 2026-09-28T09:30Z on origin/main 789b2ae5. The rule these texts describe moved in 65352b7d (#20406, merged today). Zero of the 12 open PRs touch service-settings/ or docs/qa/platform-checklist/areas/identity-auth.json, and no open pm:dispatched claim names either. The sibling #20412 (this seat, same round) edits plugin-auth/src/auth-plugin.ts only. It changes how a refused key affects its siblings, not which values are refused, so none of this card's statements depend on it.

    Clause-②: no: help and description text, translations, and a QA checklist note, restated to the rule that shipped. No accept set or public contract surface moves.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 20413,
    "status": "done",
    "branch": "claude/issue-20413-verification-posture-statements",
    "pr": "#20421",
    "session": "session_017B6YKCGu8CTY2KBWgwaHAs",
    "premise_still_valid": true,
    "summary": "Rewrote the audience group description and the audience_posture help to the shipped rule in the service-settings manifest and in the en, zh-CN, es-ES and ja-JP bundles; each file held 2 hits by key and 2 by wording, and nothing else produces them. The rule was re-derived from plugin-auth at base 40b315b (resolveEmailVerificationRequirement and assertAudienceConfig in audience-posture.ts, bindAuthSettings in auth-plugin.ts): email_domain always forces verification and refuses an explicit false from any source; open forces it unless the deployment declares false (stack config, or OS_AUTH_REQUIRE_EMAIL_VERIFICATION=false, which the binding labels as the deployment); a console-stored false is refused under open; invite_only uses the declared value, default off. The code agrees with the card. Two corrections to the card: the manifest carries the posture string as description, not help (the bundles call it help); and the checklist claim "audience is config-only, no env knob" is false. The settings service derives OS_AUTH_AUDIENCE_POSTURE, OS_AUTH_AUDIENCE_ALLOWED_EMAIL_DOMAINS and OS_AUTH_AUDIENCE_SELF_REGISTRATION_PERMISSION_SET, and a probe measured each resolving as source env, locked (control: no env reads source default); an existing plugin-auth test pins that the binding applies them. A live stock boot with those vars is not measured, and the checklist says so. In identity-auth.json the two quoted knownGaps plus seven more fields stating the same old rule, across self-signup-gate and email-verification-loop, were restated as a bounded in-place fix; both items go to revision 2 with a history entry.",
    "tests": "All at head a22b90f. (1) Dependency closure build: pnpm --filter @objectstack/service-settings^... build ran through the verify lock and gave VERDICT command-exit 0; then the package itself built (check-dts-emitted 2/2). (2) pnpm --filter @objectstack/service-settings exec vitest run --maxWorkers=2 gave "Test Files 33 passed (33) / Tests 584 passed (584)". A verbose rerun of settings-translation-coverage.test.ts plus auth.manifest.test.ts showed zh-CN, ja-JP and es-ES covering settings.auth, 43/43 passed. (3) pnpm --filter @objectstack/service-settings run typecheck (tsc --noEmit): exit 0, no diagnostics. (4) Env-knob probe (tsx scratch, not committed): the real SettingsService with the shipped authSettingsManifest; env OS_AUTH_AUDIENCE_POSTURE=open made audience_posture read value open, source env, locked true. The no-env control read invite_only, source default. An off-vocabulary value was rejected and logged IGNORED. (5) Derived gates: see gates. No ablation: this is a text-only diff with no guard to prove.",
    "mcp_calls": "0 — no MCP GitHub tool used",
    "api_writes": "3 — three REST writes, each carried by one fleet-relay repository_dispatch (POST /repos/objectstack-ai/objectstack/dispatches, HTTP 204): (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls, draft, relay run 36408011112 success; (2) assign os-warren, POST /repos//issues/20421/assignees via label-write.mjs, relay run 36408117836 success, read back matching; (3) this os-dev-report comment, POST /repos//issues/20413/comments. Plus 4 git pushes, which are not REST writes.",
    "open_questions": [],
    "out_of_scope_findings": [
    "class: b · reach: exception: release-text — shipped boot-diagnostic prose in @objectstack/plugin-auth; the message also contradicts itself · evidence: packages/plugins/plugin-auth/src/boot-sign-in-reachability.ts line 478 at 40b315b says an open or email_domain posture "forces email verification on the INVITED login too", while line 492 of the same message already reads "unless an open deployment has itself declared it off". Contract text: AudienceConfigSchema.posture describe in packages/spec/src/system/auth-config.zod.ts, "open forces it on unless the deployment explicitly sets emailAndPassword.requireEmailVerification to false". Seam: spec:AudienceConfigSchema.posture → runtime:boot-sign-in-reachability.ts boot report (line 478). The phrase is pinned by boot-sign-in-reachability.test.ts line 164, so the fix edits both files. Same family as #20413: stale "every permitting posture forces verification" statements after 65352b7. Not edited here, because the dispatch forbade plugin-auth source · dedupe words: "INVITED login too", "boot-sign-in-reachability open opt-out", "forces email verification invited login"",
    "carrier: 承接者:无 · packages/plugins/plugin-auth/src/auth-manager.ts, the comment near line 2295 ("a posture that permits self-registration FORCES requireEmailVerification on"), is stale beside the open opt-out. It is a comment only, recorded in the PR Acceptance notes and not filed"
    ],
    "gates": {
    "derivation": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands at 380efb0 derived 50 commands; the changeset added 7, so the rederivation at a22b90f gave 57 commands over 7 paths",
    "reconciliation": "dispatch-gates --ran with a per-command exit record: "57 derived, 56 run, 1 NOT-MEASURED, 0 UNRUN"",
    "not_measured": [
    "NOT MEASURED: pnpm check:dual-build-cjs-loads — exit 3, PREREQUISITE NOT MET: it needs every package dist/ and this tree built only the service-settings closure. Declared narrowing: the gate PARSES and LOADS properties applied to the one touched package. node --check dist/index.cjs exits 0; require(dist/index.cjs) loads 46 exports with the new text present. The diff is string literals only."
    ],
    "rerun_after_prerequisite": "node scripts/check-plugin-teardown-shape.mjs --self-test: exit 3 first, because its pinned fixture commit 621a487 was outside the shallow clone; after git fetch --depth=1 origin 621a487 it gave exit 0, 48 cases",
    "all_other_derived": "55 further commands exit 0, including check:platform-checklist (OK: 15 areas, 266 items), check:nul-bytes (OK), check:doc-authoring, check:cross-package-test-inputs, check:test-source-alias, check:published-files, check:adr-0087-registration --base origin/main, check:empty-changeset --base origin/main, check:changeset-no-major --base origin/main",
    "roster_gates_run_anyway": "check:authz-resolver, check:error-code-casing, check:filter-alias-parity: each exit 0 (their rosters sit under packages/, where the derivation says silence is not evidence)",
    "translation_readers": "git grep over scripts/ and .github/ for service-settings/src/translations or settingsBuiltinTranslations: exit 1, 0 hits. Control on the same surface (service-automation): exit 0. The package coverage test is the only gate on these files",
    "ci": "in_progress — one read of the check-runs for head a22b90f: 31 total, 11 success, 3 skipped, 17 in_progress, 0 red; not awaited"
    },
    "line_budget": "n/a — the diff touches no skills/** and no ledger with a line ceiling; git diff 40b315b --stat: 7 files, +40/-23",
    "deviations": [
    "Scope, checklist: beyond the two quoted knownGaps sentences, 7 more fields in the same two items state the same old rule, and they were restated as a bounded in-place fix. Where they live: self-signup-gate variants[2] and source[2]; email-verification-loop fixtures.requires[0], acceptance[5], negative[2], source[0] and source[1]. All four conditions hold: same defect class; mechanical and fixed in form by the rule; a file on the claim surface; same gate. Both items bump revision 1 to 2 with a history entry, as the checklist validator requires. The PR body names these edits with before and after phrase counts: 11 on the base, 0 at head outside the new history entries.",
    "Card correction: the manifest posture string is a description, not a help.",
    "Gate narrowing: check:dual-build-cjs-loads, declared in gates.not_measured.",
    "Shared object store: fetched one pinned commit, 621a487, at depth 1 so a checker self-test could reach its fixture. This is additive; no ref was moved beyond FETCH_HEAD of this worktree.",
    "Attribution: commits carry the model-free trailer pair from AGENTS.md (Claude-Session plus Co-authored-by: Claude), not the harness reminder model-named Co-Authored-By, which the pre-push hook refuses. The PR body ends with the AGENTS.md session-URL footer, not the harness reminder two-line block. AGENTS.md takes precedence per the reminder itself."
    ],
    "files_changed": [
    ".changeset/20413-verification-posture-statements.md",
    "docs/qa/platform-checklist/areas/identity-auth.json",
    "packages/services/service-settings/src/manifests/auth.manifest.ts",
    "packages/services/service-settings/src/translations/en.ts",
    "packages/services/service-settings/src/translations/es-ES.ts",
    "packages/services/service-settings/src/translations/ja-JP.ts",
    "packages/services/service-settings/src/translations/zh-CN.ts"
    ]
    }


    Generated by Claude Code

  6. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    ACCEPT (round 1): PR #20421 at a22b90fc — Part of #20413. Round 2 adds one more location to this card

    domain:services seat (#6021) · session_017B6YKCGu8CTY2KBWgwaHAs · 2026-09-28T10:16Z. This reviews report 5867903998 against GitHub and origin/main.

    Review items

    1. PR shape. Draft, base main, head claude/issue-20413-verification-posture-statements (the claim's branch), assignee os-warren. The first line was Fixes #20413; the seat changed it to Part of #20413 (see item 6) and read the body back. No other closing keyword is in the body.
    2. Scope. 7 files, +40/−23: the manifest, the four locale bundles, docs/qa/platform-checklist/areas/identity-auth.json, and .changeset/20413-verification-posture-statements.md. No content/docs/releases/, no plugin-auth source, no packages/spec.
    3. Checklist extension beyond knownGaps (7 more fields in self-signup-gate and email-verification-loop). These are the same stale statement, in the same file, fixed with the same mechanical edit and covered by the same gate (check:platform-checklist). Both items bump to revision 2 with history entries. The four bounded-fix conditions hold, and the PR body names each edit with before/after phrase counts. Claim surface amended in this round: the claim's identity-auth.json row now covers every field of those two items that states the verification rule, not only knownGaps.
    4. Text versus code. Spot-checked on origin/main: the manifest and zh-CN strings now state email_domain always forced, open forced unless the deployment opts out, and a console-stored value unable to turn it off. That matches the card's rule. The report's correction is accepted: the manifest carries the posture string as description, and the bundles carry it as help.
    5. Changeset. @objectstack/service-settings patch, with Clause-②: no on its own line, and text only. Right for a published package whose shipped strings change. A contract review is owed on the .changeset prose, run by this seat at CONTRACT_REVIEW_TIER before readiness.
    6. Out-of-scope findings, one line each:
      • (b) packages/plugins/plugin-auth/src/boot-sign-in-reachability.ts, the no_sign_in_account_at_boot remedy prose: "an 'open' or 'email_domain' posture forces email verification on the INVITED login too". Verified on origin/main; the same message later concedes the open opt-out. Shipped runtime text, so reach is the release-text exception. Dedupe (open + closed, two queries, words boot sign-in reachability invited login forces verification and stale forces email verification open posture opt-out plugin-auth): 5 and 6 hits, and the only topical one is this card. ⇒ merged into this card as round 2, per the family rule. No new card.
      • auth-manager.ts, the comment near "a posture that permits self-registration FORCES requireEmailVerification on": the same stale statement, comment only. ⇒ rides round 2 (same package, same family). The PR's Acceptance notes keep the record.
    7. CI. At this reading on a22b90fc: 25 success, 3 skipped, 5 in progress, 0 red. Not ready until every check is green and the contract review passes.

    Round 2 (after PR #20421 lands). Location 4 of this card is packages/plugins/plugin-auth/src/boot-sign-in-reachability.ts (the remedy prose, plus its pin in boot-sign-in-reachability.test.ts) and the auth-manager.ts comment. Each is restated to the shipped rule. It goes out as a second PR with Fixes #20413. The PR from #20412 (in flight, auth-plugin.ts only) is disjoint.


    Generated by Claude Code

  7. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Sep 28, 2026
  8. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Round 1 landed: PR #20421 → 24b70859 (merge queue). Round 2 is next: the plugin-auth location

    domain:services seat (#6021) · session_017B6YKCGu8CTY2KBWgwaHAs · 2026-09-28T11:00Z.

    • Delivered on origin/main: 24b7085939 (fix(service-settings): audience help and the identity-auth checklist state the email-verification rule as shipped). Review record: ACCEPT 5867962277; contract review PASS 5868073710 at CONTRACT_REVIEW_TIER on head a22b90fc; every check on that head was green.
    • What landed: card locations 1–3 (the settings manifest, the four locale bundles, and the identity-auth checklist), plus the seven checklist fields named in the ACCEPT.
    • What remains (round 2): location 4, packages/plugins/plugin-auth/src/boot-sign-in-reachability.ts. That is the no_sign_in_account_at_boot remedy prose "forces email verification on the INVITED login too" (read on origin/main at line 479; pinned at boot-sign-in-reachability.test.ts:164) and the same statement in that file's docblock (line 47). The same family also appears in comments at auth-manager.ts:2295 and in the signup-existing-address-refusal.test.ts docblock (line 30).

    Release: session session_017B6YKCGu8CTY2KBWgwaHAs · 因: partial landing (Part of, round 1) · 去向: pm:queue, re-claimed by this seat for round 2 in the next write.


    Generated by Claude Code

  9. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 28, 2026
  10. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_017B6YKCGu8CTY2KBWgwaHAs
    Account: os-warren (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-20413-boot-report-verification-text
    Worktree: objectstack-issue-20413
    Domain: domain:services
    Seat: domain:services#1
    File surface: packages/plugins/plugin-auth/src/boot-sign-in-reachability.ts (the no_sign_in_account_at_boot remedy prose and the file docblock's verification sentence), packages/plugins/plugin-auth/src/boot-sign-in-reachability.test.ts (the pin on that phrase, flipped to the shipped rule), the comment at packages/plugins/plugin-auth/src/auth-manager.ts near line 2295, the docblock of packages/plugins/plugin-auth/src/signup-existing-address-refusal.test.ts, and .changeset/20413-*.md. ⛔ No auth-plugin.ts (held by #20412), no behaviour change, no packages/spec. (Stop on breach; explain in the report.)
    Container & model: S, not mechanical (each sentence is re-derived from the enforcing code) ⇒ M treatment, mode:subagent, model: opus (dispatch-gates --tier: no path-derived mandate for plugin-auth/src, floor sonnet · default opus · ceiling fable)
    Clause-②: no
    Thread-read: 5868551954
    Serial constraints cleared: read at 2026-09-28T11:01Z on origin/main after 24b70859 (#20421, round 1 of this card, landed today). In flight in the same package: #20412 (this seat, claim 5867200492), whose branch today touches auth-plugin.ts, its new test, a changeset and three gate scripts. That is disjoint from this surface. Both PRs add their own plugin-auth changeset file; the later lander merges main. No open PR touches boot-sign-in-reachability* or signup-existing-address-refusal.test.ts.

    Clause-②: no: shipped boot-diagnostic prose and comments are restated to the rule that already ships (open honours a deployment opt-out; email_domain stays forced). No accept set or contract surface moves.


    Generated by Claude Code

  11. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 20413,
    "status": "done",
    "branch": "claude/issue-20413-boot-report-verification-text",
    "pr": "#20434",
    "session": "session_017B6YKCGu8CTY2KBWgwaHAs",
    "premise_still_valid": true,
    "summary": "Round 2 of #20413, location 4. The no_sign_in_account_at_boot remedy prose in packages/plugins/plugin-auth/src/boot-sign-in-reachability.ts now states the email-verification rule once, as shipped: the INVITED login meets the same rule as any sign-up; email_domain is always ON; open is ON unless the DEPLOYMENT declared it off (emailAndPassword.requireEmailVerification: false or OS_AUTH_REQUIRE_EMAIL_VERIFICATION=false), and a false stored only through the settings console is refused there; invite_only follows the declaration and is OFF by default. Remedy (b) now refers back to that rule, so the message no longer contradicts itself. The rule was re-derived from resolveEmailVerificationRequirement and assertAudienceConfig (audience-posture.ts) and applyConfigPatch (auth-manager.ts) at base 24b7085. The invitation carve-out's verdict carries only admit and grantPermissionSet, and only the walled-owner stamp is born emailVerified, so an invited login gets no exemption. The file docblock bullet, one auth-manager.ts comment near line 2295 and the signup-existing-address-refusal.test.ts docblock (line 30) are restated the same way. The test pin at old line 164 is flipped to the new text's substance, with negative pins on both old spellings, and a new describe drives each clause of the rule against AuthManager. Every PM mechanism assumption held: the phrase sat at lines 478-479 (it straddles a string join), the concession at 492, the docblock at 47, the pin at 164, and the comments at auth-manager.ts 2295 and signup-existing-address-refusal.test.ts 30. Text, comments and tests only: no behaviour change, no auth-plugin.ts, no packages/spec.",
    "tests": "All at head 7898a47. (1) pnpm --workspace-concurrency=2 --filter '@objectstack/plugin-auth^...' build, through the verify lock: VERDICT command-exit 0. Then pnpm --filter @objectstack/plugin-auth build: check-dts-emitted 2/2. (2) Targeted: pnpm --filter @objectstack/plugin-auth exec vitest run --maxWorkers=2 src/boot-sign-in-reachability.test.ts src/signup-existing-address-refusal.test.ts gave 'Test Files 2 passed (2) / Tests 59 passed (59)'. (3) Package: pnpm --filter @objectstack/plugin-auth exec vitest run --maxWorkers=2 gave 'Test Files 114 passed (114) / Tests 2458 passed (2458)'. (4) pnpm --filter @objectstack/plugin-auth run typecheck: exit 0 across tsc --noEmit, tsconfig.examples.json and check:test-typecheck, which reported 'OK ... 10 file(s) / 94 error(s) ... held'. The first attempt exited 2 only because the examples project resolves the package's own dist/, which the closure build (^...) excludes; that is a prerequisite, not a measurement, and the rerun after building the package was green. (5) Reverse verification, with the fix committed first. Each leg ran through scripts/ablation-replace.mjs in WRAP mode, under a driver trap that restores from HEAD by absolute path; the test imports the module by relative path, so it reads src/ and no rebuild was needed. Leg A put the old sentence back in place of the new one: anchor 1 to 0, blob b0be40fa to d1b521c9, 'Tests 1 failed | 50 passed (51)', failing '[#15588/F1] the no-mail-transport rider is SCOPED to the default posture' on the positive pin. Leg B added the old sentence beside the new text: the same single test red, on 'not to match /an 'open' or 'email_domain' posture .../i'. Leg C added the old remedy-(b) quantifier: the same test red, on 'not to match /every posture other than 'invite_onl.../i'. After all three legs the blob equals the HEAD blob b0be40fa and git diff HEAD is empty. The direction observed was red, as expected. (6) Lint: eslint --no-inline-config --format json on the 4 touched .ts files linted 4 files, 0 errors, 0 warnings. eslint.config.mjs enables no type-aware linting (every parserOptions block is ecmaVersion/sourceType), so an untouched file's verdict cannot move. (7) Control-byte self-scan over the 5 files and the PR body: no hits.",
    "mcp_calls": "0 — no MCP GitHub tool used",
    "api_writes": "3 — each carried by one fleet-relay repository_dispatch (POST /repos/objectstack-ai/objectstack/dispatches, HTTP 204), executed as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls, draft, relay run 36417607500 success; the body read back byte-identical, with one footer. (2) assign os-warren via label-write.mjs, POST /repos//issues/20434/assignees, relay run 36417693056 success; the read-back matches. (3) This os-dev-report comment, POST /repos//issues/20413/comments via post-stamped.mjs. Also 2 git pushes (the empty-branch probe and 7898a47), which are not REST writes. No label written: the dispatch named none, and the PR publishes (plugin-auth patch changeset), so skip-changeset does not apply. documentation, tests, tooling and size/m came from the labeler bots.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · packages/plugins/plugin-auth/src/audience-gate-test-support.ts line 17, docblock: 'open (and email_domain) force requireEmailVerification on'. It explains why fixtures use the invitation lane; it is true for the undeclared fixture config but omits open's deployment opt-out. Comment only, no reach. Noted in the PR Acceptance notes, not filed",
    "carrier: 承接者:无 · packages/plugins/plugin-auth/src/admin-remove-user-gate-ordering.test.ts line 135, test comment: 'open would force email verification on'. Same shape as above. Comment only. Noted, not filed",
    "carrier: 承接者:无 · packages/verify/src/harness.ts line 778, comment: 'open and email_domain force requireEmailVerification on'. Same shape, outside plugin-auth. Comment only. Noted, not filed",
    "carrier: 承接者:无 · packages/spec/src/migrations/entries/semantic/18.audience-posture-default-invite-only.ts line 19, and its generated mirror packages/spec/src/migrations/registry.ts line 6270: 'accepts forced email verification'. This is the v18 migration's reason text, accurate for the release that shipped it (open's opt-out came later). It is packages/spec history, not live advice. Noted, not filed, and outside this claim (no packages/spec)"
    ],
    "gates": {
    "derivation": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands at 7898a47: 64 commands over 5 paths (merge base 24b7085, committed 5, working tree 0, untracked 0)",
    "reconciliation": "dispatch-gates --ran with a per-command exit record: '64 derived, 62 run, 2 NOT-MEASURED, 0 UNRUN'. All 62 that ran exited 0",
    "not_measured": [
    "NOT MEASURED: pnpm check:dual-build-cjs-loads — exit 3, PREREQUISITE NOT MET: it needs every package's dist/, and this tree built only the plugin-auth closure. Declared narrowing, applied to the one touched package: node --check dist/index.js exits 0; require('./dist/index.js') loads 143 exports; the new text is in dist/index.js and dist/index.mjs (1 each) and the old phrase in neither (0 each)",
    "NOT MEASURED: pnpm check:type-check-debt — exit 3, PREREQUISITE NOT MET: @objectstack/runtime, service-cluster and service-job have no built types here. Declared narrowing: the DEBT keys are cloud-connection, hono, observability and spec-monorepo, none of which depends on plugin-auth, and TEST_DEBT is empty. The only non-comment source change is the content of one string literal, so no type moves; plugin-auth's own typecheck, test layer included, is green"
    ],
    "named_green_examples": "check:nul-bytes, check:doc-authoring, check:cross-package-test-inputs, check:test-source-alias, check:published-files, check:issue-citations, check:adr-0087-registration --base origin/main, check:changeset-no-major --base origin/main, check:empty-changeset --base origin/main, check:changeset-gate-self-tests, check:engine-double-contract, check:type-check-coverage: each exit 0",
    "ci": "in_progress — one read of the check-runs for head 7898a47: 31 total, 11 success, 3 skipped, 17 in_progress, 0 red; not awaited"
    },
    "line_budget": "n/a — the diff touches no skills/** and no ledger with a line ceiling; git diff 24b7085 --stat: 5 files, +153/-42",
    "deviations": [
    "Test file, beyond flipping the one pin: three titles and comments in boot-sign-in-reachability.test.ts that restated the old unconditional quantifier now say 'with nothing declared'. A new describe of 4 behaviour pins drives the message's new clauses against AuthManager: open plus the deployment's false wires OFF; the console's false is refused and stays ON, with the deployment patch as control; email_domain plus false refuses the boot, with a control; invite_only is OFF by default and ON when declared. The managerWith helper gained an optional emailAndPassword argument. All of it is in the claimed file, and it follows that file's convention that each message clause is pinned against behaviour, not only string-matched",
    "Message advice: the ordered advice is kept verbatim ('close the posture back to 'invite_only' BEFORE that person registers') and is now qualified 'on a deployment without one [a mail transport]' plus 'and leave verification at its default OFF'. Under invite_only the declared value applies, so a declared true would still need mail",
    "Gate narrowing: check:dual-build-cjs-loads and check:type-check-debt, declared in gates.not_measured",
    "Attribution: the commit carries the AGENTS.md model-free trailer pair (Claude-Session plus 'Co-authored-by: Claude'), not the harness reminder's model-named Co-Authored-By, which the pre-push hook refuses. The PR body ends with the AGENTS.md session-URL footer, not the harness reminder's block. AGENTS.md takes precedence per the reminder itself"
    ],
    "files_changed": [
    ".changeset/20413-boot-report-verification-text.md",
    "packages/plugins/plugin-auth/src/auth-manager.ts",
    "packages/plugins/plugin-auth/src/boot-sign-in-reachability.test.ts",
    "packages/plugins/plugin-auth/src/boot-sign-in-reachability.ts",
    "packages/plugins/plugin-auth/src/signup-existing-address-refusal.test.ts"
    ]
    }


    Generated by Claude Code

  12. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    ACCEPT (round 2): PR #20434 at 7898a47d (Fixes #20413)

    domain:services seat (#6021) · session_017B6YKCGu8CTY2KBWgwaHAs · 2026-09-28T11:50Z. This reviews report 5869246980 against GitHub and origin/main.

    Review items

    1. PR shape. Draft, base main, head claude/issue-20413-boot-report-verification-text (claim 5868567572), assignee os-warren. The first line is Fixes #20413 (round 2 completes the card), followed by line-start Clause-②: no. No other closing keyword is in the body.

    2. Scope. 5 files, +153/−42, all on the claim's surface:

      • boot-sign-in-reachability.ts: the remedy prose and the docblock bullet.
      • boot-sign-in-reachability.test.ts: the flipped pin, plus four behaviour pins.
      • The auth-manager.ts comment. Spot-read: it now says "forces … on by default … always under email_domain, and under open unless the deployment declared it off". Comment only.
      • The signup-existing-address-refusal.test.ts docblock.
      • .changeset/20413-boot-report-verification-text.md.

      No auth-plugin.ts, so no overlap with plugin-auth: one refused key in the auth settings pass drops every sibling setting, and says so only at warn #20412's PR fix(plugin-auth): a refused auth setting no longer drops the settings saved with it #20429, which is in the queue. No packages/spec, and no behaviour change.

    3. The message now states the rule once. email_domain always on; open on unless the deployment declared it off, with a console-only false refused; invite_only as declared, off by default. The invited login meets the same rule. Remedy (b) points back to that statement instead of contradicting it, and the ordered advice is kept with its conditions made explicit. The report re-derived the rule from resolveEmailVerificationRequirement/assertAudienceConfig/applyConfigPatch at 24b70859, and round 1's contract review 5868073710 read the same code.

    4. Pins and their failure proofs.

      • The old :164 pin is flipped to the new text's substance, with negative pins on both old spellings.
      • A new describe drives each clause against AuthManager, with controls.
      • Three legs were run: old sentence back, old sentence beside the new, old remedy-(b) quantifier back. Each turned the scoped test red, and each restore was proven by blob equality with HEAD.
      • The package suite is 2458/2458.
    5. Changeset. @objectstack/plugin-auth patch, Clause-②: no. Right: shipped boot-report prose changes, and no admission decision, default or accepted value moves. A contract review is owed on the .changeset prose and runs at CONTRACT_REVIEW_TIER before readiness.

    6. Out-of-scope findings. Four more comment-only locations of the same stale sentence:

      • audience-gate-test-support.ts:17
      • admin-remove-user-gate-ordering.test.ts:135
      • packages/verify/src/harness.ts:778
      • the v18 migration's reason text in packages/spec, which was accurate for the release that shipped it

      ⇒ Acceptance notes (carrier: none). They are comments or historical record with no reach: to a wrong answer, so they are not cards, and the card closes on this PR.

    7. CI. At the report's reading on 7898a47d: 11 success, 3 skipped, 17 in progress, 0 red. Not ready until every check is green and the contract review passes.


    Generated by Claude Code

  13. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Landed: PR #20434 → 87c37aec (merge queue). Round 2 is done and the card closed completed

    domain:services seat (#6021) · session_017B6YKCGu8CTY2KBWgwaHAs · 2026-09-28T12:24Z.

    • Delivered on origin/main: 87c37aec11. Record: ACCEPT 5869268738; contract review PASS 5869460142 at CONTRACT_REVIEW_TIER on head 7898a47d; every check green.
    • On main now: "INVITED login too" has 0 hits in boot-sign-in-reachability.ts, with the report key as the same-file control (3 hits). The no_sign_in_account_at_boot report states the verification rule once, as shipped.
    • The card, end to end: locations 1–3 landed in 24b70859 (PR fix(service-settings): audience help and the identity-auth checklist state the email-verification rule as shipped #20421: settings console text in four locales, and the identity-auth checklist). Location 4 landed in 87c37aec (PR fix(plugin-auth): the no-sign-in-account boot report states the email-verification rule as shipped #20434: the boot report, its pin, and two comments).
    • Left as Acceptance notes, not cards: five more comment-only spellings of the old rule, in test support files, a test comment, packages/verify/src/harness.ts, and the v18 migration's historical reason text. None is operator-facing.
    • Board clean-up in this write: pm:dispatched and the assignee are cleared (the closing keyword leaves both).

    Release: session session_017B6YKCGu8CTY2KBWgwaHAs · 因: delivered (Fixes #20413, merged) · 去向: closed completed.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:identityLogin and identity — sign-up, sessions, organization membership, SSObugSomething isn't workingdomain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions