Skip to content

Latest commit

 

History

History
357 lines (209 loc) · 97 KB

revised-api-implementation-plan.md

File metadata and controls

357 lines (209 loc) · 97 KB

Revised API implementation plan

Agreed unit sequence; U06-U19 merged as PR25-PR38; U20 implemented and independently audited with PR40 open; U21 implemented and independently audited with PR41 open; U22 implemented and independently audited with PR42 open; U23 read-only review complete with PR43 open; U23-F01 implemented and independently audited with PR44 open; U24 preparation implemented and independently audited with PR45 open; U25 approved browser scope passed on the unchanged PR48 candidate; native plan preparation and review authorized, execution awaiting separate permission. Implement the revised shared API as small, independently reviewable changes. The owner authorizes automatic sequential implementation through U24, with a reviewed PR for each unit before its successor starts. Acceptance, merge, publication, and peer/patch changes retain their separate approval boundaries below.

The proposal owns the target API and before/after consumer examples. This plan owns the work order, assignments, proof required, and permission gates. The requirements define the agreed next-release scope. The coverage checklist separates pending migration from current routes, and the release record continues owning the unchanged candidate gates. Source paths, dependencies, routine command routes, and existing guarantees below describe the 0.1.0-rc.11 working basis captured by U01, inspected on 2026-10-24. This publication uses an older main-branch base, not that working implementation; every assignment must refresh its caller inventory against the approved working state before editing.

Motivation and intended result

The adapter's central value is shared rendering and map access: applications supply sources, layers, camera requests, and queries through one interface. Several broader guarantees required it to own much more. The historical offline service managed persistent identity and observer recovery; location acquisition and historical following coordinate permissions, freshness, subscriptions, foreground changes, and camera dispatch. Native camera correction and feature-state replacement impose behavior beyond a direct wrapper call.

Those responsibilities connect otherwise separate paths. A rendered-frame callback participates in capture readiness and state cleanup. Native control measurements move SDK ornaments. Marker dragging disables map gestures and owns asynchronous projection. More cases must be checked when a source is replaced, an operation fails, or a component unmounts. Removing an approved guarantee removes its coordination and its testing obligation; deleting a failing test without removing its promised behavior does not simplify the contract.

The intended result keeps the common rendering/query surface and lets the selected renderer own ordinary platform behavior. Application services and screen UI become explicit application responsibilities. Native dragging, continuous camera rollback, automatic state clearing, source-level synthetic bubbling, and automatic image replay are excluded as described in the proposal. Validation, observable errors, accessibility, attribution, and cleanup of retained adapter-owned work remain required.

This trades convenience and strict parity for a smaller library-owned contract. Applications using offline downloads, tracking, capture, or controls need real migration work. They should select existing application/SDK facilities rather than inherit a mandatory copy of the old common services. Review library deletions alongside application additions so that moving the same framework into examples cannot be reported as a net simplification.

Agreed planning decisions

The owner adopted the narrower target and initially released U01 only. U01 supplied the frozen baseline and caller inventory. U02-U11 merged as PR21-PR30. On 2026-10-25, the owner released U12 and authorized the coordinator to create each subsequent reviewed PR automatically and immediately start the next planned unit through U24. Implementation remains sequential; pending PRs may stack without merging.

These planning decisions define the next-release target; they do not claim implementation:

  • Adopt the deliberately narrower shared scope from the proposal, with a breaking prerelease rather than silent changes to the current candidate. Keep native SDK service exports as pass-through facilities, with application-owned policy and verification.
  • Retain live native marker children, annotation refresh, all retained source/layer families, shared camera commands, rendered/source/cluster queries, explicit feature-state operations, mixed backend selection, and named-map access. Keep the live marker overlay and portal dependency until a separately approved replacement proves the retained behavior.
  • Add only the proposed asynchronous selected-ref getWrapperMap access route. Keep the common MapRef free of SDK types; do not replace method mirroring with another dispatcher or registry.
  • Include one newly identified contract clarification: remove UserLocation.onPress. Its current implementation uses Source.onClick, which U19 removes. UserLocation becomes position/accuracy display only. An application requiring activation can render its own known source/layer IDs and use Map.onClick. This is an agreed next-release exclusion, not a discovered SDK limitation.
  • Keep existing peers and patches during the first implementation. Narrowing peer ranges, removing native patch sections, replacing marker hosts, changing native linking, and publishing are separate decisions. The plan does not promise a particular deletion count or smaller native binaries.

Sign-off and subagent protocol

The owner authorizes the coordinator to implement U12-U24 sequentially. Each unit uses one implementation writer, a second read-only reviewer of the final diff and connected paths, and coordinator audit and routine checks. After those pass, the coordinator commits, pushes, opens the unit PR, and immediately dispatches the next planned unit without another approval request. Pending PRs may stack. Only the coordinator advances the sequence; implementers and reviewers return their assigned work and do not start successors.

This authorization excludes merging, package publication, renderer acceptance, and native builds/installations. U20 follows the owner-approved narrow Images polyfill contract; broader replacement coordination needs separate approval. U23 patch/peer changes require a separately approved bounded follow-up. U24 prepares a concrete frozen artifact, commands, environments, duration, and retry scope, then stops for acceptance permission before U25. U25-U27 retain their result and acceptance gates.

Use one implementation writer at a time because many units share map/ref adapters, public entries, native-ui, and scenario files. Implementation agents inherit the coordinator's model unless the owner requests otherwise. The model requirement for later approved smoke workers is specified separately below. Do not launch implementation or review agents merely because their assignments appear in this document.

At dispatch, give the implementer the approved base identity, unit ID, outcome, exact write allowlist, related caller/test inventory, required checks, forbidden changes, and handoff format. Source paths in the unit cards are starting points; the coordinator refreshes the allowlist before dispatch. The coordinator may add a necessary caller/test within that same outcome and records the addition. A new feature, new guarantee, changed target API, runtime dependency, or peer/patch change needs owner approval. Planned successors through U24 use the authorization above.

Every implementation unit includes its callers, public types, representative tests, applicable fixtures/scripts, and local documentation. Keep relevant builds and declarations valid at the end of each unit. Do not leave unresolved compilation failures for an integration unit. Add getWrapperMap before migrating its consumers; remove each old API only when that unit migrates or deliberately retires every affected caller. Temporary coexistence of old and new routes in the unpublished branch is allowed during this sequence, but it must not become a permanent compatibility layer or release claim.

Required handoff and coordinator progression

Each unit produces a compact review packet containing:

  1. The approved unit/base, changed files, concrete consumer changes, and any allowed-scope adjustment.
  2. What was removed, what remains, application code added, new dependencies if any, and remaining patch obligations. Measure task-owned changes against the unit's start, accounting for the pre-existing dirty workspace; do not attribute another task's edits or moved code to this work.
  3. Exact routine commands, exit results, relevant versions, and first failures plus repairs. Separate pre-existing failures from new failures. A required new failure blocks sign-off; an unrelated baseline failure remains visible and bounded by evidence.
  4. Tests retired because their contract was deliberately removed, tests rewritten for retained behavior, and regression evidence for errors, replacement, cancellation, and teardown where affected. Preserve useful cases from mixed feature suites.
  5. Read-only reviewer findings, their disposition, and coordinator review. Resolve substantive findings within the unit before presenting it as ready; fixes within the approved outcome do not release additional units.
  6. Runtime checks not run, known risks, data implications, and the exact planned successor or separate approval boundary. Routine success supports only the behavior it covers.

Record the actual PR, reviewed artifact, verification limits, and successor dispatch in the compact checkpoint evidence. Do not prepopulate later results or approvals. If a unit cannot complete its approved contract safely, report the obstacle and a concrete alternative; do not silently weaken the contract or begin an unapproved approach.

Automatic progression uses implementation and routine evidence while native integration remains explicitly unverified. It authorizes no renderer builds, installations, or scenarios without the separately specified acceptance permission.

Workspace and recovery rules

U01 records current workspace contents, including pre-existing uncommitted work. Do not reset, clean, bulk-format, commit, or copy an unrelated release artifact over that work. Prefer the existing checkout with serialized writers. If the owner later chooses an isolated worktree, the coordinator must preserve the approved uncommitted base explicitly; creating a worktree from HEAD alone does not copy it.

Recheck shared files before each dispatch. If another task changes them, reconcile the affected unit base before writing and record material changes in the next review packet. Recovery uses a reviewed reverse patch of task-owned edits or a separately authorized saved snapshot. No destructive Git operation or automatic whole-workspace revert is part of this plan. Keep temporary compiler probes, package consumers, raw logs, and builds temporary under the retention policy.

Work order

U01 has supplied its frozen evidence. U06 is merged as PR25 and U07 as PR26. U08 native camera target migration is merged as PR27. U09 feature-state lifetime migration is merged as PR28. U10 current-map capture migration is merged as PR29. U11 selected offline manager migration is merged as PR30. U12 independent snapshot migration is merged as PR31; applicable routine verification is recorded. U13 common popup migration is merged as PR32; routine verification and provenance are recorded; U14 navigation and fullscreen migration is merged as PR33; routine verification and provenance are recorded; U15 scale and attribution migration is implemented and independently audited after reviewed U14 PR33; routine verification and provenance are recorded. U15 PR34 is merged. U16 geolocation UI migration is implemented and independently audited; routine verification and provenance are recorded. U16 PR35 is merged. U17 common control layout migration is implemented and independently audited; bounded routine verification and artifact provenance are recorded; U17 PR36 is merged; U18 is implemented and independently audited; U18 evidence owns bounded verification and provenance. U18 PR37 is merged. U19 feature-click migration is merged as PR38; U19 evidence records bounded routine verification and exact archive provenance. U20 Images migration is implemented and independently audited; U20 evidence records bounded routine verification, inherited publication exclusions and exact archive provenance. U20 PR40 is open after independent review. U21 private-coordination cleanup is implemented and independently audited; U21 evidence records bounded routine verification and exact archive provenance. U21 PR41 is open after independent review. U22 public-surface audit and bounded documentation/test fixes are implemented and independently audited; U22 evidence records full routine checks without fixture exclusions, exact packed/declaration verification and the corrected fixture-loading diagnosis. U22 PR42 is open after independent review. U23 read-only patch/peer assessment is complete with PR43 open after review; the decision report records eight retained publication repair gaps at the read-only checkpoint. U23-F01 is implemented and independently audited; reconciliation evidence records exact patch identities, bounded routine/pristine/isolated proofs and frozen-archive checks with peers, locks and versions unchanged. The reconciliation PR44 is open after review. U24 candidate preparation is implemented and independently audited with PR45 open after review. The authorized U25 browser attempt failed in its first command; the Mapbox scenario passed, MapLibre camera forwarding failed, and runner cleanup left owned child processes. Eight commands were not run. The owner-approved camera/runner repairs are implemented and independently audited with PR46 open. The authorized attempt02 passed commands 1-4 on both web engines, then command 5 failed after source recreation, before requesting the replacement style, with an undefined-value error; commands 6-9 were not run. All five commands exited normally and released their owned processes. Source-backed SDK and full-hook reproductions trace the error to redundant removal of already-empty fresh feature state followed by a set before SDK state coalescing. The fixture-only repair is implemented and independently source-audited with PR47 open; applicable routine checks passed. Library behavior is unchanged. The authorized attempt03 passed commands 1-5 on both web engines, then command 6 failed in the Mapbox UI popup-teardown assertion (open=2, close=2, expected no extra dismissal); commands 7-9 were not run. All six commands exited normally and released owned resources, with frozen inputs unchanged. Source-backed raw-wrapper/SDK and actual-scene controls locate an application ownership defect: old-map removal invokes the old popup callback before child cleanup, and that stale callback closes replacement-generation state. The fixture-only generation/lifetime guard and stronger replacement-popup verification are implemented with PR48 open; applicable routine checks and independent source audit passed. The current browser outcome records all nine approved rows passing on the unchanged PR48 candidate, including commands 1-2 from attempt04 and commands 3-9 from approved recovery. The interrupted attempt04 and prior failures remain recorded history. The browser harness and runtime tools are retired. The sole acceptance proposal owns the source-audited and routinely verified resolver/retained-coverage repairs, the proposed host-readiness phase and the later separate native execution-permission gate. Native acceptance remains unverified. U25-U27 remain undispatched and require their separate permission/result gates. Sequential U12-U24 implementation is authorized under the protocol above; U25-U27 retain separate acceptance and result gates. The U08 evidence owns its bounded scope, provenance, and verification status. The U07 evidence records its bounded scope and verification status. The U03 evidence, U04 evidence, U05 evidence, and U06 evidence record routine verification and provenance; renderer acceptance remains unverified and requires separate permission. The U06 record distinguishes the passing working-tree checks and bounded publication suite from two publication wrapper-callback import failures reproduced on its pre-U06 baseline. The U07 record likewise separates passing original checks and the bounded main publication suite from those two unchanged baseline wrapper-callback import failures; mocked and packed checks do not establish touch, renderer, Metro, or native linking acceptance. The sequence below is the default; dependencies highlight why related work cannot be reversed. U12-U24 advance through reviewed PRs under the protocol above; historical unit gates and later acceptance gates remain distinct. The fuller cards below define scope and proof.

Unit Deliverable Key dependency Gate after completion
U01 Frozen working baseline and caller/test inventory Plan approval Approve baseline and U02
U02 Agreed next-release contract, without current-runtime claims U01 Approve contract and U03
U03 Selected web getWrapperMap U02 Approve U04
U04 RNMapbox getWrapperMap U03 Approve U05
U05 MapLibre native getWrapperMap U04 Approve U06
U06 Migrate advanced calls and remove ref method mirrors U03-U05 Approve U07
U07 Remove common native marker dragging U06 Approve U08
U08 Native camera targets without rollback U07 Approve U09
U09 Renderer-owned feature-state lifetime U08 Approve U10
U10 SDK capture callers; remove common map capture U03-U05, U09 Approve U11
U11 SDK offline callers; remove common offline service U10 Approve U12
U12 SDK independent snapshots; remove shared snapshot service U03-U05, U10-U11 Reviewed PR; coordinator starts U13
U13 Wrapper/app popups; remove common Popup U12; access from U03-U05 Reviewed PR; coordinator starts U14
U14 Screen/browser camera buttons; remove common NavigationControl/FullscreenControl U13 Reviewed PR; coordinator starts U15
U15 SDK ornaments; remove common ScaleControl/AttributionControl U14 Reviewed PR; coordinator starts U16
U16 App location UI; remove common GeolocateControl/following U15 Reviewed PR; coordinator starts U17
U17 Screen layout; remove common Control and placement registry U13-U16 Reviewed PR; coordinator starts U18
U18 App acquisition; remove library location services and service contexts U11-U12, U16 Reviewed PR; coordinator starts U19
U19 Map feature clicks; remove Source.onClick and UserLocation.onPress U13, U16-U18 Reviewed PR; coordinator starts U20
U20 Explicit image remount after style replacement U19 Reviewed PR; coordinator starts U21
U21 Remove unused private context/event plumbing U07-U20 Reviewed PR; coordinator starts U22
U22 Public surface, custom adapters, consumers, and package audit U21 Reviewed PR; coordinator starts U23
U23 Patch/peer decision report, with no default removals U22 Reviewed PR43; approved U23-F01 resolves retained gaps before U24
U24 Final routine checks, frozen candidate, acceptance request U23 Explicit acceptance permission
U25 Approved web renderer checks U24 and scoped permission Approve web result and native scope
U26 Approved sequential native renderer checks U24, U25 and scoped permission Approve native result and U27
U27 Final evidence, documentation, and retention review U25-U26 or explicit verification disposition Owner accepts result; publishing separate

U23 can identify necessary extra patch work. It cannot authorize it. The coordinator proposes a separately named, bounded follow-up unit, obtains approval, completes it and its checks, and returns to the remaining sequence. The same rule applies to a failed later renderer check. No worker changes production code or retries a changed artifact independently.

Unit cards

U01: Establish the working baseline

Outcome and scope. A coordinator-preparation subagent performs read-only inventory. Inspect current instructions, requirements, the proposal, package scripts, working changes, current candidate evidence, public exports, custom adapters, maintained application scenarios, and test runners. Record relevant file/artifact hashes, peers, host versions, and existing routine outcomes. Preserve the current candidate; no new release status is inferred.

Proof. Search each removed API and each private owner across source, examples, tests, scripts, package configuration, and documentation. Classify every caller as retained, migrated, or deliberately retired; note dynamic/string references. Inspect aggregate commands before running any routine baseline checks. Produce the write/dependency inventory for later units and identify unrelated failures. No renderer, SDK storage operation, sensor acquisition, build/install, or database mutation runs.

Owner decision. Accept the concrete baseline and inventory before U02. If current work differs materially from the proposal's inspection basis, present that difference before changing its target.

U02: Record the approved next-release scope

Outcome and write scope. A documentation subagent reconciles the proposal, active requirements/stage plan, grouped API checklist, package migration guidance, and applicable agent guidance after owner approval. Mark the smaller scope as agreed for the next incompatible release; keep existing implementation and historical acceptance described separately. Include the agreed UserLocation.onPress removal and application replacement. Do not edit public runtime types yet.

Proof. Documentation/link checks and review that every exclusion is explicit, every retained group has an implementation owner, and no unchecked existing work became a fictitious completed SDK limitation. Preserve current candidate/version/patch facts. Consult the writing-for-agents skill for any AGENTS.md edits and retain acceptance/retention instructions. The API proposal continues owning exact consumer examples; the plan does not duplicate a second coverage ledger.

U03: Add selected web wrapper access

Outcome and write scope. One implementation subagent adds asynchronous getWrapperMap to both selected web refs through the existing web ref factory, selected entry types, and affected callback/ref tests. Keep current advanced methods temporarily so consumers remain valid. Do not add it to the common MapRef or expose raw SDK types through the common entry.

Proof. Test the actual react-map-gl wrapper result, current replacement handle, detached rejection, retained facade refs, no waiting for load, and absence of a new map owner. Add positive selected and negative common declaration examples. Run web ref/adapter tests, type checks, library build, and affected packed entry checks. Test the existing proxy's asynchronous method behavior rather than bypassing it with an unrelated handle cache.

U04: Add RNMapbox wrapper access

Outcome and write scope. Add getWrapperMap to the RNMapbox map-ref factory and NativeAdvancedMapRef, with selected entry declarations and RNMapbox mocked adapter tests. Return the actual attached MapView wrapper ref. Keep its camera commands, source registry, and existing advanced methods unchanged.

Proof. Detached rejection, ref replacement, correct wrapper identity and type, no Camera substitution, and common-entry peer isolation. Run RNMapbox mocked adapter tests, type/build checks, and affected selected/packed checks. Import/type checking cannot certify native linking; record that gate without building a native app.

U05: Add MapLibre native wrapper access

Outcome and write scope. Add the corresponding method to the MapLibre native map-ref factory, selected ref type, and mocked adapter tests. Read the current handle when called because the wrapper can refresh imperative handles; do not retain an earlier source/map ref unnecessarily.

Proof. Detached rejection, replacement handle, exact wrapper type, and existing map-loaded camera guards still apply to common camera commands. Run MapLibre mocked adapter tests and selected declaration/build/packed checks. Check both mixed selections with the accumulated access additions; no linking or renderer run occurs.

U06: Stop mirroring advanced ref methods

Outcome and write scope. Migrate selected advanced callers and fixtures to getWrapperMap or the existing web useWrapperMap. Remove the advanced method inventories/helpers and duplicated selected ref members after searching every call. Expected owners include both selected web entries, native selected extras, web method-forwarders, selected tests, peer probes, and the selected acceptance scenarios.

Proof. Preserve all common camera/query/state methods and their result conversions. Check representative advanced reads and plugin/event routes through their true wrapper, with detached behavior documented. Keep inexpensive raw exports. Negative declarations reject removed facade methods. Do not change a React-owned source/layer/style through an SDK setter merely to make a fixture work. Run affected unit/mocked, type, build, and package-selection checks.

U07: Remove common native marker dragging

Outcome and write scope. Remove use-native-marker-drag, common annotation drag forwarding/restoration, and drag-only gesture-lock plumbing from native marker composition, both native maps, and native presentation. Narrow selected native marker props and clearly reject unsupported common JavaScript requests. Migrate native marker scenes and retire only common-native-drag scenarios/scripts; web dragging and selected raw annotation facilities remain.

Proof. Existing live marker clicks share the drag hook, so replace their activation path and retain child buttons, scrolling, offsets, providers, refresh, coordinate updates, multiple maps, and cleanup. Keep RNMapbox per-tap annotation workarounds if still needed. Test that ordinary touches do not toggle SDK gestures and no obsolete asynchronous drag changes a marker. Update compiler ownership checks and script references to a deleted hook. Routine native UI, web UI, host, wrapper-callback, declaration, and example checks apply; actual touch acceptance remains open.

U08: Remove native camera rollback

Status. Merged as PR27. The U08 evidence separates passing working-tree and covered publication checks from the two unchanged baseline wrapper-callback import failures in the full main web/unit suite. It also distinguishes the original-only TF10 harness migration from the older existing main fixtures; these fixture and artifact differences are recorded centrally. Actual native prop application, touch, renderer, Metro, and native linking acceptance remain unverified and require separate permission. The strict controlledCamera capability remains unadvertised. U09-U11 are merged as PR28-PR30; U12 is merged as PR31; U13 is implemented and independently audited.

Outcome and write scope. Remove use-native-controlled-camera and its observers/scheduling from both native maps/refs. Keep changed viewState targets, imperative commands, constraints, reset fixes, load guards, and error handling. Migrate camera/release fixtures from ignored-proposal rollback expectations to explicit target/command behavior and observed state. Preserve the native camera context shape and overlay/native UI consumers; both viewState and observedViewState carry observations rather than the application target. A native target A followed by user movement to B stays at B while A is unchanged, including a fresh equal-valued object. Changed target C and explicit jumpTo(A) remain requests; removing viewState releases the target.

Proof. Mocked tests cover changed versus unchanged targets, release of control, explicit jumpTo reapplication, commands after movement, teardown, and errors. Preserve native location-follow ownership checks and all web controlled behavior. Do not advertise missing getters, fit-cap support, or animation completion. Do not remove native SDK camera patches that fix ordinary dispatch/reset. Run camera converter, native adapter, reconciliation replacement, type and example checks.

U09: Delegate feature-state lifetime

Status. Merged as PR28. The U09 evidence owns scope, provenance, audit and routine results. It distinguishes passing original checks and covered main publication checks from the two unchanged baseline wrapper-callback import failures in the full main web/unit suite. Original and main fixtures and existing patches differ; the record preserves those artifact boundaries. The Kotlin source-lifetime static stub was skipped because its cached compiler was absent; no bridge or patch changes, native build, or installation were performed. Real feature-state lifetime, renderer, browser, Metro, and native linking acceptance remain unverified and require separate permission. U12 is merged as PR31; U13 is implemented and independently audited.

Outcome and write scope. Remove NativeFeatureState reset journals, queues, style reset/flush scheduling, and the same-ID source-remount clearing promise. Simplify both native feature-state method modules and registration effects. Keep registries needed by source/cluster/state dispatch, owner-bound cleanup, current ref lookup, validation, immutable argument capture, and SDK errors. Update the query contract and state/lifetime examples together.

Proof. Test explicit set/get/key removal/whole-state removal, GeoJSON/vector routing, missing and replaced refs, unrelated sources, errors, and argument mutation. Replace automatic-reset expectations with renderer-owned lifetime and application state ownership. Do not promise cancellation of an SDK call already sent or add a shadow state cache. Render-frame callbacks still serve map capture at this point; preserve their capture.frame calls. Run state, source-registry, adapter, query/lifetime-fixture, type and example checks.

U10: Migrate and remove common map capture

Status. Merged as PR29. The U10 evidence owns the reviewed original and main publication scopes, routine outcomes, inherited baseline failures, artifact provenance, and remaining verification limits. Current-map capture callers use selected wrapper access; independent snapshot services and their shared image-output helpers migrate in U12. Original advanced rendering, global-state, native model and service scenes retain PNG observations; the older main publication fixtures retain their narrower scene scope. Renderer, browser, Metro, native build/install, output inclusion and file behavior remain unverified for the changed artifact and require separate permission. U12 is merged as PR31; U13 is implemented and independently audited.

Outcome and write scope. Migrate capture callers to selected wrapper access, then remove MapRef.capture, captureEnabled, MapCaptureGate, capture-only listeners, and ref/factory parameters. Inspect the advanced rendering, global-state, model, and service scenes, not only the capture sample. Keep current independent snapshot services until U12.

Proof. Preserve rendered-observation intent for retained rendering tests using application/SDK capture where required. Retire common capture guarantees explicitly, rather than deleting the visual assertion that happened to use capture. Type-check native file/base64 and web buffer option routes; mock the app-owned error/ref handling. Neither this unit nor application examples promise uniform overlay inclusion, dimensions, files, or deadline behavior. Shared image-output functions remain if independent snapshots still use them. Run capture-call-site, rendering-fixture, adapter, type, build, and package checks.

U11: Migrate offline use and remove the common manager

Status. Merged as PR30. The U11 evidence owns original and main publication provenance, bounded routine outcomes, inherited publication failures, and the repaired cross-screen observer race. Application commands preserve existing IDs, user metadata, native operation keys, and imported aliases through read-only discovery; malformed and ambiguous metadata remain visible. A per-SDK observer slot rejects replacement claims while ownership or pending setup/create remains, without automatic queueing or retry. These routine checks establish no live database preservation claim. Live offline downloads, imports, cache/database operations, renderer execution, and native builds/installations are unverified and require separate permission. Location services remain until U18; U12 is merged as PR31; U13 is implemented and independently audited.

Outcome and write scope. Convert necessary application examples to selected managers and remove common OfflineService/OfflinePack types, MapServices.offline, shared offline-service, backend service conversions, and obsolete normalized-manager tests. Keep raw wrapper exports and current patches. Add a small application-owned reader for existing facade metadata only if the example/application needs it; do not recreate the common subscription manager outside the library.

Proof. Unit fixtures establish preservation of old oneMapReactOffline IDs, user metadata, native names/generated IDs, imported backend aliases, duplicate/malformed metadata reporting, and no writes during discovery. Check installed SDK argument/callback shapes and necessary application subscription teardown. Preserve persisted packs after failed creation; avoid automatic delete, rename, database reset, or redownload. Live download/import/cache/database operations are outside routine checks and require separate approved execution if needed. Historical service outcomes remain historical.

U12: Remove common independent snapshots

Status. Implemented and independently audited. The U12 evidence owns original and main publication scopes, applicable routine results, inherited baseline failures, and artifact provenance. Working independent image examples call selected WrapperSnapshotManager and WrapperStaticMapImageManager. MapServices.staticMapImage, shared capture/image-output types, orphan conversions and output helpers are removed. Location services remain until U18. Native images, renderer acceptance, Metro, and builds/installations remain unverified. PR31 is merged; U13 is implemented and independently audited under the unit protocol.

Outcome and write scope. Migrate required independent image examples to WrapperSnapshotManager/WrapperStaticMapImageManager and remove MapServices.staticMapImage, shared snapshot/capture types, associated conversions, and image-output code that has no retained owner. Keep both raw managers, current patches, and application-specific output/error handling.

Proof. Selected declaration probes verify zero zoom, bounds ordering, output choices, dimensions, and manager names against the installed packages. Retire only common format/dimension/scope guarantees. Search for image validators shared with still-retained operations before deletion. Keep LocationService and MapServices.location until U18 so intermediate builds remain valid. Run service/image, affected fixture, type, build and package checks; no native snapshot execution.

U13: Remove common popup composition

Status. Implemented and independently audited after U12 PR31. Common Popup, PopupProps, Adapter.Popup and selected facade aliases are removed. Selected web callbacks render WrapperPopup directly; native applications render their own accessible close bubble inside Marker. Native marker hosts, portals, raw SDK exports and map subscriptions remain. Routine source, declaration, mocked application wiring, native component and build checks passed their recorded scopes; the U13 evidence records exact results, inherited baseline failures, artifact provenance and remaining acceptance gates. PR32 is merged; U14 is implemented and independently audited under the unit protocol. Renderer, browser, Metro, native build/install, native bubble touches, and provider/state retention remain unverified for this migration.

Outcome and write scope. Migrate web consumers to WrapperPopup and native consumers to a screen-owned bubble in Marker or a selected annotation/Callout. Remove the common Popup component, props, adapter field, selected facade aliases, and only the associated web/native composition. Keep native marker hosts and portal ownership.

Proof. Preserve the actual migrated application's close affordance, accessibility and lifetime through its application tests. State which old common dismissal/focus/width guarantees no longer apply. Keep raw SDK exports and source/marker interaction tests that remain relevant. Native bubble touches and provider/state retention remain later integration gates. Run UI/host/wrapper callback, type/build and example checks; leave the shared map subscription facility until its other consumers are gone.

U14: Remove common navigation and fullscreen controls

Status. Implemented and independently audited after reviewed U13 PR32. Common NavigationControl, FullscreenControl, their props, adapter fields, selected facade aliases and navigation-only readback are removed. Web applications compose raw WrapperNavigationControl and WrapperFullscreenControl; native screen buttons own activation, unavailable-map handling, errors and intended camera commands. Camera methods/getters, native SDK compass options and other common controls remain. The U14 evidence owns bounded routine outcomes, the restored raw MapLibre globe/logo/terrain export regression, artifact provenance and remaining gates. PR33 is merged; U15 is implemented and independently audited under the unit protocol. Renderer interaction, native screen button touches, Metro, and native builds/installations remain unverified.

Outcome and write scope. Move web navigation/fullscreen consumers to Wrapper components and native camera buttons to ordinary screen UI. Remove the two common components, props, adapter slots, selected facade aliases, constructor guards, and now-unused navigation readback logic. Keep camera methods and native SDK compass options.

Proof. Example button tests cover accessible activation, unavailable map/error handling, and its intended camera command. Preserve camera getter correctness tests independently of retired NavigationControl. Native FullscreenControl rejection disappears with the removed common API; upstream browser fullscreen remains selected. Update custom adapter fixtures when fields are removed. Run UI, camera, host, type/build, and affected packed checks.

U15: Delegate scale and attribution ornaments

Status. Implemented and independently audited after reviewed U14 PR33. Common ScaleControl, AttributionControl, their props, adapter fields, selected facade aliases, scale-only readback and common attribution overrides are removed. Raw web Wrapper controls and native selected SDK ornaments supply presentation. Native TF07 retires the uniform units action while retaining SDK scale enablement and legal defaults; historical acceptance IDs and outcomes are unchanged. Compass options, marker hosts/portals and RNMapbox scale-position/resize refresh remain. The U15 evidence owns bounded original/publication routine results, package provenance, source inspection and remaining gates. PR34 is merged; U16 is implemented and independently audited under the unit protocol. Renderer ornament placement/units/legal presentation, browser interaction, Metro and native builds/installations remain unverified.

Outcome and write scope. Move web scale/attribution to Wrapper components and native presentation to selected SDK ornaments plus screen-owned supplemental text where necessary. Remove common ScaleControl/AttributionControl, their props/adapter slots/aliases, scale calculation/readback, and common attribution override state. Keep SDK defaults and explicit selected options.

Proof. Mocked forwarding and example tests preserve visible attribution configuration, legal text, supported SDK scale enablement, and application placement. Native positions and units are documented platform behavior; unsupported common width requests are no longer accepted via a deleted type. Do not remove the RNMapbox SDK scale-position refresh workaround while selected scale position/resize behavior still depends on it. Application layout owns control spacing; common stacking is excluded. Run UI, ornament option, host, type/build and selected checks.

U16: Remove common geolocation control and follow controller

Status. Implemented and independently audited after reviewed U15 PR34. The U16 evidence owns bounded routine outcomes, source inspection, artifact provenance and remaining verification gates. Common GeolocateControl, its props, adapter field, selected facade aliases and common follow/coalescing controller are removed. Web uses raw selected WrapperGeolocateControl without setup-provider interception. Native examples own a one-shot button request, stale-result suppression, cancellation, teardown and errors using their retained location integration. No replacement continuous-follow controller is required. Supplied display/accuracy, raw SDK pucks/follow and native camera ownership constraints remain. Location acquisition/services/types stay until U18, and source/location press handling until U19. Renderer, location sensor, Metro and native build/install checks remain unverified. U17 follows this unit's reviewed PR automatically under the unit protocol.

Outcome and write scope. Web examples use WrapperGeolocateControl; native examples use an application button and the application's location integration. Remove common GeolocateControl, its props/adapter field/aliases, use-geolocation-control, and common follow/coalescing logic. Keep display-only UserLocation and raw SDK pucks/follow facilities. Library location services still exist for remaining callers until U18.

Proof. Migrate or retire each acquisition/follow fixture explicitly. Application tests cover the policies it chooses, including owned cancellation, disposal, and failure paths; avoid a mandatory replacement follow controller. Preserve display geometry/accuracy tests and native map locationOptions ownership constraints. Confirm web Wrapper controls no longer route through MapSetup location overrides. Run location/UI, native service, application, type/build and relevant selected tests.

U17: Remove common control layout

Status. Implemented and independently audited after reviewed U16 PR35. The U17 evidence owns separate original/publication routine counts, archive provenance, phased host checks and the controlled host-wrapper red/green regression. Common Control, its types/adapter field/selected facade aliases, web custom-control composition, native corner registration/measurement and automatic ornament avoidance are removed. Application siblings own layout and explicit map activation; retained native live markers keep their hosts/portals, layout and observed camera state. SDK ornament options/defaults, legal attribution/logos and RNMapbox scale-position/resize refresh remain. PR36 is merged; U18 is implemented and independently audited under the automatic unit workflow. Renderer layout, touches, assistive technology, Metro and native builds/installations remain unverified.

Outcome and write scope. Move any remaining Control children to their application layout and remove common Control, NativeControl, web custom-control composition, overlay row registration/measurement, and automatic SDK ornament avoidance. Remove NativeOverlayContext and control-only placement state. Retain marker overlay host names, viewport size, portal setup, observed camera movement, and selected ornament option forwarding.

Proof. Check that all built-in control compositions were removed before deleting their internal host. Application examples retain providers and state by their own sibling layout, accessible buttons, safe-area/attribution spacing, resize, and multiple maps. Do not claim a portal dependency removal while native live markers still use it. Run native/web UI, map-context, host, selected-option, type/build and consumer checks. Preserve SDK scale refresh until U23 can assess its actual removal condition.

U18: Remove library acquisition and service contexts

Status. Implemented and independently audited after reviewed U17 PR36, with no outstanding findings in the inspected source/caller scope. The U18 evidence owns phased original/publication routine results, coordinator red/green corrections, exact archive/package/peer provenance and source/export inspection. Library acquisition, permission and service contexts/scoping are removed; MapSetup selects rendering and retains named maps without owning application requests. Applications own one-shot acquisition and permission policy through selected managers or browser facilities. Supplied display validation/accuracy geometry, raw SDK managers/pucks/follow and native camera ownership constraints remain; Source.onClick and UserLocation.onPress remained at this checkpoint; U19 records their removal. U18 PR37 is merged. U19 feature-click migration is merged as PR38; U19 evidence records bounded routine verification and exact archive provenance. U20 Images migration is implemented and independently audited; U20 evidence records bounded routine verification, inherited publication exclusions and exact archive provenance. U20 PR40 is open after independent review. U21 private-coordination cleanup is implemented and independently audited; U21 evidence records bounded routine verification and exact archive provenance. U21 PR41 is open after independent review. U22 public-surface audit and bounded documentation/test fixes are implemented and independently audited; U22 evidence records full routine checks without fixture exclusions, exact packed/declaration verification and the corrected fixture-loading diagnosis. U22 PR42 is open after independent review. U23 read-only patch/peer assessment is complete with PR43 open after review; the decision report records eight retained publication repair gaps at the read-only checkpoint. U23-F01 is implemented and independently audited; reconciliation evidence records exact patch identities, bounded routine/pristine/isolated proofs and frozen-archive checks with peers, locks and versions unchanged. The reconciliation PR44 is open after review. U24 candidate preparation is implemented and independently audited with PR45 open after review. The authorized U25 browser attempt failed in its first command; the Mapbox scenario passed, MapLibre camera forwarding failed, and runner cleanup left owned child processes. Eight commands were not run. The owner-approved camera/runner repairs are implemented and independently audited with PR46 open. The authorized attempt02 passed commands 1-4 on both web engines, then command 5 failed after source recreation, before requesting the replacement style, with an undefined-value error; commands 6-9 were not run. All five commands exited normally and released their owned processes. Source-backed SDK and full-hook reproductions trace the error to redundant removal of already-empty fresh feature state followed by a set before SDK state coalescing. The fixture-only repair is implemented and independently source-audited with PR47 open; applicable routine checks passed. Library behavior is unchanged. The authorized attempt03 passed commands 1-5 on both web engines, then command 6 failed in the Mapbox UI popup-teardown assertion (open=2, close=2, expected no extra dismissal); commands 7-9 were not run. All six commands exited normally and released owned resources, with frozen inputs unchanged. Source-backed raw-wrapper/SDK and actual-scene controls locate an application ownership defect: old-map removal invokes the old popup callback before child cleanup, and that stale callback closes replacement-generation state. The fixture-only generation/lifetime guard and stronger replacement-popup verification are implemented with PR48 open; applicable routine checks and independent source audit passed. The current browser outcome records all nine approved rows passing on the unchanged PR48 candidate, including commands 1-2 from attempt04 and commands 3-9 from approved recovery. The interrupted attempt04 and prior failures remain recorded history. The browser harness and runtime tools are retired. The sole acceptance proposal owns the source-audited and routinely verified resolver/retained-coverage repairs, the proposed host-readiness phase and the later separate native execution-permission gate. Native acceptance remains unverified. The publication suites retain two explicit inherited wrapper-import failures; bounded checks do not establish renderer, sensor, permission, browser interaction, Metro or native build/install acceptance.

Outcome and write scope. Move remaining location callers to app/SDK code, then remove useMapServices, MapServices, MapSetup.locationProvider, Adapter.services, service contexts/scoping, native/web acquisition factories, and acquisition-only types/helpers. Native services.ts files can disappear once U11/U12 removed their other responsibilities. Migrate custom adapter constructions and compiler/unit/package fixtures together.

Proof. Keep GeolocationPosition, UserLocationProps, and validation/geometry needed by display-only UserLocation. Do not discard coordinate validation or unit meaning with the acquisition functions. Removing a MapSetup no longer disposes app services; the owning application must dispose its own work. Verify common imports need no service manager, no sensor work starts from retained rendering, and backend peer isolation still holds. Preserve SDK manager aliases; no global stop/removeAllListeners is added to examples. Run display, setup/context, application, type/build and package-selection checks.

U19: Use map feature clicks only

Status. Implemented and independently audited after reviewed U18 PR37, with no substantive findings remaining in the inspected scope. The U19 evidence owns phased routine results, final source/compiled regressions, exact source/dist/README archive provenance and the separately recorded inherited publication failures. Shared source activation uses Map.onClick with interactiveLayerIds; Source.onClick, SourceClickEvent, synthetic source registration/dispatch/bubbling, selected facade native source hitbox additions and UserLocation.onPress are removed. Native filtered clicks preserve actual logical-point queries, shared results, observable errors and stale-map protection; applications identify plain native GeoJSON through their own IDs or properties. Raw native Wrapper source facilities, source refs/queries/state, live markers/portals, eight common runtime exports and supplied location geometry/accuracy remain. U19 is merged as PR38. U20 Images migration is implemented and independently audited; U20 evidence records bounded routine verification, inherited publication exclusions and exact archive provenance. U20 PR40 is open after independent review. U21 private-coordination cleanup is implemented and independently audited; U21 evidence records bounded routine verification and exact archive provenance. U21 PR41 is open after independent review. U22 public-surface audit and bounded documentation/test fixes are implemented and independently audited; U22 evidence records full routine checks without fixture exclusions, exact packed/declaration verification and the corrected fixture-loading diagnosis. U22 PR42 is open after independent review. U23 read-only patch/peer assessment is complete with PR43 open after review; the decision report records eight retained publication repair gaps at the read-only checkpoint. U23-F01 is implemented and independently audited; reconciliation evidence records exact patch identities, bounded routine/pristine/isolated proofs and frozen-archive checks with peers, locks and versions unchanged. The reconciliation PR44 is open after review. U24 candidate preparation is implemented and independently audited with PR45 open after review. The authorized U25 browser attempt failed in its first command; the Mapbox scenario passed, MapLibre camera forwarding failed, and runner cleanup left owned child processes. Eight commands were not run. The owner-approved camera/runner repairs are implemented and independently audited with PR46 open. The authorized attempt02 passed commands 1-4 on both web engines, then command 5 failed after source recreation, before requesting the replacement style, with an undefined-value error; commands 6-9 were not run. All five commands exited normally and released their owned processes. Source-backed SDK and full-hook reproductions trace the error to redundant removal of already-empty fresh feature state followed by a set before SDK state coalescing. The fixture-only repair is implemented and independently source-audited with PR47 open; applicable routine checks passed. Library behavior is unchanged. The authorized attempt03 passed commands 1-5 on both web engines, then command 6 failed in the Mapbox UI popup-teardown assertion (open=2, close=2, expected no extra dismissal); commands 7-9 were not run. All six commands exited normally and released owned resources, with frozen inputs unchanged. Source-backed raw-wrapper/SDK and actual-scene controls locate an application ownership defect: old-map removal invokes the old popup callback before child cleanup, and that stale callback closes replacement-generation state. The fixture-only generation/lifetime guard and stronger replacement-popup verification are implemented with PR48 open; applicable routine checks and independent source audit passed. The current browser outcome records all nine approved rows passing on the unchanged PR48 candidate, including commands 1-2 from attempt04 and commands 3-9 from approved recovery. The interrupted attempt04 and prior failures remain recorded history. The browser harness and runtime tools are retired. The sole acceptance proposal owns the source-audited and routinely verified resolver/retained-coverage repairs, the proposed host-readiness phase and the later separate native execution-permission gate. Native acceptance remains unverified. Renderer/query/touch behavior, Metro and native builds/installations remain unverified.

Outcome and write scope. Move shared source callbacks to Map.onClick plus interactiveLayerIds. Remove Source.onClick, SourceClickEvent, facade/native source callback registries and synthetic bubbling, selected facade hitbox additions, and UserLocation.onPress. Display-only UserLocation no longer installs a source click handler. Keep raw wrapper source APIs and retained source-ref registries.

Proof. Native filtered clicks still query the actual map point, produce shared feature results, propagate SDK errors, and suppress obsolete asynchronous callbacks after detachment/replacement. Web can use the wrapper's feature event where equivalent; do not drop necessary normalization. Tests cover multiple sources/layers and per-map routing. Applications needing pressable location geometry use known IDs through Source/Layer and map clicks, not a new registration API. Run interaction, source-hit, query, display, context, adapter, type and consumer checks.

U20: Keep a small Images polyfill

Status. Implemented and independently audited after merged U19 PR38, with no substantive findings remaining in the inspected scope. The U20 evidence owns phased routine results, corrected app and reentrant cleanup regressions, inherited publication exclusions, exact archive/member provenance and packed/declaration checks. Web Images is the approved narrow polyfill with independent entries, initial usable-style waiting, credential-safe failures, collision errors and synchronous owned cleanup; automatic style replay/retry and cross-style coordination are removed. Native adapters retain wrapper delegation and normal SDK restoration. SourcesMap stages cleanup before changing style on the same Map; the corrections fixture retains same-style loading, logical unmount and reuse probes. U20 PR40 is open after independent review. U21 private-coordination cleanup is implemented and independently audited; U21 evidence records bounded routine verification and exact archive provenance. U21 PR41 is open after independent review. U22 public-surface audit and bounded documentation/test fixes are implemented and independently audited; U22 evidence records full routine checks without fixture exclusions, exact packed/declaration verification and the corrected fixture-loading diagnosis. U22 PR42 is open after independent review. U23 read-only patch/peer assessment is complete with PR43 open after review; the decision report records eight retained publication repair gaps at the read-only checkpoint. U23-F01 is implemented and independently audited; reconciliation evidence records exact patch identities, bounded routine/pristine/isolated proofs and frozen-archive checks with peers, locks and versions unchanged. The reconciliation PR44 is open after review. U24 candidate preparation is implemented and independently audited with PR45 open after review. The authorized U25 browser attempt failed in its first command; the Mapbox scenario passed, MapLibre camera forwarding failed, and runner cleanup left owned child processes. Eight commands were not run. The owner-approved camera/runner repairs are implemented and independently audited with PR46 open. The authorized attempt02 passed commands 1-4 on both web engines, then command 5 failed after source recreation, before requesting the replacement style, with an undefined-value error; commands 6-9 were not run. All five commands exited normally and released their owned processes. Source-backed SDK and full-hook reproductions trace the error to redundant removal of already-empty fresh feature state followed by a set before SDK state coalescing. The fixture-only repair is implemented and independently source-audited with PR47 open; applicable routine checks passed. Library behavior is unchanged. The authorized attempt03 passed commands 1-5 on both web engines, then command 6 failed in the Mapbox UI popup-teardown assertion (open=2, close=2, expected no extra dismissal); commands 7-9 were not run. All six commands exited normally and released owned resources, with frozen inputs unchanged. Source-backed raw-wrapper/SDK and actual-scene controls locate an application ownership defect: old-map removal invokes the old popup callback before child cleanup, and that stale callback closes replacement-generation state. The fixture-only generation/lifetime guard and stronger replacement-popup verification are implemented with PR48 open; applicable routine checks and independent source audit passed. The current browser outcome records all nine approved rows passing on the unchanged PR48 candidate, including commands 1-2 from attempt04 and commands 3-9 from approved recovery. The interrupted attempt04 and prior failures remain recorded history. The browser harness and runtime tools are retired. The sole acceptance proposal owns the source-audited and routinely verified resolver/retained-coverage repairs, the proposed host-readiness phase and the later separate native execution-permission gate. Native acceptance remains unverified. Renderer image behavior, Metro and native builds/installations remain unverified.

Owner decision, 2026-10-26. The owner approved a narrow web Images polyfill after the scope assessment. Images deliberately extends react-map-gl, which exposes renderer image methods rather than a component. Native adapters translate entries to the existing Images wrappers. The migration contract owns the lifecycle and consumer example. U12-U19 are merged through PR38; implementation starts from main at f1eb35b16ed0dcf489646bded75d98735b40f369.

Outcome and write scope. Replace web replay/ownership coordination with a small loadImage/addImage/removeImage implementation. Keep initial usable-style waiting, independent entry updates/removals, credential-safe errors, successful-registration cleanup and cancellation of obsolete entry loads. Existing web names are conflicts, not permission to remove another owner's registration. Apps reserve image names while mounted. Remove sprite comparisons, automatic restoration, style-event retry and cross-style detection machinery. Native wrappers retain normal SDK restoration and collision behavior.

Applications must finish Images unmount cleanup before replacing the style, then mount fresh Images after readiness. A keyed Map with renderer reuse disabled is an alternative boundary. A key change after onStyleLoad alone is insufficient. Migrate every maintained Images consumer that changes styles to one of these boundaries. Do not add a general lifecycle controller, SDK private identity guards or native parity machinery. Document this intentional react-map-gl exception in the user-facing source/layer guide, root/package README and public Images declaration.

Proof. Check initial/missed style readiness, ordinary styledata without replay, unchanged entries, isolated URL/SDF updates, removals, collisions, failures, logical unmount/reuse and stale load completion. Test the approved application replacement sequence and repeated A/B/A choices with old loads pending. Preserve unrelated query/interaction proofs in mixed test files. Check callback-triggered release inside image calls against the supported lifetime without reinstating arbitrary raw style-replacement guarantees. Run mocked web/native adapters, declarations, maintained consumer types, compiler/build and package/selection checks. Inspect native delegation without suppressing upstream restoration. Record exact artifact provenance and retain renderer verification as an open gate. The former substantial-machinery scope stop is resolved by this owner-approved contract narrowing.

U21: Remove orphaned private coordination

Status. Implemented and independently audited after reviewed U20 PR40, with no substantive findings remaining in the inspected scope. The U21 evidence owns the private-reader inventory, source/routine results, publication compiler-proof correction and exact archive/member provenance. Unused MapSession subscription/camera/constraint fields, the optional-session helper, the private interaction listener bus and the unread native location-following presentation flag are removed. NativeCameraContext/provider and marker projection remain, using the existing observed viewState instead of its duplicate observedViewState alias. Ready refs, named-map lifecycle subscriptions, committed callbacks, active/generation/current-map query suppression, native viewport/layout/portal ownership, source registries and selected follow/camera conflict guards remain. The public API, Images contract and application examples are unchanged. U21 PR41 is open after independent review. U22 public-surface audit and bounded documentation/test fixes are implemented and independently audited; U22 evidence records full routine checks without fixture exclusions, exact packed/declaration verification and the corrected fixture-loading diagnosis. U22 PR42 is open after independent review. U23 read-only patch/peer assessment is complete with PR43 open after review; the decision report records eight retained publication repair gaps at the read-only checkpoint. U23-F01 is implemented and independently audited; reconciliation evidence records exact patch identities, bounded routine/pristine/isolated proofs and frozen-archive checks with peers, locks and versions unchanged. The reconciliation PR44 is open after review. U24 candidate preparation is implemented and independently audited with PR45 open after review. The authorized U25 browser attempt failed in its first command; the Mapbox scenario passed, MapLibre camera forwarding failed, and runner cleanup left owned child processes. Eight commands were not run. The owner-approved camera/runner repairs are implemented and independently audited with PR46 open. The authorized attempt02 passed commands 1-4 on both web engines, then command 5 failed after source recreation, before requesting the replacement style, with an undefined-value error; commands 6-9 were not run. All five commands exited normally and released their owned processes. Source-backed SDK and full-hook reproductions trace the error to redundant removal of already-empty fresh feature state followed by a set before SDK state coalescing. The fixture-only repair is implemented and independently source-audited with PR47 open; applicable routine checks passed. Library behavior is unchanged. The authorized attempt03 passed commands 1-5 on both web engines, then command 6 failed in the Mapbox UI popup-teardown assertion (open=2, close=2, expected no extra dismissal); commands 7-9 were not run. All six commands exited normally and released owned resources, with frozen inputs unchanged. Source-backed raw-wrapper/SDK and actual-scene controls locate an application ownership defect: old-map removal invokes the old popup callback before child cleanup, and that stale callback closes replacement-generation state. The fixture-only generation/lifetime guard and stronger replacement-popup verification are implemented with PR48 open; applicable routine checks and independent source audit passed. The current browser outcome records all nine approved rows passing on the unchanged PR48 candidate, including commands 1-2 from attempt04 and commands 3-9 from approved recovery. The interrupted attempt04 and prior failures remain recorded history. The browser harness and runtime tools are retired. The sole acceptance proposal owns the source-audited and routinely verified resolver/retained-coverage repairs, the proposed host-readiness phase and the later separate native execution-permission gate. Native acceptance remains unverified. Renderer, Metro and native build/install acceptance remain unverified.

Outcome and write scope. Search remaining readers of map interaction subscriptions, session camera/constraint fields, native location-follow presentation state, and native camera contexts. Delete only unused private pieces left by U07-U20. Keep ready/ref access, named maps, native marker projection/layout observations, and asynchronous filtered-click safety. Consolidate the observed camera representation if no retained caller needs the old target/observation split.

Proof. Treat this as bounded ownership cleanup, not a new architecture or file-reorganization project. Retain current callbacks during concurrent/suspended renders, logical unmount cleanup during web reuse, multiple-map isolation, source queries and marker projection. Run context, callback, lifetime, interaction and native UI tests plus types/build. Demonstrate each deletion by its removed readers; no generic replacement event bus, controller, or context inspector is introduced.

U22: Audit the final public and consumer surface

Status. Implemented and independently audited after reviewed U21 PR41, with no substantive findings remaining in the inspected scope. The U22 evidence owns the public/consumer audit, individual negative packed cases, exact archive/member provenance, full source/compiled checks and current documentation excerpt probes. The audit verifies eight common runtime exports and 91 type exports, 99 total, the six-key Adapter, selected borrowed wrapper refs/raw aliases, custom adapters, mixed selections and app-owned examples. All 37 current excerpts pass against actual dist in both roots; seven explicit historical Before blocks remain excluded. The five failing current examples were repaired and remain checked. Production source and dist are byte-identical to the U21 checkpoint. The two formerly excluded publication wrapper-callback fixtures now pass in full source and compiled suites: the installed marker.ts files existed, but Vite filesystem eligibility blocked loading computed SDK-source imports outside the clone. The bounded test-only allowlist correction changes no SDK or production behavior; earlier U06-U21 evidence retains its historical outcomes and the new record supersedes the old missing-file diagnosis. Compiler skip diagnostics remain separate from a claim that every runtime function is compiled. U22 PR42 is open after independent review. U23 read-only patch/peer assessment is complete with PR43 open after review; the decision report records eight retained publication repair gaps at the read-only checkpoint. U23-F01 is implemented and independently audited; reconciliation evidence records exact patch identities, bounded routine/pristine/isolated proofs and frozen-archive checks with peers, locks and versions unchanged. The reconciliation PR44 is open after review. U24 candidate preparation is implemented and independently audited with PR45 open after review. The authorized U25 browser attempt failed in its first command; the Mapbox scenario passed, MapLibre camera forwarding failed, and runner cleanup left owned child processes. Eight commands were not run. The owner-approved camera/runner repairs are implemented and independently audited with PR46 open. The authorized attempt02 passed commands 1-4 on both web engines, then command 5 failed after source recreation, before requesting the replacement style, with an undefined-value error; commands 6-9 were not run. All five commands exited normally and released their owned processes. Source-backed SDK and full-hook reproductions trace the error to redundant removal of already-empty fresh feature state followed by a set before SDK state coalescing. The fixture-only repair is implemented and independently source-audited with PR47 open; applicable routine checks passed. Library behavior is unchanged. The authorized attempt03 passed commands 1-5 on both web engines, then command 6 failed in the Mapbox UI popup-teardown assertion (open=2, close=2, expected no extra dismissal); commands 7-9 were not run. All six commands exited normally and released owned resources, with frozen inputs unchanged. Source-backed raw-wrapper/SDK and actual-scene controls locate an application ownership defect: old-map removal invokes the old popup callback before child cleanup, and that stale callback closes replacement-generation state. The fixture-only generation/lifetime guard and stronger replacement-popup verification are implemented with PR48 open; applicable routine checks and independent source audit passed. The current browser outcome records all nine approved rows passing on the unchanged PR48 candidate, including commands 1-2 from attempt04 and commands 3-9 from approved recovery. The interrupted attempt04 and prior failures remain recorded history. The browser harness and runtime tools are retired. The sole acceptance proposal owns the source-audited and routinely verified resolver/retained-coverage repairs, the proposed host-readiness phase and the later separate native execution-permission gate. Native acceptance remains unverified. Renderer, Metro and native build/install acceptance remain unverified.

Outcome and write scope. A review-focused unit checks the eight root runtime exports, retained types, smaller Adapter shape, selected getter signatures, raw exports, aliases, custom adapters, maintained examples, compiler/fixture checks, and package documentation. Each earlier unit must already compile; this is the final cross-surface audit, not a place to park broken callers.

Proof. Positive and negative packed/declaration cases cover every deliberate removal, common import safety, selected native drag restrictions, and both mixed selections. Confirm examples use app-owned services rather than relocated common service frameworks. Keep retained advanced-rendering observations and meaningful unit regressions while retiring obsolete common-service/drag harness entry points. Reconcile the existing checklist and migration document without rewriting historical results. New substantive runtime findings go through reviewed rework with an explicit bounded scope.

U23: Review patches and peers before changing them

Status. Read-only assessment is complete after reviewed U22 PR42. The decision report records the source-backed review of all active sections/hunks, the eight missing publication repair groups, retained callers and peer/host distinctions. No active repair is proven obsolete. No patch, peer, lockfile, source, configuration, version or package artifact was changed, and no new native failure or compatibility pass was observed. P1-P8 were identified as implementation gaps, not contract exclusions. The owner-approved bounded U23-F01 follow-up below is implemented and independently audited. U23 PR43 remains open after review; reviewed follow-up PR44 is open and U24 preparation is implemented and independently audited with PR45 open. The U25 first command failed; owner-approved camera/runner repairs are implemented and independently audited with PR46 open, and attempt02 passed commands 1-4 before command 5 failed after source recreation, before the replacement-style request. Commands 6-9 were not run; normal teardown was observed. The command-5 fixture repair is implemented and independently source-audited with PR47 open and applicable routine checks passed. The authorized attempt03 passed commands 1-5 on both web engines, then command 6 failed in the Mapbox UI popup-teardown assertion (open=2, close=2, expected no extra dismissal); commands 7-9 were not run. All six commands exited normally and released owned resources, with frozen inputs unchanged. Source-backed raw-wrapper/SDK and actual-scene controls locate an application ownership defect: old-map removal invokes the old popup callback before child cleanup, and that stale callback closes replacement-generation state. The fixture-only generation/lifetime guard and stronger replacement-popup verification are implemented with PR48 open; applicable routine checks and independent source audit passed. The current browser outcome records all nine approved rows passing on the unchanged PR48 candidate, including commands 1-2 from attempt04 and commands 3-9 from approved recovery. The interrupted attempt04 and prior failures remain recorded history. The browser harness and runtime tools are retired. The sole acceptance proposal owns the source-audited and routinely verified resolver/retained-coverage repairs, the proposed host-readiness phase and the later separate native execution-permission gate. Native linking/renderer acceptance remains a separate later permission gate.

Outcome and scope. A read-only reviewer maps every active patch section to a retained core behavior, raw selected facility, delegated app service, build/linking requirement, or obsolete guarantee. Inspect duplicate supported RNMapbox patch versions and actual consumer peer constraints. Report keep/remove/upstream-fix-needed recommendations and consequences; change no patch, peer range, lockfile, or linked artifact by default.

Proof. Distinguish service abstraction removal from an upstream service bug. Keep per-map event isolation, ordinary camera dispatch/reset, source/query/state error propagation, and codegen/linking repairs while required. Native scale refresh and the marker portal remain until their retained uses are resolved. A removal requires an explicit owner-approved follow-up unit with affected static checks and later scoped builds/runtime verification. Do not certify the development host as the release baseline.

U23-F01: Reconcile retained publication repairs

Status. Implemented and independently audited after reviewed U23 PR43, with no substantive findings remaining in the inspected scope. The reconciliation evidence owns P1-P8 closure, old-section/hunk semantic accounting, exact final patch/archive identities, bounded pristine/Swift/Objective-C++/Node/static proofs, error-sensitivity checks and applicable source/compiled/isolated outcomes. Only publication's three combined native patches and necessary regression/proof/documentation paths changed. Original patches, all production library modules, peer ranges, locks, versions and SDK pins remain unchanged. RNMapbox 10.3.8 retains its existing bounds-reset implementation. Executable Kotlin checks were skipped because the compiler was unavailable; static Android assertions and extracted methods with stubbed SDK boundaries are not native builds or renderer acceptance. The reviewed follow-up PR44 is open and U24 preparation is implemented and independently audited with PR45 open. The U25 first command failed; owner-approved camera/runner repairs are implemented and independently audited with PR46 open, and attempt02 passed commands 1-4 before command 5 failed after source recreation, before the replacement-style request. Commands 6-9 were not run; normal teardown was observed. The command-5 fixture repair is implemented and independently source-audited with PR47 open and applicable routine checks passed. The authorized attempt03 passed commands 1-5 on both web engines, then command 6 failed in the Mapbox UI popup-teardown assertion (open=2, close=2, expected no extra dismissal); commands 7-9 were not run. All six commands exited normally and released owned resources, with frozen inputs unchanged. Source-backed raw-wrapper/SDK and actual-scene controls locate an application ownership defect: old-map removal invokes the old popup callback before child cleanup, and that stale callback closes replacement-generation state. The fixture-only generation/lifetime guard and stronger replacement-popup verification are implemented with PR48 open; applicable routine checks and independent source audit passed. The current browser outcome records all nine approved rows passing on the unchanged PR48 candidate, including commands 1-2 from attempt04 and commands 3-9 from approved recovery. The interrupted attempt04 and prior failures remain recorded history. The browser harness and runtime tools are retired. The sole acceptance proposal owns the source-audited and routinely verified resolver/retained-coverage repairs, the proposed host-readiness phase and the later separate native execution-permission gate. The pre-repair U23 assessment and historical outcomes remain unchanged; renderer acceptance still requires separate permission.

Proof and gate. Verify pristine patch application for all three versions and version-specific retained repairs, including RNMapbox 10.3.8 source/emitted/native namespace coherence and its existing camera-reset exception. Run affected routine/static codegen, package/declaration and isolated proofs, including the 10.3.8 endpoint alongside the 10.3.7 minimum, then obtain independent review. Record exact final hashes and distinguish those checks from native runtime results. The completed follow-up has reviewed PR44 open; U24 preparation is implemented and independently audited with PR45 open. The U25 first command failed; owner-approved camera/runner repairs are implemented and independently audited with PR46 open, and attempt02 passed commands 1-4 before command 5 failed after source recreation, before the replacement-style request. Commands 6-9 were not run; normal teardown was observed. The command-5 fixture repair is implemented and independently source-audited with PR47 open and applicable routine checks passed. The authorized attempt03 passed commands 1-5 on both web engines, then command 6 failed in the Mapbox UI popup-teardown assertion (open=2, close=2, expected no extra dismissal); commands 7-9 were not run. All six commands exited normally and released owned resources, with frozen inputs unchanged. Source-backed raw-wrapper/SDK and actual-scene controls locate an application ownership defect: old-map removal invokes the old popup callback before child cleanup, and that stale callback closes replacement-generation state. The fixture-only generation/lifetime guard and stronger replacement-popup verification are implemented with PR48 open; applicable routine checks and independent source audit passed. The current browser outcome records all nine approved rows passing on the unchanged PR48 candidate, including commands 1-2 from attempt04 and commands 3-9 from approved recovery. The interrupted attempt04 and prior failures remain recorded history. The browser harness and runtime tools are retired. The sole acceptance proposal owns the source-audited and routinely verified resolver/retained-coverage repairs, the proposed host-readiness phase and the later separate native execution-permission gate. Native linking, builds/installations and renderer acceptance still require separate permission at the prepared checkpoint.

U24: Freeze a candidate and prepare acceptance

Status. Historical candidate preparation and execution are recorded in Git history. The current handoff owns the deferred checkpoint; future release preparation must use current source, dependencies and reviewed inputs.

Outcome and write scope. The coordinator integrates all approved work, runs applicable accumulated routine checks, records measured code moved/deleted and dependencies retained, builds/packs the agreed breaking candidate, and freezes its hashes, patches, selected peers, host versions, harness, and application binaries/build inputs. Current candidate evidence remains separate. Confirm no known substantive implementation/review issue remains.

Proof. Full applicable routine web/unit and mocked native suites, types, library/example build, common/selected packed consumers, aliases, mixed resolution, and relevant standalone/compiled-fixture checks pass or have an explicit independently bounded baseline disposition. No retained-contract test is merely removed to make the candidate green. Prepare exact acceptance commands from the migrated harness; commands and duration are intentionally not invented in this plan because scenario entry points are being changed.

Owner decision. Present the candidate, named scenarios, six affected environments or justified subset, exact commands, expected elapsed time, resource assignments, open gates, and retry/artifact scope. Obtain explicit acceptance permission. Until then, stop before renderer execution and report integration as unverified. A package archive or successful routine check is not publication or renderer acceptance.

U25: Execute approved web checks

The compact checkpoint records the historical browser result and its artifact boundary. Future web acceptance is deferred and requires current impact review and explicit permission.

U26: Execute approved native checks

Current checkpoint. Acceptance is deferred until release preparation or an explicit owner request. The current handoff links the historical f05 browser and Android results, with complete iOS batches and the density gate deferred. These results do not certify the working checkout or block ordinary development.

Preparation and approval. Follow the authoritative complete batch protocol. Account for every retained requirement through valid prior evidence and all remaining scenarios in one immutable platform/backend/device/SDK unit. Prepare the entire caller flow, exact runnable commands, routine command/report regressions, identity/ownership checks and measured storage headroom, then obtain one approval for that complete unit. Its useful existing calibration, setup, duration, cleanup and retry scope must be explicit. Preparation grants no native execution permission.

Execution and recovery. Use one exclusive owner-selected Terra Medium worker per unit; the coordinator retains diagnosis and audit. Declare the unit order when preparing the release. Finish or explicitly block a unit before changing backend. Stop on the first unexpected failure, preserve completed applicable results, and consolidate known related offline repairs into one audited PR and one remaining-unit resume proposal. Apply the policy's 30-minute saved-evidence diagnosis limit and escalation stop rule; standalone runtime diagnostics require an explicit owner exception and earn no acceptance credit.

Proof. Reconcile every retained requirement against actual renderer observations, applicable reused evidence or explicit owner-approved exclusions. Verify intended installed identity and retained drawing, queries, camera/gestures, marker children/scrolling/annotations, multiple maps, images, source/state transitions and migrated application UI as assigned by the fixed coverage map. Blocked or unverified requirements never count as passed. This scope does not certify the general upstream SDK, physical devices or full assistive-technology behavior. The current plan preserves these limits and the separate result/signoff gates.

U27: Complete evidence and hand over

Outcome and write scope. The coordinator reviews the approved renderer results against every retained contract and open gate, reconciles migration/public docs and the existing support matrix, and removes temporary consumers, caches, unused binaries and nonessential raw logs under the retention policy. Preserve compact provenance and the recovery information for existing offline data.

Proof and owner decision. Report implementation complete, routine results, actual renderer evidence, deliberately excluded behavior, remaining gaps, actual code/dependency movement, and any migration risks. Unfinished retained behavior remains unfinished; do not relabel it unsupported at the end. Owner sign-off accepts this result and its verification limits. The current unit PR workflow above governs commits, pushes, and PR creation. Package publication, merge, and tagging require separate authorization; commits use the repository's Conventional Commit subject and bullet summary.

Routine verification menu

These are command routes inspected in the U01 working basis from package.json, Vite configuration, and Jest configuration. They are proposed execution instructions for approved units, not results of this documentation task. Inspect them again at dispatch, including nested scripts, for accidental acceptance execution. Use focused cases for the unit; broaden once for final integration unless new failures or substantive changes justify more checks.

bun run check
bun run check:docs
bun run typecheck
bun run typecheck:apps
bun run build

For focused routine tests, use the existing local runners with a real file path from that unit's refreshed inventory. For example, before its contract is changed, the native UI suite can be selected directly:

./node_modules/.bin/jest --runInBand --runTestsByPath packages/one-map-react/test/tf07-ui.native.test.tsx

The corresponding ordinary Vitest route for web/unit cases is:

./node_modules/.bin/vp test run packages/one-map-react/test/map-interactions.web.test.tsx

Use the build/packed consumer/peer/example-resolution scripts with their actual discovered options for export changes. Final integration uses the applicable full routine suites, package checks, and compiler coverage. Inspect the long root test/validate chains before running them; a script's historical name or a .test suffix alone does not establish whether it starts a renderer. Native builds, Expo/Metro renderer transport, browser scenarios, live storage/sensor operations, and simulator/emulator input remain outside these routine test instructions.

Ready-to-dispatch assignment template

Use this compact template for approved routine implementation work. Fill the actual paths, commands and base; do not send placeholders as an implementation assignment. U25/U26 use dedicated smoke-worker instructions containing their explicitly approved renderer commands and build/install permissions instead of this template's prohibition on renderer execution.

Implement only <approved unit and outcome> from the approved plan.
Base: <workspace path, current revision/workspace identity, relevant hashes>.
Allowed writes: <exact files and necessary agreed caller/test closure>.
Read: <current instructions, approved contract, connected owners/callers>.
Retain: <specific behavior and resource/error/teardown guarantees>.
Remove or migrate: <specific APIs, consumers, fixtures, and old expectations>.
Routine checks: <exact allowed commands; no acceptance execution>.
Do not change peers, patches, unrelated files, or start the next unit.
Do not commit, publish, build/install a native app, or retry renderer runs.
Return the concrete diff, checks and first failures, retained/retired tests,
consumer consequences, actual code movement, risks, and unverified gates.
Then return for coordinator review; only the coordinator creates the reviewed PR and dispatches the authorized successor.

The reviewer receives the same base/contract, the completed diff and check outputs, a read-only assignment, and explicit instructions to trace callers, replacement, stale work, errors, teardown, and deliberate exclusions. The coordinator owns progression and separate approval boundaries; agents do not chain their own successor tasks.