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
|
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.
|
||||||
|
|
||||||
|
|
|
||||||
4
TREE.md
4
TREE.md
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
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.
|
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.
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
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)
|
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.
|
||||||
|
|
|
||||||
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
|
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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue