diff --git a/SCOPE.md b/SCOPE.md index d496049..1e87258 100644 --- a/SCOPE.md +++ b/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. diff --git a/TREE.md b/TREE.md index 26836dc..c17286b 100644 --- a/TREE.md +++ b/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 diff --git a/research/README.md b/research/README.md index 5590638..409b353 100644 --- a/research/README.md +++ b/research/README.md @@ -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. diff --git a/research/candidates/IndependentFeatureBoundary.md b/research/candidates/IndependentFeatureBoundary.md new file mode 100644 index 0000000..e2509ab --- /dev/null +++ b/research/candidates/IndependentFeatureBoundary.md @@ -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. diff --git a/research/candidates/VerticalFeatureSlice.md b/research/candidates/VerticalFeatureSlice.md index 9fe48f1..2a6e846 100644 --- a/research/candidates/VerticalFeatureSlice.md +++ b/research/candidates/VerticalFeatureSlice.md @@ -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. diff --git a/research/catalog/PatternCandidateCatalog.md b/research/catalog/PatternCandidateCatalog.md index 9689758..52370bf 100644 --- a/research/catalog/PatternCandidateCatalog.md +++ b/research/catalog/PatternCandidateCatalog.md @@ -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. diff --git a/research/catalog/SourceCatalog.md b/research/catalog/SourceCatalog.md index 6610b34..94ff16c 100644 --- a/research/catalog/SourceCatalog.md +++ b/research/catalog/SourceCatalog.md @@ -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. diff --git a/research/plan/OpenQuestions.md b/research/plan/OpenQuestions.md index 98f6384..cb59c40 100644 --- a/research/plan/OpenQuestions.md +++ b/research/plan/OpenQuestions.md @@ -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. diff --git a/research/plan/ValidationCases.md b/research/plan/ValidationCases.md index 94daa2d..74cbec2 100644 --- a/research/plan/ValidationCases.md +++ b/research/plan/ValidationCases.md @@ -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. diff --git a/research/reviews/FeatureDeploymentBoundaries.md b/research/reviews/FeatureDeploymentBoundaries.md new file mode 100644 index 0000000..4c21971 --- /dev/null +++ b/research/reviews/FeatureDeploymentBoundaries.md @@ -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. diff --git a/research/reviews/FeatureDeploymentSources.json b/research/reviews/FeatureDeploymentSources.json new file mode 100644 index 0000000..bd044f7 --- /dev/null +++ b/research/reviews/FeatureDeploymentSources.json @@ -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 + } + ] +} diff --git a/research/reviews/NavigationCoverage.md b/research/reviews/NavigationCoverage.md index 51efbfe..d81cee6 100644 --- a/research/reviews/NavigationCoverage.md +++ b/research/reviews/NavigationCoverage.md @@ -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. diff --git a/research/walkthroughs/VC06-MicrofrontendEstate.md b/research/walkthroughs/VC06-MicrofrontendEstate.md new file mode 100644 index 0000000..a054087 --- /dev/null +++ b/research/walkthroughs/VC06-MicrofrontendEstate.md @@ -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. diff --git a/workplans/FEP-WP-0003-contrasting-schools.md b/workplans/FEP-WP-0003-contrasting-schools.md index 50e4132..4b7d6a7 100644 --- a/workplans/FEP-WP-0003-contrasting-schools.md +++ b/workplans/FEP-WP-0003-contrasting-schools.md @@ -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.