Distinguish feature organization from independent release boundaries

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a0cffe-206f-7323-89d3-b20ca4cf4bf9
This commit is contained in:
tegwick 2026-09-26 23:06:16 +02:00
parent 29ccad7002
commit b8eec87f08
14 changed files with 460 additions and 2 deletions

View file

@ -24,7 +24,7 @@ and agent reference, following the preliminary direction in `INTENT.md`.
Research scaffold with an infospace-bench adapter as of 2026-09-26. The adapter Research scaffold with an infospace-bench adapter as of 2026-09-26. The adapter
has deterministic integration tests, completed bounded live investigations through has deterministic integration tests, completed bounded live investigations through
llm-connect, and three synthetic architecture walkthroughs (VC-03 provisional). Sixteen developed research llm-connect, and four synthetic architecture walkthroughs (VC-03 and VC-06 provisional). Seventeen developed research
drafts remain hypotheses; none is canonically admitted. No frontend application runtime exists. See `research/bench/README.md`, drafts remain hypotheses; none is canonically admitted. No frontend application runtime exists. See `research/bench/README.md`,
`REVIEW.md` (the initial review) and `workplans/` for follow-up work. `REVIEW.md` (the initial review) and `workplans/` for follow-up work.

View file

@ -246,6 +246,7 @@ research/candidates/DerivedState.md
research/candidates/ExplicitReconciliation.md research/candidates/ExplicitReconciliation.md
research/candidates/FailureBoundary.md research/candidates/FailureBoundary.md
research/candidates/FocusReturn.md research/candidates/FocusReturn.md
research/candidates/IndependentFeatureBoundary.md
research/candidates/InvalidateAndReproject.md research/candidates/InvalidateAndReproject.md
research/candidates/IslandsOfInteractivity.md research/candidates/IslandsOfInteractivity.md
research/candidates/LocalCommitBoundary.md research/candidates/LocalCommitBoundary.md
@ -380,6 +381,8 @@ research/plan/ValidationCases.md
research/reviews/AuthorityPilot.md research/reviews/AuthorityPilot.md
research/reviews/BoundaryRecoveryExperiment.md research/reviews/BoundaryRecoveryExperiment.md
research/reviews/CarniatoAdmissionRegression.json research/reviews/CarniatoAdmissionRegression.json
research/reviews/FeatureDeploymentBoundaries.md
research/reviews/FeatureDeploymentSources.json
research/reviews/FrontendRecoveryImplementations.md research/reviews/FrontendRecoveryImplementations.md
research/reviews/FrontendRecoverySources.json research/reviews/FrontendRecoverySources.json
research/reviews/JoplinConflictScreen.json research/reviews/JoplinConflictScreen.json
@ -414,6 +417,7 @@ research/reviews/recovery-review-02/response.md
research/walkthroughs/VC01-TransactionalAdministration.md research/walkthroughs/VC01-TransactionalAdministration.md
research/walkthroughs/VC02-OfflineFieldNotes.md research/walkthroughs/VC02-OfflineFieldNotes.md
research/walkthroughs/VC03-ContentPublication.md research/walkthroughs/VC03-ContentPublication.md
research/walkthroughs/VC06-MicrofrontendEstate.md
scripts/research_admission.py scripts/research_admission.py
scripts/research_bench.py scripts/research_bench.py
scripts/research_execution.py scripts/research_execution.py

View file

@ -60,3 +60,8 @@ A partial guard loses input; a complete remedy remains open. Original results re
Latest bounded mechanism test: [ownership routing](reviews/NestedOwnershipRouting.md) Latest bounded mechanism test: [ownership routing](reviews/NestedOwnershipRouting.md)
meets 24/24 routed assertions versus 20/24 unmodified controls, with explicit scope meets 24/24 routed assertions versus 20/24 unmodified controls, with explicit scope
limits. No delay or readiness wait; no production fork or canonical promotion. limits. No delay or readiness wait; no production fork or canonical promotion.
Latest breadth evidence: [feature versus deployment boundaries](reviews/FeatureDeploymentBoundaries.md)
compares pinned example sources and adds [provisional VC-06](walkthroughs/VC06-MicrofrontendEstate.md).
Independent Feature Boundary develops an existing seed; current corpus has seventeen
hypotheses and four synthetic walkthroughs. No deployment independence was runtime-verified.

View file

@ -0,0 +1,50 @@
---
title: Independent Feature Boundary
status: draft
maturity: hypothesis
families: [composition, execution]
scales: [L1, L4]
admission: research-candidate-only
---
# Independent Feature Boundary
Context: a cohesive frontend capability needs a release cadence different from its
host or neighboring capabilities. Delivery autonomy competes with integration cost,
shared experience and runtime dependency management.
Proposed solution: define the capability's public composition contract and package it
as a separately releasable unit with an explicit activation mechanism. State supported
host/API/dependency versions, lifecycle and cleanup behavior, route ownership, and
which shared state may cross the boundary. Validate compatible old/new combinations
before changing the binding that activates a release.
Publishing bytes, activating them and retiring the old version are separate actions.
Plan for cached bindings, lazy loads and running sessions that retain old code. Define
rollback scope, artifact retention and failure behavior; neither an asset rollback nor
unmount reverses accepted domain operations. A new incompatible contract may require
a coordinated migration despite separate pipelines.
Result: compatible changes can be activated without rebuilding unrelated features,
but compatibility testing, observability and composition policy add cost. A directory,
repository, lazy chunk or lifecycle export alone does not provide this independence.
Shared runtime/startup dependencies can still couple failures. Code in the same browser
context is not thereby security-isolated. Preserve usable navigation and focus across
partial loading, replacement and teardown.
Evidence: [deployment-boundary review](../reviews/FeatureDeploymentBoundaries.md)
D04–D09 locates runtime binding, lifecycle exports and separate workflow definitions
in one example family, with documentary alternatives. CI success, actual deployment
independence and complete-pattern recurrence are unverified. No canonical identity
or admitted graph relations; hypothesis only.
Alternative: a coordinated application release with [Vertical Feature Slice](VerticalFeatureSlice.md)
when separate cadence is unnecessary. Proposed relations: may use
[Failure Boundary](FailureBoundary.md) for a specified fault scope and
[URL-addressable State](URLAddressableState.md) for shared route contracts. Neither
separate activation nor [Islands of Interactivity](IslandsOfInteractivity.md) entails
the other. Boundaries can coincide without becoming the same pattern.
Next test: [VC-06](../walkthroughs/VC06-MicrofrontendEstate.md) proposes compatible and
incompatible feature releases, failed loading and binding rollback across fresh and
already-open sessions. These runtime checks have not yet been executed.

View file

@ -38,3 +38,13 @@ Evidence locators: [breadth review](../reviews/PatternBreadthExpansion.md).
All relations are research proposals; no canonical identity or admitted graph edges. All relations are research proposals; no canonical identity or admitted graph edges.
The next test is planned, not executed. Known uses of the complete proposed contract The next test is planned, not executed. Known uses of the complete proposed contract
have not been verified in this investigation. have not been verified in this investigation.
## Pinned source-layout contrast — 2026-09-26
[Boundary review](../reviews/FeatureDeploymentBoundaries.md) D01–D03 locates public
feature entry points, UI/model separation and page composition in a pinned FSD todo
example, alongside one application build script. The shared entity/API layer means
feature grouping does not imply a private persistence adapter. This is a partial
static use, not a release or import-enforcement test. Compare
[Independent Feature Boundary](IndependentFeatureBoundary.md): release cadence adds
activation/version contracts that source grouping alone does not provide.

View file

@ -130,3 +130,14 @@ for Failure Boundary and Focus Return. Seven of eight immediate-run assertions m
a separate 100 ms nested-settling condition met eight. Removed-trigger default behavior a separate 100 ms nested-settling condition met eight. Removed-trigger default behavior
is a negative control, and immediate nested dismissal remains unresolved. Sixteen is a negative control, and immediate nested dismissal remains unresolved. Sixteen
hypotheses retained, no admission or full-pattern recurrence claim. hypotheses retained, no admission or full-pattern recurrence claim.
## Source/build/release distinction — 2026-09-26
[Independent Feature Boundary](../candidates/IndependentFeatureBoundary.md) develops
the existing seed around separate release/activation contracts (composition/execution,
L1/L4). Seventeen developed hypotheses now exist; none admitted. Pinned example
sources support partial mechanisms, not verified production release independence.
[Vertical Feature Slice](../candidates/VerticalFeatureSlice.md) gains a source-layout
example and a contrast with deployment. [Evidence](../reviews/FeatureDeploymentBoundaries.md)
and [provisional VC-06](../walkthroughs/VC06-MicrofrontendEstate.md) distinguish module,
artifact, activation, runtime-failure and organizational boundaries.

View file

@ -133,3 +133,18 @@ compares unchanged packages with an explicitly modified in-memory Escape mechani
The routed results are evidence for our proposed design, not observations of shipped The routed results are evidence for our proposed design, not observations of shipped
vendor behavior. Current raw control also reproduces production wrong-owner dismissal vendor behavior. Current raw control also reproduces production wrong-owner dismissal
in the new controlled fixture. Prior receipts remain unchanged. in the new controlled fixture. Prior receipts remain unchanged.
## Feature organization and release contrast — 2026-09-26
| ID | Source | Revision / evidence scope |
| --- | --- | --- |
| SRC-0031 | [FSD todo example](https://github.com/feature-sliced/examples/tree/3050d1080506823df79c77457b96b47a835f87c8/todo-app) | 3050d1080506823df79c77457b96b47a835f87c8; feature interfaces and application build |
| SRC-0032 | [React microfrontends root-config](https://github.com/react-microfrontends/root-config/tree/b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e) | b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e; composition and workflow |
| SRC-0033 | [React microfrontends navbar](https://github.com/react-microfrontends/navbar/tree/55ff88e74714d12d3e3447250e34a2b7742e91f6) | 55ff88e74714d12d3e3447250e34a2b7742e91f6; lifecycle and workflow, same family as SRC-0032 |
| SRC-0034 | [single-spa recommended setup](https://single-spa.js.org/docs/recommended-setup/) | Living 6.x documentation; runtime binding and deployment contracts |
| SRC-0035 | [webpack Module Federation](https://webpack.js.org/concepts/module-federation/) | Living documentation; separately built containers and shared dependencies |
Accessed 2026-09-26. [17-file hash manifest](../reviews/FeatureDeploymentSources.json)
and [claims D01–D09](../reviews/FeatureDeploymentBoundaries.md). Static example-source
inspection, no builds or deployments run. Documentation revisions unknown; examples
and docs do not establish independent recurrence of a complete release contract.

View file

@ -92,3 +92,14 @@ Q05 routing follow-up: [experimental owner dispatch](../reviews/NestedOwnershipR
separates input delivery from return-focus policy. Successful cancellation and cleanup separates input delivery from return-focus policy. Successful cancellation and cleanup
matter alongside correct close targeting. The bounded mechanism comparison supports matter alongside correct close targeting. The bounded mechanism comparison supports
this distinction; it does not establish a universal ownership model or close Q05. this distinction; it does not establish a universal ownership model or close Q05.
## Q06 source, artifact and activation boundaries — 2026-09-26
[Pinned contrast](../reviews/FeatureDeploymentBoundaries.md) locates feature APIs
inside one application build and separately defined microfrontend release workflows.
Shared startup dependencies still couple runtime availability. Q06 now distinguishes
module imports, artifacts, activation bindings, runtime failures and team ownership;
separate repositories prove none of the latter guarantees by themselves.
[VC-06](../walkthroughs/VC06-MicrofrontendEstate.md) changes only release cadence to
show why source boundaries can remain while deployment units merge. Runtime version
skew/rollback and independent assessment remain open; Q06 is not closed.

View file

@ -1,6 +1,6 @@
# Validation cases # Validation cases
Status: synthetic briefs · VC-01 and VC-02 have drafts/self-reviews; VC-03 has a provisional exploratory draft; other cases remain planned. Status: synthetic briefs · VC-01 and VC-02 have drafts/self-reviews; VC-03 and VC-06 have provisional exploratory drafts; other cases remain planned.
[VC-01 draft](../walkthroughs/VC01-TransactionalAdministration.md) and [VC-02 draft](../walkthroughs/VC02-OfflineFieldNotes.md) are reasoning exercises, [VC-01 draft](../walkthroughs/VC01-TransactionalAdministration.md) and [VC-02 draft](../walkthroughs/VC02-OfflineFieldNotes.md) are reasoning exercises,
not runtime validation or M1 acceptance. not runtime validation or M1 acceptance.
@ -52,3 +52,7 @@ Keep development examples separate from the held-out set.
2026-09-26: [provisional VC-03](../walkthroughs/VC03-ContentPublication.md) explores 2026-09-26: [provisional VC-03](../walkthroughs/VC03-ContentPublication.md) explores
navigation/rendering before M1 completion. It does not satisfy the M2 case gate. navigation/rendering before M1 completion. It does not satisfy the M2 case gate.
2026-09-26: [provisional VC-06](../walkthroughs/VC06-MicrofrontendEstate.md) contrasts
independent activation with one coordinated release cadence. Source inspection does
not complete its runtime/independent-review obligations or the M2 gate.

View file

@ -0,0 +1,72 @@
# Feature organization and deployment boundaries — 2026-09-26
Status: bounded static source review by Codex, WP-0003 T01. Seventeen inspected files
from three pinned example repositories, plus two primary documentation pages. No
application build, CI run, deployed service, traffic or rollback drill was executed.
[Manifest](FeatureDeploymentSources.json) records file URLs, commit IDs and SHA-256.
These are demonstration implementations, not evidence of team autonomy in production.
## Primary claims
| Claim | Source / locator | Located observation | Limit / editorial implication |
| --- | --- | --- | --- |
| D01 | SRC-0031 feature-sliced/examples, todo-app/src/features/toggle-task/index.ts, ui.tsx and model/toggle-task.ts | Feature entry exports UI/model; UI delegates toggling to a model using the task entity | Located partial feature grouping and interface; not proof of enforced import rules |
| D02 | SRC-0031 todo-app/src/pages/tasks-list/index.tsx; package.json scripts | Page imports two feature entry points; package has one react-scripts application build | Source capability boundaries do not themselves create separate release artifacts |
| D03 | SRC-0031 entities/task/model/tasks.ts; shared/api/typicode/tasks.ts | Entity effects call a shared HTTP adapter; toggle model directly updates the entity store | Capability code need not own its storage adapter; this demo does not establish durable write behavior |
| D04 | SRC-0032 root-config/src/react-mf-root-config.js and src/index.ejs | Runtime imports resolve named applications via an external import map; layout declares routes and navbar loader/error UI | Composition and binding are separate from feature internals; fallback presence alone does not prove failure recovery |
| D05 | SRC-0032 and SRC-0033 .github/workflows/build_and_deploy.yml | Each repo builds its artifact, uploads under a run-specific path, then updates its named import-map entry; root additionally uploads index.html | Located separate release definitions, not observed successful or atomic production releases |
| D06 | SRC-0033 src/react-mf-navbar.js and root.component.js | Navbar exports bootstrap/mount/unmount and adapts a React tree with a rendering fallback | A concrete host/feature lifecycle interface; authentication, compatibility and teardown correctness remain untested |
| D07 | SRC-0032 src/react-mf-root-config.js | Layout activation and start occur inside successful styleguide-import continuation | Shared runtime prerequisite can affect startup despite separate artifact pipelines; no outage was induced |
| D08 | SRC-0034 [single-spa recommended setup](https://single-spa.js.org/docs/recommended-setup/), In-browser versus build-time modules / Deployment and CI / State management | Documents runtime module binding, artifact upload followed by import-map update, concurrent map-update hazards and shared-state compatibility costs | Repository layout is not our proposed independence criterion; compatibility and activation need explicit contracts |
| D09 | SRC-0035 [webpack Module Federation](https://webpack.js.org/concepts/module-federation/), Separate builds per page / Sharing modules | Describes separate page/container builds, shell changes for routes and shared dependency negotiation | Another composition mechanism, not another verified application or automatic version compatibility |
SRC-0031 commit `3050d1080506823df79c77457b96b47a835f87c8` (2025-08-08);
SRC-0032 `b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e` (2025-08-18);
SRC-0033 `55ff88e74714d12d3e3447250e34a2b7742e91f6` (2025-06-19).
Dates are commit timestamps, not release evidence. Documentation accessed 2026-09-26,
living revisions unknown; single-spa page identifies its 6.x documentation line.
Dependency ranges in source package files are not asserted as installed versions.
## Boundary comparison
| Boundary | Feature-sliced todo example | Microfrontend example family | What remains to verify |
| --- | --- | --- | --- |
| Source imports | Page consumes feature public entry points; model consumes entity API | Navbar internals behind lifecycle exports; root imports named application | Enforced dependency direction and unintended private imports |
| Build | Application-level build script | Separate root/navbar build scripts and CI artifacts | Actual build output and dependency resolution |
| Activation | No per-feature activation mechanism located in inspected files | Named map entries updated after artifact upload | Atomic map updates, cached maps, old sessions and rollback |
| Runtime dependency | Shared entity state and API adapter | Shared styleguide gates root startup; shared runtime packages may couple versions | Outage, version skew and mixed-version behavior |
| Organizational ownership | Unknown | Unknown; separate repositories/workflows are not team evidence | Who owns interfaces, release decisions and incident response |
The root-config and navbar repositories belong to one example family. FSD supplies a
contrasting source-layout example, not a second independent implementation of a complete
independent-release contract. None establishes recurrence of the full new hypothesis.
## Counterexamples and generative consequence
A feature can have a good public code interface and still ship in one artifact. A
separate artifact can still require coordinated releases when shared state or a host
interface breaks compatibility. A successful upload can be invisible until its binding
changes. Changing a binding does not necessarily change a module already loaded in a
long-running tab. Rolling back assets cannot be assumed to reverse domain effects or
restore compatibility after an incompatible backend migration. These are proposed
review obligations, not observed bugs in these example projects.
Keep [Vertical Feature Slice](../candidates/VerticalFeatureSlice.md) scoped to code
organization. Develop the existing [Independent Feature Boundary](../candidates/IndependentFeatureBoundary.md)
seed around independently releasable capabilities and explicit composition contracts.
Do not make it require a microfrontend framework, separate Git repository or a network
request per component. [Failure Boundary](../candidates/FailureBoundary.md) and
[Islands of Interactivity](../candidates/IslandsOfInteractivity.md) stay separate decisions.
[Provisional VC-06](../walkthroughs/VC06-MicrofrontendEstate.md) applies the distinction
to independent teams/releases, shared navigation and partial outages. It includes a
single-release constraint branch, without declaring the M2 walkthrough gate complete.
## Next evidence
Under WP-0003 T01, exercise two compatible feature versions against one unchanged
host, a deliberately incompatible version, a failed asset load and rollback of the
activation binding with both fresh and already-running sessions. Check startup-critical
shared resources separately from feature-local failure. Do not use existing deployment
workflows or credentials to perform the experiment; a local controlled harness suffices.
Q06 is sharpened, not closed. No additional inference was needed for this review.

View file

@ -0,0 +1,159 @@
{
"accessed": "2026-09-26",
"method": "bounded static inspection of upstream example repositories; no build or deployment execution",
"files": [
{
"source": "SRC-0031",
"repo": "feature-sliced/examples",
"commit": "3050d1080506823df79c77457b96b47a835f87c8",
"path": "todo-app/package.json",
"url": "https://raw.githubusercontent.com/feature-sliced/examples/3050d1080506823df79c77457b96b47a835f87c8/todo-app/package.json",
"sha256": "a3dfc5cefd8af93cac585ec6e3195bc8eafd49d3ff17af7e478340ac6b2e97f9",
"lines": 61
},
{
"source": "SRC-0031",
"repo": "feature-sliced/examples",
"commit": "3050d1080506823df79c77457b96b47a835f87c8",
"path": "todo-app/src/features/toggle-task/index.ts",
"url": "https://raw.githubusercontent.com/feature-sliced/examples/3050d1080506823df79c77457b96b47a835f87c8/todo-app/src/features/toggle-task/index.ts",
"sha256": "f7879b4495612a25911f1825539da5ffcdd8f22a9b6be4168cf686b36d6261f2",
"lines": 2
},
{
"source": "SRC-0031",
"repo": "feature-sliced/examples",
"commit": "3050d1080506823df79c77457b96b47a835f87c8",
"path": "todo-app/src/features/toggle-task/ui.tsx",
"url": "https://raw.githubusercontent.com/feature-sliced/examples/3050d1080506823df79c77457b96b47a835f87c8/todo-app/src/features/toggle-task/ui.tsx",
"sha256": "741c7c5605db821e5e4e7772720dffd8610d48d179621d4257e1c89798e327d5",
"lines": 27
},
{
"source": "SRC-0031",
"repo": "feature-sliced/examples",
"commit": "3050d1080506823df79c77457b96b47a835f87c8",
"path": "todo-app/src/features/toggle-task/model/toggle-task.ts",
"url": "https://raw.githubusercontent.com/feature-sliced/examples/3050d1080506823df79c77457b96b47a835f87c8/todo-app/src/features/toggle-task/model/toggle-task.ts",
"sha256": "3448529428fb218d8c67362ef3c59a8604a65b4566f764c9e6f4227bf0f1c20c",
"lines": 15
},
{
"source": "SRC-0031",
"repo": "feature-sliced/examples",
"commit": "3050d1080506823df79c77457b96b47a835f87c8",
"path": "todo-app/src/pages/tasks-list/index.tsx",
"url": "https://raw.githubusercontent.com/feature-sliced/examples/3050d1080506823df79c77457b96b47a835f87c8/todo-app/src/pages/tasks-list/index.tsx",
"sha256": "cf310f1ca8ae572df4ff88446d66daa8dfc58724facd8f785e51ffec0ff4f9ef",
"lines": 75
},
{
"source": "SRC-0031",
"repo": "feature-sliced/examples",
"commit": "3050d1080506823df79c77457b96b47a835f87c8",
"path": "todo-app/src/shared/api/typicode/tasks.ts",
"url": "https://raw.githubusercontent.com/feature-sliced/examples/3050d1080506823df79c77457b96b47a835f87c8/todo-app/src/shared/api/typicode/tasks.ts",
"sha256": "b5aa3c98846c843a0aad957de8fdfe00f8679abc47d7259463e33ce871de07d6",
"lines": 23
},
{
"source": "SRC-0031",
"repo": "feature-sliced/examples",
"commit": "3050d1080506823df79c77457b96b47a835f87c8",
"path": "todo-app/src/entities/task/model/tasks.ts",
"url": "https://raw.githubusercontent.com/feature-sliced/examples/3050d1080506823df79c77457b96b47a835f87c8/todo-app/src/entities/task/model/tasks.ts",
"sha256": "42212ce40afde606a855a0e12b56664a818d039c68db3b6e40e974ce39437194",
"lines": 87
},
{
"source": "SRC-0032",
"repo": "react-microfrontends/root-config",
"commit": "b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e",
"path": "package.json",
"url": "https://raw.githubusercontent.com/react-microfrontends/root-config/b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e/package.json",
"sha256": "1e917abf287bee55b0e55fd5d334228cdf0375db286cd9b15069aba6adbfccbd",
"lines": 40
},
{
"source": "SRC-0032",
"repo": "react-microfrontends/root-config",
"commit": "b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e",
"path": "webpack.config.js",
"url": "https://raw.githubusercontent.com/react-microfrontends/root-config/b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e/webpack.config.js",
"sha256": "26d03b89b02614cf8afe9e1d07ac4c061f4e845cfe0c95082bc3fa7b5342159a",
"lines": 33
},
{
"source": "SRC-0032",
"repo": "react-microfrontends/root-config",
"commit": "b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e",
"path": "src/react-mf-root-config.js",
"url": "https://raw.githubusercontent.com/react-microfrontends/root-config/b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e/src/react-mf-root-config.js",
"sha256": "ef9fefdd28dc2741bcb232768582ddf17d1b78bd036f2a2f07b63c7e9a956315",
"lines": 33
},
{
"source": "SRC-0032",
"repo": "react-microfrontends/root-config",
"commit": "b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e",
"path": "src/index.ejs",
"url": "https://raw.githubusercontent.com/react-microfrontends/root-config/b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e/src/index.ejs",
"sha256": "5bec0385b19cc9d080ea285675e7afab8ee70940999d8da678eb5a2518d1a395",
"lines": 52
},
{
"source": "SRC-0032",
"repo": "react-microfrontends/root-config",
"commit": "b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e",
"path": ".github/workflows/build_and_deploy.yml",
"url": "https://raw.githubusercontent.com/react-microfrontends/root-config/b5414dcf7b4ecda95f11ada3821e30d2acfd9e4e/.github/workflows/build_and_deploy.yml",
"sha256": "22016b0cb9e3a31ced25dc8bac3281986b0177b969611040a6537f232d74d601",
"lines": 85
},
{
"source": "SRC-0033",
"repo": "react-microfrontends/navbar",
"commit": "55ff88e74714d12d3e3447250e34a2b7742e91f6",
"path": "package.json",
"url": "https://raw.githubusercontent.com/react-microfrontends/navbar/55ff88e74714d12d3e3447250e34a2b7742e91f6/package.json",
"sha256": "508b318ae723c2e473a950f99b9b25f01466ba459bcbd8d487b1c9b77d37d488",
"lines": 68
},
{
"source": "SRC-0033",
"repo": "react-microfrontends/navbar",
"commit": "55ff88e74714d12d3e3447250e34a2b7742e91f6",
"path": "webpack.config.js",
"url": "https://raw.githubusercontent.com/react-microfrontends/navbar/55ff88e74714d12d3e3447250e34a2b7742e91f6/webpack.config.js",
"sha256": "77b1bf1eca1a4404de1dce2488f467e44eb99e3eefcb1a63ee1925c5f45d7972",
"lines": 14
},
{
"source": "SRC-0033",
"repo": "react-microfrontends/navbar",
"commit": "55ff88e74714d12d3e3447250e34a2b7742e91f6",
"path": "src/react-mf-navbar.js",
"url": "https://raw.githubusercontent.com/react-microfrontends/navbar/55ff88e74714d12d3e3447250e34a2b7742e91f6/src/react-mf-navbar.js",
"sha256": "1fdc8a249d75ebb4353bfdce9f9838ea81c7e516978dd236acffe2daeaa648b9",
"lines": 21
},
{
"source": "SRC-0033",
"repo": "react-microfrontends/navbar",
"commit": "55ff88e74714d12d3e3447250e34a2b7742e91f6",
"path": "src/root.component.js",
"url": "https://raw.githubusercontent.com/react-microfrontends/navbar/55ff88e74714d12d3e3447250e34a2b7742e91f6/src/root.component.js",
"sha256": "5dea686e1ad3c8817d9d1d4a54ccc33938d6c3508f6ccf5e5a278774e7cea3ee",
"lines": 29
},
{
"source": "SRC-0033",
"repo": "react-microfrontends/navbar",
"commit": "55ff88e74714d12d3e3447250e34a2b7742e91f6",
"path": ".github/workflows/build_and_deploy.yml",
"url": "https://raw.githubusercontent.com/react-microfrontends/navbar/55ff88e74714d12d3e3447250e34a2b7742e91f6/.github/workflows/build_and_deploy.yml",
"sha256": "013ebc66d1eed4fdab5c6f38cbf164b4ef56ee3850ec32cae826c2f9cfd99430",
"lines": 79
}
]
}

View file

@ -20,3 +20,8 @@ No source count is used as a recurrence score or evidence-gate substitute.
Boundary follow-up: [React/Radix browser observations](BoundaryRecoveryExperiment.md) Boundary follow-up: [React/Radix browser observations](BoundaryRecoveryExperiment.md)
add bounded executable evidence to F. Nested dismissal remains timing-sensitive; add bounded executable evidence to F. Nested dismissal remains timing-sensitive;
no screen-reader verification or full quality-stream completion. no screen-reader verification or full quality-stream completion.
Stream E follow-up: [feature/deployment contrast](FeatureDeploymentBoundaries.md)
adds pinned example code and release workflow definitions; operational independence
remains unverified. VC-06 now has a provisional synthetic draft; VC-04/05 and VC-07–10
remain planned. One new developed seed brings the current corpus to seventeen hypotheses.

View file

@ -0,0 +1,92 @@
# VC-06 — Microfrontend estate
Status: provisional draft, editorial self-review only. Codex, 2026-09-26.
Synthetic fixed brief; exploratory preparation under WP-0003 T01/T02, not M2 acceptance.
Corpus: seventeen research hypotheses; no canonical admission.
## Fixed brief and assumptions
Independent teams/releases, shared navigation and partial outages are the fixed
constraints. For this exercise, assume a host shell with two capabilities, Reports
and Account, served in one browser context. Each team should release a compatible
change without rebuilding the host or the other capability. Host owns top-level route
selection and persistent navigation; teams own declared subroutes and lifecycle cleanup.
The service remains authoritative for protected data and writes. Offline edits,
collaborative editing and numerical latency budgets are unspecified and not promised.
Keyboard/focus continuity, meaningful load/error feedback and usable navigation during
a feature load failure are required. Separate bundles confer no authorization or
security isolation. Authentication/session policy, dependency versions, event schemas
and route collisions are integration contracts. This brief does not require a specific
framework, separate repositories, or separate origins.
## Baseline narrative without the pattern catalog
Produce a versioned artifact for each capability and load it through a host-selected
binding. Define mount/unmount, inputs/events and supported host/API versions. Keep
routing and shared state small enough that compatible feature changes do not force
all teams to release together. Publish before activating; retain prior compatible
artifacts and declare how old tabs continue operating. Show a local load failure while
keeping navigation available. Test dependency failures that can still affect the host.
The same obligations can be expressed without pattern names; no decision benefit is proven.
## Decisions
| Order | Context / forces | Pattern reference | Alternative / reason | Resulting context | Evidence |
| --- | --- | --- | --- | --- | --- |
| 1 | Independent release cadence versus integration cost | [Independent Feature Boundary](../candidates/IndependentFeatureBoundary.md) | One application release violates the assumed cadence; source folders alone cannot satisfy it | Separate artifacts plus explicit composition/activation contract | D04–D06/D08 |
| 2 | Local change cohesion versus shared dependencies | [Vertical Feature Slice](../candidates/VerticalFeatureSlice.md) | Global technical folders can scatter capability changes; do not force every shared primitive into a feature | Internal code organization can vary independently of release packaging | D01–D03 |
| 3 | Shared navigation and deep links | [URL-addressable State](../candidates/URLAddressableState.md), host-owned route context | Uncoordinated routers can disagree; a shared route schema still needs compatibility | Host selects capability; feature owns a declared subroute space | D04, editorial proposal |
| 4 | Partial outage versus coherent experience | [Failure Boundary](../candidates/FailureBoundary.md), scoped to load/render/lifecycle separately | A render boundary alone cannot handle a failed download | Host retains navigation and exposes a local error/retry path | D04/D06, runtime unverified |
| 5 | Independent activation versus version skew | Independent Feature Boundary | Upload-only is not activation; simultaneous incompatible upgrades defeat the stated independence | Supported version combinations and binding rollback defined | D05/D08/D09 |
D01–D09 resolve in the [source review](../reviews/FeatureDeploymentBoundaries.md).
Independent source, build, activation and failure boundaries are distinct decisions.
## Failure and recovery trace
1. Host H1 activates Reports R1 and Account A1 from a declared binding. Route and
public data/event contracts have tested compatibility ranges. This is an assumption
to be verified, not an observed guarantee of the example repositories.
2. Publish Reports R2 to a distinct retained URL, validate H1/R2/A1 and relevant API
combinations, then update only the Reports binding. Concurrent binding changes
need an atomic or conflict-detecting update contract.
3. A fresh session obtains R2; an open session may retain R1. Do not assume import-map
replacement hot-swaps existing modules. Define whether a session remains pinned,
reloads at a safe boundary or uses an explicit supported replacement protocol.
4. If R2 fails to load, keep shell navigation available and show an accessible feature
error. Retry identity here is a load concern; do not resubmit a domain mutation
merely because the feature remounts. Guard teardown callbacks from changing focus
or state owned by a newer instance.
5. If R2 requires an incompatible host/shared-state contract, do not claim independent
release. Reject activation or coordinate a migration with support for old sessions.
6. Roll back the Reports binding to retained R1 for applicable sessions. Verify API/data
compatibility before promising recovery; bytes alone cannot undo server effects.
A shared startup dependency outage is a separate scenario: local feature fallbacks
cannot protect a shell that never starts.
## Change one constraint
Replace independent releases with **one coordinated release cadence**; keep separate
teams, shared navigation and partial-outage requirements. Internal feature interfaces
and ownership can remain, but a single tested application artifact may now satisfy
the brief with less activation/version-skew machinery. Retain scoped failure handling;
do not infer it disappears when deployment units merge. This branch demonstrates why
Vertical Feature Slice need not imply Independent Feature Boundary.
## Review
| Criterion | Assessment | Reason |
| --- | --- | --- |
| Traceability | pass (editorial) | Pinned source mechanisms separated from proposed release contracts |
| Configuration coherence | pass (editorial) | Host routes, lifecycle and compatibility responsibilities explicit |
| Usefulness beyond baseline | unknown | Same-author synthesis; baseline already contains the obligations |
| Quality constraints | revise | No outage, keyboard/focus, old-session or rollback execution |
| Changed constraint | pass (editorial) | Single cadence permits combining artifacts while retaining code boundaries |
## Gaps and ownership
[WP-0003 T01/T02](../../workplans/FEP-WP-0003-contrasting-schools.md) owns a local
version-skew/load-failure/binding-rollback harness and independent walkthrough review.
No cloud deployment, production artifact activation or operational team independence
was verified. VC-04/05 remain planned; this draft does not complete VC-06's M2 gate.

View file

@ -130,3 +130,23 @@ upstream message, pattern promotion or M2 completion. Resume feature/import vers
release-boundary and navigation evidence next; keep the router limitation as a live release-boundary and navigation evidence next; keep the router limitation as a live
T01 follow-up rather than requiring a production fork here. Sixteen hypotheses, T01 follow-up rather than requiring a production fork here. Sixteen hypotheses,
T02/T03 and the independent-human gate unchanged. No model calls. T02/T03 and the independent-human gate unchanged. No model calls.
## Feature organization versus independent activation — 2026-09-26
T01 progress: reviewed 17 files at pinned commits in feature-sliced/examples todo-app
and react-microfrontends root-config/navbar; SRC-0031–0035 include primary mechanism
docs. Partial feature interfaces coexist with one application build; separate build/
release definitions coexist with shared startup dependencies. No build, CI, cloud
deployment or rollback execution. FeatureDeploymentSources.json pins all file hashes.
Developed Independent Feature Boundary from the existing seed, bringing the corpus
to seventeen hypotheses. Vertical Feature Slice refined; provisional VC-06 traces
activation, version skew, partial load failure and rollback with a single-cadence
branch. T02 remains todo for its post-M1 gate; this is preparatory work, not M2 acceptance.
See research/reviews/FeatureDeploymentBoundaries.md.
Next T01 evidence: local compatible/incompatible feature versions against unchanged
host, failed load, activation rollback with fresh and already-running sessions, and
shared startup outage. No production workflows/credentials needed. Navigation checks
and broader router-lifecycle limits remain live; T03 and human-validation gate unchanged.
No model calls, deployment, canonical admission or proven generativity benefit.