Cory Policht
← All references
REF · IP-SCP-40-40-RETIRE-AGENTOPS-ROOM · IP

Ip Scp 40 40 Retire Agentops Room

source: Spatial-Cognition-Platform/Epic-S27-Control-Room-Scene-And-Substrate/IP-SCP-40.40-Retire-AgentOps-Room.mdscrubbed extract
Cited by:now-shipping

Scrubbed extract of Spatial-Cognition-Platform/Epic-S27-Control-Room-Scene-And-Substrate/IP-SCP-40.40-Retire-AgentOps-Room.md — cited by the Chronicle (08-now-shipping). Redactions: phone / service detail / secrets / clearance / personal / internal hosts.


type: implementation-plan category: Work project: Spatial-Cognition-Platform priority: High status: done created: 2026-09-23 updated: 2026-09-23 epic: Epic-S27-Control-Room-Scene-And-Substrate user-story: IP-SCP-40.40 effort: 6h points: 5 target_repo: spatial-cognition-xr precedence:

  • “[[IP-SCP-40.25-Profile-Flag-Selection-Hunk]]” verification_class: B2 verification_rung: R2 needs_unity: true tags: [implementation-plan, control-room, agentops, retirement, operator-decision, test-time]

IP-SCP-40.40: Retire the AgentOps room

Operator decision (2026-09-23, verbatim)

“that old room with all of the pannels and junk, that one needs to get removed cause it’s taking valuable time testing and it’ll never be used”

The Control Room is the product room. Workspace-AgentOps and its boot path are retired. This supersedes the CLAUDE.md line “AgentOps stays the default until IP-SCP-40.31 passes”: the operator has made that call directly, and 40.31’s re-staging no longer gates the switch.

Scope change (2026-09-23, same day, verbatim)

“I would like to be able to retain all the prefabs and assets. just that scene can go away with the walls of text as well.”

This narrows the removal to the scene. Only these go away:

  • the AgentOps scene and its boot scene;
  • the scene-level composition that puts walls of text panels around the user;
  • the profile, gate and test machinery that exists only to build, boot or exercise that scene.

Everything else stays. That covers every prefab, material, model/FBX, ScriptableObject and content asset, every Addressables group, entry and catalog key, every asset or prefab family builder and kit, every script a retained prefab or asset references, and the engine-free core. A retained prefab must never end up with a missing script. This supersedes the removal breadth of the original §1 and §3. The first survey (commit abaf4eeb) proposed deleting prefabs, assets and core, and it is replaced below.

Operator decisions (2026-09-23)

  • Q1: yes. Move ScpPerfSampler and ScpTrackingTelemetry into the Control Room boot in chunk A. The Control Room boot must then emit [SCP-PERF] (see Acceptance). The debug HUD family was not part of this answer. It stays in (a), marked “confirm” (Q1b).
  • Q2: keep MR capture. Move ScpMrCaptureController and ScpMrCaptureRefusalPanel (plus the core MrCaptureGate) into the Control Room boot in chunk A. ScpMrCaptureControllerTests is kept.

Evidence

In the 2026-09-23 full EditMode run (1,097 tests, shared Editor), the only two failures were AgentOps-room tests:

  • ScpOfflineWorkspaceIntegrationTests.FullDemoSeatsPartsAndForgesATemplate, “Canceled startup”, 60 s timeout;
  • CompactThoughtInspectionViewTests…RealContentHandle…, Addressables load, 30 s timeout.

The offline-workspace integration suite alone runs at about 50–60 s per test while the Editor is unfocused. It dominates R2 wall time and has a known timing-flake history.

Scope

1. Survey first. Classify every AgentOps item into one of three groups. Nothing is deleted until this survey is committed as a table in this note.

  • Scene-only (remove): Workspace-AgentOps.unity, Bootstrap.unity, and the boot and composition code whose only job is building or booting that scene. That is the entry point, composition, binder and reconciler, and the offline runtimes, but only where no retained prefab or asset references them. Also the CI and tool gates that require the scene, and the EditMode suites whose purpose is booting or exercising it.
  • Retained: every prefab or asset, and every script a prefab or asset needs, including the builders and kits that author them. Kits, core models, the Fleet Shelf binding and furniture, the orb family, supervision sinks, ScpGraphRootAnchor and XR-Rig stay working for the Control Room and the gym.
  • Dead code with no asset dependents: list only. Removal is proposed only when the code is purely scene wiring.

2. Build profile.

  • SCP_WORKSPACE_PROFILE defaults to ControlRoom. The AgentOps value becomes an unknown value, which fails closed.
  • EditorBuildSettings and tools/verify-workspace-scene.py stop requiring AgentOps.
  • The CI gates (ci.yml static gates, build-and-publish-apk.yml inputs) and tools/build-install-launch.ps1 are updated.
  • build-manifest.json records ControlRoom.

3. Remove the scene-only set in the short chunk sequence of Survey (f). After each chunk:

  • R1 green;
  • the Unity compile is clean. Read Logs/Editor.log for error CS. The MCP compile-errors tool gave a false 0 on 2026-09-23;
  • the gym and Control Room builders’ read-backs are OK;
  • verify-gym-scene.py and verify-workspace-scene.py --scene Workspace-ControlRoom pass;
  • verify-prefab-roots.py passes, and no retained prefab has a missing script;
  • full EditMode is green.

4. Docs. Update the project CLAUDE.md (AgentOps references, the default-profile line, and the scene list in “Never read .unity”) and README.md. Record the retirement in the S27 README and in [[Trackers/Spatial-Execution-Tracker]]. Any vault IP whose sole deliverable is AgentOps-room composition is re-scoped or closed, each with a one-line reason.

Out of scope

  • Every prefab and asset, and the scripts, builders and kits behind them. This is the operator’s 2026-09-23 scope change.
  • All engine-free core, including the models only AgentOps used.
  • The asset gym: it stays; it’s the inspection surface.

Acceptance

  • There is no AgentOps scene, boot path or build profile. A ControlRoom-profile APK builds (R4 build only).
  • Every prefab and asset present at 94f77ab still exists, with no missing-script references. Check this with verify-prefab-roots.py, plus a before/after file-list diff of Assets/**/*.{prefab,asset,mat,fbx,anim} that must be empty.
  • The Control Room boot emits [ScpComposition] VERIFY=OK and [SCP-PERF] frame and GPU lines, and the tracking telemetry and MR capture are wired (operator decisions Q1 and Q2). Read these from the R3-link editor log first, then from the R4 device session log. The [SCP-PERF] figures themselves stay R4-only.
  • Full EditMode runs green with measurably lower wall time. Record before and after.
  • The Control Room and gym are unchanged in the headset. This is an R3-link spot check with the operator.

Survey (2026-09-23, revised for the scene-only scope)

Ref surveyed: spatial-cognition-xr @ 94f77ab (session/controlroom-pairing-20260922). The survey was read-only: a git archive of that ref, with no checkout and no Unity.

Method. Two graphs.

  1. Asset graph. Every .meta GUID was resolved to a path. Every YAML asset was scanned for guid: and m_AssetGUID: references.
  2. C# type graph. Comments and string literals were stripped. Each file then got an edge to every file that declares a top-level type it names.

Retained roots:

  • (i) every script referenced by any asset except the two AgentOps scenes and the legacy source scene;
  • (ii) everything the Control Room, gym, build and infra, and the self-installing globals reach;
  • (iii) every editor file that authors an asset (SaveAsPrefabAsset, CreateAsset, CreateOrMoveEntry), 44 files in all;
  • (iv) every production file the scene seed does not reach.

Scene seed: ScpSceneBootstrap, ScpWorkspaceSceneEntryPoint, ScpWorkspaceComposition, and the pure scene composers (ScpOfflineWorkspaceBuilder, ScpOfflineControlBuilder, ScpOfflineGraphBuilder, ScpOfflineWorkspacePreview, ScpCompositionWiring, ScpHandoffAcceptanceBuilder, ScpOfflineWorkspaceWalkthrough).

How “scene-only” was decided. A file is scene-only if the seed reaches it and the retained closure, blocked at the seed, does not. The closure is blocked at the seed so that every retained-to-seed edge shows up as a cut to make.

Sanity check. The survey counts 1,098 EditMode tests, which matches the 1,097 in the evidence run.

Totals

Bucket Unity C# Engine-free core Assets EditMode tests
(a) Scene-only (remove) 38 unconditional, plus 8 debug-HUD files (remove pending confirmation, Q1b); MR capture is retained (Q2) 0 (all kept) 2 scenes only (Bootstrap.unity, Workspace-AgentOps.unity); 0 prefabs or assets 22 suites / 115 tests removed (23 of those tests are the HUD suites, pending Q1b)
(b) Retained Everything else. This includes the offline runtimes that prefabs or asset builders pin, all 44 asset builders, and all kits. 13 retained files need a cut (see (b)). all all prefabs, assets, Addressables groups, entries and catalog keys 19 suites / 173 tests edited; 98 suites / 810 tests untouched
(c) Dead, no asset dependents 17 listed (list only); 1 is purely scene wiring and joins (a) 21 core files the scene alone reaches (list only; kept) none none

Blockers (a retained prefab or asset whose script is scene-only): none. No retained prefab, ScriptableObject or Addressables entry references any script in (a).

The one asset-level caveat is not a prefab. Scp/Legacy/Scenes/SpatialCognition.unity is the source scene that ScpAdditiveSceneBuilder splits into XR-Rig, and it carries ScpSceneBootstrap and ScpWorkspaceSceneEntryPoint components. Deleting those scripts would leave two missing-script components in that source scene. The fix is in chunk D: trim ScpAdditiveSceneBuilder to XR-Rig only, and strip the two components from the legacy scene in the same PR.

(a) Scene-only (remove)

Path Kind Evidence
Assets/Scenes/Workspace-AgentOps.unity, Assets/Scenes/Bootstrap.unity scenes The AgentOps room and its boot scene. Only the AgentOps profile, ScpSimulatorHarness, ScpProjectHealth, ScpInteractiveSimSession and the tool gates in (e) reference them.
Scp.Unity.Boot: ScpSceneBootstrap, WorkspaceFiles; Lifecycle/: ScpWorkspaceSceneEntryPoint, ScpWorkspaceComposition, ScpInteractionBinder, ScpSceneViewReconciler, ScpSceneViews, ScpSessionDiagnostics, ScpSplatWiring, ScpOfflineControlRuntime, ScpOfflineWorkspacePanel, ScpOfflineProjectionRegion, ScpSandboxScenarioBinding, ScpLegendSwatchSource, DemoIntentDispatcher, DemoObjectProjection{Binding,Session}, DemoOperationsDisplayBinding, CompactThoughtInspectionContentBinding, ProvenanceBeamService, ReasoningPlacementWriter, ReasoningRevisionService (22) boot and composition Only the two AgentOps scenes and the seed reference these. No prefab or asset does. ScpSessionDiagnostics is the AgentOps-only wiring for the perf sampler, tracking telemetry and HUD; see Q1.
Scp.Unity.Interaction: ScpRunControlGestureBinding, RevisePalette{Grab,Selection}Binding, CaseFileCardGrabBinding; Scp.Unity.View: RevisePalette{View,OptionRef}, ReasoningDimEffect, RevisionAddedPulse (8) scene components These are wired only by ScpWorkspaceComposition or the AgentOps scene. No prefab carries them.
Assets/Editor/: ScpOfflineWorkspaceBuilder, ScpOfflineControlBuilder, ScpOfflineGraphBuilder, ScpOfflineWorkspacePreview, ScpCompositionWiring, ScpHandoffAcceptanceBuilder, OfflineVerification/ScpOfflineWorkspaceWalkthrough; ScpGraphSceneBuilder, a legacy scene builder coupled to ScpSceneBootstrap and purely scene wiring (8) scene composers These compose or drive the AgentOps scene. Their shared helpers are extracted first (A2), and the asset they author is re-homed (A3).
Pending Q1b (HUD confirmation): Scp.Unity.Diag: ScpDebugHud, ScpHudButton, ScpLegendPanel, ScpAdpTheme, ScpFriendly, ScpHoldTapClassifier, ScpRehomeDebounce, ScpSandboxConsole (8) debug HUD Only ScpSessionDiagnostics creates the HUD. The recommendation is to remove it, and the operator has not answered. ScpPerfSampler and ScpTrackingTelemetry are moved to the Control Room (Q1 yes) and depend only on ScpLog, so they need nothing from the HUD.
ScpMrCaptureController, ScpMrCaptureRefusalPanel MR capture Retained, per operator Q2. Chunk A moves them into the Control Room boot.

(b) Retained

Assets. Every prefab, material, model, animation, audio file, ScriptableObject and fixture is retained, and so are all 7 Addressables groups and all 40 ScpSceneContentCatalog keys. After chunk D they are no longer loaded at runtime by any room. The gym census (ScpGymAssetManifest) still lists and inspects them.

Code. All 44 asset-authoring builders are retained, including ScpOfflineShelfBuilder, ScpS14RegistrationBuilder, ScpOfflineFoundryBuilder, ScpOfflineDispatchBuilder, ScpOfflineThoughtPrefabBuilder, ScpSpecializedViewBuilder, ScpDemoStageProfileBuilder, the Edge/NodePanel/Handoff/Reasoning/TemplateCard/CaseFile/WorkToken builders, and the AgentOrb and supervision authors. So is every script a prefab carries (for example ScpOfflineThoughtRuntime on PF_OfflineThoughtWorkspace and PF_CompactThoughtInspection), every kit, and the whole engine-free core.

Retained but no longer wired. The runtimes the retained builders pin stay in the tree with no scene composing them:

  • ScpOfflineGraphRuntime
  • ScpOfflineFoundryRuntime
  • ScpOfflineDispatchRuntime
  • ScpOfflineEmbodimentRuntime
  • ScpShelfRuntime
  • ScpHandoffRuntime
  • ScpSpecializedViewRenderer
  • ScpDemoStage

Retained files that need a cut before or with the deletion:

Retained file Reference into (a) Cut Chunk
ScpControlRoomSessionRuntime.cs:97-102 ScpSceneBootstrap.ReportSourceSelection (ScpSceneBootstrap.cs:363) A1: move the static reporter to a shared lifecycle helper. A
ScpOfflineFoundryBuilder, ScpOfflineDispatchBuilder, ScpOfflineThoughtPrefabBuilder, ScpOfflineShelfBuilder ScpOfflineWorkspaceBuilder.CreateLabel / CreateAction (about 30 call sites) A2: extract the label and action helpers into a shared editor utility. A
ScpOfflineWorkspaceBuilder (being deleted) It is the only author of the retained OfflineSpecializedCatalog.asset (:138-140). It also creates OfflineAction.mat, which ScpOfflineDispatchBuilder authors too. A3: move the specialized-catalog authoring into ScpSpecializedViewBuilder, so the retained asset stays regenerable. A
ScpS14RegistrationBuilder ScpWorkspaceSceneEntryPoint (:30-33,124,182,208,241). It finds the owner in the AgentOps scene and reads the catalog from it. A4: make the orb-variant, Addressables and catalog-key registration load ScpSceneContentCatalog.asset by path. Then drop WireShelf’s scene wiring (grab, ghosts, handoffs, demo stage) in D. A, then D
ScpOfflineShelfBuilder.cs:37 ScpWorkspaceSceneEntryPoint.DefaultShelfCapacity Move the constant (16) beside the shelf furniture authoring. D
ScpOfflineFoundryBuilder.cs:94-107 RequireEntry and “Author harvest drawer handoff”, which opens the AgentOps scene Drop that scene-wiring method; keep the prefab authoring. D
ScpDemoStageProfileBuilder.cs:20-28 Opens and saves Workspace-AgentOps Keep the DemoStageViewProfile.asset authoring (:39); drop the scene wiring. D
ScpShelfRuntime.cs:81,117,149, ScpHandoffRuntime.cs:99,134, ScpOfflineEmbodimentRuntime.cs:54,116 Take ScpWorkspaceSceneEntryPoint as an Initialize or constructor parameter Drop the parameter. Only the deleted entry point and composition called these. D
ScpSessionPorts.cs:10, UnityAdditiveSceneAdapter.cs:26,67-73,196,291,310 IScpAdditiveSceneAdapter.WorkspaceEntryPoint Remove the port member. The Control Room and gym boot through this adapter. D
ScpLifecycleSteps.cs:409, VerifyCompositionStep.cs:34-61 ScpSceneBootstrap CompositionRoot Retype to Component, or drop. D
ScpControlRoomWorkspaceBuilder.cs:452-461, ScpGymWorkspaceBuilder.cs:419-428 Leak guards (FindInScene<ScpWorkspaceSceneEntryPoint / ScpSceneBootstrap>) Drop the guards along with the types. D
ScpAdditiveSceneBuilder.cs:20-52 Splits the legacy scene into XR-Rig and Bootstrap and Workspace-AgentOps, and uses ScpSceneBootstrap Trim to XR-Rig only and strip the two components from the legacy scene. Regenerate XR-Rig and diff it against 94f77ab; the diff must be empty. D
ScpPlayerBuilder.cs:100-114, 505-570, ScpProjectHealth.cs:51, ScpSimulatorHarness.cs:70, ScpInteractiveSimSession The AgentOps session configure/verify hunk, Bootstrap.unity scene paths Remove the hunk. Retarget the rest to Bootstrap-ControlRoom. B
Q1 (operator: yes) ScpPerfSampler and ScpTrackingTelemetry are wired only through ScpSessionDiagnostics. The Control Room APK emits no [SCP-PERF] today. A5: create both in ScpControlRoomBootstrap, mirroring ScpSessionDiagnostics.cs:56-79 minus the HUD. Acceptance: the Control Room boot log shows [SCP-PERF]. A
Q2 (operator: keep) ScpMrCaptureController (and ScpMrCaptureRefusalPanel, core MrCaptureGate) are wired only by ScpSceneBootstrap A6: wire MR capture into ScpControlRoomBootstrap. ScpMrCaptureControllerTests is kept. A

(c) Dead code with no asset dependents (list only; not proposed for removal)

Path Why it looks dead Proposal
ScpLinkDemoPresentationMode, ScpModelPreviewSceneBuilder, ScpSelectionSceneBuilder, ScpGrabSceneBuilder, OfflineVerification/ScpSplatSimulatorVerification Legacy menu tools for scenes that no longer ship List only.
Lifecycle/DemoStageOutcomeBinding, Lifecycle/NotImplementedHarvestPort, Interaction/{ContextCardPullToFaceAdapter,DrawerCueSink,DrawerPullHandleInteractable,ForgeCueSink,HarvestPresentationSink} Unwired components that no asset references List only.
The runtimes that stay without wiring, listed in (b) No scene composes them after chunk D List only. A future IP could remove them once their builders’ remaining references are trimmed.
Around 50 view and interaction scripts (for example NodeSpawner, Truth/Evidence/RevisionLinkRenderer, ReasoningSpawner, EntitySelectionBinding, EntityCardPanel, TemplateRackBayStrip, ForgeAssemblyView, BlankOrbView, ScpSceneContentKeys) Scene components that only the retained asset builders or the legacy scene builders reference Keep. Removing them would mean trimming retained builders, which the scope change forbids.
21 engine-free core files that only the scene reaches (Sandbox*, MrCapture*, RevisePalette*, LegendModel, FileSystemWorkspaceFile, …) Engine-free core Keep: all core stays (the scope change settles Q3).
SampleScene.unity; the in-flight Control Room work (curtain, exclusion volume, sandbox wall, helper shader preview); the assembly stubs Not AgentOps, or work in flight Keep.

(d) Tests

Remove: 22 suites / 115 tests. These either test a scene-only subject or boot and exercise the AgentOps scene. Removing ScpOfflineWorkspaceIntegrationTests removes the 50–60 s-per-test suite and evidence failure 1.

  • Scene-exercising: ScpOfflineWorkspaceIntegrationTests (5), ScpSceneBootstrapLifecycleTests (4), ScpSceneEntryPointWiringTests (9), ScpCompositionVerificationContractTests (2), ScpCompositionWiringBehaviorTests (2), ScpGraphContentFrameTests (3), ScpGraphCullingContractTests (6), ScpWorkspacePlacementTests (4), ScpRecordedReplayRuntimeTests (1).
  • Scene-only subjects: ScpInteractionBinderTests (3), ScpOfflineControlRuntimeTests (10), ScpOfflineProjectionRegionTests (3), ScpSplatWiringTests (9), DemoObjectProjectionBindingTests (11), CaseFileCardGrabBindingTests (10), RevisePaletteContentTests (3), RevisePalettePlacementTests (3), WorkspacePathResolutionTests (4).
  • Pending Q1b (HUD): ScpLegendPanelTests (3), ScpRehomeDebounceTests (4), ScpHoldTapClassifierTests (5), ScpSandboxConsoleTests (11).
  • ScpMrCaptureControllerTests (11): kept, per operator Q2. Only its subject’s wiring moves.

Edit: 19 suites / 173 tests. Keep each suite and drop the scene cases, leak guards or fixture use.

Suite (count) Scene touch
ScpGymCompositionTests (11), ScpControlRoomCompositionTests (8), FleetShelfKitCompositionTests (17), GateBenchKitCompositionTests (5), SandboxWallKitCompositionTests (11), ScpCoherenceBoardKitTests (14), SupervisionPrefabsTests (4) Leak guards through ScpWorkspaceSceneEntryPoint and ScpSceneBootstrap, and cases that assert against Workspace-AgentOps
ScpAdditiveSceneLifecycleTests (9), ScpLifecycleUnwindTests (8), ScpMainThreadLifecycleTests (9) Load Workspace-AgentOps or fake WorkspaceEntryPoint. Retarget them to the Control Room scene or an entry-point-free fake.
ScpLiveBuildRemoteAuthorityTests (5), ScpLiveServiceLifecycleTests (4), BakedSnapshotDocumentSourcesTests (11) Go through ScpSceneBootstrap. Re-home them onto ScpLiveServiceComposition and the moved reporter (A1).
ScpShelfRuntimeCompositionTests (11), CompactThoughtInspectionViewTests (8), DemoOperationsDisplayViewTests (16), ScpOfflineGraphRuntimeTests (4), SpatialDemoControllerTests (8) Retained subjects with scene-only fixtures: the entry point, the content binding, DemoOperationsDisplayBinding, DemoObjectProjectionBinding and DemoIntentDispatcher. Evidence failure 2 (CompactThoughtInspectionViewTests…RealContentHandle…) lives in a retained suite. Keep that case unless it proves scene-bound when the suite is edited.
ScpPlayerSceneSelectionTests (10) AgentOps default-profile cases. Invert them to “AgentOps fails closed”.

Keep untouched: 98 suites / 810 tests (this includes ScpMrCaptureControllerTests). The largest of these are the suites for retained prefab scripts: HarvestGestureBindingTests (18), GrabConnectorBindingTests (24), TemplateCard*, WorkToken*, CaseFile* (other than grab), ForgeAssemblyViewTests, PartsDrawerViewTests, ScpShelfRuntimeTests, ScpHandoffRuntimeTests and ScpVisualSpecCatalogTests.

(e) Profile, CI and docs touchpoints

Where Today Change
Editor/ScpPlayerSceneSelection.cs Unset means AgentOps, and AgentOps returns the enabled EditorBuildSettings list byte for byte Unset means ControlRoom. AgentOps becomes an unknown value and fails closed.
Editor/ScpPlayerBuilder.cs:100-114, 505-570 Configures and verifies the ScpSceneBootstrap session on the default profile Remove the hunk.
ProjectSettings/EditorBuildSettings.asset Bootstrap, XR-Rig, Workspace-AgentOps Bootstrap-ControlRoom, XR-Rig, Workspace-ControlRoom. The gym stays out of the build list.
tools/verify-workspace-scene.py Default mode is AgentOps. The ControlRoom mode asserts that no Control Room scene is in EditorBuildSettings. Remove the AgentOps mode and make ControlRoom the default. Invert that assertion.
tools/verify-build-scenes-enabled.py:10-39 (CI R1 static gate) Hard-codes the AgentOps boot scenes Use the Control Room scene set.
tools/verify-gym-scene.py:315-317, 383 Requires Bootstrap.unity to be the first build scene; its self-test mutates the scene to Workspace-AgentOps Require Bootstrap-ControlRoom first, and pick a new mutation target for the self-test.
tools/verify-scene.py:77-79 Says the builder “overwrites Bootstrap and Workspace-AgentOps too” Update the message after the trim.
.gitea/workflows/build-and-publish-apk.yml:42-49, 86-90 workspace_profile defaults to AgentOps, and tag pushes build AgentOps Default to ControlRoom and drop the AgentOps option.
tools/ci-build-apk.ps1:124-136 Empty means AgentOps Accept ControlRoom only; empty means ControlRoom. build-manifest.json records ControlRoom.
tools/build-install-launch.ps1:67-101, 521-529, 722 -WorkspaceProfile defaults to AgentOps; the comment on the expected VERIFY count names Workspace-AgentOps Profile becomes ControlRoom only; update the comment. -RegenAssets (ScpReasoningAssetBuilder) stays, because that builder is retained.
tools/run-link-play.ps1:216, run-simulator.ps1, run-simulator-interactive.ps1 Open or boot Bootstrap.unity Point them at Bootstrap-ControlRoom.unity. The sim tools follow the harness retarget.
Committed health report (validate_health_report.py, CI) ScpProjectHealth.RequiredScenePath = Bootstrap.unity Retarget and regenerate.
CLAUDE.md (repo) Lines 32-36 (scene list), 46-48 (the verify-workspace-scene gate), 226-233 (profile default, “AgentOps stays the default until 40.31”) §4
README.md, docs/OFFLINE-WORKSPACE.md, docs/process/asset-pipeline.md:15,107 (stage 6 “room” is Workspace-AgentOps), tools/xr-operator/README.md:66 AgentOps as the room §4. Stage 6 becomes Workspace-ControlRoom.
Vault About 30 open notes reference AgentOps-room composition. Among them: the S7, S11, S12, S13, S14, S15 and S16 offline demo gates (16.33, 17.34, 18.34, 19.32, 20.32, 21.33, 22.32); 19.20; 30.5.1; 30.6.2; 30.14; 32.5; 32.7; 33.9; 33.10; 34.31; 35.18; 36.31; 39.4; 39.11; 39.17; and the S6 fix notes §4: re-scope or close each, with a one-line reason. Content IPs whose assets are retained, such as 34.1 and 34.34, stay open.

(f) Chunks

# PR Contents Must be done first
A Decouple, plus the Q1/Q2 re-wiring A1 move ReportSourceSelection.
A2 extract CreateLabel/CreateAction into a shared editor utility.
A3 move OfflineSpecializedCatalog.asset authoring into ScpSpecializedViewBuilder.
A4 make the S14 orb-variant, Addressables and catalog registration scene-free.
A5 (Q1) create ScpPerfSampler and ScpTrackingTelemetry in ScpControlRoomBootstrap.
A6 (Q2) wire ScpMrCaptureController and its refusal panel into ScpControlRoomBootstrap.
Add EditMode coverage asserting that the Control Room boot creates all three.
Acceptance: the R3-link editor log shows [ScpComposition] VERIFY=OK and [SCP-PERF] lines from the Control Room boot, and the Control Room and gym builder read-backs stay byte-stable.
Operator decisions Q1 and Q2 (done, 2026-09-23)
B Profile, build and CI flip (§2) Everything in (e) except docs. After B, AgentOps can no longer be built or selected, but its scene files are still on disk. A
C Scene-only tests Remove the 22 suites (the 4 HUD suites only if Q1b confirms). Edit the 19 suites, except the edits that need a D cut, which move to D. Record full-EditMode wall time before and after. B
D Scenes, boot and composition Delete the two scenes and the (a) code. Make every in-PR cut from (b). Trim ScpAdditiveSceneBuilder and strip the legacy scene. Regenerate XR-Rig and the gym manifest; both diffs must be empty. Run the prefab and asset file-list diff: it must be empty, with no missing scripts. C
E Docs (§4) The repo CLAUDE.md and README.md, the docs in (e), the S27 README, the Spatial-Execution-Tracker, and the vault IP re-scopes D

C and D can merge into one PR if the reviewer prefers. The scene files, boot code and scene-bound tests delete together cleanly. In that case, C keeps only the tests that need no D cut.

Decisions

  • Q1: perf sampler and tracking telemetry. Operator, 2026-09-23: yes. Both move into the Control Room boot in chunk A (A5), with [SCP-PERF] emission from the Control Room boot as acceptance.
  • Q1b: debug HUD (8 files, 4 suites / 23 tests). Still open. The recommendation is to remove it, because the walls-of-text panel is what is being retired and the perf and telemetry no longer need it. It is removed in C and D only if the operator confirms. Otherwise it stays as unwired code.
  • Q2: MR capture. Operator, 2026-09-23: keep. It moves into the Control Room boot in chunk A (A6).
  • Q3: core AgentOps-only models. Resolved by the scope change: all engine-free core is kept.
  • Chunk A+B PR (operator, 2026-09-23). The PR keeps every prefab and asset, ports the perf sampler and tracking telemetry (Q1) and MR capture (Q2) into the Control Room boot, and leaves the debug HUD alone (Q1b still undecided: not deleted, not ported). It deletes no scene and no scene code; those deletions are deferred per [[Tasks/Work/tech-debt-spatial-cognition-xr-agentops-room-code-deletion]].
  • Chunk B profile (implementation call, following §2). AgentOps stops being a WorkspaceProfile member in B, not D. SCP_WORKSPACE_PROFILE=AgentOps fails closed from this PR on, and the error names IP-SCP-40.40. The AgentOps scene and code still compile and open in the Editor.

Chunk A+B status (2026-09-23)

Branch: feat/scp-40.40-ab-decouple-profile (spatial-cognition-xr, off 829b1e4), pushed; no PR opened yet. The orchestrator runs the Unity compile, .meta generation and health-report export, then opens it.

Item Done How
A1 yes ReportSourceSelection now lives on the retained ScpLiveServiceComposition; both boots and BakedSnapshotDocumentSourcesTests call it there.
A2 yes A new Assets/Editor/ScpOfflineAuthoring.cs holds CreateLabel / CreateAction / ActionMaterial. All callers are repointed, and the scene builder no longer defines them.
A3 yes ScpSpecializedViewBuilder.AuthorCatalog authors OfflineSpecializedCatalog.asset, with the menu entry SCP/Offline/Build specialized view content. The AgentOps builder calls it.
A4 yes ScpS14RegistrationBuilder.RegisterContent() does the scene-free orb-variant, Addressables and catalog registration by path, with a read-back of every agent-orb-dormant-* key (menu entry SCP/Register S14 content (scene-free)). WireShelf shares the same body.
A5 (Q1) yes The new ScpControlRoomDiagnostics creates ScpPerfSampler and ScpTrackingTelemetry on the stage root after VERIFY. Anchor placements and layout re-solves (the new ScpControlRoomLayoutFollower.ReSolving) count as expected moves.
A6 (Q2) yes ScpMrCaptureArming.Arm is the one shared arming step, and ScpSceneBootstrap delegates to it. The Control Room boot carries the same optional _mrCaptureController and arms it through the new ScpControlRoomSessionRuntime.Begin(..., onBound) hook.
A tests yes ScpControlRoomDiagnosticsTests: 9 EditMode cases.
B yes The core WorkspaceProfile is ControlRoom only. EditorBuildSettings is Bootstrap-ControlRoom / XR-Rig / Workspace-ControlRoom. ScpPlayerBuilder drops the AgentOps hunk and adds a player-session read-back plus a build-list-equals-selection check. The CR builder writes and reads back that list. Health, sim harness, sim session and run-link-play are retargeted. verify-workspace-scene defaults to ControlRoom and requires the exact CR build list (AgentOps mode stays opt-in until the deferred deletion). verify-build-scenes-enabled, verify-gym-scene, ci-build-apk.ps1, build-install-launch.ps1 and build-and-publish-apk.yml are updated.

Boot markers that prove the wiring (Control Room boot, R3-link log):

  • [SCP-CONTROLROOM] OK DIAGNOSTICS perf=True tracking=True mrCapture=<present|absent>
  • [SCP-TRACKING] armed | ...
  • [SCP-PERF] armed | ... (after the 3 s warm-up)
  • [SCP-MR-CAPTURE] ... after the session binds

No scene carries a capture object and no recorder ships, the same as AgentOps today. So the expected MR line is no capture object in this scene; MR capture is off.

Proof so far (no Unity run):

  • R1 is green: 2660 App tests plus all other assemblies.
  • verify-workspace-scene.py (CR default, --selftest, --scene Workspace-AgentOps) passes.
  • verify-build-scenes-enabled.py passes, and fails on the old AgentOps list (inverted).
  • verify-gym-scene.py and its --selftest pass.
  • verify-prefab-roots.py and its --selftest pass.
  • verify-scene.py and verify-no-locomotor-freefall.py pass.

Open, for the orchestrator’s Unity pass:

  • .meta files for the three new .cs files.
  • The Unity compile (read Editor.log).
  • R2.
  • Re-export unity-health-report.json (ScpProjectHealth.ExportReport). Until then the freshness gate in validate_health_report.py fails, because ProjectSettings and ProjectHealth changed in this PR.
  • The Control Room builder read-back. Its build-list assertion is inverted to require the CR set.

Chunk C+D status (2026-09-23): scenes and scene-bound tests, done in branch

A+B merged: PR #583, main at d579f60.

Branch: feat/scp-40.40-cd-remove-agentops-scenes (spatial-cognition-xr, off d579f60), pushed with commits 51630ef and fc133e6. No PR is open yet. The orchestrator runs the Unity pass, then opens it.

Code deletion is deferred. The operator deferred it to [[Tasks/Work/tech-debt-spatial-cognition-xr-agentops-room-code-deletion]]. The only .cs files this branch deletes are the two EditMode test files below. The (a) boot, composition and builder code, the debug HUD (Q1b is still open) and their unit-test suites stay in the tree, unused. So the survey’s (d) “remove 22 suites” list is narrowed to the cases that open or parse the deleted scene files. The suites that test code still in the tree move to the tech-debt note along with that code.

Item Done How
Scenes yes Bootstrap.unity and Workspace-AgentOps.unity are deleted, with their .meta files. A GUID grep finds their GUIDs only in their own .meta files: no retained scene, prefab, asset or Addressables entry references them.
Tests, suites yes ScpOfflineWorkspaceIntegrationTests is deleted: 4 scene cases, including evidence failure 1. Its one scene-free case (formation effects) moves to ForgeAssemblyViewTests. ScpCompositionVerificationContractTests is deleted: 1 case.
Tests, cases yes ScpSceneEntryPointWiringTests -4 (5 source and synthetic cases kept). SupervisionPrefabsTests -2 (2 prefab cases kept). ScpGymCompositionTests -2 (saved-room label facing, and gym/room parity). ScpAdditiveSceneLifecycleTests -1 case and -2 TestCase rows (XR-Rig kept). Net: -16 EditMode cases.
Retained builders yes Every builder that opens the deleted scene by path now throws an IP-SCP-40.40 message before touching anything: ScpS14RegistrationBuilder.WireShelf, ScpOfflineFoundryBuilder.AuthorHarvestHandoff, ScpDemoStageProfileBuilder.AuthorWorkspaceProfile, ScpOfflineWorkspaceBuilder.BuildAll and ScpCompositionWiring. ScpCompositionWiring used to fall back silently to wiring the legacy XR-Rig source scene; it no longer does. No CI path or tool invokes any of them.
ScpAdditiveSceneBuilder unchanged It is the only author of XR-Rig, and it still re-creates the two deleted scenes when it runs. verify-scene.py’s hint and CLAUDE.md say to delete them again before committing. Trimming it is part of the tech debt.
Tooling yes verify-workspace-scene.py no longer has its AgentOps mode, checks or fixtures. Only --scene Workspace-ControlRoom remains, and it is the default.
Docs yes Repo CLAUDE.md (the scene sizes, the scene gates, and the profile paragraph, which replaces “AgentOps stays the default until 40.31”), README, asset-pipeline.md stage 6 (now Workspace-ControlRoom), a retired banner on OFFLINE-WORKSPACE.md, and the xr-operator README. The S27 README, the tracker and the vault IP re-scopes (E) are not done.

Proof (no Unity run):

  • R1 is green: App 2660, Projection 914, Domain 186, Contracts 139, Guardrails 26, SnapshotExporter 11.
  • Static gates all pass: verify-workspace-scene (default, --selftest, --scene Workspace-ControlRoom), verify-build-scenes-enabled, verify-gym-scene and its --selftest, verify-prefab-roots and its --selftest, verify-asset-metas, verify-scene, verify-no-locomotor-freefall and validate_health_report.
  • Compile check: the edited Scp.Unity.EditModeTests, Scp.Unity.Boot.Editor and Assembly-CSharp-Editor sources compile with 0 errors. They were compiled with dotnet build against the main checkout’s Library/ScriptAssemblies, which is not a Unity compile.
  • Prefab and asset diff: git diff --name-status origin/main -- '*.prefab' '*.mat' '*.asset' '*.fbx' '*.controller' '*.anim' (and their .meta files) is empty. There are 286 such files before and 286 after.

Open, for the orchestrator’s Unity pass:

  • The Unity compile (check Editor.log for error CS).
  • Full EditMode R2, recording wall time before and after.
  • No builder needs rerunning, and there is no health-report re-export: none of the freshness inputs changed.
  • [[Tasks/Work/tech-debt-spatial-cognition-xr-agentops-room-code-deletion]]
  • [[Trackers/Pairing-Plan-2026-09-22]]
  • [[Trackers/Pairing-Agent-Distillation-Log#Handoff state]]
  • [[IP-SCP-40.25-Profile-Flag-Selection-Hunk]]
  • [[IP-SCP-40.31-Control-Room-Seven-Beat-Re-Staging-Pass]]

Completion (2026-09-23)

  • Chunks A and B: PR #583 (main@d579f60). Chunks C and D (the scenes and their scene-only tests): PR #584 (main@db5069a). CI R2 passed at each PR head: 1108/1108 and 1092/1092.
  • No prefabs or assets deleted: 286 files before and after. The code deletion is deferred to [[../../../Tasks/Work/tech-debt-spatial-cognition-xr-agentops-room-code-deletion|tech debt]].
  • R2 wall time: CI EditMode went from 4 m 56 s (1,108 tests) to 4 m 30 s (1,092 tests), about −9 %. The larger saving the evidence implied came from local GUI-Editor focus stalls, which the headless CI runner doesn’t have.
  • Still open: the R3-link spot check (the Control Room and gym unchanged in the headset), to be done in the next headset session. The R4 ControlRoom-profile APK build was not run here.