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
ScpPerfSamplerandScpTrackingTelemetryinto 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
ScpMrCaptureControllerandScpMrCaptureRefusalPanel(plus the coreMrCaptureGate) into the Control Room boot in chunk A.ScpMrCaptureControllerTestsis 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,
ScpGraphRootAnchorand 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_PROFILEdefaults toControlRoom. TheAgentOpsvalue becomes an unknown value, which fails closed.EditorBuildSettingsandtools/verify-workspace-scene.pystop requiring AgentOps.- The CI gates (
ci.ymlstatic gates,build-and-publish-apk.ymlinputs) andtools/build-install-launch.ps1are updated. build-manifest.jsonrecordsControlRoom.
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.logforerror 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.pyandverify-workspace-scene.py --scene Workspace-ControlRoompass;verify-prefab-roots.pypasses, 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
94f77abstill exists, with no missing-script references. Check this withverify-prefab-roots.py, plus a before/after file-list diff ofAssets/**/*.{prefab,asset,mat,fbx,anim}that must be empty. - The Control Room boot emits
[ScpComposition] VERIFY=OKand[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.
- Asset graph. Every
.metaGUID was resolved to a path. Every YAML asset was scanned forguid:andm_AssetGUID:references. - 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:
ScpOfflineGraphRuntimeScpOfflineFoundryRuntimeScpOfflineDispatchRuntimeScpOfflineEmbodimentRuntimeScpShelfRuntimeScpHandoffRuntimeScpSpecializedViewRendererScpDemoStage
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). : kept, per operator Q2. Only its subject’s wiring moves.ScpMrCaptureControllerTests(11)
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).
AgentOpsstops being aWorkspaceProfilemember in B, not D.SCP_WORKSPACE_PROFILE=AgentOpsfails 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.pypasses, and fails on the old AgentOps list (inverted).verify-gym-scene.pyand its--selftestpass.verify-prefab-roots.pyand its--selftestpass.verify-scene.pyandverify-no-locomotor-freefall.pypass.
Open, for the orchestrator’s Unity pass:
.metafiles for the three new.csfiles.- The Unity compile (read
Editor.log). - R2.
- Re-export
unity-health-report.json(ScpProjectHealth.ExportReport). Until then the freshness gate invalidate_health_report.pyfails, 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-sceneand its--selftest,verify-prefab-rootsand its--selftest,verify-asset-metas,verify-scene,verify-no-locomotor-freefallandvalidate_health_report. - Compile check: the edited
Scp.Unity.EditModeTests,Scp.Unity.Boot.EditorandAssembly-CSharp-Editorsources compile with 0 errors. They were compiled withdotnet buildagainst the main checkout’sLibrary/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.metafiles) is empty. There are 286 such files before and 286 after.
Open, for the orchestrator’s Unity pass:
- The Unity compile (check
Editor.logforerror 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.
Related
- [[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.