docs: consolidate Wheels 5 roadmap into a single decided document#3237
Conversation
Replace the draft wheels-5-roadmap-recommendations.md with a single canonical wheels-5-roadmap.md that reflects a critical review of the draft's assumptions and reasoning: - Reframe the objective from "win share vs ColdBox" to retention + onboarding-friction in a contracting CFML market; competitor is attrition, not ColdBox. - Correct factual errors: RustCFML is public (pixl8/Alex Skinner), AI-authored, no ORM -> demoted from strategic pillar to monitor-only. - Stop framing already-shipped v4 systems (DI, jobs, middleware, query builder, packages) as net-new; this is a coherence release. - Right-size scope to a small 5.0 core: controller-level strong params (CFML-native helpers, not a Rails object), response object, formalized RequestContext with ONE controller idiom (no action-arg injection, no three styles), legacy removal, single CI matrix manifest, and one forward bet (AI-legibility). - Defer modules/scheduler/config-schema/DI-discovery/OpenAPI to 5.1+; drop the strategic conformance program and RFC-gate process. - Correct dependency posture: own the vendored LuCLI fork (alpha, single-maintainer) with a continuity plan; BoxLang first-class but re-evaluated quarterly. - Two CI tiers + release gate instead of five. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MZ3uagrSQEjTEB4yKGFfzZ Signed-off-by: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Wheels Bot — Reviewer
TL;DR. This PR replaces the 2,688-line wheels-5-roadmap-recommendations.md draft with a single 268-line wheels-5-roadmap.md canonical roadmap. It is a docs-only change — no framework/CLI/app code is touched, so no test suites or changelog fragment apply, and the PR body says as much correctly. I independently checked every "verified" codebase claim and every file/anchor link in the new document; all of them hold. Verdict: comment — the diff is essentially clean, with one trivial command-name nit that does not block.
Conventions
docs/releases/wheels-5-roadmap.md:199— the generated-app smoke flow is written as`new` → `generate scaffold` → `dbmigrate latest` → `test` → `start`. The canonical CLI verb iswheels migrate latest, notdbmigrate latest—cli/lucli/Module.cfc:606definesfunction migrate()and there is no top-leveldbmigratecommand (the onlydbmigratehits incli/lucli/are template-snippet strings).CLAUDE.md's onboarding-harness note also describes the flow aswheels new → wheels start → wheels migrate latest. Suggest changingdbmigrate latest→migrate latestso the doc matches the surface it elsewhere documents carefully. Non-blocking.
Docs
Verification of the document's load-bearing factual claims (all confirmed against the tree at this head):
- §3 baseline table paths all resolve:
vendor/wheels/Injector.cfc,Job.cfc,JobWorker.cfc,middleware/(containsPipeline,Cors,RateLimiter,SecurityHeaders,RequestId),model/query/QueryBuilder.cfc,PackageLoader.cfc+ModuleGraph.cfc,model/properties.cfc,cli/lucli/Module.cfc,.github/workflows/compat-matrix.yml+pr.yml. Relative../../depth fromdocs/releases/is correct. - §5.1 "Gap (verified)":
accessibleProperties()(properties.cfc:10) andprotectedProperties()(properties.cfc:32) exist;expectParams/requireParam/permitdo not yet exist anywhere invendor/wheels— the gap is real. - §5.3 "there is no
RequestContext.cfc": confirmed — no such file undervendor/wheels. - §5.4 "
Plugins.cfc, 1,131 lines": exact (wc -l= 1131).vendor/wheels/Test.cfc(RocketUnit) present as claimed. - §3/§6 CLI claims:
routes()(Module.cfc:1267) anddoctor()(Module.cfc:2181) both exist. - Intra-doc anchors
#9-deferred-to-51,#10-what-wheels-5-will-not-do,#11-open-decisionsmatch GitHub's slugification of the corresponding##headers.
Commits
1b27b0531 docs: consolidate Wheels 5 roadmap into a single decided document— typedocsis in the allowlist, subject is lower-case and well under 100 chars, body is wrapped, and the commit carries a DCOSigned-off-bytrailer. Conforms tocommitlint.config.js.
Nice cleanup — collapsing the dual-document state into one decided roadmap, with the prior draft preserved at 53e6778 in history, is the right call. The single nit above is optional.
The generated-app smoke flow listed `dbmigrate latest`, but the CLI verb is `wheels migrate latest`; there is no top-level `dbmigrate` command. Addresses wheels-bot review nit on #3237. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MZ3uagrSQEjTEB4yKGFfzZ Signed-off-by: Claude <noreply@anthropic.com>
What
Replaces the draft
docs/releases/wheels-5-roadmap-recommendations.md(2,689 lines) with a single canonicaldocs/releases/wheels-5-roadmap.md(268 lines). There is now one document describing what Wheels 5 is for.This rewrite is the output of a critical review of the original draft — challenging not just the recommendations but the underlying assumptions and reasoning. Both the codebase claims and the external/market claims in the draft were independently verified.
Why the draft needed rework
The draft was accurate at the leaf level but wrong at the root:
pixl8/RustCFML, Alex Skinner) but ~26★, AI-authored, and has no ORM — it cannot run Wheels' model layer. Demoted to monitor-only.What the new roadmap commits to
RequestContextwith one controller idiom (no action-arg injection, no three styles), decisive legacy removal (plugins → adapter package, RocketUnit), a single CI matrix manifest, and one forward bet: AI-legibility (machine-readable routes, lifecycle trace, stable MCP contract, canonical generators).Notes
53e6778.🤖 Generated with Claude Code
Generated by Claude Code