28 KiB
Indicator Inventory: Cross-Domain Progress Indicator Semantics Audit
Package: specs/278-cross-domain-indicator-audit/
Branch: 278-cross-domain-indicator-audit
Status: Implemented docs-only audit artifact
Last updated: 2026-05-06
Scope And Method
This inventory is repository evidence only. It does not change runtime code, routes, assets, authorization, tests, persisted state, or UI behavior.
The audit used the named source anchors from spec.md and plan.md, then ran bounded searches under apps/platform/app/, apps/platform/resources/views/filament/, and the already-mounted apps/platform/resources/views/livewire/ operation feedback view for current progress-like, readiness-like, health-like, score-like, coverage-like, usage/capacity, and generation-state cues.
Confirmed Source Anchors
| Anchor | Source type | Surface | Domain | Route or shell context | Notes |
|---|---|---|---|---|---|
apps/platform/app/Support/OpsUx/OperationUxPresenter.php |
presenter | OperationRun feedback copy | Ops | /admin/t/{tenant} shell feedback, /admin/operations, run detail |
Defines queued, active, stale, terminal, and next-step wording. |
apps/platform/app/Support/OpsUx/OperationRunProgressContract.php |
presenter | OperationRun progress contract | Ops | active shell feedback and run consumers | Defines counted vs activity/phased/composite/none progress capability. |
apps/platform/resources/views/livewire/bulk-operation-progress.blade.php |
blade | In-shell operation activity banner | Ops | tenant panel shell | Renders determinate and indeterminate operation progress/activity feedback. |
apps/platform/app/Filament/Widgets/Inventory/InventoryKpiHeader.php |
widget | Inventory KPI header | Inventory | tenant inventory/dashboard context | Renders total items, covered types, follow-up, coverage basis, and active ops. |
apps/platform/app/Filament/Widgets/Dashboard/RecoveryReadiness.php |
widget | Recovery readiness widget | Backup/restore | tenant dashboard | Renders backup posture and recovery evidence cards. |
apps/platform/app/Services/Baselines/SnapshotRendering/BaselineSnapshotPresenter.php |
service | Baseline snapshot detail rendering | Baseline | baseline snapshot detail | Renders outcome, fidelity, gap, coverage, lifecycle, current-truth, and count summaries. |
apps/platform/app/Services/ReviewPackService.php |
service | Review pack generation and entitlement decision | Review/export | tenant review pack flows | Supplies generation-state and usage/capacity input. |
apps/platform/app/Support/TenantDashboard/TenantDashboardSummaryBuilder.php |
builder | Tenant dashboard overview | Tenant summary | /admin/t/{tenant} |
Builds posture, KPIs, governance rows, readiness cards, and recent operations. |
apps/platform/resources/views/filament/widgets/dashboard/tenant-dashboard-overview.blade.php |
blade | Tenant dashboard overview | Tenant summary | /admin/t/{tenant} |
Renders dashboard badges, progress bars, KPI charts, and readiness cards. |
apps/platform/resources/views/filament/widgets/tenant/tenant-review-pack-card.blade.php |
blade | Review pack card | Review/export | tenant dashboard/review context | Renders no-pack, queued/generating, ready, failed, and expired states. |
apps/platform/resources/views/filament/widgets/workspace/workspace-needs-attention.blade.php |
blade | Workspace needs-attention widget | Workspace monitoring | /admin workspace context |
Renders triage review progress and pressure links. |
apps/platform/resources/views/filament/widgets/dashboard/baseline-compare-now.blade.php |
blade | Baseline governance widget | Baseline compare | tenant dashboard | Renders summary-state badges and finding-count cues. |
apps/platform/app/Filament/Pages/BaselineCompareLanding.php |
page | Baseline compare landing | Baseline compare | /admin/t/{tenant}/baseline-compare |
Carries coverage, gap, freshness, and summary-assessment truth into Blade. |
apps/platform/app/Filament/Resources/EvidenceSnapshotResource.php |
resource | Evidence snapshot detail | Evidence | tenant evidence snapshots | Renders permission posture score and evidence completeness/generation state. |
apps/platform/app/Filament/Resources/StoredReportResource.php |
resource | Stored report detail | Reports | tenant stored reports | Renders retained report lifecycle and permission posture score. |
apps/platform/app/Filament/Resources/ProviderConnectionResource.php |
resource | Provider connection list/detail | Provider posture | /admin/provider-connections |
Renders provider lifecycle, consent, verification, and last health check. |
apps/platform/resources/views/filament/forms/components/restore-run-checks.blade.php |
blade | Restore safety checks | Restore | restore run form/detail | Renders safety, technical startability, and check-count badges. |
apps/platform/resources/views/filament/forms/components/restore-run-preview.blade.php |
blade | Restore preview | Restore | restore run form/detail | Renders preview decision, readiness suppression, and changed-item counters. |
Related Spec Guardrails
| Spec | Relation | Out of scope here | Guardrail |
|---|---|---|---|
266 |
context-only | yes | Tenant dashboard productization remains runtime owner for dashboard layout and action behavior. |
268 |
context-only guardrail | yes | OperationRun activity feedback already owns shell activity behavior. This audit only classifies it. |
270 |
context-only guardrail | yes | OperationRun progress contract remains the execution-progress authority. |
271 |
context-only guardrail | yes | Counted progress rollout remains a separate runtime adoption lane. |
272 |
context-only guardrail | yes | Phase/composite OperationRun progress remains separate from this cross-domain audit. |
275 |
nearby context | yes | Localization/customer-safe review wording is context only. No translation catalog changes are made here. |
277 |
nearby context | yes | Stored reports are audited as current indicator surfaces; stored-report runtime behavior is not reopened. |
Search Boundary And Exclusions
Confirmed additional in-scope search hits were included when they represented execution progress, coverage, completion, health, readiness, risk, pressure, usage, capacity, score, or generation state on tenant, workspace, canonical operations, evidence, review/export, provider, restore, or baseline surfaces.
Excluded search hits:
- console-only progress bars in Artisan commands, because they are not operator-facing product surfaces
- generic CRUD lifecycle badges with no progress/indicator ambiguity beyond ordinary table state
- diff row status badges, because they are direct diff semantics rather than cross-domain progress or readiness indicators
- platform
/systemcustomer-health widgets, because this active spec scope is workspace + tenant + canonical-view and not a platform-plane health-score rollout - raw support diagnostic fields where the visible surface explicitly states diagnostics-only context and not operator progress/readiness
Inventory Entries
Allowed semantic categories: execution progress, activity state, coverage, completion, health, readiness, risk, pressure, usage, capacity, score, generation state, unknown/ambiguous.
Allowed dispositions: keep as-is, copy-only clarification, standards clarification, product decision, contract follow-up, shared-component follow-up, migration follow-up, defer.
| ID | Source | Surface / Domain | Visible cue and pattern | Data source and calculation basis | Category | Determinism | Scope / audience | Likely reading and risk | Disposition / lane |
|---|---|---|---|---|---|---|---|---|---|
| IND-001 | OperationRunProgressContract.php; bulk-operation-progress.blade.php |
Operation activity banner / Ops | processed / total (percent) with role="progressbar" |
OperationRun.summary_counts.processed and summary_counts.total, normalized and clamped by OperationRunProgressContract::forRun() |
execution progress | determinate | tenant-prefiltered / operator-msp | Correctly reads as active execution progress when the run is active. Risk is low because terminal and queued runs are excluded from counted progress by the shared contract. | keep as-is |
| IND-002 | OperationRunProgressContract.php; bulk-operation-progress.blade.php |
Operation activity banner / Ops | Indeterminate bar plus labels such as Waiting for worker. or Progress details pending. |
OperationRun.status, run activity, phase/composite hints; no percent is emitted |
activity state | indeterminate | tenant-prefiltered / operator-msp | The moving/bar-like pattern can still be mistaken for percentage progress even though it is activity-only. | standards clarification / standards patch lane |
| IND-003 | OperationUxPresenter.php; bulk-operation-progress.blade.php |
Operation activity banner / Ops | Status pill labels such as Queued for execution, In progress, Completed successfully, Blocked by prerequisite |
OperationStatusNormalizer::toUxStatus($status, $outcome) and terminal guidance from OperationUxPresenter |
activity state | determinate | tenant-prefiltered / operator-msp | Reads as operation lifecycle state. Risk appears when terminal success and active progress are visually adjacent, but current code separates progress rendering from terminal runs. | keep as-is |
| IND-004 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php |
Recent operations / Tenant dashboard | Separate operation status and outcome badges in recent-operation rows | OperationRun.status, OperationRun.outcome, and freshness state through BadgeRenderer |
completion | determinate | tenant-prefiltered / operator-msp | Reads as run outcome or terminal follow-up. Risk is low if status and outcome remain distinct. | keep as-is |
| IND-005 | InventoryKpiHeader.php |
Inventory KPI header / Inventory | Total items stat count |
TenantCoverageTruth.observedItemTotal; direct observed inventory item count |
coverage | determinate | tenant-prefiltered / operator-msp | Can be read as tenant inventory completeness, but it only measures observed items across supported types. | standards clarification / standards patch lane |
| IND-006 | InventoryKpiHeader.php |
Inventory KPI header / Inventory | Covered types as succeeded / supported with breakdown badges |
TenantCoverageTruth.succeededTypeCount, supportedTypeCount, failed/skipped/unknown breakdown |
coverage | determinate | tenant-prefiltered / operator-msp | Reads as coverage, not execution progress. Missing or unknown types can make the denominator look more complete than the underlying basis. | contract follow-up / metric/indicator contract foundation |
| IND-007 | InventoryKpiHeader.php |
Inventory KPI header / Inventory | Need follow-up stat and top-priority follow-up summary |
TenantCoverageTruth.followUpTypeCount and topPriorityFollowUpRow() |
pressure | determinate | tenant-prefiltered / operator-msp | Reads as operational pressure. Risk is that 0 can be mistaken for overall tenant health when the coverage basis is missing or stale. |
standards clarification / standards patch lane |
| IND-008 | InventoryKpiHeader.php |
Inventory KPI header / Inventory | Coverage basis value No current result, completion timestamp, and run outcome badge |
TenantCoverageTruth.basisRun, basis completion timestamp, OperationRun.outcome badge |
coverage | unknown | tenant-prefiltered / operator-msp | No current result can read as calm/zero result instead of missing basis truth. |
copy-only clarification / standards patch lane |
| IND-009 | InventoryKpiHeader.php |
Inventory KPI header / Inventory/Ops | Active ops count plus queued or running description |
ActiveRuns::countForTenantId() and inventory-sync active query |
activity state | determinate | tenant-prefiltered / operator-msp | Reads as active execution activity, but only inventory sync is described in the helper line. | standards clarification / standards patch lane |
| IND-010 | RecoveryReadiness.php; recovery-readiness.blade.php |
Recovery readiness widget / Backup | Backup posture card with colored value and description |
TenantBackupHealthResolver::assess() and TenantRecoveryTriagePresentation label/tone/description |
health | determinate | tenant-prefiltered / operator-msp | Reads as backup health/posture, not restore execution progress. Risk is that posture and recovery readiness share one card language. | contract follow-up / metric/indicator contract foundation |
| IND-011 | RecoveryReadiness.php; recovery-readiness.blade.php |
Recovery readiness widget / Restore | Recovery evidence card with colored value and description |
RestoreSafetyResolver::dashboardRecoveryEvidence() and recovery presentation helpers |
readiness | unknown | tenant-prefiltered / operator-msp | Can read as complete restore readiness even when evidence history is absent or latest detail is unavailable. | standards clarification / standards patch lane |
| IND-012 | BaselineSnapshotPresenter.php |
Baseline snapshot detail / Baseline | Outcome, Current truth, Lifecycle, Overall fidelity, Evidence gaps, Captured items badges/facts |
ArtifactTruthPresenter, snapshot lifecycle state, RenderedSnapshot groups, fidelity counts, gap summary |
coverage | determinate | workspace-aggregate / operator-msp | Reads as baseline snapshot usability and coverage. Risk is multiple badges can look like duplicate status instead of distinct truth dimensions. | contract follow-up / metric/indicator contract foundation |
| IND-013 | BaselineSnapshotPresenter.php |
Baseline snapshot coverage sections / Baseline | Coverage summary, per-type coverageHint, fidelitySummary |
FidelityState::aggregate(), GapSummary, per-type rendered snapshot groups |
coverage | determinate | workspace-aggregate / operator-msp | Reads as governed-subject coverage/fidelity. Risk is that reference-only fidelity can look like complete evidence if the coverage hint is not read. | standards clarification / standards patch lane |
| IND-014 | ReviewPackService.php |
Review-pack entitlement decision / Review/export | current_usage, remaining_capacity, and effective_value returned with generation decision |
WorkspaceCommercialLifecycleResolver::actionDecision() plus entitlement decision projection |
usage | determinate | workspace-aggregate / operator-msp | Reads as plan usage/capacity, not generation readiness. Risk is hidden if later surfaced beside generation buttons without category/freshness. | contract follow-up / metric/indicator contract foundation |
| IND-015 | tenant-review-pack-card.blade.php; ReviewPackService.php |
Review pack card / Review/export | Queued, Generating, Ready, Failed, Expired, Generation in progress... |
ReviewPack.status, status badge catalog, generation job/run state via service-created OperationRun |
generation state | determinate | tenant-prefiltered / operator-msp | Reads as artifact generation state. Risk is low when it stays separate from operation execution progress. | keep as-is |
| IND-016 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php |
Tenant dashboard top posture / Tenant summary | Blocked, Action needed, Calm posture status and headline |
Required permission counts, governance aggregate state, backup posture, recovery evidence, recommended actions | readiness | determinate | tenant-prefiltered / mixed | Reads as whole-tenant readiness. Risk is that a single calm/action label can collapse provider permissions, findings, backup, recovery, and operations into one ambiguous health claim. | contract follow-up / metric/indicator contract foundation |
| IND-017 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php |
Tenant dashboard KPI row / Findings | High severity findings count and optional 7-day chart |
Active high/critical findings count and highSeverityFindingsChart() |
risk | determinate | tenant-prefiltered / operator-msp | Reads as active risk pressure. The small chart can look like trend health rather than event count unless category/direction is explicit. | shared-component follow-up / shared indicator component system |
| IND-018 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php |
Tenant dashboard KPI row / Findings | Overdue findings count |
TenantGovernanceAggregate.overdueOpenFindingsCount |
pressure | determinate | tenant-prefiltered / operator-msp | Reads as workflow pressure, not completion. 0 can look like tenant health if other inputs are missing. |
standards clarification / standards patch lane |
| IND-019 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php |
Tenant dashboard KPI row / Provider permissions | Missing permissions count with app/delegated split |
Required permissions overview counts from TenantRequiredPermissionsViewModelBuilder |
risk | determinate | tenant-prefiltered / operator-msp | Reads as provider permission risk. Provider-owned semantics must not become platform-core readiness truth. | contract follow-up / metric/indicator contract foundation |
| IND-020 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php |
Tenant dashboard KPI row / Operations | Active operations count, but value is stale or terminal runs needing follow-up |
OperationRun::dashboardNeedsFollowUp(), terminalFollowUp(), activeStaleAttention() |
unknown/ambiguous | determinate | tenant-prefiltered / operator-msp | The label reads like active execution count, while the query measures follow-up pressure. This is a confirmed wording ambiguity. | copy-only clarification / standards patch lane |
| IND-021 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php; baseline-compare-now.blade.php |
Governance status / Baseline compare | Baseline compare headline/state badge such as Aligned, Needs review, Refresh recommended, Action required, In progress |
TenantGovernanceAggregate, BaselineCompareSummaryAssessment, and latest compare stats |
readiness | determinate | tenant-prefiltered / operator-msp | Reads as baseline readiness/posture. In progress must remain activity state, while aligned/needs review are governance results. |
contract follow-up / metric/indicator contract foundation |
| IND-022 | TenantDashboardSummaryBuilder.php; BaselineCompareLanding.php |
Governance status / Evidence coverage | Evidence coverage value and coverage warning badge/section |
Latest EvidenceSnapshot.completeness_state, baseline compare coverageStatus, uncovered types, evidence gap counts |
coverage | unknown | tenant-prefiltered / mixed | Can read as complete evidence coverage even when latest compare coverage is unproven, warning, stale, or gap-limited. | standards clarification / standards patch lane |
| IND-023 | TenantDashboardSummaryBuilder.php |
Governance status / Review freshness | Review freshness value and timestamp description |
Latest TenantReview.status, published/generated/updated timestamps |
readiness | unknown | tenant-prefiltered / mixed | Reads as current review readiness. Risk is that status and freshness are mixed without a dedicated stale-data contract. | contract follow-up / metric/indicator contract foundation |
| IND-024 | TenantDashboardSummaryBuilder.php |
Governance status / Provider permissions | Provider permissions as Ready, Blocked, or Needs attention |
Required permissions overview overall, missing counts, freshness |
risk | unknown | tenant-prefiltered / operator-msp | Reads as provider readiness. Risk is stale permission snapshots can make the state look current. | contract follow-up / metric/indicator contract foundation |
| IND-025 | TenantDashboardSummaryBuilder.php; RecoveryReadiness.php |
Governance status / Backup posture | Backup posture value and tone |
TenantBackupHealthAssessment posture, recovery triage copy |
health | unknown | tenant-prefiltered / operator-msp | Reads as backup health. Risk is health/posture can be mistaken for restore readiness or successful backup execution. | standards clarification / standards patch lane |
| IND-026 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php |
Readiness card / Current review | Findings with outcome progress bar and Review completion progress bar |
TenantReview.summary.finding_count, finding_report_buckets, section_count, section_state_counts; percent from current / total |
completion | determinate | tenant-prefiltered / mixed | Correctly reads as review completion, not execution progress. Risk is customer-safe readers may treat review completion as evidence completeness. | shared-component follow-up / shared indicator component system |
| IND-027 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php |
Readiness card / Risk exceptions | Need action, Accepted risks, Expiring soon, Pending approval stats |
Tenant-scoped FindingException status counts plus governance aggregate lapsed/expiring counts |
risk | determinate | tenant-prefiltered / operator-msp | Reads as risk-governance pressure. It should not be displayed as progress toward safety. | standards clarification / standards patch lane |
| IND-028 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php; ProviderConnectionResource.php |
Readiness card / Provider Health | Provider verification status, missing permission count, last check, permissions snapshot | ProviderConnection.verification_status, last_health_check_at, required-permissions freshness/counts |
health | unknown | tenant-prefiltered / operator-msp | Provider-owned health can be mistaken for platform-core health if it is not labeled as provider-specific. | contract follow-up / metric/indicator contract foundation |
| IND-029 | TenantDashboardSummaryBuilder.php; tenant-dashboard-overview.blade.php; tenant-review-pack-card.blade.php |
Readiness card / Customer-safe output | Review pack or evidence availability status, evidence snapshot time, review pack generated time | Latest ReviewPack.status, ReviewPack.generated_at, latest EvidenceSnapshot.generated_at |
generation state | unknown | tenant-prefiltered / customer-readable | Reads as handoff/export readiness. Risk is evidence availability can be mistaken for a generated customer-safe package. | copy-only clarification / standards patch lane |
| IND-030 | workspace-needs-attention.blade.php |
Workspace needs attention / Triage | Reviewed x/y, Follow-up needed, Changed since review, Current affected set |
triageReviewProgress affected-total and review-state counts |
completion | determinate | workspace-aggregate / operator-msp | Reads as review completion over a dynamic affected set. Risk is denominator freshness and scope can shift between reviews. | product decision / metric/indicator contract foundation |
| IND-031 | EvidenceSnapshotResource.php |
Evidence snapshot permission posture / Evidence | Posture score plus granted/required permission counts |
Stored permission-posture payload fields posture_score, required_count, granted_count |
score | unknown | tenant-prefiltered / operator-msp | Score direction, scale, and freshness are not self-describing in the current summary. | contract follow-up / metric/indicator contract foundation |
| IND-032 | StoredReportResource.php |
Stored report detail / Reports | Posture score, Required, Granted, Missing highlights |
StoredReport.payload permission-posture report fields |
score | unknown | tenant-prefiltered / operator-msp | Same score can be read as success percentage or risk score without category/direction. | contract follow-up / metric/indicator contract foundation |
| IND-033 | ProviderConnectionResource.php |
Provider connection list/detail / Provider posture | Lifecycle, Consent, Verification, Last check badges and freshness |
ProviderConnection.is_enabled, consent_status, verification_status, last_health_check_at |
health | unknown | workspace-aggregate / support-platform | Reads as provider connection health. Provider-specific labels such as Healthy must stay provider-owned examples, not platform-core truth. |
standards clarification / standards patch lane |
| IND-034 | tenant-verification-report.blade.php |
Tenant verification report / Provider posture | Verification is currently in progress and operation link |
Stored latest provider verification OperationRun state and report availability |
activity state | indeterminate | tenant-prefiltered / operator-msp | Reads as verification activity, not permission posture completion. Risk is low because copy says stored operation state. | keep as-is |
| IND-035 | restore-run-checks.blade.php |
Restore safety checks / Restore | Safety checks, Technically startable / Technical blocker present, Ready, Ready with caution, blocking/warning/safe counts |
Restore run check integrity, execution readiness, safety assessment, check severity counts | readiness | determinate | tenant-prefiltered / operator-msp | Reads as execution readiness and safety proof. Risk is Ready can be mistaken for safe to execute without preview context. |
standards clarification / standards patch lane |
| IND-036 | restore-run-preview.blade.php |
Restore preview / Restore | Preview decision, Checks current, Calm readiness suppressed, x/y policies changed, assignment/scope-tag change counts |
Preview integrity, checks integrity, safety assessment, restore preview summary counts | risk | determinate | tenant-prefiltered / operator-msp | Reads as preview impact and readiness suppression, not operation progress. x/y policies changed uses a ratio but measures impact, not completion. |
standards clarification / standards patch lane |
| IND-037 | BaselineCompareLanding.php; baseline-compare-landing.blade.php |
Baseline compare landing / Baseline | Coverage warning badges/sections, evidence gap counts, No findings explanation |
BaselineCompareStats.coverageStatus, evidence-gap details, reason presenter |
coverage | unknown | tenant-prefiltered / operator-msp | No findings can be misread as success when coverage warnings or evidence gaps exist. |
copy-only clarification / standards patch lane |
| IND-038 | OperationRunResource.php; inventory-coverage-truth.blade.php |
Operation run detail / Inventory coverage | Inventory sync coverage rows and succeeded/failed/skipped type counts | OperationRun.inventoryCoverage() rows and computed counts |
coverage | determinate | canonical-view / operator-msp | Reads as result coverage for an operation run, not live progress. Risk is outcome counters can be mistaken for progress if reused outside detail context. | standards clarification / standards patch lane |
Summary Matrix
| Category | Entries | Primary risk |
|---|---|---|
| execution progress | 1 | Must remain limited to active runs with trustworthy processed/total truth. |
| activity state | 4 | Indeterminate bars and in progress labels can look like completion progress. |
| coverage | 8 | Missing, stale, or partial basis can be read as complete coverage. |
| completion | 3 | Review completion can be mistaken for evidence completeness or customer readiness. |
| health | 4 | Provider or backup-specific health can leak into platform-core health language. |
| readiness | 5 | Rollups can collapse safety, evidence, workflow, and provider readiness. |
| risk | 5 | Risk and preview-impact indicators can look like progress or success. |
| pressure | 2 | 0 pressure can look like global health when source data is missing. |
| usage | 1 | Usage/capacity can look like readiness when shown beside generation actions. |
| capacity | 0 | Capacity appears paired with usage in IND-014; no standalone capacity cue was confirmed. |
| score | 2 | Score direction/scale/freshness is not self-describing. |
| generation state | 2 | Evidence availability and generated package readiness can blur. |
| unknown/ambiguous | 1 | Active operations currently labels a follow-up-pressure count. |
Review Outcome
- The inventory covers every named source anchor and the confirmed additional in-scope cues discovered by bounded repo search.
- No application code, tests, migrations, routes, assets, provider registration, panel wiring, global search, or authorization behavior was changed.
- Runtime remediation remains out of scope. Every non-
keep as-iscue routes to exactly one bounded follow-up lane infollow-up-map.md.