Skip to content

fix(cli): honor --no-sqlite when scaffolding lucee.json#2624

Merged
bpamiri merged 6 commits into
developfrom
fix/bot-2621-wheels-new-no-sqlite-still-creates-sqlite-database
May 13, 2026
Merged

fix(cli): honor --no-sqlite when scaffolding lucee.json#2624
bpamiri merged 6 commits into
developfrom
fix/bot-2621-wheels-new-no-sqlite-still-creates-sqlite-database

Conversation

@wheels-bot
Copy link
Copy Markdown
Contributor

@wheels-bot wheels-bot Bot commented May 12, 2026

Summary

wheels new <app> --no-sqlite previously created db/development.sqlite and db/test.sqlite and wired both as datasources in the scaffolded lucee.json. The flag was honored for configureSQLiteDatabase() (the db/*.sqlite + config/app.cfm injection paths) but not for the lucee.json template, which embedded the org.sqlite.JDBC datasource pair unconditionally — so Lucee still opened those JDBC URLs on first connection and auto-created the empty database files.

This change drops the hardcoded SQLite block from cli/lucli/templates/app/lucee.json in favor of a {{datasourcesBlock}} placeholder, and threads opts.noSQLite through Module.cfc::scaffoldNewApp()'s context so the substituted block is either the SQLite pair (default) or {} when --no-sqlite is set.

Related Issue

Fixes #2621

Type of Change

  • Bug fix
  • New feature
  • Enhancement to existing feature
  • Documentation update
  • Refactoring

Feature Completeness Checklist

  • DCO sign-off — every commit carries Signed-off-by: (git commit -s)
  • Testsvendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc was added failing, then passes after the fix
  • Framework Docs — handled by bot-update-docs.yml follow-up
  • AI Reference Docs — handled by bot-update-docs.yml follow-up
  • CLAUDE.md — handled by bot-update-docs.yml follow-up
  • CHANGELOG.md — entry added under [Unreleased]
  • Test runner passes — local Lucee 7 + SQLite run: 4290 pass, 0 fail, 0 error (full framework suite)

Test Plan

  • Run wheels new test-app --no-sqlite --reload-password=PLACEHOLDER and confirm:
    • test-app/db/development.sqlite is NOT created
    • test-app/db/test.sqlite is NOT created
    • test-app/lucee.json contains "datasources": {} (no org.sqlite.JDBC entries)
  • Run wheels new test-app2 (default, no flag) and confirm the SQLite datasource pair IS present in lucee.json and db/*.sqlite files ARE created — the default happy path must not regress.
  • bash tools/test-local.sh (framework suite, Lucee 7 + SQLite) — green.

Drop the hardcoded SQLite datasource pair from cli/lucli/templates/app/lucee.json
in favor of a {{datasourcesBlock}} placeholder, and thread opts.noSQLite
through scaffoldNewApp's context so the substituted block is either the SQLite
pair (default) or {} when --no-sqlite is set. Lucee no longer auto-creates
db/development.sqlite / db/test.sqlite on first connection. Fixes #2621.

Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
…-project guide

The prior description implied only config/app.cfm carried datasource
configuration, leaving lucee.json's role undocumented. After #2621 both
files honor --no-sqlite: lucee.json now emits an empty datasources object
so Lucee never auto-creates db/*.sqlite on first connection.

Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
@wheels-bot
Copy link
Copy Markdown
Contributor Author

wheels-bot Bot commented May 12, 2026

Wheels Bot — Docs updated

Added a doc commit to this PR:

  • web/sites/guides/src/content/docs/v4-0-0/command-line-tools/wheels-commands/creating-a-project.mdx — clarified that lucee.json carries Lucee-level JDBC datasource entries and now honors --no-sqlite (emits empty datasources: {} so Lucee never auto-creates db/*.sqlite); updated both v4-0-0 and v4-0-1-snapshot versions.

The prior description implied only config/app.cfm held datasource configuration, which understated lucee.json's role and didn't mention the fix from #2621. No other doc locations (CLAUDE.md, .ai/wheels/) document wheels new flag behavior at this level of detail, so no further changes were needed.

Copy link
Copy Markdown
Contributor Author

@wheels-bot wheels-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wheels Bot — Reviewer A

TL;DR: This PR correctly fixes the --no-sqlite / lucee.json regression: the hardcoded SQLite datasource pair is replaced by a {{datasourcesBlock}} placeholder, and scaffoldNewApp() threads opts.noSQLite through to produce either the SQLite pair or {}. The change is narrow and accurate. Two nits worth addressing before merge: multi-line comment blocks violate CLAUDE.md conventions, and the tests are source-inspection only — they confirm the template was restructured but never call buildSQLiteDatasourcesBlock() or verify its output is valid JSON. Overall verdict: comment (no correctness, cross-engine, or security findings).


Conventions

Multi-line comment blocks — violates CLAUDE.md "one short line max"

cli/lucli/Module.cfc, lines 4118–4124:

// Template variable context — all config values flow through here.
// `datasourcesBlock` is the JSON fragment substituted into lucee.json
// at the `"datasources": {{datasourcesBlock}}` site: the SQLite pair
// by default, or an empty `{}` when `--no-sqlite` was passed. Without
// this gate the rendered lucee.json pointed Lucee at jdbc:sqlite
// paths even with `--no-sqlite`, and the engine auto-created empty
// db/*.sqlite files on first connection (GH ##2621).

CLAUDE.md: "Only add [a comment] when the WHY is non-obvious … one short line max. Don't write multi-line comment blocks." A single line captures the non-obvious invariant:

// datasourcesBlock: SQLite pair by default; "{}" when --no-sqlite (GH #2621)

The same applies to the 7-line docstring on buildSQLiteDatasourcesBlock() (lines 4319–4327).

##2621 in a // comment — harmless but misleading

cli/lucli/Module.cfc, line 4124:

// db/*.sqlite files on first connection (GH ##2621).

## escapes a CFML expression delimiter inside evaluated strings; // comments are never evaluated, so #2621 is fine here. The rendered source just displays GH ##2621 instead of GH #2621.

Trivial double-space

cli/lucli/Module.cfc, line 4341:

block &= pad & "},"  & nl;

Two spaces before & nl; — style nit only.


Tests

Tests verify template structure, not generated output

vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc has two it() blocks:

  1. Reads cli/lucli/templates/app/lucee.json as a string and asserts it contains {{datasourcesBlock}} and does not contain org.sqlite.JDBC.
  2. Reads cli/lucli/Module.cfc as a string and asserts it contains datasourcesBlock.

These are regression guards that would fail on the pre-fix code — good. But buildSQLiteDatasourcesBlock() is never exercised. A future change that introduced malformed JSON in that function (e.g. a stray comma or missing closing brace) would not be caught by this spec. Consider a follow-up to add a behavioral test: either expose a public test accessor or verify the rendered block can be parsed with deserializeJSON("{\"datasources\": " & block & "}").


Pre-existing gap (not introduced here — noted for visibility)

When --setup-h2 is passed without --no-sqlite, the ternary at line 4132:

"datasourcesBlock": opts.noSQLite ? "{}" : buildSQLiteDatasourcesBlock(opts.datasource)

still emits the SQLite JDBC pair into lucee.json. This was also true in the old hardcoded template, so it is not a regression from this PR. With the placeholder machinery now in place, a one-line follow-up would fix it:

"datasourcesBlock": (opts.noSQLite || opts.setupH2) ? "{}" : buildSQLiteDatasourcesBlock(opts.datasource)

Commits

Single commit fix(cli): honor --no-sqlite when scaffolding lucee.json — type fix, scope cli, subject ≤ 100 chars, not ALL-CAPS, DCO Signed-off-by: present. All good.

Copy link
Copy Markdown
Contributor Author

@wheels-bot wheels-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wheels Bot — Reviewer A

TL;DR: The new commit (3fd657346) is a documentation-only follow-up that updates the creating-a-project guide in v4-0-0 and v4-0-1-snapshot to clarify that lucee.json now honors --no-sqlite alongside config/app.cfm. The factual claims are accurate and the change is correctly applied to both doc versions. The prior review's nits (multi-line comment blocks, double-space, test coverage gap) remain open — none were addressed by this commit. Overall verdict: comment.


Docs

Accurate and well-scoped. The new sentence in both MDX files correctly describes the post-fix behavior:

Both files honor --no-sqlite: the flag emits an empty datasources object in lucee.json so Lucee never auto-creates db/development.sqlite and db/test.sqlite on first connection, and omits the datasource block from config/app.cfm.

This directly matches what scaffoldNewApp() now does (lines 4130–4134 of Module.cfc).

Minor completeness nit. The old text said:

config/app.cfm carries the datasource configuration — SQLite by default, H2 under --setup-h2, or no datasource block under --no-sqlite.

The replacement removes the --setup-h2 mention entirely. A reader now has to look elsewhere to understand what --setup-h2 produces in lucee.json or config/app.cfm. Since the pre-existing --setup-h2 gap (SQLite pair still emitted when --setup-h2 is set — noted in the previous review) is unchanged and undocumented, this is an acceptable omission for now, but worth a follow-up sentence if that gap is fixed.


Commits

Commit Message DCO
71fbbf7c6 fix(cli): honor --no-sqlite when scaffolding lucee.json Signed-off-by: claude[bot] present
3fd657346 docs(web/guides): clarify lucee.json honors --no-sqlite in creating-a-project guide Signed-off-by: claude[bot] present

Both conform to commitlint: valid fix/docs types, scopes within the suggested list, subjects <= 100 chars, not ALL-CAPS.


Outstanding from prior review (still open)

These were flagged in the previous Reviewer A comment on 71fbbf7c6 and have not been addressed:

  1. Multi-line comment blockcli/lucli/Module.cfc lines 4118–4124 and the 7-line docstring on buildSQLiteDatasourcesBlock() (lines 4319–4327) violate CLAUDE.md's "one short line max" guidance.
  2. ##2621 in a // comment// comments are never evaluated by CFML so the escape is unnecessary; #2621 is fine.
  3. Double-space nitcli/lucli/Module.cfc line 4341: block &= pad & "},\" & nl; (two spaces before & nl;).
  4. Test coverage gapNoSQLiteScaffoldSpec.cfc verifies source-file structure but never calls buildSQLiteDatasourcesBlock() or validates the rendered block as parseable JSON.

None of these are blockers, but they should be addressed before the PR moves to ready-for-review.

@wheels-bot
Copy link
Copy Markdown
Contributor Author

wheels-bot Bot commented May 12, 2026

Wheels Bot — Reviewer B (round 1)

A's review is substantively correct — the core bug, fix approach, and commit hygiene assessments are all accurate. One missed instance of the same CLAUDE.md violation A flagged elsewhere, and A's verdict label is inconsistent with A's own wording. On balance the findings are valid and actionable, so I'm converging on changes needed.

Sycophancy

None detected. A called out real findings, assigned "comment" rather than a rubber-stamp approve, and gave concrete inline suggestions. No unearned praise.

False positives

None detected. I verified each of A's claims against the diff:

  • Multi-line comment block at cli/lucli/Module.cfc ~4118–4124: Confirmed — 7-line // block before the var context struct. CLAUDE.md "one short line max" applies.
  • Multi-line docstring on buildSQLiteDatasourcesBlock(): Confirmed — the /** ... */ block spanning ~9 lines in the diff.
  • ##2621 in a // comment: Confirmed at line 4124 (GH ##2621). CLAUDE.md explicitly notes // comments are not evaluated, so ## is unnecessary and renders literally as ##2621.
  • Double-space before & nl;: Confirmed — block &= pad & "}," & nl; has two spaces between "}," and & nl;.
  • Tests are source-inspection only: Confirmed — both it() blocks read and contains-check source files. buildSQLiteDatasourcesBlock() is never invoked; malformed JSON output would not be caught.

Missed issues

NoSQLiteScaffoldSpec.cfc — 17-line opening docblock (vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc, lines 1–18)

A flagged multi-line comment blocks in Module.cfc but didn't apply the same rule to the new test spec. The file opens with a large /** ... */ component-level docblock that explains the bug, the pre-fix behavior, and the fix — exactly what CLAUDE.md prohibits:

"Don't explain WHAT the code does … Don't reference the current task, fix, or callers … Never write multi-line comment blocks."

The describe-label "wheels new --no-sqlite (issue 2621)" already names the regression context. The docblock can be dropped entirely.

Verdict alignment

A says the nits are "worth addressing before merge" but chose "comment" rather than "request-changes." That label is inconsistent with the wording. The findings are concrete and actionable; the spec maps "comment with concrete actionable findings" to converged-changes, which is what I'm emitting.

Convergence

Aligned on changes needed. Consensus for address-review:

  1. cli/lucli/Module.cfc ~4118–4124 — collapse the 7-line // block to one line, e.g.: // datasourcesBlock: SQLite pair by default; "{}" when --no-sqlite (#2621)
  2. cli/lucli/Module.cfc — remove the /** ... */ docstring on buildSQLiteDatasourcesBlock(); one short // line max if the WHY is non-obvious, or drop it entirely since the function name and the caller's comment already cover it.
  3. cli/lucli/Module.cfc line 4124 — fix ##2621#2621 (unnecessary escape in a // comment).
  4. cli/lucli/Module.cfc — remove the double-space in block &= pad & "}," & nl;.
  5. vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc lines 1–18 — drop the component-level docblock entirely.

The behavioral test gap for buildSQLiteDatasourcesBlock() is a follow-up concern (A framed it as "consider a follow-up"), not a blocking change — leave it out of the address-review commit.

- cli/lucli/Module.cfc: collapse 7-line comment on `var context` to a
  single-line WHY note per CLAUDE.md "one short line max" rule, and fix
  the unnecessary `##2621` escape inside the `//` comment (#2621)
- cli/lucli/Module.cfc: drop the 8-line docstring on
  buildSQLiteDatasourcesBlock(); the function name plus its single
  caller's note already explain the WHY
- cli/lucli/Module.cfc: remove the stray double-space in
  `block &= pad & "}," & nl;`
- vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc: drop the
  17-line component-level docblock; the describe label
  "wheels new --no-sqlite (issue 2621)" already pins the regression
  context

Signed-off-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
@wheels-bot
Copy link
Copy Markdown
Contributor Author

wheels-bot Bot commented May 12, 2026

Wheels Bot -- Reviewer B (round 1)

A's review of the doc commit is accurate and well-targeted. All findings check out against the diff. I have one missed issue to add -- same pattern A flagged in Module.cfc but overlooked in the spec file -- and agree the nits should be addressed before the PR moves to ready-for-review. Converging on changes.

Sycophancy

None detected. A gives a comment verdict with explicit findings, not a blanket LGTM.

False positives

None detected. Verified each claim against the actual code:

  • Multi-line inline comment (Module.cfc lines 4118-4124): confirmed -- 7 lines of // comment, violates CLAUDE.md "one short line max".
  • Multi-line docstring (Module.cfc lines 4319-4327): confirmed -- 8-line block on buildSQLiteDatasourcesBlock(), same violation.
  • Double-hash in a // comment (line 4124): confirmed -- // comments are never evaluated by CFML, so the escape is unnecessary; a single hash suffices.
  • Double-space (line 4341): confirmed -- block &= pad & "}," & nl; has two spaces before & nl;.
  • Test coverage gap: accurate -- NoSQLiteScaffoldSpec.cfc reads source files and checks for string presence; it does not call buildSQLiteDatasourcesBlock() or parse/validate the rendered JSON output.

Missed issues

  • Block comment in NoSQLiteScaffoldSpec.cfc lines 1-17: A flagged multi-line comment blocks in Module.cfc but missed the 16-line block at the top of the spec file -- same CLAUDE.md violation. It duplicates the PR description and commit message; trim to one line or remove entirely.

Verdict alignment

A's comment verdict is appropriate for a documentation-only commit being reviewed in isolation. The outstanding items are carried from the prior commit review, not introduced by the doc commit, so not blocking on their own -- but they do need resolution before the PR is ready.

Convergence

Aligned. A's four findings are all valid; I add one more (the spec file block comment, same pattern). The joint recommendation is that these five nits -- multi-line inline comment in Module.cfc, multi-line docstring on buildSQLiteDatasourcesBlock(), unnecessary double-hash escape, double-space, and the spec file block comment -- should be cleaned up before the PR moves to ready-for-review. No behavioral or correctness concerns with the underlying fix.

@wheels-bot
Copy link
Copy Markdown
Contributor Author

wheels-bot Bot commented May 12, 2026

Wheels Bot — Address Review (round 1)

Applied consensus findings from Reviewer A and Reviewer B's convergence (round 1):

  • cli/lucli/Module.cfc ~4118–4124 — collapsed the 7-line // block on var context to a single-line WHY note (// datasourcesBlock: SQLite pair by default; "{}" when --no-sqlite (#2621)) per CLAUDE.md's "one short line max" rule.
  • cli/lucli/Module.cfc ~4313–4321 — removed the 8-line /** … */ docstring on buildSQLiteDatasourcesBlock(). Function name plus the caller's note already cover the WHY.
  • cli/lucli/Module.cfc line 4124 (old) — fixed ##2621#2621. // comments are never evaluated, so the escape was unnecessary and rendered literally.
  • cli/lucli/Module.cfc line 4335 — removed the stray double-space in block &= pad & "}," & nl;.
  • vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc lines 1–17 — dropped the component-level docblock. The describe label "wheels new --no-sqlite (issue 2621)" already pins the regression context.

Skipped (not in consensus, per B's note):

  • Behavioral test for buildSQLiteDatasourcesBlock() — A framed this as a "consider a follow-up", not a blocking change. Left for a separate PR.
  • --setup-h2 || --no-sqlite ternary widening — A flagged this as a pre-existing gap, explicitly not a regression from this PR.

Re-ran the CLI spec layer locally against Lucee 7 + SQLite (server already up; tools/test-local.sh has an unrelated sed -i '' macOS/Linux portability bug, so I invoked the test endpoint directly):

curl /wheels/core/tests?db=sqlite&directory=wheels.tests.specs.cli
→ pass=3 fail=0 error=0 (ApiControllerSnippetSpec + NoSQLiteScaffoldSpec both green)

The new commit will trigger a fresh Reviewer A run on the updated SHA. Convergence loop continues until reviewers align on approve or the outer-loop cap (5 rounds) is reached.

Copy link
Copy Markdown
Contributor Author

@wheels-bot wheels-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

test

Copy link
Copy Markdown
Contributor Author

@wheels-bot wheels-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Header

Sub

body text

@wheels-bot
Copy link
Copy Markdown
Contributor Author

wheels-bot Bot commented May 12, 2026

Wheels Bot — Reviewer B (round 1)

A's review 4275878496 has body "test" and zero line comments. That is a placeholder, not a review. A made no findings, no analysis, and no verdict. I re-scanned the address-review diff independently and found no issues, but I cannot converge on a non-review.

Sycophancy

The review body is the single word "test" with no line comments. This is worse than a rubber-stamp "LGTM" — A provided no analysis of the address-review commit whatsoever, effectively granting a silent pass to every change on the branch.

False positives

None detected. A made no claims to falsify.

Missed issues

A provided no analysis. I re-scanned the address-review diff (SHA b2f2296ad5c318dfefdf2523fcd1bef83a04d15c) and checked whether all five consensus changes from round 1 were applied:

  1. cli/lucli/Module.cfc context-struct comment — collapsed to single line ✓
  2. cli/lucli/Module.cfcbuildSQLiteDatasourcesBlock() has no docstring ✓
  3. cli/lucli/Module.cfc#2621 not ##2621 in comment ✓
  4. cli/lucli/Module.cfc — single space in string concatenation ✓
  5. vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc — no component-level docblock ✓

No new issues introduced by this commit.

Verdict alignment

A's state is "COMMENTED" with body "test". That is not a valid verdict — it provides no assessment of whether the PR should be approved or changed.

Convergence

Not aligned. A needs to submit a substantive review of the address-review commit. The diff appears clean, but B cannot converge on a non-review. A should re-review the current SHA and either approve (all consensus changes are applied, no new issues visible) or flag any remaining concerns.

@wheels-bot
Copy link
Copy Markdown
Contributor Author

wheels-bot Bot commented May 12, 2026

Wheels Bot — Reviewer B (round 1)

A's review 4275891846 on SHA b2f2296ad is a placeholder — the body reads ## Header / Sub / body text with no code findings, no inline comments, and no meaningful verdict. There is nothing to verify or dispute. I have re-scanned the diff independently to surface what A should have assessed.

Sycophancy

A content-free "COMMENTED" state on a non-trivial diff is implicit approval-without-examination — a rubber-stamp that cited no evidence. That qualifies as sycophancy by omission.

False positives

None — A made no claims.

Missed issues

A provided no assessment. From my own scan of the current diff:

All five round-1 consensus items are correctly applied in the address-review commit (b2f2296ad):

  1. cli/lucli/Module.cfc — 7-line // block collapsed to a single line: // datasourcesBlock: SQLite pair by default; "{}" when --no-sqlite (issue 2621). ✓
  2. cli/lucli/Module.cfc/** ... */ docblock on buildSQLiteDatasourcesBlock() removed. ✓
  3. cli/lucli/Module.cfc — unnecessary double-hash corrected (single hash in comment, not double). ✓
  4. cli/lucli/Module.cfc — stray double-space in string concat removed. ✓
  5. vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc — component-level docblock dropped. ✓

No new issues introduced by the address-review commit:

  • The private modifier on buildSQLiteDatasourcesBlock() is appropriate. The CLAUDE.md warning about private vs public targets mixin CFCs integrated via $integrateComponents(); a CLI module helper is outside that concern.
  • cli/lucli/templates/app/lucee.json correctly replaces the hardcoded SQLite block with the {{datasourcesBlock}} placeholder.
  • Doc changes in both v4-0-0 and v4-0-1-snapshot accurately describe the two-file (lucee.json + config/app.cfm) approach and the --no-sqlite behavior.
  • CHANGELOG entry is properly placed and formatted.

Carry-over (non-blocking, consensus): behavioral test for buildSQLiteDatasourcesBlock() was classified as a follow-up in round 1 — not blocking this PR.

Verdict alignment

A's "COMMENTED" state carries no verdict. It is not an approval, not a request for changes — it is nothing.

Convergence

Not aligned. A has not submitted a real review on SHA b2f2296ad. From my independent scan the code is clean and all consensus findings are addressed; a genuine Reviewer A pass should yield "approve." Convergence is deferred until A provides an actual assessment.

Copy link
Copy Markdown
Contributor Author

@wheels-bot wheels-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wheels Bot — Reviewer A response (round 1)

B was entirely correct on all counts. My two reviews on SHA `b2f2296ad` carried placeholder bodies ("test" and "## Header / Sub / body text") with zero code analysis. There is nothing to defend from those submissions. Having now performed an independent review of the full diff, I confirm all five round-1 consensus items are correctly applied, no new issues are present, and the behavioral fix is sound. Converging to approve.

Conceded points

  • Placeholder reviews: Both prior reviews on `b2f2296ad` provided no analysis — B was correct that they constituted a failure of the review process and that convergence could not proceed from them.
  • All five consensus items applied: B's independent scan was accurate. Verified against the diff:
    1. `cli/lucli/Module.cfc` — 7-line `//` block on `var context` collapsed to `// datasourcesBlock: SQLite pair by default; "{}" when --no-sqlite (#2621)` ✓
    2. `cli/lucli/Module.cfc` — `/** ... */` docstring on `buildSQLiteDatasourcesBlock()` removed ✓
    3. `cli/lucli/Module.cfc` — unnecessary `##` escape corrected; comment now uses `(#2621)` ✓
    4. `cli/lucli/Module.cfc` — stray double-space in `block &= pad & "}," & nl;` removed ✓
    5. `vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc` — component-level docblock dropped; `describe` label pins the regression context ✓

Defended points

None — B made no false-positive claims against me since my prior reviews made no claims to dispute.

One minor observation I'm adding for completeness (not a change request): `NoSQLiteScaffoldSpec.cfc` retains a two-line inline comment (// The template must NOT hardcode the SQLite class — emitting it / // has to go through the placeholder so --no-sqlite can suppress.) that technically violates CLAUDE.md's "one short line max" rule. The assertion message immediately below already carries this context, so the comment is redundant. I'm noting it only as a follow-up candidate — it does not block approval.

Updated verdict

Approve: all round-1 consensus changes are correctly applied, the core `--no-sqlite` / `lucee.json` fix is behaviorally sound, the commits conform to commitlint, DCO trailers are present, and no new issues were introduced by the address-review commit.

…s-new-no-sqlite-still-creates-sqlite-database

Signed-off-by: Peter Amiri <peter@alurium.com>

# Conflicts:
#	CHANGELOG.md
@bpamiri
Copy link
Copy Markdown
Collaborator

bpamiri commented May 12, 2026

Status — issues resolved at 2f4328b

Bringing this PR back to a mergeable state:

  • Merge conflict (CHANGELOG.md) — resolved. Kept both [Unreleased] entries (this PR's --no-sqlite fix plus wheels new scaffolds Application.cfc with missing application.wheelsdi assignment in onApplicationStart #2622's application.wheelsdi fix from develop). PR is now MERGEABLE.
  • Reviewer A workflow failure (HTTP 422) — root cause was the validation step trying to dismiss two bogus COMMENTED-state reviews on b2f2296ad (test body, len 4 — and ## Header / Sub / body text placeholder). GitHub's API forbids dismissing commented reviews. On the new SHA 2f4328b9d the guard will run against a clean review set and should exit clean. The workflow itself has a latent bug (it can't gracefully handle un-dismissible state) — worth a follow-up issue against .github/workflows/bot-reviewer-a.yml, separate from this PR.
  • Visual regression failure — not caused by this PR. The blog homepage baseline (web/tests/visual-baselines/blog.png) is stale relative to develop's current rendering after the Wheels 4.0 announce post (fix(web/blog): quote title in wheels-4-closing-the-maturity-gap (recover failed auto-deploy) #2620, McpServer.cfc uses DirectoryCreate() with two arguments, which is incompatible with Adobe ColdFusion #2618). Develop's own last two push runs (4e695b21d, 2b908f6b822) also failed on this same [blog] FAIL — 37,668 pixels differ line, so the post-merge auto-refresh in web-deploy.yml's Commit pre-refreshed blog baseline step is what needs fixing — and peter/fix-blog-baseline-race is already in flight for that. Visual regression is not a required check on develop, so this is non-blocking.
  • Required checks: only Bot PR TDD Gate is required by the ruleset; it passed at b2f2296ad and is rerunning now.
  • Bogus reviews on b2f2296ad — left in place. They're scoped to the prior SHA and don't affect convergence on the new SHA. Cleaning them up requires a maintainer dismissal via the GitHub UI (API rejects programmatic dismissal of COMMENTED reviews).

Re-running CI now; the convergence loop will pick up the new SHA naturally.

Copy link
Copy Markdown
Contributor Author

@wheels-bot wheels-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wheels Bot — Reviewer A

TL;DR: The head commit (2f4328b9d) is a merge of origin/develop that brings in PR #2623's Application.cfc changes and resolves a CHANGELOG conflict; it introduces no new PR-specific code. The underlying fix — replacing the hardcoded SQLite block in lucee.json with a {{datasourcesBlock}} placeholder and threading opts.noSQLite through scaffoldNewApp() — is correct. All five round-1 consensus items raised in prior reviews have been addressed. Two minor nits remain open: a two-line inline comment in the spec file that technically violates CLAUDE.md's "one short line max" rule, and a test coverage gap where buildSQLiteDatasourcesBlock() is never exercised. Neither is a blocker. Overall verdict: comment.


Correctness

Fix is behaviorally sound. When opts.noSQLite is truthy, "datasourcesBlock": "{}" is substituted, producing "datasources": {} in the rendered lucee.json (valid JSON). When false, buildSQLiteDatasourcesBlock(opts.datasource) reconstructs the exact same indentation structure as the original hardcoded block: 6-space pad for top-level keys, 8-space inner for properties, 4-space closing brace at " }". The default path is a byte-equivalent replacement.

No correctness issues found.


Conventions

Remaining two-line inline commentvendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc, lines 20–21:

// The template must NOT hardcode the SQLite class — emitting it
// has to go through the placeholder so --no-sqlite can suppress.

CLAUDE.md: "one short line max." The toBeFalse() assertion message immediately below already carries this context in full. This was flagged as a follow-up candidate (not a blocker) in the round-1 Reviewer A response; noting it again for completeness.

All other round-1 items are resolved and verified against the current tree:

  • 7-line comment on var context collapsed to a single WHY note ✓
  • buildSQLiteDatasourcesBlock() docstring removed ✓
  • ##2621#2621 in the // comment ✓
  • Stray double-space in block &= pad & "}," & nl; removed ✓
  • 17-line component docblock on NoSQLiteScaffoldSpec.cfc dropped ✓

Tests

Coverage gap (follow-up candidate, not a blocker)vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc:

Both it() blocks are source-inspection tests: one reads the template file as a string and checks for the placeholder; the other reads Module.cfc as a string and checks for datasourcesBlock. Neither exercises the rendering path. A malformed JSON output from a future edit to buildSQLiteDatasourcesBlock() — e.g. a stray trailing comma or missing closing brace — would not be caught. A follow-up integration test that invokes scaffoldNewApp() (or the CLI equivalent) and reads the rendered lucee.json would confirm both the --no-sqlite path ("datasources": {}) and the default path produce parseable JSON. This gap has been noted in two prior reviews; filing as a follow-up to address post-merge.


Commits

SHA Message DCO
71fbbf7c6 fix(cli): honor --no-sqlite when scaffolding lucee.json Signed-off-by: claude[bot]
3fd657346 docs(web/guides): clarify lucee.json honors --no-sqlite in creating-a-project guide Signed-off-by: claude[bot]
b2f2296ad fix(cli): address Reviewer A/B consensus findings (round 1) Signed-off-by: claude[bot]
2f4328b9d Merge remote-tracking branch origin/develop (merge) Signed-off-by: Peter Amiri

All PR-authored commits conform to commitlint: valid fix/docs types, scopes within the suggested list (cli, web/guides), subjects ≤ 100 chars, not ALL-CAPS.

@wheels-bot
Copy link
Copy Markdown
Contributor Author

wheels-bot Bot commented May 12, 2026

Wheels Bot — Reviewer B (round 1)

A's review is substantive, accurate, and internally consistent. No sycophancy, no false positives, no meaningful missed issues. A's two remaining findings are both correctly classified as non-blocking follow-up candidates, which makes the "comment" verdict slightly inconsistent — all non-blocking items together warrant an approve. Converging on approve.

Sycophancy

None detected. A gives a structured analysis with findings, explicitly distinguishes blockers from non-blockers, and does not issue an unearned rubber-stamp.

False positives

None detected. Verified each claim against the diff:

  • Two-line inline comment at NoSQLiteScaffoldSpec.cfc lines 20–21: confirmed — the // The template must NOT hardcode ... two-liner is present in the diff. CLAUDE.md "one short line max" applies. The toBeFalse() failure message immediately below already carries the same context, so the comment is redundant as well as over-length.
  • Test coverage gap on buildSQLiteDatasourcesBlock(): accurate — both it() blocks read source files as strings and never invoke the function. A malformed JSON output would not be caught. A correctly frames this as a follow-up, not a blocker.
  • All five round-1 consensus items verified ✓: checked against the diff; all applied correctly.

Missed issues

None of significance.

  • The private modifier on buildSQLiteDatasourcesBlock() was correctly not flagged. The CLAUDE.md warning about private vs public targets mixin CFCs integrated via $integrateComponents(); a CLI module helper is outside that concern (confirmed by prior round B analysis on b2f2296ad).
  • The /** docblock visible in the diff context is the pre-existing resolveWheelsSourceOrFail docblock, not a new addition from this PR. Not flagging it is correct.
  • No cross-engine concerns: buildSQLiteDatasourcesBlock() uses standard CFML string concatenation and chr(10) — both work on all engines. The {{datasourcesBlock}} substitution produces valid JSON in both the SQLite and empty-object paths.

Verdict alignment

A says both remaining items are "not a blocker" and a "follow-up candidate." That assessment is correct. However, two explicitly non-blocking items together warrant "approve," not "comment" — "comment" in GitHub state leaves the PR in review-limbo without formally approving despite A's own characterization of the code as merge-ready. This is a mild inconsistency, not a substantive dispute.

Convergence

Aligned, no changes needed. A's underlying assessment matches mine: the fix is behaviorally correct, all five round-1 consensus items are applied, and both remaining items (two-line comment, coverage gap) are legitimately post-merge follow-ups. Joint recommendation: approve and let the PR proceed to human review.

The blog homepage baseline (web/tests/visual-baselines/blog.png) drifted
when 2b908f6 (Wheels 4.0: Closing the Maturity Gap post) and 4e695b2
(title quote fix) landed on develop — the workflow's post-merge
auto-refresh in web-deploy.yml only fires when `blog_content_changed=true`
on a PR, and these were direct merges that didn't pre-refresh.

This commit refreshes the baseline to match the current rendered blog
homepage, unblocking PR #2624 (whose CI failure was inherited drift, not
a code change) and develop's last two push runs which fail identically.

The broader auto-refresh-race fix lives on peter/fix-blog-baseline-race;
this is the immediate unblock.

Signed-off-by: Peter Amiri <peter@alurium.com>
@bpamiri
Copy link
Copy Markdown
Collaborator

bpamiri commented May 12, 2026

Status update — baseline refresh at 83f7f8d

Reviewers converged on approve at 2f4328b9d. The only remaining red check was Visual regression, which was failing on [blog] / — 37,668 pixels differ for the blog homepage. Verified this is upstream drift after develop merged the Wheels 4.0 announcement post and title-quote fix without the workflow's post-merge auto-refresh firing (develop's last two push runs fail identically).

Refreshed web/tests/visual-baselines/blog.png locally:

$ pnpm install --frozen-lockfile
$ pnpm exec playwright install chromium  # cached
$ pnpm --filter @wheels-dev/site-blog build
$ node scripts/visual-regression.mjs --update --site blog
[blog] screenshotting /
[blog] baseline updated: web/tests/visual-baselines/blog.png
All visual checks passed.

This commit is intentionally separate (test(web/blog): scope) so the original fix(cli): scope of this PR stays clean. The broader auto-refresh race fix lives on peter/fix-blog-baseline-race; this is the immediate unblock.

After this run completes, all required checks should be green and Bot PR TDD Gate (the only required gate) should remain pass. Ready for human review.

Copy link
Copy Markdown
Contributor Author

@wheels-bot wheels-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wheels Bot — Reviewer A

TL;DR: The head commit (83f7f8d49) adds only a binary visual-baseline refresh (web/tests/visual-baselines/blog.png). All substantive code changes — the {{datasourcesBlock}} placeholder in lucee.json, the buildSQLiteDatasourcesBlock() helper, opts.noSQLite threading in scaffoldNewApp(), the guide doc updates, and the five round-1 consensus fixes — were fully reviewed on prior SHAs. No new findings arise from the incremental diff. Overall verdict: comment (two minor open items remain as follow-up candidates, neither a blocker).


Correctness

The incremental change is a PNG binary — no logic change. The core --no-sqlite fix is correct and has been verified in prior reviews. No new correctness issues.


Conventions

Two items from prior rounds remain open (neither introduced by this commit, both noted as follow-up candidates):

Two-line inline commentvendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc, lines 20-21:

// The template must NOT hardcode the SQLite class — emitting it
// has to go through the placeholder so --no-sqlite can suppress.

CLAUDE.md: "one short line max." The toBeFalse() assertion message immediately below carries this context in full — the comment is redundant. Not a blocker.


Tests

Behavioral coverage gap (follow-up candidate)vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc exercises source-file structure only; buildSQLiteDatasourcesBlock() is never called and its JSON output is never validated as parseable. A stray trailing comma or missing closing brace in a future edit would not be caught. This gap has been noted in three consecutive reviews; filing as a follow-up to address post-merge.


Commits

SHA Message DCO
71fbbf7c6 fix(cli): honor --no-sqlite when scaffolding lucee.json Signed-off-by: claude[bot] present
3fd657346 docs(web/guides): clarify lucee.json honors --no-sqlite in creating-a-project guide Signed-off-by: claude[bot] present
b2f2296ad fix(cli): address Reviewer A/B consensus findings (round 1) Signed-off-by: claude[bot] present
2f4328b9d Merge origin/develop (merge commit) Signed-off-by: Peter Amiri present
83f7f8d49 test(web/blog): refresh visual baseline after Wheels 4.0 post drift Signed-off-by: Peter Amiri present

All PR-authored commits conform to commitlint: valid types (fix, docs, test), scopes within the suggested list (cli, web/guides, web/blog), subjects no longer than 100 chars, not ALL-CAPS.

@wheels-bot
Copy link
Copy Markdown
Contributor Author

wheels-bot Bot commented May 12, 2026

Wheels Bot — Reviewer B (round 1)

A's review of the head commit is accurate. The incremental change on SHA 83f7f8d49 is a binary PNG baseline refresh only — no logic, no CFML, no JSON. A correctly characterizes it as such, re-confirms all five round-1 consensus items are applied, and carries forward the same two non-blocking follow-up notes. The verdict inconsistency ("comment" when both items are explicitly non-blocking) is the same mild issue B flagged in the prior round on 2f4328b9d; it does not change the underlying assessment. Converging on approve.

Sycophancy

None detected. A does not rubber-stamp the PNG commit — A explicitly says the substantive code was reviewed on prior SHAs and limits the incremental review to the incremental diff. That is the correct approach for a binary-only head commit.

False positives

None detected. A's two carry-over findings are both accurately scoped:

  • Two-line inline comment (NoSQLiteScaffoldSpec.cfc lines 20-21): confirmed present in the diff, confirmed redundant given the toBeFalse() assertion message below it. CLAUDE.md "one short line max" applies.
  • Coverage gap on buildSQLiteDatasourcesBlock(): confirmed — neither it() block invokes the function or validates the rendered JSON. The gap is real and A's framing as a follow-up candidate (not a blocker) is appropriate.

Missed issues

None. The only diff on this SHA is web/tests/visual-baselines/blog.png (binary, no logic). There is nothing else to scan. A's decision not to re-litigate previously reviewed commits is correct per the incremental-review convention established in prior rounds.

Verdict alignment

A's "comment" state is inconsistent with A's own characterization that neither remaining item is a blocker. The prior converged-approve on 2f4328b9d already reflected this assessment. A PNG baseline refresh does not introduce new reasons to withhold approval. The correct verdict on this SHA is approve.

Convergence

Aligned, no changes needed. The fix is behaviorally correct, all five round-1 consensus items are applied, both remaining items are legitimately post-merge follow-ups, and the head commit changes nothing substantive. Joint recommendation: approve.

The previous baseline refresh (83f7f8d) was generated on macOS
Chromium, which produces noticeably different font hinting and
antialiasing from CI's Linux Chromium — the diff measured 43,928
pixels, well above the 300-pixel threshold.

Replaced web/tests/visual-baselines/blog.png with blog.actual.png
extracted from the visual-regression-diffs artifact of the failing
CI run (run 25763885277). This is the Linux-rendered output that
subsequent CI runs will diff against, so the comparison should now
land at 0 pixels (or well within the threshold).

Verified by visual inspection: same content as the macOS render
(Wheels 4.0 / LuCLI / Multi-Tenancy posts), just rendered with the
CI environment's font stack.

Signed-off-by: Peter Amiri <peter@alurium.com>
@bpamiri
Copy link
Copy Markdown
Collaborator

bpamiri commented May 12, 2026

Baseline retry at 8fb7bf2 — CI-rendered version

My prior baseline refresh (83f7f8d49) was generated on macOS Chromium, which produces noticeably different font hinting and antialiasing from CI's Linux Chromium. CI rejected it with 43,928 pixels differing (even higher than the pre-refresh 37,668 — classic platform render divergence).

Pulled blog.actual.png from the visual-regression-diffs artifact of run 25763885277 and committed it as the new baseline. This is CI's own Linux-rendered output, so the next regression run will diff against itself and land at 0 pixels.

Visually verified: same content as the macOS render (Wheels 4.0 / LuCLI / Multi-Tenancy posts) — just rendered with CI's font stack. Waiting on the new run.

Copy link
Copy Markdown
Contributor Author

@wheels-bot wheels-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wheels Bot — Reviewer A

TL;DR: The head commit (8fb7bf263) replaces the blog visual-regression baseline (web/tests/visual-baselines/blog.png) with a Linux-CI-rendered version after the previous macOS-rendered baseline produced a 43,928-pixel diff above the 300-pixel threshold. The change is correct and well-explained. All substantive code — the {{datasourcesBlock}} placeholder, buildSQLiteDatasourcesBlock(), opts.noSQLite threading, guide updates, and round-1 consensus fixes — was fully reviewed on prior SHAs and has not changed. Two minor follow-up candidates from those rounds remain open. Overall verdict: comment (no new correctness, cross-engine, or security findings).


Correctness

The PNG swap is appropriate. CI was failing due to macOS-vs-Linux Chromium font-hinting divergence; replacing the baseline with the CI-rendered artifact is the standard fix. The commit message cites the CI run ID (25763885277) and the measured pixel delta for auditability. No logic change.


Conventions

Two-line inline comment (still open — follow-up candidate)vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc, lines 20–21:

// The template must NOT hardcode the SQLite class — emitting it
// has to go through the placeholder so --no-sqlite can suppress.

CLAUDE.md: "one short line max." The toBeFalse() assertion message on line 23 already carries this context in full — the comment is redundant. This has been flagged in three consecutive reviews; noting again as a follow-up to address pre-merge.


Tests

Behavioral coverage gap (still open — follow-up candidate)vendor/wheels/tests/specs/cli/NoSQLiteScaffoldSpec.cfc exercises source-file structure only; buildSQLiteDatasourcesBlock() is never called and its JSON output is never validated as parseable. A stray trailing comma or missing closing brace in a future edit would not be caught. This gap has been noted in three consecutive reviews; filing as a follow-up to address post-merge.


Commits

SHA Message DCO
71fbbf7c6 fix(cli): honor --no-sqlite when scaffolding lucee.json Signed-off-by: claude[bot] present
3fd657346 docs(web/guides): clarify lucee.json honors --no-sqlite in creating-a-project guide Signed-off-by: claude[bot] present
b2f2296ad fix(cli): address Reviewer A/B consensus findings (round 1) Signed-off-by: claude[bot] present
2f4328b9d Merge origin/develop (merge commit) Signed-off-by: Peter Amiri present
83f7f8d49 test(web/blog): refresh visual baseline after Wheels 4.0 post drift Signed-off-by: Peter Amiri present
8fb7bf263 test(web/blog): use CI-rendered baseline (macOS Chromium diverges) Signed-off-by: Peter Amiri present

All PR-authored commits conform to commitlint: valid types (fix, docs, test), scopes within the suggested list (cli, web/guides, web/blog), subjects ≤ 100 chars, not ALL-CAPS.

@wheels-bot
Copy link
Copy Markdown
Contributor Author

wheels-bot Bot commented May 12, 2026

Wheels Bot — Reviewer B (round 1)

A's review accurately characterizes the head commit as a PNG-only baseline swap and correctly limits the incremental review to that scope. Both carry-over findings are accurately stated and consistent with three prior rounds. The only issue is a mild verdict inconsistency — A labels both items as follow-up candidates (non-blocking) but issues "comment" rather than "approve." Converging on approve.

Sycophancy

None detected. A does not rubber-stamp the PNG commit and explicitly limits the review to the incremental diff — the correct approach for a binary-only head commit.

False positives

None detected. Both carry-over findings have been confirmed consistently across prior rounds and predate the head commit:

  • Two-line inline comment (NoSQLiteScaffoldSpec.cfc lines 20-21): CLAUDE.md "one short line max" applies; confirmed by three consecutive rounds.
  • Coverage gap on buildSQLiteDatasourcesBlock(): accurate; neither it() block invokes the function or validates the rendered JSON.

The head commit changed only web/tests/visual-baselines/blog.png (binary, 0 insertions/deletions) — verified via git show 8fb7bf263 --stat. A's description of the change is correct in every detail.

Missed issues

None. The diff on this SHA is a single binary PNG file. There is no logic, no CFML, no configuration to scan.

Verdict alignment

A labels both remaining items as "follow-up candidates" — one "pre-merge," one "post-merge" — but issues "comment" rather than "approve." A's own characterization of the items as non-blocking follow-ups makes the "comment" verdict inconsistent. B already converged-approve on 83f7f8d49 with these same two items assessed as non-blocking post-merge work; the head commit introduces nothing new. The correct verdict is approve.

Convergence

Aligned, no changes needed. The fix is behaviorally correct, all round-1 consensus items are applied, both remaining follow-ups are legitimately post-merge work, and the head commit is a PNG-only baseline swap. Joint recommendation: approve.

@bpamiri bpamiri marked this pull request as ready for review May 13, 2026 04:03
@bpamiri bpamiri merged commit 1e7dfa4 into develop May 13, 2026
15 checks passed
@bpamiri bpamiri deleted the fix/bot-2621-wheels-new-no-sqlite-still-creates-sqlite-database branch May 13, 2026 04:03
bpamiri added a commit that referenced this pull request May 13, 2026
…baseline

Merges origin/develop into the PR branch so CI reruns against the
post-#2624 baseline (which refreshed web/tests/visual-baselines/blog.png
after the May 12 "Closing the Maturity Gap" post drift). The failed
Visual regression check on the prior HEAD was caused by the stale
baseline on develop at the time of that CI run, not by anything in
this PR.

Conflicts resolved (all additive — both sides kept):

- CHANGELOG.md: kept ### Changed entry from #2632 and appended the
  reloadPassword Documentation entry to the existing ### Documentation
  section (which #2627 had populated on develop), rather than carrying
  a duplicate top-level ### Documentation header.
- web/sites/guides/src/content/docs/v4-0-0/upgrading/3x-to-4x.mdx and
  v4-0-1-snapshot/upgrading/3x-to-4x.mdx: kept both new Common-issues
  bullets — the wirebox boot-failure bullet from #2627 and the
  reloadPassword bullet from this PR.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Signed-off-by: Peter Amiri <peter@alurium.com>
bpamiri added a commit that referenced this pull request May 13, 2026
…es-to-and-dry-run-flag

Bring in latest develop (5 commits including PR #2624's blog visual
baseline refresh) so the visual regression check picks up the current
baseline. The PR's branch was created before #2624 landed, leaving
GitHub's pull/2642/merge ref combining stale PR-side baseline with
old develop — the test diffed against the pre-Maturity-Gap-post
baseline and failed with 37,668 pixels of drift on the blog index.

CHANGELOG.md conflict resolved by keeping both sets of `Fixed`
entries — develop's #2630, #2635, #2621 plus this PR's #2629 — and
develop's new `Documentation` section for #2627.

cli/lucli/Module.cfc auto-merged: PR #2629's upgrade() help-text
changes are in a different region than #2624's --no-sqlite
scaffolding logic, so both sets of edits coexist cleanly.

Signed-off-by: Peter Amiri <peter@alurium.com>
bpamiri added a commit that referenced this pull request May 13, 2026
Brings the CI-rendered blog visual-regression baseline (8fb7bf2,
landed on develop via #2624's squash merge) into the PR branch so the
Visual regression check stops failing on the stale macOS-Chromium
baseline this branch forked from. The CI run on 5b656e4 measured
37,668 pixels of font-rendering drift against the old baseline; merging
develop in auto-takes the CI-rendered blob (af41788) the PR branch
never touched.

Three conflicts resolved manually, all in the documentation layer:

- CHANGELOG.md: combine #2626 entry (this PR) with develop's #2630,
  #2635, #2621, plus the Documentation subsection for #2627. PR entry
  moved to the end of the Fixed list to preserve develop's ordering.
- web/sites/guides/.../v4-0-0/upgrading/3x-to-4x.mdx: keep both
  Common-issues bullets — develop's wirebox boot-failure entry (#2627)
  and this PR's static-asset 404 entry (#2626).
- web/sites/guides/.../v4-0-1-snapshot/upgrading/3x-to-4x.mdx: same
  resolution as v4-0-0.

cli/lucli/Module.cfc auto-merged cleanly — develop's #2624 added a
sibling helper, this PR added \$ensureProjectRewriteConfig(); both
land side by side.

Signed-off-by: Peter Amiri <peter@alurium.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

wheels new --no-sqlite still creates SQLite database files and configures them in lucee.json

1 participant