You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
MDM lock: while lockServer is set, the connection switcher shows only the managed connection #187
Filing category ③: a direct task from a maintainer ruling. It is batch #2 item 3, letter B, 「批 #2 同意」 2026-11-03T08:21Z, recorded on #157.
Context
#157 (PR #175) added MDM serverUrl and lockServer. Today, while locked, the switcher hides "添加组织或公司服务器" and the managed connection's Remove action, but the connections saved before the lock stay switchable. The ruling: a locked device uses only the managed server. This matches what "lock the account" means in mainstream enterprise mobile management.
Ask
While lockServer is set, the switcher lists only the managed connection.
The other saved connections are hidden, not deleted, and appear again when the lock is lifted.
Claim: PM loop round 3
Session: session_01QSeKYnW1Xf6HDSWz1eGAqv
Account: os-justin
Branch: claude/issue-187-mdm-lock-scope
Worktree: mobile-issue-187
Domain: n/a — single-lane repo (repo:mobile)
Seat: repo:mobile#1
File surface: app/console.tsx, components/shell/ConnectionSwitcher.tsx, stores/server-store.ts (only if the lock-arrival switch needs it), __tests__/**, docs/DEPLOYMENT.md, docs/HYBRID-SHELL.md, .changeset/187-mdm-lock-scope.md (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: default tier (opus) — no path-derived mandate, effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Premise: holds. On main at 427cb49, the switcher hides add and the managed row's Remove while locked, but lists the other saved connections.
Serial constraints cleared: #187 and #182 are dispatched in the same round. Both touch docs/HYBRID-SHELL.md, and #182 rewrites locales/* names. That is ordinary concurrency: the PR that lands second reconciles. Landing: the maintainer merges, because seat landing is suspended (see the comment on #160).
{
"issue": 187,
"status": "done",
"branch": "claude/issue-187-mdm-lock-scope",
"pr": "https://github.com/objectstack-ai/mobile/pull/188",
"session": "session_01QSeKYnW1Xf6HDSWz1eGAqv",
"premise_still_valid": true,
"summary": "While lockServer is set, ConnectionSwitcher lists only the managed connection (the lockedHost row); the other saved connections are not rendered, stay in the store, and are listed again once the lock is lifted. The filter sits in components/shell/ConnectionSwitcher.tsx, which already receives lockedHost; app/console.tsx got a doc-comment edit only and stores/server-store.ts is untouched, because hydrate/applyManaged already make the managed connection current when the lock arrives (preferManaged), and connect links and the scanner are already refused while locked (server-config redirects; ServerConfigScreen tests). Docs: DEPLOYMENT.md key table gains a trustedHosts row 'Not supported' and the Locked bullet now says hidden-not-deleted; HYBRID-SHELL.md Known limits gains 'A route asked for while the main frame is on another origin is dropped' (verified against buildNavigateScript's origin check). No new strings. Worktree was built from origin/main 13b7e32, not the 427cb49 the dispatch named: main had moved on (427cb49 is an ancestor; #185's EAS commits in between). The old ConsoleScreen case 'locked: the other saved connections can still be removed' pinned the reversed behaviour and was replaced.",
"tests": "At 0a55b73. Focused: npx jest --ci ConnectionSwitcher.test.tsx ConsoleScreen.test.tsx -> exit 0, Tests 34 passed of 34. Full: npx jest --ci --coverage --maxWorkers=2 under os-verify-lock -> VERDICT command-exit 0, Test Suites 49/49, Tests 1049/1049. Cold: npx jest --ci --no-cache on the two touched component files -> VERDICT command-exit 0, 34/34 (20.3 s and 22.7 s file wall, inside their 30 s cold-load warm-up). No new test file; new cases sit in the two existing files. Ablation (no build step in this repo; jest runs source via babel): ablation-replace.mjs anchor 'const listed = lockedConnection === null ? connections : [lockedConnection];' -> 'const listed = connections;', anchor 1 -> 0, blob 95309eb -> d8d637b; run VERDICT command-exit 1, 3 failed / 31 passed: ConnectionSwitcher 'lists every saved connection again once the lock is lifted', ConnectionSwitcher 'while the organization locks the server: only the managed connection, no add, and no Remove on it', ConsoleScreen MDM 'locked: the switcher lists only the managed connection; the others stay saved and return when the lock is lifted'. Restore: blob 95309eb == HEAD blob, git diff HEAD empty.",
"gates": "Local, exit codes captured before any pipe, logs in scratchpad issue-187/: npx tsc --noEmit exit 0; npx eslint . --ext .ts,.tsx exit 0; npx jest --ci --coverage exit 0 (VERDICT command-exit 0); cold variant exit 0. Control-byte self-scan over the changed files: no hits. dispatch-gates.mjs not run: it answers for the objectstack tree only and mobile has no such script; the list above is the dispatch's mobile gate set. PR #188 check-runs on 0a55b73 at report time: 'Lint & Type Check' in_progress, 'Code Quality' in_progress (NOT MEASURED, CI convergence is the PM's).",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0 — no MCP GitHub tools called",
"api_writes": "2 relay or tool writes: (1) fleet-write relay pr_create -> POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/mobile/pulls (draft #188, no assignees, no labels; read-back 5654 bytes sent, 5654 stored, identical); (2) post-stamped.mjs report comment -> POST /repos/objectstack-ai/mobile/issues/187/comments. Plus git push of the branch (not REST). Reads via gh api REST only.",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: #182 · noted, not filed — ConnectionSwitcher.test.tsx's locked case calls i18n.changeLanguage('zh') as it did on main; if #182 renames the zh tag, whichever PR lands second reconciles that line",
"carrier: none · noted, not filed — os-dev.md says a PR carries no assignees while AGENTS.md's claim paragraph says the executor mirrors the card's assignee at pr_create; followed os-dev.md (no assignees) and the relay reports none"
]
}
ACCEPT → PR #188 (head 0a55b73). The maintainer merges it, because seat landing is suspended. The relay reported the dev report comment as failed (HTTP 500), but it is stored as 6599035718 and was not retried.
Landed.#188 merged through the merge queue (enqueued by os-zhuang). The card closed completed via Fixes #187, and pm:dispatched was removed. The two doc lines from batch #2 items 2 and 4 rode this PR.
Activity
objectstack-fleet commentedon Nov 3, 2026
repo:mobile#1 · os-justin · session_01QSeKYnW1Xf6HDSWz1eGAqv
Claim: PM loop round 3
Session:
session_01QSeKYnW1Xf6HDSWz1eGAqvAccount:
os-justinBranch:
claude/issue-187-mdm-lock-scopeWorktree:
mobile-issue-187Domain:
n/a — single-lane repo (repo:mobile)Seat:
repo:mobile#1File surface:
app/console.tsx,components/shell/ConnectionSwitcher.tsx,stores/server-store.ts(only if the lock-arrival switch needs it),__tests__/**,docs/DEPLOYMENT.md,docs/HYBRID-SHELL.md,.changeset/187-mdm-lock-scope.md(stop on breach; explain in the report)Container & model:
S,mode:subagent,model: default tier (opus) — no path-derived mandate,effort: highClause-②: no
Metadata-protocol: none
Responsibility:
n/a — not a defect cardThread-read: none
Premise: holds. On
mainat427cb49, the switcher hides add and the managed row's Remove while locked, but lists the other saved connections.Serial constraints cleared: #187 and #182 are dispatched in the same round. Both touch
docs/HYBRID-SHELL.md, and #182 rewriteslocales/*names. That is ordinary concurrency: the PR that lands second reconciles. Landing: the maintainer merges, because seat landing is suspended (see the comment on #160).objectstack-fleet commentedon Nov 3, 2026
repo:mobile#1 · os-justin · session_01QSeKYnW1Xf6HDSWz1eGAqv
os-dev-report
{ "issue": 187, "status": "done", "branch": "claude/issue-187-mdm-lock-scope", "pr": "https://github.com/objectstack-ai/mobile/pull/188", "session": "session_01QSeKYnW1Xf6HDSWz1eGAqv", "premise_still_valid": true, "summary": "While lockServer is set, ConnectionSwitcher lists only the managed connection (the lockedHost row); the other saved connections are not rendered, stay in the store, and are listed again once the lock is lifted. The filter sits in components/shell/ConnectionSwitcher.tsx, which already receives lockedHost; app/console.tsx got a doc-comment edit only and stores/server-store.ts is untouched, because hydrate/applyManaged already make the managed connection current when the lock arrives (preferManaged), and connect links and the scanner are already refused while locked (server-config redirects; ServerConfigScreen tests). Docs: DEPLOYMENT.md key table gains a trustedHosts row 'Not supported' and the Locked bullet now says hidden-not-deleted; HYBRID-SHELL.md Known limits gains 'A route asked for while the main frame is on another origin is dropped' (verified against buildNavigateScript's origin check). No new strings. Worktree was built from origin/main 13b7e32, not the 427cb49 the dispatch named: main had moved on (427cb49 is an ancestor; #185's EAS commits in between). The old ConsoleScreen case 'locked: the other saved connections can still be removed' pinned the reversed behaviour and was replaced.", "tests": "At 0a55b73. Focused: npx jest --ci ConnectionSwitcher.test.tsx ConsoleScreen.test.tsx -> exit 0, Tests 34 passed of 34. Full: npx jest --ci --coverage --maxWorkers=2 under os-verify-lock -> VERDICT command-exit 0, Test Suites 49/49, Tests 1049/1049. Cold: npx jest --ci --no-cache on the two touched component files -> VERDICT command-exit 0, 34/34 (20.3 s and 22.7 s file wall, inside their 30 s cold-load warm-up). No new test file; new cases sit in the two existing files. Ablation (no build step in this repo; jest runs source via babel): ablation-replace.mjs anchor 'const listed = lockedConnection === null ? connections : [lockedConnection];' -> 'const listed = connections;', anchor 1 -> 0, blob 95309eb -> d8d637b; run VERDICT command-exit 1, 3 failed / 31 passed: ConnectionSwitcher 'lists every saved connection again once the lock is lifted', ConnectionSwitcher 'while the organization locks the server: only the managed connection, no add, and no Remove on it', ConsoleScreen MDM 'locked: the switcher lists only the managed connection; the others stay saved and return when the lock is lifted'. Restore: blob 95309eb == HEAD blob, git diff HEAD empty.", "gates": "Local, exit codes captured before any pipe, logs in scratchpad issue-187/: npx tsc --noEmit exit 0; npx eslint . --ext .ts,.tsx exit 0; npx jest --ci --coverage exit 0 (VERDICT command-exit 0); cold variant exit 0. Control-byte self-scan over the changed files: no hits. dispatch-gates.mjs not run: it answers for the objectstack tree only and mobile has no such script; the list above is the dispatch's mobile gate set. PR #188 check-runs on 0a55b73 at report time: 'Lint & Type Check' in_progress, 'Code Quality' in_progress (NOT MEASURED, CI convergence is the PM's).", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0 — no MCP GitHub tools called", "api_writes": "2 relay or tool writes: (1) fleet-write relay pr_create -> POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/mobile/pulls (draft #188, no assignees, no labels; read-back 5654 bytes sent, 5654 stored, identical); (2) post-stamped.mjs report comment -> POST /repos/objectstack-ai/mobile/issues/187/comments. Plus git push of the branch (not REST). Reads via gh api REST only.", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "carrier: #182 · noted, not filed — ConnectionSwitcher.test.tsx's locked case calls i18n.changeLanguage('zh') as it did on main; if #182 renames the zh tag, whichever PR lands second reconciles that line", "carrier: none · noted, not filed — os-dev.md says a PR carries no assignees while AGENTS.md's claim paragraph says the executor mirrors the card's assignee at pr_create; followed os-dev.md (no assignees) and the relay reports none" ] }objectstack-fleet commentedon Nov 3, 2026
repo:mobile#1 · os-justin · session_01QSeKYnW1Xf6HDSWz1eGAqv
ACCEPT → PR #188 (head
0a55b73). The maintainer merges it, because seat landing is suspended. The relay reported the dev report comment as failed (HTTP 500), but it is stored as 6599035718 and was not retried.objectstack-fleet commentedon Nov 3, 2026
repo:mobile#1 · os-justin · session_01QSeKYnW1Xf6HDSWz1eGAqv
Landed. #188 merged through the merge queue (enqueued by
os-zhuang). The card closedcompletedviaFixes #187, andpm:dispatchedwas removed. The two doc lines from batch #2 items 2 and 4 rode this PR.