Repository navigation
Enforce Console account scopes and named-person token requests - #1803
Merged
Merged
Conversation
A session with Act and without security could read finding records from the Stop confirmation page. Peek already refuses that view. Stop itself still requires only Act.
This was referenced Nov 6, 2026
Merged
Closed
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.
Summary
Closes #1757
Setup preserves the scopes table and writes its default. Restricted sessions hide action controls and retain their own browser sign-out. The guide and public Console descriptions document the CLI and header.
The Resources indicator also follows
read, including on an Account page opened with no scopes.Test seams: the
thirdshiftbinary (Console scopes and Setup), authenticated HTTP (authorization, page controls, Activity log, protected settings), and the rendered Console in Chromium.Evidence
Execution evidence
cargo test --test console cli_sets_and_shows_address_scopes_without_changing_other_settingsfailed becauseconsole scopesreturned the usage error;1 failed.After: the same command passed:
1 passed; 0 failed. The finalcargo test --test console accounts::address_scopesrun passed all seven tests, including named-person Stop/Dismissal, scope intersection, protected config, Security log access, and restricted sign-out.python3 .thirdshift-review-xFNQof/repro-signout.pyfailed withread-only session POST /sign-out: 403 {"error":"Missing scope: act"}.After: the exact reproducer exited 0 with
read-only session POST /sign-out: 303. The regression is also kept in the Rust integration suite.cargo test --test console accounts::address_scopes::act_without_security_cannot_read_a_security_run_from_the_stop_page -- --test-threads=1failed (exit 101). A signed-in session with scopesreadandactreceived HTTP 200 forGET /stop?command=secure-fixture, and the page included the Security run's finding titles.After: the same command passed. That session receives 403
Missing scope: securityand neither title. An ordinary Stop page stays available, and adding the security scope shows the finding again.node --test console/tests/accounts.test.cjs: both tests passed, including 1440×900 and 390×844 with JavaScript enabled and disabled.cargo fmt --check,npm run docs:check --prefix site, andcargo clippy --all-targets -- -D warningspassed. All ten Console unit tests and the complete binary unit suite passed (1,646 passed, three ignored). Existing allowlist diagnostics and every page's CLI-pair assertions are preserved.CARGO_BUILD_JOBS=3 NEXTEST_TEST_THREADS=8 NEXTEST_RETRIES=1 RUST_TEST_THREADS=3 scripts/affected-tests origin/issue-1753passed: 62 site tests, 127 Console tests, and 3,783 Rust tests; 82 skipped. The Rust run took 2,074.694 seconds after compilation. One Architect test (labelling_an_idea_adds_needs_triage_with_its_description_to_a_repository_that_lacks_it) hit a transient systemd scope-name collision and passed its retry; no retry policy or scope-management code was changed.8284a57fis green: all 3,783 Rust tests passed, with 82 skipped and no retries. Console and site checks passed. The site job was retried after Chromium installation consumed nearly all of its ten-minute limit and the first attempt was cancelled during tests.Visual evidence
Desktop, 1440×900: signed-in Inbox with the live Command's details open; all scopes before,
readafter.Phone, 390×844: the same Inbox and Command details flow.
Account with zero scopes: Resources is hidden while the browser's own sign-out stays available.
1440×900:
390×844:
Unaddressed findings
Standards
None. STD-1 was addressed with a shared action Actor that owns attribution and preserves the stored Stop-request format.
Spec
None. SPEC-1 was reproduced with the reviewer's exact command, fixed, and retained as a regression test. No findings were deferred to the Spec or Day shift.
Security
None. An Act session without the security scope could open a Security run's Stop page and read its finding records.
cargo test --test console accounts::address_scopes::act_without_security_cannot_read_a_security_run_from_the_stop_page -- --test-threads=1failed before the guard (the page returned 200 and included the finding titles) and passed after it. The confirmation page now uses Peek's missing-scope refusal. Stopping the run still requires only Act.Review fixed point: remote
issue-1753at3480c496429376f641b5a7e8a72b3fd3c8e16436. Each reviewer read 43 of the 44 changed files, including the generated manual. Final changes after both permitted follow-ups were not reread:src/console/header-status.html(Resources scope guard),src/console/auth.rs(Clippy error boxing),src/config/console.rs(restored CLI diagnostic prefix),src/console.rs(API-only metadata assertion), and the final zero-scope assertion intests/console/address_scopes.rs. The latter four files' earlier hunks were read. These changes passed their targeted Rust tests, browser account tests where affected, and Clippy. No other coverage gaps remain, and no generated output was excluded. Reports andsummary.jsonare retained in.thirdshift-review-xFNQof/with counts{"standards":1,"spec":1}.Security review outcome
No unaddressed introduced findings.
Merge Danger
Door: two-way
Older binaries cannot enforce address scopes. Before rollback, review the sign-in list and remove the new
console.address_scopeskey. Stored Stop requests retain their existing field layout.Blast Radius: Console
Scope assignments can deny page or API access; the machine's shell remains the recovery path. Existing addresses retain all five scopes until narrowed.
Built with codex codex-cli 0.164.0 · gpt-6.1-sol · xhigh