Skip to content

fix(test): route browser-test artifact dir creation through File.mkdirs() for Adobe CF#2616

Merged
bpamiri merged 5 commits into
developfrom
claude/vigorous-lovelace-4d1e82
May 12, 2026
Merged

fix(test): route browser-test artifact dir creation through File.mkdirs() for Adobe CF#2616
bpamiri merged 5 commits into
developfrom
claude/vigorous-lovelace-4d1e82

Conversation

@bpamiri
Copy link
Copy Markdown
Collaborator

@bpamiri bpamiri commented May 12, 2026

Summary

vendor/wheels/wheelstest/BrowserTest.cfc:265 and vendor/wheels/public/mcp/McpServer.cfc:1115 both called directoryCreate(path, true). Adobe ColdFusion rejects the Lucee-only createPath flag with Parameter validation error for the DIRECTORYCREATE function. The function takes 1 parameter., which crashed the core test suite on ACF whenever a browser spec failed and the artifact directory did not yet exist.

Route the recursive directory creation through java.io.File.mkdirs() — the same canonical engine-agnostic workaround already used by vendor/wheels/services/packages/ManifestCache.cfc::$ensureDir from #2567. The new BrowserTest.$ensureArtifactDir(path) helper centralizes the pattern for the browser-test base class so future call sites pick up the cross-engine-safe behavior automatically.

Failing-then-passing spec

Added vendor/wheels/tests/specs/wheelstest/BrowserTestArtifactDirSpec.cfc:

  • Before fix: 2 errors — The method $ensureArtifactDir does not exist.
  • After fix: 2 passing — covers the deeply-nested-parents case (what createPath=true was meant to handle) and the already-exists no-op.

Local run (Lucee 7 + SQLite):

  • wheels.tests.specs.wheelstest: 109 pass / 0 fail / 12 err (the 12 errors are pre-existing BrowserLoginSpec/BrowserRouteSpec connection failures, unrelated to this change)
  • Full core suite: 3463 pass / 0 fail / 12 err (same pre-existing errors)

Test plan

  • Failing spec written first, observed to error with method $ensureArtifactDir does not exist
  • Implementation lands, spec now passes
  • No regressions across the full core suite on Lucee 7 + SQLite
  • CI matrix run on ACF 2023 / 2025 + MySQL / Postgres / SQL Server (covered automatically by compat-matrix.yml)
  • Framework Docs — not required for this fix
  • AI Reference Docs — not required for this fix
  • CLAUDE.md — not required for this fix
  • CHANGELOG.md

Fixes #2614

🤖 Generated with Claude Code

…rs() for Adobe CF

`BrowserTest.$captureFailureArtifacts` and `McpServer`'s test-file generator
both called `directoryCreate(path, true)`. Adobe ColdFusion rejects the
Lucee-only `createPath` flag with "Parameter validation error for the
DIRECTORYCREATE function. The function takes 1 parameter.", which crashed
the core test suite on ACF any time a browser spec failed and the artifact
directory did not yet exist.

Route the recursive directory creation through `java.io.File.mkdirs()`,
which works uniformly on Lucee, Adobe CF, and BoxLang — same canonical
workaround already used by `services/packages/ManifestCache.cfc::$ensureDir`
(#2567).

Adds `BrowserTestArtifactDirSpec` covering the nested-parent and
already-exists cases against the extracted `$ensureArtifactDir` helper.

Fixes #2614

Signed-off-by: Peter Amiri <petera@pai.com>
Copy link
Copy Markdown
Contributor

@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 replaces the two Lucee-only directoryCreate(path, true) calls with java.io.File.mkdirs(), matches the canonical pattern established by ManifestCache in #2567, ships a properly-structured BDD spec that tests the multi-parent and no-op cases, and includes a CHANGELOG entry. The fix is sound; the nits below are minor convention items that do not block merging.


Correctness

McpServer.cfc — mkdirs() return value not checked (line 1121)

// vendor/wheels/public/mcp/McpServer.cfc:1121
createObject("java", "java.io.File").init(local.fullTargetDir).mkdirs();

The canonical pattern in ManifestCache.$ensureDir (lines 132–135) captures the return value and re-verifies with DirectoryExists before throwing:

local.created = CreateObject("java", "java.io.File").init(arguments.path).mkdirs();
if (!local.created && !DirectoryExists(arguments.path)) {
    Throw(type="Wheels.Packages.CacheDir", message="Could not create cache directory ...");
}

For McpServer this is partially mitigated by the outer catch at line 1142 which converts any exception to an error string — the user would see a file-write error rather than a directory-creation error, which is survivable. Still, for consistency and diagnosability, consider the canonical form. Not a blocker.


Conventions

McpServer.cfc — stale meta-comment (line 1108)

// Debug logging removed - path resolution working correctly

This is a comment about removed code, not about current behavior — exactly what CLAUDE.md flags: "Don't reference the current task, fix, or callers." It should be deleted.

BrowserTest.cfc — multi-line Javadoc block (lines 280–289)

/**
 * Ensures the artifact directory exists, creating it (and any missing
 * parents) when necessary. Routes through java.io.File.mkdirs() rather
 * than directoryCreate(path, true) because Adobe ColdFusion rejects the
 * ...
 */

CLAUDE.md says "Never write multi-paragraph docstrings or multi-line comment blocks — one short line max." The WHY is worth keeping, but a single inline reference is enough:

// Adobe CF rejects directoryCreate(path, true) — see issue #2614. Use mkdirs() instead.
public void function $ensureArtifactDir(required string path) {

The same applies to the large block comment inside BrowserTestArtifactDirSpec.cfc (lines 6–15). The issue number in the it() label is sufficient documentation.


Tests

The spec extends wheels.WheelsTest (BDD syntax, not RocketUnit), covers the two meaningful cases (deeply-nested parents do not exist; directory already exists), cleans up via finally, and uses CreateUUID() to avoid test-run collisions. The ListFirst(Replace(...), "/") sweep logic in the first finally block correctly targets the root UUID directory for recursive delete.

One note: both it() closures instantiate new wheels.wheelstest.BrowserTest() inside the closure body rather than in a shared beforeEach. Constructing it twice is harmless here (no Playwright involved), but a shared setup would be idiomatic for this test framework.


Commits

fix(test): route browser-test artifact dir creation through File.mkdirs() for Adobe CF — type fix, scope test, subject 76 chars, not ALL-CAPS. Passes commitlint.

…back

Reviewer A flagged four items on PR #2616:

1. McpServer.$ensureDir now matches ManifestCache's canonical mkdirs +
   re-check + throw pattern, so a silent mkdirs() failure surfaces as
   "Could not create test directory" instead of a downstream FileWrite
   error.
2. Drop the pre-existing "Debug logging removed - path resolution
   working correctly" meta-comment that violated CLAUDE.md's "no
   references to past changes" rule.
3. Shrink the $ensureArtifactDir Javadoc block to a single line per
   CLAUDE.md's "one short line max" guidance.
4. Compress the regression-context comment in BrowserTestArtifactDirSpec
   from 10 lines to 2, while preserving the issue reference in both the
   comment and the it() label.

Note: the it() label now uses `##2614` because unescaped `#` in CFML
string literals triggers the "Invalid Syntax Closing [##] not found"
trap and crashes the entire spec bundle — verified locally.

The shared-beforeEach suggestion was skipped (reviewer marked it
"harmless here" and YAGNI applies — `new BrowserTest()` has no
side-effects without Playwright).

Signed-off-by: Peter Amiri <petera@pai.com>
@bpamiri
Copy link
Copy Markdown
Collaborator Author

bpamiri commented May 12, 2026

Addressed in ed4ce696d:

  1. McpServer return-value check — adopted ManifestCache's pattern verbatim (capture, re-check, throw Wheels.Mcp.TestDir). Outer catch-all at line 1142 still converts to the user-facing error string, but the diagnostic message is now specific to directory creation.
  2. Stale // Debug logging removed comment — deleted.
  3. $ensureArtifactDir docstring — collapsed to one line per CLAUDE.md.
  4. Spec regression comment — compressed from 10 lines to 2 (kept the bug reference; folded the WHY into the it() label).
  5. Shared beforeEach — skipped per your "harmless here" note (YAGNI; new BrowserTest() is side-effect-free without Playwright).

Gotcha for archaeologists: moving #2614 into the it() string literal triggered the CFML #-as-expression-delimiter trap and crashed the entire wheelstest bundle on reload. CLAUDE.md flags this explicitly — fixed with ##2614. Local wheelstest run still: BrowserTestArtifactDirSpec 2 pass / 0 fail / 0 err.

@wheels-bot
Copy link
Copy Markdown
Contributor

wheels-bot Bot commented May 12, 2026

Wheels Bot — Reviewer B (round 1)

A's core findings are valid and A correctly avoided sycophancy. One genuine missed issue: the same multi-line-comment convention A flagged in BrowserTest.cfc and BrowserTestArtifactDirSpec.cfc was also violated by the new inline block in McpServer.cfc -- which this PR introduced -- but A skipped it. That inconsistency needs acknowledgment before we converge. One minor note on the stale-comment finding is also worth clarifying.

Sycophancy

None detected. A's TL;DR identifies real issues before saying the fix is sound, and the COMMENTED (non-approving) state is consistent with having outstanding findings.

False positives

None detected. I verified every specific claim:

  • McpServer mkdirs() return value: createObject("java", "java.io.File").init(local.fullTargetDir).mkdirs(); at the changed site does not capture the return value. ManifestCache does. A's claim checks out.
  • McpServer stale comment (line 1108): The line // Debug logging removed - path resolution working correctly is present in the live file. A's description is accurate. (See scope note under Missed Issues.)
  • BrowserTest.cfc docstring (lines 280-289): The 9-line /** ... */ block is in the diff. CLAUDE.md "one short line max" applies. Valid finding.
  • BrowserTestArtifactDirSpec.cfc block comment (lines 6-15): The 10-line // block is in the diff. Valid finding.

Missed issues

McpServer.cfc - new 6-line inline comment block (same violation A flagged elsewhere)

The diff adds this to McpServer.cfc:

// Adobe CF's DirectoryCreate rejects the Lucee-only createPath
// flag with "Parameter validation error for the DIRECTORYCREATE
// function. The function takes 1 parameter." (#2614). Route
// through java.io.File.mkdirs() so the recursive-create path
// works on every engine. Same pattern as ManifestCache (#2567)
// and BrowserTest.$ensureArtifactDir.

This is six consecutive // lines. CLAUDE.md: "Never write multi-paragraph docstrings or multi-line comment blocks - one short line max." A raised this exact violation for BrowserTest.cfc and BrowserTestArtifactDirSpec.cfc but did not flag the equivalent block in McpServer.cfc, which is introduced by this same PR.

McpServer.cfc stale comment at line 1108 - pre-existing, not introduced by this PR

A flagged // Debug logging removed - path resolution working correctly but it is not in the diff. The file's diff hunk starts at line 1112; line 1108 is four lines above the context window. The PR author did not add it. Flagging pre-existing code is reasonable under the boy-scout rule, but A should be explicit that this predates the PR rather than presenting it as a change-introduced issue.

Verdict alignment

A used COMMENTED with "fix is sound; nits do not block merging." That reads as a permissive non-blocking review, consistent with the nature of the issues (all convention nits, no functional defects). The COMMENTED state is appropriate given outstanding findings.

Convergence

Not aligned yet. A needs to acknowledge the McpServer.cfc 6-line comment block - either flag it as the same non-blocking nit as the others, or explain why it is treated differently. Once A addresses that inconsistency, the joint recommendation is clear: the functional fix is correct, all findings are convention nits in the same tier, and the verdict should be a permissive approve.

Copy link
Copy Markdown
Contributor

@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 refactor commit addresses all four items Reviewer A raised on the first round (meta-comment dropped, McpServer now uses the canonical mkdirs-check-throw pattern, docstring shrunk to one line, spec comment compressed). The fix itself is correct and the cross-engine approach is sound. One finding requires action before merge: both commits carry a DCO sign-off email that differs from the commit author email, which risks failing the required DCO status check.


Correctness

DCO email mismatch — both commits (required status check risk)

Both commits show:

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

petera@pai.competer@alurium.com. CONTRIBUTING.md (§ DCO) and the shared-rails guidance both require the sign-off to match the configured git author identity. The DCO GitHub App is a required status check on every PR — if petera@pai.com is not a GitHub-verified email for this account, the check will fail and block the merge.

Fix: add the correct email to GitHub's verified addresses, or amend both commits to use Signed-off-by: Peter Amiri <peter@alurium.com>.


Conventions

BrowserTest.$ensureArtifactDir omits the mkdirs() return-value check (minor nit, not a blocker)

vendor/wheels/wheelstest/BrowserTest.cfc lines 281–287:

// Adobe CF rejects directoryCreate(path, true) — see #2614. Use mkdirs() instead.
public void function $ensureArtifactDir(required string path) {
    if (directoryExists(arguments.path)) {
        return;
    }
    createObject("java", "java.io.File").init(arguments.path).mkdirs();
}

The canonical pattern from ManifestCache (lines 132–138, the reference implementation for this workaround) captures the return value and re-verifies:

local.created = CreateObject("java", "java.io.File").init(arguments.path).mkdirs();
if (!local.created && !DirectoryExists(arguments.path)) {
    Throw(type="Wheels.Packages.CacheDir", message="Could not create cache directory...");
}

The McpServer path (also changed in this PR) already follows the canonical form. $ensureArtifactDir is partially mitigated by the try/catch wrapping all of $captureFailureArtifacts (which deliberately swallows errors to avoid masking test failures), so the practical impact is: on a permission-denied failure, no screenshot is saved and no diagnostic surfaces. Aligning with the canonical pattern would produce a clearer log entry before the swallow. Not a blocker on its own.


Tests

The BrowserTestArtifactDirSpec covers the two meaningful paths against BrowserTest.$ensureArtifactDir (deeply-nested parents, already-exists no-op), uses CreateUUID() for collision-safety, and cleans up in finally. The McpServer path has no dedicated spec, but that path requires complex path-resolution setup; integration coverage via compat-matrix.yml is reasonable for it.


Commits

Both commit subjects pass commitlint (types fix and refactor, scope test, headers 82 and 73 chars respectively, not ALL-CAPS). The DCO sign-off concern is noted above under Correctness.


Cross-engine

No new cross-engine concerns introduced. java.io.File.mkdirs() is JVM-level and works identically on Lucee, Adobe CF, and BoxLang. The single-argument DirectoryCreate calls in the spec are safe on all engines.

Copy link
Copy Markdown
Contributor

@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)

Both of B's points are correct. I concede the McpServer 6-line comment-block miss (genuine inconsistency: I flagged the same CLAUDE.md violation in BrowserTest.cfc and BrowserTestArtifactDirSpec.cfc but skipped the identical block in McpServer.cfc, all three introduced by the same commit) and the pre-existing stale-comment attribution (line 1108 was above the @@ -1112 hunk start, so A should have noted it as a boy-scout observation, not a change-introduced issue). Both issues were subsequently fixed in the refactor commit (ed4ce69); no new action required on these points.

Conceded points

  • McpServer.cfc 6-line comment block: Confirmed by reading git show 71816cc85 — the first commit introduced exactly the 6-line block B quoted (// Adobe CF's DirectoryCreate rejects the Lucee-only createPath...) without capturing mkdirs()'s return value. I flagged the equivalent multi-line blocks in BrowserTest.cfc and BrowserTestArtifactDirSpec.cfc but missed this one. The refactor commit collapsed it to one line and added the canonical return-value check, so it is resolved on the current SHA.
  • Stale comment at line 1108 is pre-existing: Confirmed — the first commit's hunk opens at line 1112 (@@ -1112,7 +1112,13), placing line 1108 outside the changed region. A should have flagged it explicitly as a pre-existing boy-scout item rather than presenting it as PR-introduced. The refactor commit deleted it, resolving it on the current SHA.

Defended points

None. B's findings on the old SHA are accurate on both counts.

Updated verdict

On the old SHA the three comment-block findings are in the same nit tier and the functional fix was correct — B's proposed permissive-approve direction is right for that code. On the current SHA (ed4ce69) my separate review identified a DCO sign-off email mismatch (peter@alurium.com author vs Signed-off-by: petera@pai.com), which is a required status check; that concern stands and warrants request-changes until resolved. Once the DCO is cleared, the PR is approvable.

@wheels-bot
Copy link
Copy Markdown
Contributor

wheels-bot Bot commented May 12, 2026

Wheels Bot — Reviewer B (round 1)

A's review on the current SHA is accurate and well-reasoned. The DCO email mismatch finding is legitimate and A's CHANGES_REQUESTED verdict is consistent with it. One minor presentation gap: A does not explicitly confirm that B's round-1 concern (the McpServer 6-line comment block) was resolved by the refactor — but the code confirms it was. No false positives; no sycophancy; no significant missed issues.

Sycophancy

None detected. A identifies a real blocking issue (DCO) before acknowledging the fix is sound, and CHANGES_REQUESTED is not a permissive rubber-stamp.

False positives

None detected. Both claims verified against the diff:

  • DCO mismatch: both commits in the API payload show Author: Peter Amiri <peter@alurium.com> / Signed-off-by: Peter Amiri <petera@pai.com>. The emails differ. A's characterization is accurate. Whether the check passes depends on whether petera@pai.com is a verified address on bpamiri's GitHub account — which A cannot determine from the diff — so flagging it as a risk is the correct conservative call.
  • $ensureArtifactDir return-value omission: The BrowserTest.cfc diff confirms createObject("java", "java.io.File").init(arguments.path).mkdirs(); with no return capture, while McpServer.cfc uses the full canonical pattern. A's description is accurate. Labeling it a non-blocking nit is also defensible given the surrounding try/catch in $captureFailureArtifacts.

Missed issues

A does not acknowledge B's round-1 finding was resolved (presentation gap, not a code defect)

B's round-1 critique flagged that the McpServer.cfc 6-line comment block violated CLAUDE.md's "one short line max" rule — the same violation A had flagged in BrowserTest.cfc and BrowserTestArtifactDirSpec.cfc. The refactor commit compressed that block to a single line:

// Adobe CF rejects directoryCreate(path, true) — see #2614. Use mkdirs() instead.

A's current review does not mention this. It is not a miss in the traditional sense (the code is correct), but A should confirm the prior cross-review finding was addressed rather than only listing the four items from A's own original review. This does not change the verdict.

No other missed issues found. Cross-engine, commitlint, and test coverage are all correctly assessed.

Verdict alignment

A used CHANGES_REQUESTED driven by the DCO email mismatch. That is consistent: the DCO check is a required status that blocks merge, and the fix is not a code edit — it requires the author to either add petera@pai.com as a verified GitHub address or amend the commits. CHANGES_REQUESTED is the appropriate signal.

Convergence

Aligned. A and B agree: the functional fix is correct, the cross-engine approach is sound, and the only outstanding item is the DCO sign-off email. The $ensureArtifactDir return-value inconsistency is a non-blocking nit both A and B acknowledge. The joint recommendation is CHANGES_REQUESTED until the DCO concern is resolved. Note for bot-address-review.yml: the required change is not a code edit — it is a commit-metadata fix (amend both commits to Signed-off-by: Peter Amiri <peter@alurium.com>, or the author adds petera@pai.com to their GitHub verified emails). The bot should post a clear comment directing the human contributor rather than attempting a file edit.

bpamiri added 2 commits May 12, 2026 07:36
… pattern

Capture mkdirs() return value and re-verify with directoryExists before
throwing, matching the reference implementation in ManifestCache.$ensureDir.
The surrounding try/catch in $captureFailureArtifacts still swallows the
throw to preserve best-effort artifact capture semantics, but the throw
now produces a diagnosable log entry before the swallow when a permission-
denied or filesystem failure occurs.

Signed-off-by: Peter Amiri <peter@alurium.com>
Resolves CHANGELOG.md conflict by keeping both Unreleased Fixed entries
(#2613 and #2614) in numeric order. McpServer.cfc auto-merged cleanly —
the #2617 mid() fix lives in a different function from the directoryCreate
fix from this PR.

Signed-off-by: Peter Amiri <peter@alurium.com>
@wheels-bot
Copy link
Copy Markdown
Contributor

wheels-bot Bot commented May 12, 2026

Wheels Bot — Address Review (round 1)

Consensus from Reviewer A and Reviewer B (converged at ed4ce696d):

  1. $ensureArtifactDir return-value check missing from vendor/wheels/wheelstest/BrowserTest.cfc — already resolved by the author in commit f2890e9c5 (refactor(test): align $ensureArtifactDir with ManifestCache canonical pattern). The mkdirs() return value is now captured and re-verified with directoryExists, matching ManifestCache.$ensureDir.

  2. DCO sign-off email mismatch on commits 71816cc85 and ed4ce696d — skipped: cannot be applied by a code commit. Per CONTRIBUTING.md § DCO, the Signed-off-by: email must match the author email. Both commits show Author: Peter Amiri <peter@alurium.com> paired with Signed-off-by: Peter Amiri <petera@pai.com>. The bot cannot rewrite branch history under the wheels-bot rails (no force-push, no history rewrites on shared branches), so resolution requires author action from @bpamiri:

    • Option A — add petera@pai.com as a verified email on the GitHub account so the existing sign-offs become DCO-valid, or
    • Option Bgit rebase --signoff develop on this branch and force-push, replacing the trailers with Signed-off-by: Peter Amiri <peter@alurium.com>.

    Note: the most recent commit on the branch (f2890e9c5) and the develop merge (44902d3b8) already carry the correct sign-off — only the two earlier commits need adjustment.

No new commits pushed in this round. The convergence loop will resume once the DCO is resolved; if Option A is taken, a fresh Reviewer A run on the same SHA should suffice.

Copy link
Copy Markdown
Contributor

@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 merge commit (44902d3b) brings no functional code change -- it only syncs the PR branch with develop. The substantive fix (routing directoryCreate(path, true) through java.io.File.mkdirs() in both BrowserTest and McpServer) is correct, cross-engine clean, and well-tested. One required-status-check blocker remains from the previous review cycle: two of the three code commits still carry a Signed-off-by email that does not match the git author email, meaning the DCO GitHub App check will fail and prevent merging.


Correctness

DCO sign-off mismatch -- commits 71816cc8 and ed4ce696 (required status check blocks merge)

# 71816cc854 -- fix(test): route browser-test artifact dir creation through File.mkdirs()
Author:         Peter Amiri <peter@alurium.com>
Signed-off-by:  Peter Amiri <petera@pai.com>   <- mismatch

# ed4ce696d1 -- refactor(test): tighten browser-test artifact dir fix per review feedback
Author:         Peter Amiri <peter@alurium.com>
Signed-off-by:  Peter Amiri <petera@pai.com>   <- mismatch

Commit f2890e9c5 (the most-recent code commit) already corrected this -- its sign-off reads peter@alurium.com -- but the two earlier commits were not amended to match. The DCO GitHub App is a required status check on every PR; it validates every commit, not just the tip. With two mismatched commits in the history the check will fail and block the merge.

Fix (one of):

  • Rebase and amend 71816cc8 and ed4ce696 to use Signed-off-by: Peter Amiri <peter@alurium.com>, or
  • Add petera@pai.com as a verified email on the GitHub account so the DCO App accepts it.

Conventions

BrowserTestArtifactDirSpec.cfc lines 6-7: two-line comment block (minor nit)

// Regression for #2614 -- Adobe CF rejects directoryCreate(path, true);
// $ensureArtifactDir routes through java.io.File.mkdirs() instead.

CLAUDE.md: "Never write multi-paragraph docstrings or multi-line comment blocks -- one short line max." The content is a single thought and compresses cleanly:

// Regression for #2614: Adobe CF rejects directoryCreate(path, true); routes through File.mkdirs() instead.

Not a blocker, but the prior review cycle already trimmed a 10-line block to reach this 2-line remnant -- finishing the trim is the obvious follow-up.


Cross-engine

No new cross-engine concerns. java.io.File.mkdirs() is JDK-level and works identically on Lucee, Adobe CF, and BoxLang -- confirmed by .ai/wheels/cross-engine-compatibility.md section "DirectoryCreate() Second Argument Is Lucee-Only" (lines 151-165), which prescribes this exact workaround. The single-argument DirectoryCreate(existingDir) used in the spec's setup is also Adobe-safe.


Tests

BrowserTestArtifactDirSpec extends wheels.WheelsTest (BDD syntax, not RocketUnit), covers the two meaningful paths (deeply-nested parents, already-exists no-op), uses CreateUUID() to avoid cross-run collisions, and cleans up via finally. The ##2614 escape in the it() label correctly avoids the "Invalid Syntax Closing [#] not found" crash documented in CLAUDE.md.


Commits

Three code commits. All subjects pass commitlint (types fix / refactor, scope test, headers 76/73/82 chars, not ALL-CAPS). DCO sign-off concern on two commits is noted above under Correctness.

…DE.md

Reviewer A flagged the remaining 2-line block as one thought; folding
it into a single line completes the trim from round 1.

Signed-off-by: Peter Amiri <peter@alurium.com>
@wheels-bot
Copy link
Copy Markdown
Contributor

wheels-bot Bot commented May 12, 2026

Wheels Bot — Reviewer B (round 1)

A's review on 44902d3b is accurate and well-reasoned. The contributor resolved A's nit independently before B ran — commit d4b11e3fa2d9 collapses the 2-line comment block to one line with the correct sign-off — so the only outstanding item is the DCO email mismatch on two commits, which A correctly flags as a merge blocker.

Sycophancy

None detected. A leads with the real blocking issue (DCO) before acknowledging the fix is correct. CHANGES_REQUESTED is consistent with the findings.

False positives

None detected. Both claims verified against the commit API:

  • DCO mismatch on 71816cc85 and ed4ce696d: Both commits show Author: Peter Amiri <peter@alurium.com> paired with Signed-off-by: Peter Amiri <petera@pai.com>. The emails differ. A's characterization is accurate.
  • BrowserTestArtifactDirSpec.cfc 2-line comment block: The diff confirms the 2-line block was present in 44902d3b (the SHA A reviewed). A's claim was accurate at review time. Commit d4b11e3fa2d9 landed after A's review and resolves this without bot involvement.

Missed issues

Timing note only: the nit was resolved by the contributor before B ran

Commit d4b11e3fa2d9e166... is the current branch head and carries the correct sign-off email. No other issues found. Cross-engine correctness (java.io.File.mkdirs() is JDK-level — confirmed by the diff), test coverage (2 BDD specs, correct ##2614 escape), commitlint (all 5 commits pass — types fix/refactor/refactor/merge/docs, subjects under 100 chars, not ALL-CAPS), and the merge commit's own sign-off (peter@alurium.com — correct) are all clean.

Verdict alignment

A's CHANGES_REQUESTED is consistent with the DCO finding. The DCO GitHub App validates every commit in the PR, not just the tip; two mismatched commits block the merge regardless of how clean the rest of the history is.

Convergence

Aligned. A and B agree: the functional fix is correct, the comment nit has been resolved independently by the contributor, and the only outstanding item is the DCO email mismatch on 71816cc85 and ed4ce696d. The joint recommendation is CHANGES_REQUESTED until DCO is resolved. Note for bot-address-review.yml: no code change is needed — the nit is already addressed in d4b11e3fa; the DCO issue requires contributor action (add petera@pai.com as a verified email on the GitHub account, or rebase both commits to correct the Signed-off-by trailer to peter@alurium.com).

Copy link
Copy Markdown
Contributor

@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 d4b11e3fa commit correctly resolves the last nit from round 3 — the 2-line spec comment is now a single line, matching CLAUDE.md's "one short line max" rule. The functional fix (routing directoryCreate(path, true) through java.io.File.mkdirs() in both BrowserTest and McpServer) remains correct, cross-engine clean, and well-tested. One blocker from rounds 2 and 3 is still unresolved: two of the four code commits carry a Signed-off-by email that does not match the git author email. CONTRIBUTING.md § DCO states the DCO GitHub App is a required status check that validates every commit; until those two commits are corrected, the merge is at risk.


Correctness

DCO sign-off mismatch — commits 71816cc8 and ed4ce696 (third consecutive round flagging this)

Both commits carry petera@pai.com in the trailer but peter@alurium.com as the author, unchanged from rounds 2 and 3:

# 71816cc854 — fix(test): route browser-test artifact dir creation through File.mkdirs()
Author:         Peter Amiri <peter@alurium.com>
Signed-off-by:  Peter Amiri <petera@pai.com>   ← mismatch

# ed4ce696d1 — refactor(test): tighten browser-test artifact dir fix per review feedback
Author:         Peter Amiri <peter@alurium.com>
Signed-off-by:  Peter Amiri <petera@pai.com>   ← mismatch

Commits f2890e9c5 and d4b11e3fa both use peter@alurium.com correctly — the fix is known. Per CONTRIBUTING.md § DCO:

The DCO GitHub App runs as a required status check on every PR. It verifies that every commit in the PR carries a valid Signed-off-by trailer and blocks merge if any are missing.

Fix (one of):

  • Rebase and amend 71816cc8 and ed4ce696 to use Signed-off-by: Peter Amiri <peter@alurium.com>, or
  • Add petera@pai.com as a verified email on the GitHub account so the DCO App accepts it.

Commits

New commit d4b11e3fa (docs(test): collapse two-line regression comment to one line per CLAUDE.md): type docs, scope test, subject 58 chars, not ALL-CAPS — passes commitlint. DCO sign-off on this commit matches (peter@alurium.com). The mismatch concerns on 71816cc8 and ed4ce696 are noted under Correctness.


Cross-engine

No new cross-engine concerns. java.io.File.mkdirs() is JDK-level and works identically on Lucee, Adobe CF, and BoxLang. The single-argument DirectoryCreate(existingDir) used in the spec setup is also Adobe-safe.

@wheels-bot
Copy link
Copy Markdown
Contributor

wheels-bot Bot commented May 12, 2026

Wheels Bot — Address Review (round 2)

Reviewer A and Reviewer B converged on d4b11e3fa with the same outstanding item flagged in round 1: the DCO Signed-off-by email on commits 71816cc85 and ed4ce696d (petera@pai.com) does not match the author email (peter@alurium.com). All other commits on this branch — including the contributor's voluntary follow-up d4b11e3fa (which independently collapsed the 2-line comment block A had flagged) and the develop merge 44902d3b8 — already carry the correct sign-off.

No commit pushed in this round:

  • CLAUDE.md comment-block nit — already resolved by the author in d4b11e3fa before this round ran. Nothing to apply.
  • DCO email mismatch on 71816cc85 and ed4ce696d — skipped: not actionable by the bot. The wheels-bot rails forbid history rewrites and force-pushes on shared branches, so the bot cannot retroactively correct the Signed-off-by: trailer on already-pushed commits. Resolution requires author action from @bpamiri — either:
    • Option A — add petera@pai.com to the verified emails on your GitHub account, which makes the existing sign-offs DCO-valid, or
    • Option Bgit rebase --signoff origin/develop on this branch and force-push, replacing the two trailers with Signed-off-by: Peter Amiri <peter@alurium.com>.

Handing back to humans. The convergence loop will resume once a new SHA appears (Option B) or once the DCO check re-runs and passes (Option A); a fresh Reviewer A run will pick it up automatically.

@bpamiri bpamiri merged commit 7cdb036 into develop May 12, 2026
6 checks passed
@bpamiri bpamiri deleted the claude/vigorous-lovelace-4d1e82 branch May 12, 2026 15:24
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.

Core tests fail on Adobe ColdFusion: DirectoryCreate() called with unsupported arguments in BrowserTest.cfc

1 participant