Repository navigation
docs(qa): the share-link landing page asserts the 'Sign in required' state for a signed_in link (#23169) - #23327
Merged
objectstack-fleet[bot] merged 1 commit intoOct 13, 2026
Conversation
…state for a signed_in link access-security.share-link-landing-page, revision 1 -> 2. Its knownGaps[2] recorded that the console folded every 401 into the password prompt, so a signed_in-audience link opened anonymously rendered 'Password required', and asked to be revised once the console told the two codes apart. It does: at objectui 1fb1ced36243 (this repo's .objectui-sha) SharedRecordPage reads a 401 by its error.code (resolveGateOf) and renders a dedicated 'Sign in required' state for SIGN_IN_REQUIRED. Both resolve mounts still answer that code (plugin-sharing share-link-routes.ts and the runtime dispatcher twin). knownGaps[2] becomes a regression row, acceptance[3] asserts the sign-in state instead of recording whichever state renders, and variants[5] names it. One history entry records the row, its run and the fields touched. No other item changes. Claude-Session: https://claude.ai/code/session_012zwsLMxQBwHUYJgPyrpEvx Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 13, 2026
objectstack-fleet
Bot
deleted the
claude/issue-23169-share-link-landing-row
branch
October 13, 2026 20:13
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #23169
Clause-②: no (QA data)
This PR lands one row of #23169:
access-security.share-link-landing-pageC3, from QA run #23163 (surface:browser). The row waited for PR #23222, which also editedaccess-security.json; it merged as66949b7729. #23169 remains open for its other row,platform-core.lifecycle-retention-sweepsteps[4], which still waits on a maintainer ruling and is not part of this PR.What changed
One item changes:
access-security.share-link-landing-page, at.items[27]ofdocs/qa/platform-checklist/areas/access-security.json. Itsrevisiongoes from 1 to 2, and onehistoryentry is appended. Indices are zero-based.fixtures.knownGaps[2]signed_inlink opened anonymously renders "Password required". It asked to be revised once the console told the two codes aparterror.code, and asigned_inlink opened anonymously renders the "Sign in required" state. It names the objectui pinsacceptance[3].clause(the item's clause 4)/loginroute that redirects back. Never the password prompt or a password inputacceptance[3].verify401 SIGN_IN_REQUIREDbody, then a screenshot and a DOM read of the sign-in statevariants[5]No other item changes, and no other field of this item. This is the same edit discipline as PR #23278.
How the row was checked
The row was re-checked from source. No browser was driven and no app was booted, as in PR #23278. QA run #23163 saw the state live, at objectstack
36b2889cwith objectui1fb1ced36243: "signed_inaudience renders a dedicated 'Sign in required' state (401 SIGN_IN_REQUIRED), member 200".1fb1ced36243, stillmain's.objectui-sha:apps/console/src/pages/SharedRecordPage.tsx:fetchResolvereads a 401's body throughresolveGateOf. Asign-in-requiredanswer sets thesign-ingate. That gate renders "Sign in required", "The owner shared this link with signed-in users only." and a Sign in link to/loginwhoseredirectis the router path.apps/console/src/pages/shared-record-shape.ts:RESOLVE_GATE_BY_CODEmapsNEEDS_PASSWORDandWRONG_PASSWORDto the password gate andSIGN_IN_REQUIREDto the sign-in gate. Any other code names no gate, and the page shows the server's message.SharedRecordPage-11649.test.tsx("shows the sign-in path back to this link, and no password prompt") andshared-record-shape.test.ts("reads each 401 code as its gate").87e902dcbb: both resolve mounts answer401 SIGN_IN_REQUIREDwhen a livesigned_inlink without a password is opened anonymously. One is the probe in the resolve route ofpackages/plugins/plugin-sharing/src/share-link-routes.ts; the other is its dispatcher twin inpackages/runtime/src/domains/share-links.ts.The two sides agree. So, as the item itself asked, the knownGap becomes a regression row and clause 4 becomes an assertion.
Edit discipline. One scripted edit:
revision,fixtures,acceptance,variantsandhistory;revisionwent up by one, andhistoryis the base list plus one entry.scripts/symbol-anchors.mjs) says a line number is not an anchor form.Gates
All gates ran at head
88a65fb624. Each ran in its own process with its own log, and its exit code was read before any pipe.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 13 commands for the one path. The--ranreconciliation printed✓ dispatch-gates --ran: 13 derived famil(ies) accounted for — 13 run, 0 NOT-MEASURED (a DERIVED zero — all 13 recorded an exit code and none of them is 3).node scripts/check-ci-filter-parity.mjsOK: all 21 build input(s) turbo.json declares outside the packages …node scripts/check-closing-keyword-parity.mjscheck-closing-keyword-parity: OK (3 parsers agree on all 9 keywords …)node scripts/check-closing-keyword-parity.mjs --self-test✓ … 40 assertions, 5 mutations of the shipped parsers each driven to red.node scripts/check-comment-mask-corpus.mjs✓ comment-mask corpus sweep …: 8983 files, 0 disagree, 0 unparseablepnpm --filter @objectstack/lint run check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 474 files …. It ran afterpnpm --filter '@objectstack/lint...' buildunderos-verify-lock:VERDICT command-exit 0, 151 s heldpnpm check:cross-package-test-inputsOK: 30 package(s) read outside themselves, all declared …pnpm check:doc-authoring✓ doc authoring guard: 18522 customer-facing string(s) … cleanpnpm check:driver-memory-censuscheck-driver-memory-census: OK …pnpm check:gitlink-declaredcheck-gitlink-declared: OK (11279 index entries …)pnpm check:nul-bytescheck-nul-bytes: OK (scanned 11270 text file(s) … no raw ASCII control bytes).pnpm check:platform-checklistcheck-platform-checklist: 8 problem(s): the same 8 lines as at base87e902dcbb. The sorted problem lines diff empty, and none of them is in this itempnpm check:refd-timer-probeOK check-refd-timer-probe: 8977 source file(s) swept …pnpm check:watch-hint-literal✓ check-watch-hint-literal: 73 declaration(s) across 4 rostered name(s) …check:platform-checklistproblems predate this PR. Seven are absent symbols, inaccess-security.public-form-withdrawal-layers,attachments-storage.attach-requires-parent-editandsearch.rls-both-personas. The eighth is the attachments-storage anchor floor. The daily watchdog owns them.--anchor-censusat base and at head reads724/741resolved, plus 10 on the named residual. Every per-file count is identical,areas/access-security.json63 at both.skip-changeset:docs/qa/**ships in no package.git grep 'docs/qa' -- '*package.json'exits 1, with no hit. The positive control ispackages/spec/package.json, which carries afilesfield (dist,json-schema, …).node scripts/checklist-select.mjs access-security.share-link-landing-pageprints1 runnable item(s).Acceptance notes
Two things are noted here and not filed by this PR.
audience: 'signed_in', opened anonymously with the correct password, answers401 WRONG_PASSWORD.SqlDriver(:memory:):401 NEEDS_PASSWORD;401 WRONG_PASSWORD;401 WRONG_PASSWORD;200.resolveTokenrefuses on the audience before it checks the password. The route's probe then answers from the row in password-first order, and it reads only whether a password was sent, not whether it was right. The dispatcher twin has the same order (source read).ShareDialog.tsxat the pin sends an audience and a password in one create. The landing page then says "Wrong password." for the right one, and never offers sign-in.signed_intoken separately, so it does not reach that case.acceptance[1].verify(SharedRecordPage.tsx,143-176),acceptance[2].verify(,178-186),knownGaps[1]andsource[1](,190-234) no longer point at those code paths at the pin.file:line, but not this comma spelling, which appears 44 times acrossareas/*.json.Generated by Claude Code