Phase 2a + 2a+ of Admin and Feature Flags respectively have produced two runnable decision services. Each contract is clear in isolation but operators cannot see how they compose. This phase delivers a single page that wires both services together in the exact order they should be consumed — policy-first, then eval — with honest trace and honest deferred items. It does not open new runtime capability; it makes the existing capability legible.
Per docs/planning/ia-governance.json:
/runtime/* is A-owned · debug / scaffolding / integration surfaces belong here → chose /runtime/cross-runtime-integration/./planning/* is A-owned · RFC / design / rationale belongs here → this page lives at /planning/cross-runtime-integration.html.
The demo is a third-party consumer of the two services, not a fourth service.
It intentionally stays at the "preview / debug / scaffolding" tier of the IA owner matrix (Runtime Phase Pack)
and does not promote to Admin Portal, App, or a new sub-portal.
When a production surface eventually wants to consume both services, the orchestration rules shown here
(policy-first · eval-second · short-circuit on deny) become the reference sequence for middleware.
| File / route | Owner | Role in this demo |
|---|---|---|
docs/runtime/cross-runtime-integration/* | A | new · demo surface + README + contract |
docs/planning/cross-runtime-integration.html | A | new · this rationale |
docs/runtime/admin-control-plane-service/* | A | unchanged · service consumed over HTTP |
docs/runtime/feature-flags-service/* | A | unchanged · service consumed over HTTP |
docs/runtime/admin-control-plane/*.json | A | unchanged · Phase 1 models loaded by policy service |
docs/runtime/feature-flags/registry.json | A | unchanged · fetched by the demo page to derive sensitivity profile |
docs/kb/data/approval_matrix.json | B | read-only · policy service references row-sensitive-override |
docs/kb/data/tenant_scope.json | B | read-only · referenced via policy engine contract |
docs/kb/data/publish_workflow.json | B | read-only · referenced via rollout_model |
No B-owned file is written or reinterpreted by this phase. Cross-tenant write workflows are explicitly out of scope.
registry.flags[].sensitive_flag / requires_approvalPOST /api/policy/sensitive/checkGET /api/policy/access/checkGET /api/flags/eval?key=…browser → browser → policy_service POST /api/policy/sensitive/check GET /api/policy/access/check policy_service → browser browser → flags_service GET /api/flags/eval?key={flag_key}&user={actor_user_id}&… flags_service → browser browser combines into single view
/runtime/cross-runtime-integration/ → Live (demo · local/dev only)/planning/cross-runtime-integration.html → Live (v1 · this page)idx-runtime-cross-integration at 04.04.00.00 (runtime tab)idx-planning-cross-integration at 03.13.00.00runtime_artefacts group/runtime/feature-flags-service/service.html, /runtime/admin-control-plane-service/service.html, and this planning page| Item | Deferred | Why | Next logical phase |
|---|---|---|---|
| JWT / IdP | yes | IdP integration out of scope for demo | Admin 2b + FF 2b |
| Approval store backing | yes | approval_refs trusted at face value | Admin 2b |
| Flag transition / flip API | yes | mutation path not scaffolded | FF 2c |
| Audit write / WORM sink | yes | Kafka ptt.audit.trail topic + producer not wired | Admin 2b+ |
| Redis / cache invalidation | yes | cache layer deferred | FF 2a+ infra |
| Production auth | yes | dev-mode X-PTT-* only | Phase 2b |
| Admin mutation UI | yes | decision-only model | Admin 3 |
| Real rollout persistence | yes | registry.json file-backed only | FF 2c |
| Server-side orchestration service | not attempted | browser chain sufficient for demo | gateway consolidation |
POLICY/ and FLAGS/ lines from the two services verbatimcross runtime, runtime integration, policy first, eval second, orchestration demo, 04.04.00.00, 03.13.00.00