v38 Cutover Log¶
Baseline¶
Baseline tag:
pre-cutover-namespace-swapBaseline commit:
858d3a5Snapshot time (UTC):
2026-03-05 21:38:04Z
Environment¶
Python (poetry runtime):
Python 3.13.0Python (host):
Python 3.11.5Poetry:
Poetry 1.7.0Platform: local macOS dev environment
Persisted-data compatibility default¶
Cutover assumes no backwards compatibility guarantee for persisted artifacts generated before the namespace swap.
Validation Lanes¶
Lane A: v38 native engine¶
poetry run pytest -q engine/tests/core38 engine/tests/vm38 engine/tests/story38 engine/tests/service38 -o log_cli=false
Result: 918 passed
Lane B: non-retiring engine compatibility¶
poetry run pytest -q engine/tests/integration engine/tests/loaders engine/tests/ir engine/tests/journal engine/tests/persistence engine/tests/lang engine/tests/utils engine/tests/mechanics -o log_cli=false
Result: 665 passed, 62 skipped, 9 xfailed
Lane C: apps¶
poetry run pytest -q apps/cli/tests apps/server/tests -o log_cli=false
Result: 36 passed, 3 skipped, 1 xfailed
Current Expected Skip/XFail Inventory¶
SKIP:
apps/server/tests/test_media_server_integration.py::test_media_story_round_tripreason: deferred during v38 cutover (legacy VM-phase coupling)
SKIP:
apps/server/tests/test_multi_world_switching.py::test_story_debug_endpoints_are_wiredreason: deferred during v38 cutover (debug endpoints preserved as
501 Not Implemented)
SKIP:
apps/server/tests/test_world_endpoints.py::test_world_inforeason: legacy reference world bundle is not yet v38 codec-compatible
XFAIL:
apps/server/tests/test_rest_dependencies.py::test_story_router_uses_orchestrator_dependencyreason: “not sure what it is doing here”
Cutover Import Audit¶
Pre-swap gate command:
python scripts/audit_cutover_edges.py --mode pre-swap --enforce --json-out tmp/cutover_audit_preswap.json
Current pre-swap result:
IR bridge: 0Bypass imports: 0Intentional bridges: 0(tracked viascripts/cutover_import_allowlist.txt)
Pre-swap audit now passes after tightening classification to treat *_legacy
source trees as transitional and only gate non-legacy bypass imports.
Intentional bridge allowlist is currently empty.
Post-swap gate command:
python scripts/audit_cutover_edges.py --mode post-swap --enforce --json-out tmp/cutover_audit_postswap.json
Current post-swap result:
IR bridge: 0Post-swap disallowed legacy imports: 0Post-swap disallowed *38 imports: 0
CI now enforces the post-swap gate mode.
Shim Plumbing Reduction (2026-03-06)¶
Removed CLI legacy endpoint fallback plumbing:
deleted
StoryTanglCLI.call_legacy_endpoint(...)removed
_call_legacy(...)helpers from CLI story/world/dev controllers
Removed dead branch in
tangl.service.api_endpointthat conditionally sourced endpoint metadata from a legacy module.Validation:
python scripts/audit_cutover_edges.py --mode post-swap --enforce→ passpoetry run pytest -q engine/tests/service38/test_api_endpoint.py→29 passedpoetry run pytest -q engine/tests/service38→85 passedpoetry run pytest -q apps/cli/tests apps/server/tests→36 passed, 3 skipped, 1 xfailed
Namespace Retirement Cleanup (2026-03-06)¶
Removed compatibility wrapper packages:
engine/src/tangl/core38engine/src/tangl/vm38engine/src/tangl/story38engine/src/tangl/service38
Loader/runtime cleanup:
WorldCompilernow enforcesruntime_version="38"and no longer carries legacy runtime37 compile branches.WorldRegistrynow validates runtime version and passes through runtime selection to compiler methods.
Validation:
Lane A:
918 passedLane B:
665 passed, 62 skipped, 9 xfailedLane C:
36 passed, 3 skipped, 1 xfailedFull suite:
1658 passed, 71 skipped, 10 xfailedImport sanity:
python -c "import tangl.core, tangl.vm, tangl.story, tangl.service"→ok
Endpoint Naming Cleanup (2026-03-06)¶
Service operation routing now targets canonical runtime endpoint names:
RuntimeController.create_storyRuntimeController.get_story_updateRuntimeController.resolve_choiceRuntimeController.get_story_infoRuntimeController.drop_story
Backward-compatible
*38endpoint aliases remain accepted:operation reverse-lookup maps suffixed names to canonical names
default endpoint policy is applied to both
create_storyandcreate_story38
Added canonical
RuntimeController.get_story_update(...)endpoint alias to match canonical operation routing.Validation:
Targeted service/app routes:
poetry run pytest -q engine/tests/service38/controllers/test_runtime_controller.py engine/tests/integration/test_service_layer.py apps/server/tests/test_rest_gateway_dependencies.py apps/server/tests/test_story_runtime_endpoints.py→16 passed
Full suite:
1658 passed, 71 skipped, 10 xfailedPost-swap import audit: pass (
IR bridge: 0, legacy imports:0,*38imports:0)
Additional Shim Prune (2026-03-06)¶
Removed runtime endpoint-name shims in
RuntimeController:retired method aliases
create_story38,resolve_choice38,get_story_update38,get_story_info38,drop_story38canonical endpoint methods now carry implementation directly.
Removed endpoint reverse-lookup shim aliases in
tangl.service.operations(only canonical endpoint names resolve to operation tokens).Removed temporary duplicate endpoint policy key
RuntimeController.create_story38from service bootstrap defaults.Renamed REST dependency function surface to canonical names and moved module:
apps/server/src/tangl/rest/dependencies_gateway.py→apps/server/src/tangl/rest/dependencies_gateway.pyupdated app/router/tests imports accordingly.
Fixed CI failure in
engine/tests/story38/test_story_init.py:import-guard test now scans
engine/src/tangl/storyguard checks retired imports (
tangl.core38/tangl.vm38) instead of canonical imports.
Validation:
poetry run pytest -q→1658 passed, 71 skipped, 10 xfailedpython scripts/audit_cutover_edges.py --mode post-swap --enforce→ pass