Summary
Formalize the build extension/middleware pipeline: deterministic ordering and a typed phase model instead of comment-encoded magic priority numbers. Directly supports the plugin architecture foundation in this milestone.
Findings (file:line)
FalloutBuild.Events.cs:21-25 — extensions discovered via GetCustomAttributes<BuildExtensionAttributeBase>() and ordered OrderByDescending(x => x.Priority). Equal priorities fall back to CLR reflection order → non-deterministic across runtimes.
FalloutBuild.cs:44-62 — ~15 built-in extensions share magic priorities (150/100/75/50/10/5/-100); the "before logo / after logo / after finish" phases exist only as comments.
Execution/Extensibility/BuildExtensionAttributeBase.cs — IBuildExtension + IOn* lifecycle interfaces are public; concrete extensions are mostly internal (keep that).
Scope
- Add a deterministic secondary ordering key for equal priorities.
- Introduce a typed phase model (enum or ordered phase tokens) replacing comment-encoded ranges.
- Document the
IOn* lifecycle contract.
- Confirm middleware internals stay
internal (milestone policy: no public plugin SDK yet).
Acceptance criteria
- Equal-priority ordering is deterministic and covered by a test.
- Phases are typed, not magic numbers.
- No public plugin surface added.
Notes
- Non-breaking.
- Depends on: FT-2 (can proceed largely in parallel with FT-3/4/5).
- Size: M.
Summary
Formalize the build extension/middleware pipeline: deterministic ordering and a typed phase model instead of comment-encoded magic priority numbers. Directly supports the plugin architecture foundation in this milestone.
Findings (file:line)
FalloutBuild.Events.cs:21-25— extensions discovered viaGetCustomAttributes<BuildExtensionAttributeBase>()and orderedOrderByDescending(x => x.Priority). Equal priorities fall back to CLR reflection order → non-deterministic across runtimes.FalloutBuild.cs:44-62— ~15 built-in extensions share magic priorities (150/100/75/50/10/5/-100); the "before logo / after logo / after finish" phases exist only as comments.Execution/Extensibility/BuildExtensionAttributeBase.cs—IBuildExtension+IOn*lifecycle interfaces are public; concrete extensions are mostly internal (keep that).Scope
IOn*lifecycle contract.internal(milestone policy: no public plugin SDK yet).Acceptance criteria
Notes