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:
parent
29ccad7002
commit
b8eec87f08
14 changed files with 460 additions and 2 deletions
2
SCOPE.md
2
SCOPE.md
|
|
@ -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
|
||||
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`,
|
||||
`REVIEW.md` (the initial review) and `workplans/` for follow-up work.
|
||||
|
||||
|
|
|
|||
4
TREE.md
4
TREE.md
|
|
@ -246,6 +246,7 @@ research/candidates/DerivedState.md
|
|||
research/candidates/ExplicitReconciliation.md
|
||||
research/candidates/FailureBoundary.md
|
||||
research/candidates/FocusReturn.md
|
||||
research/candidates/IndependentFeatureBoundary.md
|
||||
research/candidates/InvalidateAndReproject.md
|
||||
research/candidates/IslandsOfInteractivity.md
|
||||
research/candidates/LocalCommitBoundary.md
|
||||
|
|
@ -380,6 +381,8 @@ research/plan/ValidationCases.md
|
|||
research/reviews/AuthorityPilot.md
|
||||
research/reviews/BoundaryRecoveryExperiment.md
|
||||
research/reviews/CarniatoAdmissionRegression.json
|
||||
research/reviews/FeatureDeploymentBoundaries.md
|
||||
research/reviews/FeatureDeploymentSources.json
|
||||
research/reviews/FrontendRecoveryImplementations.md
|
||||
research/reviews/FrontendRecoverySources.json
|
||||
research/reviews/JoplinConflictScreen.json
|
||||
|
|
@ -414,6 +417,7 @@ research/reviews/recovery-review-02/response.md
|
|||
research/walkthroughs/VC01-TransactionalAdministration.md
|
||||
research/walkthroughs/VC02-OfflineFieldNotes.md
|
||||
research/walkthroughs/VC03-ContentPublication.md
|
||||
research/walkthroughs/VC06-MicrofrontendEstate.md
|
||||
scripts/research_admission.py
|
||||
scripts/research_bench.py
|
||||
scripts/research_execution.py
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
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.
|
||||
|
||||
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.
|
||||
|
|
|
|||
50
research/candidates/IndependentFeatureBoundary.md
Normal file
50
research/candidates/IndependentFeatureBoundary.md
Normal 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.
|
||||
|
|
@ -38,3 +38,13 @@ Evidence locators: [breadth review](../reviews/PatternBreadthExpansion.md).
|
|||
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
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
is a negative control, and immediate nested dismissal remains unresolved. Sixteen
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
vendor behavior. Current raw control also reproduces production wrong-owner dismissal
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -92,3 +92,14 @@ Q05 routing follow-up: [experimental owner dispatch](../reviews/NestedOwnershipR
|
|||
separates input delivery from return-focus policy. Successful cancellation and cleanup
|
||||
matter alongside correct close targeting. The bounded mechanism comparison supports
|
||||
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.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# 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,
|
||||
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
|
||||
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.
|
||||
|
|
|
|||
72
research/reviews/FeatureDeploymentBoundaries.md
Normal file
72
research/reviews/FeatureDeploymentBoundaries.md
Normal 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.
|
||||
159
research/reviews/FeatureDeploymentSources.json
Normal file
159
research/reviews/FeatureDeploymentSources.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -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)
|
||||
add bounded executable evidence to F. Nested dismissal remains timing-sensitive;
|
||||
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.
|
||||
|
|
|
|||
92
research/walkthroughs/VC06-MicrofrontendEstate.md
Normal file
92
research/walkthroughs/VC06-MicrofrontendEstate.md
Normal 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.
|
||||
|
|
@ -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
|
||||
T01 follow-up rather than requiring a production fork here. Sixteen hypotheses,
|
||||
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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue