# Extension development findings

The original library was retained. `reports/extensions-baseline/` records the public protocol and
45 original module/test/program/document hashes before kernel changes. New components were developed
in `hearth_extensions/`; no reference implementation was invoked or modified.

| Evidence | Finding | Resolution |
|---|---|---|
| `../extensions-baseline/failing-connect-probe.txt` | A read-only endpoint consumer was rejected because a landing also offered a restricted resurfacing grant | A `connect` binding consumes capacity and records relationships/dependencies but never acquires mutation authority. A negative test rejects attempted host writes. |
| `first-geometry-probes.txt` | The new test incorrectly expected chain entries to use `instance` | Corrected the test to the existing public `id` key; no protocol change or weakened assertion. |
| `geometry-probes-2.txt` | Window shutters intruded into a three-wide entrance approach | The shared polygon facade grid moves the second window bay outward. All three shape variants then preserve approach headroom. |
| `client-probes.txt` | A requested curve exceeded one segment's 220-cell domain; another contour ran too close to occupied approach geometry | Added `BoundaryChain` using forwarded public mount interfaces and bounded segments. The client declares a perimeter outside its buildings. No locked building was moved and the per-segment limit was retained. |
| `client-probes-2.txt` | Global endpoint clipping planes severed a bent route, including same-Z endpoints | The shared ribbon geometry applies caps only at their own nearest endpoint. A separate kinked polyline test prevents regression. |
| Endpoint integration during client development | Broad connector mouths could overlap narrow host approach margins | A connector reads the port region, retains the offered mouth width, and flares to body width after the first stations. Host ownership stays unchanged. |
| `focused-tests.txt` | Link-only regeneration correctly left surveyed endpoint hosts stale | Exposed the need to replay hosts first while replacing the later connector. The kernel continued to reject stale completion. |
| `../extensions-baseline/failing-replay-probe.txt` | The proposed public call could not replace a target later in a coupled replay | Added the optional explicit `replacements` mapping. Unknown/duplicate targets reject; ordered replay remains one atomic transaction. No stale-flag bypass. |
| `previews/extensions/development/` | The new organization was readable but the landscape sparse | Reused the existing public landscape component inside the graph composition with declared minimum counts. |
| `first-assessment/` | First complete 112-input batch, all supported inputs valid; nine bounded stress failures | Retained all outcomes. Corrected the contact metric to include actual boundary support coordinates and distinguished current sitework cells from edit records. This was a metric refinement, not a new architectural type count. |
| `previews/extensions/pre-interior/` and `pre-interior-assessment/` | Close cutaways showed small inherited furniture groupings in broad halls | Added public `WorkBay` and `HallInterior` components: scaled allocation, interaction ports, actual inventory/support checks and protected central aisles. Locked architecture and terrain stay intact. |
| `interior-tests.txt` | The new test used a nonexistent `View.clearance` convenience name | Corrected it to the existing `View.clear(port.region)` API. The six actual generation/validation cases had already succeeded. |
| `interior-tests-final.txt`, `full-regression.txt`, `final/` | Final interior and complete regressions pass; same 112 principal inputs retain the same outcome counts | 179 full tests, 88/88 supported inputs, 15/24 stress inputs, nine retained incompatibilities. No optional furnishing omissions. |

Only `hearth/kernel/scene.py` changed within the original kernel. The change was necessary in both
cases because authority negotiation and coordinated replay are kernel responsibilities; extension-only
code could not legitimately bypass them. Original source/test hashes and the final delta are compared
in `api-final.json`. All original tests, examples, concrete components, environment code, persistence
code and the default CLI remain unchanged. The public component/plan/contract schemas and companion
format are unchanged; the library version is 1.2.0.

The extension does not inspect private host fields or mutate shared storage. Read-only public
contracts and ports guide composition; effects return through the kernel. Its actual-geometry custom
validators use the standard registration extension point. Analysis code reads public node records to
measure signatures. Destructive mutations appear only in deliberate negative tests.

Later assessment conveniences add `--samples` so new runs retain separate artifact destinations and
use the full explicit root environment seed for boundary replay. `--focus` is a preview-only crop
through the supplied proc slicer, selected from a public contract envelope. It never changes a valid
source scene or claims that the incomplete geometry slice has its semantic metadata.

The original 134-test, 64-pair and stress evidence is not rewritten. The new exercise also does not
reinterpret the user's external browser report as validation of new code. Remaining constraints,
sample denominators, timing and rendering limits are stated in `ASSESSMENT.md` and the package guide.
