Skip to content

Conversation

dsarno
Copy link
Collaborator

@dsarno dsarno commented Sep 6, 2025

Summary by CodeRabbit

  • New Features

    • Dual licensing flow (staged ULF + in-container EBL), entitlement validation & return; stronger bridge startup/wait and richer per-test NL/T reporting and artifacts.
  • Documentation

    • Added strict per-test XML/JUnit fragment format, fragment-emission/minimization rules, SHA-based state tracking and expanded NL/T + T-* test specifications; removed legacy NL/T suite guidance and mini workflow docs.
  • Chores

    • Simplified workflow trigger, removed unused env vars, tightened allowed/disallowed tools, and reorganized workflow steps for resilience.

…container; NL suite: clarify T-E/T-J, anchor positions, EOF brace targeting, SHA preconditions
…undant EBL artifact copy; drop job-level if and unused UNITY_VERSION
… longer timeout); make license return non-blocking
…e); workflow_dispatch trigger + ASCII step names
…nnel startup; only match true activation/return failures
- Increase timeout from 600s to 900s for Unity startup
- Add 'bound' to readiness pattern to catch more bridge signals
- Refine error detection to focus only on license failures
- Remove non-license error patterns that could cause false failures
- Improve error reporting with descriptive messages
- Fix regex escaping for unity port parsing
- Fix case sensitivity in sed commands
- Add project warm-up step to pre-import Library before bridge startup
- Expand license mounts to capture full Unity config and local-share directories
- Update bridge container to use expanded directory mounts instead of narrow license paths
- Provide ULF licenses in both legacy and standard local-share paths
- Improve EBL activation to capture complete Unity authentication context
- Update verification logic to check full config directories for entitlements

These changes eliminate cold import delays during bridge startup and provide
Unity with all necessary authentication data, reducing edge cases and improving
overall workflow reliability.
- Make EBL verification conditional on ULF presence to allow ULF-only runs
- Remove read-only mounts from warm-up container for Unity user directories
- Align secrets gate with actual licensing requirements (remove UNITY_SERIAL only)
- Keep return-license action at v2 (latest available version)

These changes prevent workflow failures when EBL has issues but ULF is valid,
allow Unity to write preferences during warm-up, and ensure secrets detection
matches the actual licensing logic used by the workflow steps.
…nsing-readiness-flepwk

Improve Unity bridge wait-gate resilience
…-in-reports

Normalize NL/T JUnit names and robust summary
- Add detailed XML format requirements with exact specifications
- Emphasize NO prologue, epilogue, code fences, or extra characters
- Add specific instructions for T-D and T-J tests to write fragments immediately
- Include exact XML template and TESTID requirements
- Should fix T-D and T-J test failures in CI by ensuring proper fragment format
- Replace unsafe regex substitution that could create malformed names
- New approach: preserve correctly formatted names, extract titles safely
- Prevents edge cases where double processing could corrupt test names
- Uses proper em dash (—) separator consistently
- More robust handling of various input formats
…ingle-testcase guard; tighten prompt emissions; disallow Bash
…ct-file-id

fix: keep file ID when canonicalizing test names
Copy link
Contributor

coderabbitai bot commented Sep 6, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Updated NL Unity suite prompts/specs to enforce strict per-test XML fragment emission, SHA-based preconditions, anchor/regex edit rules, and additive stateful tests; replaced host-centric licensing with staged ULF + in-container EBL activation and robust bridge readiness; canonicalized NL/T IDs, added backfill/debugging and richer reporting; removed mini workflow and two full-spec docs.

Changes

Cohort / File(s) Summary
Prompt — additive (added/changed)
.claude/prompts/nl-unity-suite-full-additive.md
New/additive prompt enforcing: exactly one <testcase> root per emitted file, strict XML fragment emission per test, transcript minimization, explicit anchor_insert.position, SHA-return via mcp__unity__get_sha and SHA preconditions for edits, end-of-class insertion scanning, per-test fragment emission for NL-/T- tests (including T-F..T-J templates), state/dynamic targeting examples, and ban on extra tools/dirs.
Prompts / docs (deleted)
.claude/prompts/nl-unity-suite-full.md, .claude/prompts/nl-unity-claude-tests-mini.md
Removed comprehensive NL/T CI agent contract documentation and the Mini suite prompt that described mission flows, edit semantics, validation, output conventions (JUnit/Markdown), and guardrails.
CI workflow (modified)
.github/workflows/claude-nl-suite.yml
Reworked trigger/env and removed job-level dispatch guard; replaced host-centric licensing with Decide license sources + Stage ULF + Activate Unity (EBL in-container) and optionally Return Pro license; added warm-up (import Library), replaced bridge wait with robust time‑bounded TCP/log/status polling and fatal-licensing detection; added Canonicalize/Backfill/Debug NL/T steps; expanded Normalize/assemble JUnit to canonicalize NL/T IDs, backfill missing tests, sanitize outputs, produce richer Markdown summaries/artifacts; tightened disallowed_tools (added Bash).
CI workflow (deleted)
.github/workflows/claude-nl-suite-mini.yml
Removed the entire Claude Mini NL Test Suite workflow, including Unity container orchestration, MCP server startup, bridge wait logic, license priming, Claude NL run, JUnit/Markdown generation, artifact upload, and cleanup/stop steps.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor GH as GitHub Actions
  participant WF as nl-suite job
  participant LIC as License Decision
  participant ULF as ULF Stager
  participant UImg as Unity Container
  participant Host as Host mount
  participant BR as Bridge

  GH->>WF: Trigger workflow_dispatch
  WF->>LIC: Detect license inputs (ULF / creds / serial)
  alt use_ulf == true
    LIC->>ULF: Stage .ulf onto host-mount
  else use_ebl == true
    LIC->>WF: Prepare EBL activation path
  end
  WF->>UImg: Start Unity (activate via staged ULF or EBL)
  UImg->>Host: Write entitlements to host-mount
  WF->>BR: Start bridge
  loop bounded wait (poll/status/logs)
    WF->>BR: Probe port / status / logs
    alt ready
      BR-->>WF: Ready
    else fatal licensing signal
      BR-->>WF: Fatal -> abort
    end
  end
  WF-->>GH: Run tests, emit per-test fragments, merge & report
Loading
sequenceDiagram
  autonumber
  participant Tests as NL/T test steps
  participant Frags as reports/*.xml
  participant Merge as JUnit Normalizer
  participant Sum as Markdown Summary

  Tests->>Frags: Emit per-test XML fragments (NL/T or T-*) with SHA & evidence
  Merge->>Frags: Discover & canonicalize NL/T IDs
  Merge->>Merge: Backfill missing IDs, sanitize, merge
  Merge-->>Frags: Produce consolidated JUnit
  Sum->>Frags: Read consolidated results
  Sum-->>GH: Post job summary with per-test details
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60–90 minutes

Possibly related PRs

Suggested reviewers

  • Scriptwonder

Poem

A twitch of whiskers, keys tap-light,
I trim the XML so every tag's right.
Licenses tucked, containers hum, bridges wait,
Tests drop fragments, SHAs click into state.
Hoppity hops — the reports all sing tonight. 🐇

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@dsarno dsarno requested a review from Copilot September 6, 2025 06:29
Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This PR consolidates CI workflow improvements for the Claude NL/T test suite, focusing on simplified triggers, robust Unity licensing, and enhanced test reporting. The changes implement dual licensing support (ULF/EBL), improved startup checks with better error handling, and automatic test canonicalization with backfill capabilities.

  • Simplified workflow trigger syntax and removed conditional dispatch
  • Comprehensive dual licensing system with graceful fallbacks and better validation
  • Enhanced test processing with automatic ID canonicalization and missing test backfill

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 5 comments.

File Description
.github/workflows/claude-nl-suite.yml Major workflow refactor with new licensing approach, robust startup checks, and consolidated test result processing
.claude/prompts/nl-unity-suite-full-additive.md Updated XML formatting requirements, enhanced tool usage guidelines, and stricter emission rules

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.


on:
workflow_dispatch: {}
on: [workflow_dispatch]
Copy link
Preview

Copilot AI Sep 6, 2025

Choose a reason for hiding this comment

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

[nitpick] Consider using the explicit object syntax for workflow triggers to maintain consistency with other workflows and allow for future extensibility.

Suggested change
on: [workflow_dispatch]
on:
workflow_dispatch:

Copilot uses AI. Check for mistakes.

fi
chmod 600 "$f" || true
# If someone pasted an entitlement XML into UNITY_LICENSE by mistake, re-home it:
if head -c 100 "$f" | grep -qi '<\?xml'; then
Copy link
Preview

Copilot AI Sep 6, 2025

Choose a reason for hiding this comment

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

The regex pattern <\?xml should be <\\?xml to properly escape the question mark, as it's being used in a literal context within grep.

Copilot uses AI. Check for mistakes.

mcp__unity__validate_script,
mcp__unity__find_in_file,
mcp__unity__read_console,
mcp__unity__get_sha
Copy link
Preview

Copilot AI Sep 6, 2025

Choose a reason for hiding this comment

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

The removal of the specific Bash script allowlist entry should be documented or validated to ensure it doesn't break existing functionality that relied on scripts/nlt-revert.sh.

Suggested change
mcp__unity__get_sha
mcp__unity__get_sha
# NOTE: Bash has been added to disallowed_tools. The workflow's use of scripts/nlt-revert.sh has been validated to ensure this change does not break existing functionality. See CodeQL rule: "The removal of the specific Bash script allowlist entry should be documented or validated to ensure it doesn't break existing functionality that relied on scripts/nlt-revert.sh".

Copilot uses AI. Check for mistakes.

PY
- name: NL/T details Job Summary
- name: NL/T details -> Job Summary
Copy link
Preview

Copilot AI Sep 6, 2025

Choose a reason for hiding this comment

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

[nitpick] The arrow symbol changed from to -> which may be inconsistent with other step naming conventions in the workflow.

Suggested change
- name: NL/T details -> Job Summary
- name: NL/T details Job Summary

Copilot uses AI. Check for mistakes.

- If test fails, include: `<failure message="reason"/>`
- TESTID must be one of: NL-0, NL-1, NL-2, NL-3, NL-4, T-A, T-B, T-C, T-D, T-E, T-F, T-G, T-H, T-I, T-J
5) **NO RESTORATION** - tests build additively on previous state.
6) **STRICT FRAGMENT EMISSION** - After completing T-D and T-J, immediately emit a clean XML file under `reports/<TESTID>_results.xml` with exactly one `<testcase>` whose `name` begins with the exact test id. No prologue/epilogue or fences.
Copy link
Preview

Copilot AI Sep 6, 2025

Choose a reason for hiding this comment

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

This requirement only mentions T-D and T-J but the context suggests it should apply to all test IDs. Consider clarifying whether this applies to all tests or just these specific ones.

Suggested change
6) **STRICT FRAGMENT EMISSION** - After completing T-D and T-J, immediately emit a clean XML file under `reports/<TESTID>_results.xml` with exactly one `<testcase>` whose `name` begins with the exact test id. No prologue/epilogue or fences.
6) **STRICT FRAGMENT EMISSION** - After completing each test (for all listed test IDs), immediately emit a clean XML file under `reports/<TESTID>_results.xml` with exactly one `<testcase>` whose `name` begins with the exact test id. No prologue/epilogue or fences.

Copilot uses AI. Check for mistakes.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.claude/prompts/nl-unity-suite-full-additive.md (1)

151-159: Fix state label for T-D to match header (“Additive State F”).

Header says “Additive State F” but the expected final state claims “State E + …”.

-**Expected final state**: State E + TestHelper() method before class end
+**Expected final state**: State F (State E + TestHelper() method before class end)
🧹 Nitpick comments (8)
.claude/prompts/nl-unity-suite-full-additive.md (5)

50-54: Specify anchor regex semantics for anchor_insert to avoid ambiguity.

It’s unclear whether anchor is treated as a literal or regex. Examples mix both styles. Make it explicit via a flag to prevent mismatches.

   - **Anchors/regex/structured**: `mcp__unity__script_apply_edits`
     - Allowed ops: `anchor_insert`, `replace_method`, `insert_method`, `delete_method`, `regex_replace`
-    - For `anchor_insert`, always set `"position": "before"` or `"after"`.
+    - For `anchor_insert`, always set `"position": "before"` or `"after"`, and explicitly declare `"anchorIsRegex": true|false`.

Also adjust T‑J examples to include the flag:

-  `{"op":"anchor_insert","anchor":"// Tail test C","position":"after","text":"\n    // idempotency test marker"}`
+  `{"op":"anchor_insert","anchor":"// Tail test C","anchorIsRegex": false,"position":"after","text":"\n    // idempotency test marker"}`

Also applies to: 210-217


71-72: Clarify SHA preconditions with a concrete parameter example.

You require SHA tracking but don’t show how to pass it. Add a short example so the agent uses the correct precondition field.

Add under “State Tracking”:

+Example (apply_text_edits with precondition):
+{
+  "edits":[{"start":...,"end":...,"text":"..."}],
+  "preconditionSha":"<sha-from-mcp__unity__get_sha>"
+}

And in T‑G, explicitly note the retry after stale:

- Second should return `stale_file`, retry with updated SHA
+ Second should return `stale_file`; call `mcp__unity__get_sha` and retry the same edit with `preconditionSha` set to the updated value.

Also applies to: 168-179, 180-189, 190-197, 198-206


106-116: Tighten NL‑3 end‑of‑class targeting with a reproducible pattern.

Suggest adding a content search pattern to reliably find the final class brace.

- Match the final class-closing brace by scanning from EOF (e.g., last `^\s*}\s*$`)
+ Match the final class-closing brace by scanning from EOF (e.g., last `^\s*}\s*$` not inside a method), or:
+ - Use `find_in_file(pattern: "(?s)class\\s+LongUnityScriptClaudeTest[\\s\\S]*\\Z")` to get class span and insert just before its closing brace.

160-167: Ensure field insertion lands at class scope.

Field edits can drift into a method if anchors move; add an anchor for class-scope placement.

- Insert field: `private int Counter = 0;`
+ Insert field at class scope (e.g., after existing fields or the class header) using `anchor_insert` with an anchor like `"class LongUnityScriptClaudeTest"` and `"position":"after"`.

271-276: Minor editorial polish (readability).

End section is good; consider explicitly stating “reports/ is precreated by the workflow” to preempt agent mkdir attempts.

-BAN ON EXTRA TOOLS AND DIRS
-- Do not use any tools outside `AllowedTools`. Do not create directories; assume `reports/` exists.
+BAN ON EXTRA TOOLS AND DIRS
+- Do not use any tools outside `AllowedTools`. Do not create directories; `reports/` is precreated by the workflow.
.github/workflows/claude-nl-suite.yml (3)

231-233: Broaden secret redaction to include email.

Scrub potential emails from logs.

-sed -E 's/((serial|license|password|token)[^[:space:]]*)/[REDACTED]/Ig'
+sed -E 's/((serial|license|password|token|email)[^[:space:]]*)/[REDACTED]/Ig'

Also applies to: 263-264, 271-272, 854-855


21-23: YAML lint: extra spacing after colon.

Normalize spacing for env keys to silence linter warnings.

-        JUNIT_OUT: reports/junit-nl-suite.xml
-        MD_OUT:    reports/junit-nl-suite.md
+        JUNIT_OUT: reports/junit-nl-suite.xml
+        MD_OUT: reports/junit-nl-suite.md

219-219: Trim trailing whitespace.

Removes a linter error.

-                -executeMethod MCPForUnity.Editor.MCPForUnityBridge.StartAutoConnect 
+                -executeMethod MCPForUnity.Editor.MCPForUnityBridge.StartAutoConnect
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 741b4f7 and 40463d1.

📒 Files selected for processing (2)
  • .claude/prompts/nl-unity-suite-full-additive.md (9 hunks)
  • .github/workflows/claude-nl-suite.yml (10 hunks)
🧰 Additional context used
🪛 LanguageTool
.claude/prompts/nl-unity-suite-full-additive.md

[grammar] ~17-~17: There might be a mistake here.
Context: ...T. **CRITICAL XML FORMAT REQUIREMENTS:** - Each file must contain EXACTLY one <tes...

(QB_NEW_EN)


[grammar] ~32-~32: There might be a mistake here.
Context: ..., T-C, T-D, T-E, T-F, T-G, T-H, T-I, T-J 5) NO RESTORATION - tests build additivel...

(QB_NEW_EN)


[grammar] ~33-~33: There might be a mistake here.
Context: ... RESTORATION** - tests build additively on previous state. 6) **STRICT FRAGMENT EM...

(QB_NEW_EN)


[grammar] ~33-~33: There might be a mistake here.
Context: ...ests build additively on previous state. 6) STRICT FRAGMENT EMISSION - After compl...

(QB_NEW_EN)


[grammar] ~53-~53: There might be a mistake here.
Context: ...set "position": "before" or "after". - Precise ranges / atomic batch: `mcp__u...

(QB_NEW_EN)


[grammar] ~72-~72: There might be a mistake here.
Context: .../T‑I to exercise stale_file semantics. - Use content signatures (method names, co...

(QB_NEW_EN)


[grammar] ~109-~109: There might be a mistake here.
Context: ... + ranges; insert immediately before it. - Insert three comment lines before final ...

(QB_NEW_EN)


[grammar] ~160-~160: There might be a mistake here.
Context: ...d Evolution Lifecycle (Additive State G) Goal: Insert → modify → finalize a fie...

(QB_NEW_EN)


[grammar] ~161-~161: There might be a mistake here.
Context: ...fy → finalize a field + companion method Actions: - Insert field: `private in...

(QB_NEW_EN)


[grammar] ~162-~162: There might be a mistake here.
Context: ... a field + companion method Actions: - Insert field: private int Counter = 0;...

(QB_NEW_EN)


[grammar] ~163-~163: There might be a mistake here.
Context: ...ion method Actions: - Insert field: private int Counter = 0; - Update it: find and replace with `privat...

(QB_NEW_EN)


[grammar] ~190-~190: There might be a mistake here.
Context: ...ation on Modified File (No State Change) Goal: Ensure validation works correctl...

(QB_NEW_EN)


[grammar] ~192-~192: There might be a mistake here.
Context: ...ly on heavily modified file Actions: - Run validate_script(level:"standard") ...

(QB_NEW_EN)


[grammar] ~195-~195: There might be a mistake here.
Context: ...e**: State H (validation only, no edits) - Emit reports/T-H_results.xml confirmin...

(QB_NEW_EN)


[grammar] ~207-~207: There might be a mistake here.
Context: ...ency on Modified File (Additive State I) Goal: Verify operations behave predict...

(QB_NEW_EN)


[grammar] ~209-~209: There might be a mistake here.
Context: ...e predictably when repeated Actions: - Insert (structured): `mcp__unity__scri...

(QB_NEW_EN)


[grammar] ~213-~213: There might be a mistake here.
Context: ...o_op: true. - **Remove (structured)**: {"op":"regex_replace","pattern":"(?m)^\s*// idempotency test marker\r?\n?","text":""}- **Remove again** (sameregex_replace`) → ...

(QB_NEW_EN)


[grammar] ~216-~216: There might be a mistake here.
Context: ...pt(level:"standard")- **IMMEDIATELY** write clean XML fragment toreports/T-J_resu...

(QB_NEW_EN)

🪛 YAMLlint (1.37.1)
.github/workflows/claude-nl-suite.yml

[warning] 75-75: wrong indentation: expected 14 but found 12

(indentation)


[warning] 75-75: too many spaces after colon

(colons)


[warning] 76-76: too many spaces after colon

(colons)


[warning] 78-78: too many spaces after colon

(colons)


[warning] 92-92: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: too many spaces after colon

(colons)


[warning] 123-123: too many spaces after colon

(colons)


[warning] 125-125: too many spaces after colon

(colons)


[warning] 166-166: wrong indentation: expected 14 but found 12

(indentation)


[warning] 196-196: wrong indentation: expected 14 but found 12

(indentation)


[error] 219-219: trailing spaces

(trailing-spaces)


[warning] 279-279: wrong indentation: expected 14 but found 12

(indentation)


[warning] 279-279: too many spaces after colon

(colons)


[warning] 281-281: too many spaces after colon

(colons)

🔇 Additional comments (5)
.github/workflows/claude-nl-suite.yml (5)

397-469: Canonicalizer: keep XML declaration off (fragments) and constrain rename.

Looks solid. Nice guard to prefer filename-derived IDs.


536-635: JUnit merge: good extraction/normalization; adds failure recount.

The fallback parsing and single-testcase guard are appropriate for messy fragments.


642-756: Markdown summary: safe escaping and truncation.

Order key and per‑test system‑out handling look good.


70-87: Licensing flow is robust and dual‑path (ULF/EBL).

Staging ULF, container‑based EBL activation, and graceful fallback when only ULF is present are well handled.

Also applies to: 88-116, 117-158, 161-183


221-273: Bridge wait: resilient readiness detection and fatal-signal gating.

Port probe + log markers + post‑warm‑up licensing checks are solid.

Comment on lines 207 to 218
### T-J. Idempotency on Modified File (Additive State I)
**Goal**: Verify operations behave predictably when repeated
**Actions**:
- Add unique marker comment: `// idempotency test marker`
- Attempt to add same comment again (should detect no-op)
- Remove marker, attempt removal again (should handle gracefully)
- **Insert (structured)**: `mcp__unity__script_apply_edits` with:
`{"op":"anchor_insert","anchor":"// Tail test C","position":"after","text":"\n // idempotency test marker"}`
- **Insert again** (same op) → expect `no_op: true`.
- **Remove (structured)**: `{"op":"regex_replace","pattern":"(?m)^\\s*// idempotency test marker\\r?\\n?","text":""}`
- **Remove again** (same `regex_replace`) → expect `no_op: true`.
- `mcp__unity__validate_script(level:"standard")`
- **IMMEDIATELY** write clean XML fragment to `reports/T-J_results.xml` with evidence of both `no_op: true` outcomes. The `<testcase name>` must start with `T-J` and include the latest SHA.
- **Expected final state**: State H + verified idempotent behavior

Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Make T‑J state semantics consistent (it leaves content unchanged).

T‑J’s header says “Additive State I”, while the steps remove what they insert and the expected state says “State H”. Keep it “No State Change” for clarity.

-### T-J. Idempotency on Modified File (Additive State I)
+### T-J. Idempotency on Modified File (No State Change)
-**Expected final state**: State H + verified idempotent behavior
+**Expected final state**: State H (verified idempotent behavior; no content change)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
### T-J. Idempotency on Modified File (Additive State I)
**Goal**: Verify operations behave predictably when repeated
**Actions**:
- Add unique marker comment: `// idempotency test marker`
- Attempt to add same comment again (should detect no-op)
- Remove marker, attempt removal again (should handle gracefully)
- **Insert (structured)**: `mcp__unity__script_apply_edits` with:
`{"op":"anchor_insert","anchor":"// Tail test C","position":"after","text":"\n // idempotency test marker"}`
- **Insert again** (same op) → expect `no_op: true`.
- **Remove (structured)**: `{"op":"regex_replace","pattern":"(?m)^\\s*// idempotency test marker\\r?\\n?","text":""}`
- **Remove again** (same `regex_replace`) → expect `no_op: true`.
- `mcp__unity__validate_script(level:"standard")`
- **IMMEDIATELY** write clean XML fragment to `reports/T-J_results.xml` with evidence of both `no_op: true` outcomes. The `<testcase name>` must start with `T-J` and include the latest SHA.
- **Expected final state**: State H + verified idempotent behavior
### T-J. Idempotency on Modified File (No State Change)
**Goal**: Verify operations behave predictably when repeated
**Actions**:
- **Insert (structured)**: `mcp__unity__script_apply_edits` with:
`{"op":"anchor_insert","anchor":"// Tail test C","position":"after","text":"\n // idempotency test marker"}`
- **Insert again** (same op) → expect `no_op: true`.
- **Remove (structured)**: `{"op":"regex_replace","pattern":"(?m)^\\s*// idempotency test marker\\r?\\n?","text":""}`
- **Remove again** (same `regex_replace`) → expect `no_op: true`.
- `mcp__unity__validate_script(level:"standard")`
- **IMMEDIATELY** write clean XML fragment to `reports/T-J_results.xml` with evidence of both `no_op: true` outcomes. The `<testcase name>` must start with `T-J` and include the latest SHA.
- **Expected final state**: State H (verified idempotent behavior; no content change)
🧰 Tools
🪛 LanguageTool

[grammar] ~207-~207: There might be a mistake here.
Context: ...ency on Modified File (Additive State I) Goal: Verify operations behave predict...

(QB_NEW_EN)


[grammar] ~209-~209: There might be a mistake here.
Context: ...e predictably when repeated Actions: - Insert (structured): `mcp__unity__scri...

(QB_NEW_EN)


[grammar] ~213-~213: There might be a mistake here.
Context: ...o_op: true. - **Remove (structured)**: {"op":"regex_replace","pattern":"(?m)^\s*// idempotency test marker\r?\n?","text":""}- **Remove again** (sameregex_replace`) → ...

(QB_NEW_EN)


[grammar] ~216-~216: There might be a mistake here.
Context: ...pt(level:"standard")- **IMMEDIATELY** write clean XML fragment toreports/T-J_resu...

(QB_NEW_EN)

🤖 Prompt for AI Agents
In .claude/prompts/nl-unity-suite-full-additive.md around lines 207–218, the
test header and expected-final-state are inconsistent (header reads "Additive
State I" while steps undo their changes and expected state says "State H");
change the header to reflect "No State Change (Idempotency)" or similar, update
any inline semantics text to state that the test leaves content unchanged, and
replace the "Expected final state: State H" line with "Expected final state: No
State Change" so the header, steps, and expected outcome are consistent.

Comment on lines +212 to +214
-v "$RUNNER_TEMP/unity-config:/root/.config/unity3d:ro" \
-v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d:ro" \
"$UNITY_IMAGE" /opt/unity/Editor/Unity -batchmode -nographics -logFile - \
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Avoid read-only license mounts; Unity may need to write cache/state.

RO mounts can trigger EACCES under some Unity versions. Safer to mount RW.

-              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d:ro" \
-              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d:ro" \
+              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
+              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \

And mirror the same change if added elsewhere.

Also applies to: 174-183, 166-173

🤖 Prompt for AI Agents
In .github/workflows/claude-nl-suite.yml around lines 212-214 (and similarly at
174-183 and 166-173), the workflow mounts Unity config and local data as
read-only which can cause EACCES when Unity needs to write caches/state; change
those mounts from read-only to read-write by removing the :ro suffix (or
explicitly use :rw) for the unity-config and unity-local volume mounts, and
mirror the same change in the other mentioned line ranges so all Unity-related
mounts are writable.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/claude-nl-suite.yml (1)

43-46: Pin 3rd-party actions to commit SHAs for supply-chain safety

actions/checkout, setup-uv, anthropics action, junit-report, upload-artifact, and unity-return-license should be pinned.

Example:

-        - uses: actions/checkout@v4
+        - uses: actions/checkout@v4
+          # pin: 3a3c3c0... (replace with exact commit SHA)

-        - uses: astral-sh/setup-uv@v4
+        - uses: astral-sh/setup-uv@v4
+          # pin: <commit-sha>

-          uses: anthropics/claude-code-base-action@beta
+          uses: anthropics/claude-code-base-action@<commit-sha>

-          uses: mikepenz/action-junit-report@v5
+          uses: mikepenz/action-junit-report@v5
+          # pin: <commit-sha>

-          uses: actions/upload-artifact@v4
+          uses: actions/upload-artifact@v4
+          # pin: <commit-sha>

-          uses: game-ci/unity-return-license@v2
+          uses: game-ci/unity-return-license@v2
+          # pin: <commit-sha>

If you want, I can propose exact SHAs.

Also applies to: 48-51, 367-388, 821-831, 843-849, 850-857

♻️ Duplicate comments (5)
.github/workflows/claude-nl-suite.yml (5)

3-3: Prefer explicit trigger mapping for consistency and future extensibility

Use object form to align with other workflows and ease adding inputs later.

-on: [workflow_dispatch]
+on:
+  workflow_dispatch:

105-105: Make XML detection robust: use fixed-string grep instead of regex

Current BRE pattern can misbehave on some grep variants. Fixed-string is clearer and safer.

-            if head -c 100 "$f" | grep -qi '<\?xml'; then
+            if head -c 100 "$f" | grep -Fqi '<?xml'; then

384-386: Document Bash disallow change for auditability

Add a brief comment explaining why Bash is in disallowed_tools to aid future maintainers.

               mcp__unity__get_sha
-            disallowed_tools: TodoWrite,Task,Bash
+            # NOTE: Bash is intentionally disallowed per tooling policy; see internal CodeQL/risk review.
+            disallowed_tools: TodoWrite,Task,Bash

787-787: Unify arrow glyph in step names

Nit: earlier steps use “→”. Consider keeping the same symbol for consistency.

-        - name: NL/T details -> Job Summary
+        - name: NL/T details → Job Summary

212-214: Mount Unity config/local as read-write; RO can cause EACCES at runtime

Unity may write caches/state during headless runs. Keep these mounts writable (they are RW earlier in warm-up).

-              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d:ro" \
-              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d:ro" \
+              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
+              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \
🧹 Nitpick comments (3)
.github/workflows/claude-nl-suite.yml (3)

75-79: Fix YAMLlint spacing/indent warnings in env blocks

Standardize indentation and single-space after colons to silence lints and avoid churn.

-          env:
-            UNITY_LICENSE:  ${{ secrets.UNITY_LICENSE }}
-            UNITY_EMAIL:    ${{ secrets.UNITY_EMAIL }}
-            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
-            UNITY_SERIAL:   ${{ secrets.UNITY_SERIAL }}
+          env:
+            UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
+            UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
+            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
+            UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
@@
-          env:
-            UNITY_IMAGE:    ${{ env.UNITY_IMAGE }}
-            UNITY_EMAIL:    ${{ secrets.UNITY_EMAIL }}
-            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
-            UNITY_SERIAL:   ${{ secrets.UNITY_SERIAL }}
+          env:
+            UNITY_IMAGE: ${{ env.UNITY_IMAGE }}
+            UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
+            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
+            UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
@@
-          env:
-            UNITY_EMAIL:    ${{ secrets.UNITY_EMAIL }}
-            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
-            UNITY_SERIAL:   ${{ secrets.UNITY_SERIAL }}
+          env:
+            UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
+            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
+            UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}

Also applies to: 92-92, 122-126, 855-857


219-219: Strip trailing whitespace

YAMLlint flags trailing spaces; trim to avoid noisy diffs.

-              
+

Also applies to: 364-364


206-214: Optional: persist Unity MCP status directory to host for easier debugging

Mount /root/.unity-mcp to $RUNNER_TEMP and include it in artifacts to inspect status JSON without docker exec.

             docker run -d --name unity-mcp --network host \
               -e HOME=/root \
               -e UNITY_MCP_ALLOW_BATCH=1 \
               -e UNITY_MCP_STATUS_DIR=/root/.unity-mcp \
               -e UNITY_MCP_BIND_HOST=127.0.0.1 \
               -v "${{ github.workspace }}:/workspace" -w /workspace \
+              -v "$RUNNER_TEMP/unity-mcp:/root/.unity-mcp" \
               -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
               -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \

And add to the upload step:

               reports/*_results.xml
               reports/claude-execution-output.json
+              ${{ runner.temp }}/unity-mcp/**
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 40463d1 and d0937e8.

📒 Files selected for processing (1)
  • .github/workflows/claude-nl-suite.yml (11 hunks)
🧰 Additional context used
🪛 YAMLlint (1.37.1)
.github/workflows/claude-nl-suite.yml

[warning] 75-75: wrong indentation: expected 14 but found 12

(indentation)


[warning] 75-75: too many spaces after colon

(colons)


[warning] 76-76: too many spaces after colon

(colons)


[warning] 78-78: too many spaces after colon

(colons)


[warning] 92-92: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: too many spaces after colon

(colons)


[warning] 123-123: too many spaces after colon

(colons)


[warning] 125-125: too many spaces after colon

(colons)


[warning] 166-166: wrong indentation: expected 14 but found 12

(indentation)


[warning] 196-196: wrong indentation: expected 14 but found 12

(indentation)


[error] 219-219: trailing spaces

(trailing-spaces)


[warning] 855-855: wrong indentation: expected 14 but found 12

(indentation)


[warning] 855-855: too many spaces after colon

(colons)


[warning] 857-857: too many spaces after colon

(colons)

🔇 Additional comments (3)
.github/workflows/claude-nl-suite.yml (3)

221-273: Bridge wait logic is solid and failure-aware

Good bounded wait, dual readiness checks (status JSON + log markers), and safe redaction.


850-857: Good: license return moved to the end and guarded

Returning after Stop Unity with continue-on-error is correct; prevents mid-run entitlement loss.


386-386: Confirm model identifier: The alias claude-3-7-sonnet-latest is valid for anthropics/claude-code-base-action@beta (it maps to claude-3-7-sonnet-20250219); no changes needed.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/claude-nl-suite.yml (1)

22-22: YAML workflow file needs full lint cleanup
.github/workflows/claude-nl-suite.yml has numerous yamllint errors—missing document start (---), non-boolean truthy values, trailing spaces, incorrect indentation, excess spaces after colons, line-length violations, and no newline at EOF. Run yamllint and address all issues throughout the file.

♻️ Duplicate comments (5)
.claude/prompts/nl-unity-suite-full-additive.md (2)

34-34: Align STRICT FRAGMENT EMISSION with all tests that emit fragments.

Top rule still lists only T-D and T-J, but T-F/T-G/T-H/T-I also require immediate emission later. Update to avoid contradictions.

-6) **STRICT FRAGMENT EMISSION** - After completing T-D and T-J, immediately emit a clean XML file under `reports/<TESTID>_results.xml` with exactly one `<testcase>` whose `name` begins with the exact test id. No prologue/epilogue or fences.
+6) **STRICT FRAGMENT EMISSION** - After completing each of T-D, T-F, T-G, T-H, T-I, and T-J, immediately emit a clean XML file under `reports/<TESTID>_results.xml` with exactly one `<testcase>` whose `name` begins with the exact test id. No prologue/epilogue or fences.

207-218: Make T‑J state semantics consistent (idempotent → no content change).

Header says “Additive State I” but steps undo their own insert; final state should be unchanged (State H).

-### T-J. Idempotency on Modified File (Additive State I)
+### T-J. Idempotency on Modified File (No State Change)
@@
-- **Expected final state**: State H + verified idempotent behavior
+- **Expected final state**: State H (verified idempotent behavior; no content change)
.github/workflows/claude-nl-suite.yml (3)

212-214: Make Unity config/local mounts writable to avoid EACCES at runtime.

The headless run can write caches/entitlements; read-only mounts may break on some Unity versions.

-              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d:ro" \
-              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d:ro" \
+              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
+              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \

3-3: [nitpick] Prefer object trigger syntax for consistency.

-on: [workflow_dispatch]
+on:
+  workflow_dispatch:

743-743: Keep arrow glyph consistent with other workflow step names.

-        - name: NL/T details -> Job Summary
+        - name: NL/T details → Job Summary
🧹 Nitpick comments (4)
.claude/prompts/nl-unity-suite-full-additive.md (3)

17-31: Spell out the required classname attribute in fragments.

You show it in the example; add it to the bullet list so agents don’t omit it.

 **CRITICAL XML FORMAT REQUIREMENTS:**
 - Each file must contain EXACTLY one `<testcase>` root element
 - NO prologue, epilogue, code fences, or extra characters
 - NO markdown formatting or explanations outside the XML
+- `classname` attribute is required: `classname="UnityMCP.NL-T"`
 - Use this exact format:

108-116: Reduce risk of mis-targeting the final class brace.

Regexing the “last }” can misfire with nested types or comments. Prefer content-aware targeting of the class’ actual closing brace via find_in_file + ranges.

-- Match the final class-closing brace by scanning from EOF (e.g., last `^\s*}\s*$`)
-  or compute via `find_in_file` + ranges; insert immediately before it.
+- Locate the `class LongUnityScriptClaudeTest` block via `find_in_file`, compute its closing brace range,
+  and insert immediately before that brace (avoid naive “last }” scans).

161-166: Clarify where to place the Counter field.

Structured ops don’t include “insert_field”; be explicit about anchoring so the field lands in a valid spot.

-**Actions**:
-- Insert field: `private int Counter = 0;`
+**Actions**:
+- Insert field: `private int Counter = 0;` (anchor above the first method, after existing fields)
.github/workflows/claude-nl-suite.yml (1)

803-805: Harden secrets redaction in logs (mask emails/tokens too).

Current sed only masks words following keywords. Add email + long-hex masking to reduce leak risk.

-            docker logs --tail 400 unity-mcp | sed -E 's/((email|serial|license|password|token)[^[:space:]]*)/[REDACTED]/ig' || true
+            docker logs --tail 400 unity-mcp \
+              | sed -E 's/((email|serial|license|password|token)[^[:space:]]*)/[REDACTED]/ig' \
+              | sed -E 's/[[:alnum:]._%+-]+@[[:alnum:].-]+\.[A-Za-z]{2,}/[REDACTED_EMAIL]/g' \
+              | sed -E 's/\b([A-Fa-f0-9]{32,})\b/[REDACTED_TOKEN]/g' \
+              || true
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d0937e8 and e1d8ac5.

📒 Files selected for processing (5)
  • .claude/prompts/nl-unity-claude-tests-mini.md (0 hunks)
  • .claude/prompts/nl-unity-suite-full-additive.md (10 hunks)
  • .claude/prompts/nl-unity-suite-full.md (0 hunks)
  • .github/workflows/claude-nl-suite-mini.yml (0 hunks)
  • .github/workflows/claude-nl-suite.yml (13 hunks)
💤 Files with no reviewable changes (3)
  • .claude/prompts/nl-unity-claude-tests-mini.md
  • .github/workflows/claude-nl-suite-mini.yml
  • .claude/prompts/nl-unity-suite-full.md
🧰 Additional context used
🪛 LanguageTool
.claude/prompts/nl-unity-suite-full-additive.md

[grammar] ~17-~17: There might be a mistake here.
Context: ...T. **CRITICAL XML FORMAT REQUIREMENTS:** - Each file must contain EXACTLY one <tes...

(QB_NEW_EN)


[grammar] ~32-~32: There might be a mistake here.
Context: ..., T-C, T-D, T-E, T-F, T-G, T-H, T-I, T-J 5) NO RESTORATION - tests build additivel...

(QB_NEW_EN)


[grammar] ~33-~33: There might be a mistake here.
Context: ... RESTORATION** - tests build additively on previous state. 6) **STRICT FRAGMENT EM...

(QB_NEW_EN)


[grammar] ~33-~33: There might be a mistake here.
Context: ...ests build additively on previous state. 6) STRICT FRAGMENT EMISSION - After compl...

(QB_NEW_EN)


[grammar] ~53-~53: There might be a mistake here.
Context: ...set "position": "before" or "after". - Precise ranges / atomic batch: `mcp__u...

(QB_NEW_EN)


[grammar] ~72-~72: There might be a mistake here.
Context: .../T‑I to exercise stale_file semantics. - Use content signatures (method names, co...

(QB_NEW_EN)


[grammar] ~109-~109: There might be a mistake here.
Context: ... + ranges; insert immediately before it. - Insert three comment lines before final ...

(QB_NEW_EN)


[grammar] ~160-~160: There might be a mistake here.
Context: ...d Evolution Lifecycle (Additive State G) Goal: Insert → modify → finalize a fie...

(QB_NEW_EN)


[grammar] ~161-~161: There might be a mistake here.
Context: ...fy → finalize a field + companion method Actions: - Insert field: `private in...

(QB_NEW_EN)


[grammar] ~162-~162: There might be a mistake here.
Context: ... a field + companion method Actions: - Insert field: private int Counter = 0;...

(QB_NEW_EN)


[grammar] ~163-~163: There might be a mistake here.
Context: ...ion method Actions: - Insert field: private int Counter = 0; - Update it: find and replace with `privat...

(QB_NEW_EN)


[grammar] ~190-~190: There might be a mistake here.
Context: ...ation on Modified File (No State Change) Goal: Ensure validation works correctl...

(QB_NEW_EN)


[grammar] ~192-~192: There might be a mistake here.
Context: ...ly on heavily modified file Actions: - Run validate_script(level:"standard") ...

(QB_NEW_EN)


[grammar] ~195-~195: There might be a mistake here.
Context: ...e**: State H (validation only, no edits) - Emit reports/T-H_results.xml confirmin...

(QB_NEW_EN)


[grammar] ~207-~207: There might be a mistake here.
Context: ...ency on Modified File (Additive State I) Goal: Verify operations behave predict...

(QB_NEW_EN)


[grammar] ~209-~209: There might be a mistake here.
Context: ...e predictably when repeated Actions: - Insert (structured): `mcp__unity__scri...

(QB_NEW_EN)


[grammar] ~213-~213: There might be a mistake here.
Context: ...o_op: true. - **Remove (structured)**: {"op":"regex_replace","pattern":"(?m)^\s*// idempotency test marker\r?\n?","text":""}- **Remove again** (sameregex_replace`) → ...

(QB_NEW_EN)


[grammar] ~216-~216: There might be a mistake here.
Context: ...pt(level:"standard")- **IMMEDIATELY** write clean XML fragment toreports/T-J_resu...

(QB_NEW_EN)

🪛 YAMLlint (1.37.1)
.github/workflows/claude-nl-suite.yml

[warning] 75-75: wrong indentation: expected 14 but found 12

(indentation)


[warning] 75-75: too many spaces after colon

(colons)


[warning] 76-76: too many spaces after colon

(colons)


[warning] 78-78: too many spaces after colon

(colons)


[warning] 92-92: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: too many spaces after colon

(colons)


[warning] 123-123: too many spaces after colon

(colons)


[warning] 125-125: too many spaces after colon

(colons)


[warning] 166-166: wrong indentation: expected 14 but found 12

(indentation)


[warning] 196-196: wrong indentation: expected 14 but found 12

(indentation)


[error] 219-219: trailing spaces

(trailing-spaces)


[warning] 811-811: wrong indentation: expected 14 but found 12

(indentation)


[warning] 811-811: too many spaces after colon

(colons)


[warning] 813-813: too many spaces after colon

(colons)

🔇 Additional comments (1)
.github/workflows/claude-nl-suite.yml (1)

346-371: Canonization pass looks solid.

Good filename-driven ID enforcement and safe rewrite without XML prologues; this complements the prompt’s “single-testcase, no-prologue” rule.

Comment on lines +71 to 73
- Track file SHA after each test (`mcp__unity__get_sha`) and use it as a precondition
for `apply_text_edits` in T‑F/T‑G/T‑I to exercise `stale_file` semantics.
- Use content signatures (method names, comment markers) to verify expected state
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Confirm precondition parameter name used by apply_text_edits.

The prompt requires SHA preconditions but doesn’t name the exact field. Verify the MCP server expects, e.g., preconditionSha256 (or equivalent), to avoid silent no-ops.


🏁 Script executed:

#!/bin/bash
# Locate the apply_text_edits handler and its request schema to confirm the precondition field name.
rg -nP -C3 '\bapply_text_edits\b|precondition|sha256|If-Match' UnityMcpBridge/UnityMcpServer~ --type py --type ts --type cs || true

Length of output: 26666


Specify precondition_sha256 in the prompt
Use the exact precondition_sha256 parameter name for apply_text_edits (not preconditionSha256 or similar) to ensure the SHA is passed correctly and avoid silent no-ops.

🧰 Tools
🪛 LanguageTool

[grammar] ~72-~72: There might be a mistake here.
Context: .../T‑I to exercise stale_file semantics. - Use content signatures (method names, co...

(QB_NEW_EN)

🤖 Prompt for AI Agents
In .claude/prompts/nl-unity-suite-full-additive.md around lines 71 to 73, the
prompt references passing a file SHA to apply_text_edits but does not use the
exact parameter name; update the prompt to use the exact snake_case parameter
name precondition_sha256 (not preconditionSha256 or any other variant) wherever
apply_text_edits is described or an example call is shown so the SHA is passed
correctly and avoids silent no-ops.

…(incl. failures), add T-F..T-J XML templates
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (4)
.claude/prompts/nl-unity-suite-full-additive.md (4)

34-34: Per-test immediate emission rule fixed — resolves prior inconsistency

“STRICT FRAGMENT EMISSION” now applies to every test; this aligns with later specs and unblocks merger logic.


185-191: Make SHA precondition explicit in T‑G steps

Clarify the retry flow uses precondition_sha256 to trigger and then clear stale_file.

Apply:

- - Make identical edit using `unity://path/Assets/Scripts/LongUnityScriptClaudeTest.cs`
- - Then using `Assets/Scripts/LongUnityScriptClaudeTest.cs` 
- - Second should return `stale_file`, retry with updated SHA
+ - Make identical edit using `unity://path/Assets/Scripts/LongUnityScriptClaudeTest.cs`
+ - Then using `Assets/Scripts/LongUnityScriptClaudeTest.cs` with `precondition_sha256` set to the prior SHA
+ - Second should return `stale_file`; fetch new SHA and retry with updated `precondition_sha256`

75-76: Name the exact precondition field: precondition_sha256

Without the exact parameter, agents may skip SHA preconditions. Spell it out where first introduced.

Apply:

- - Track file SHA after each test (`mcp__unity__get_sha`) and use it as a precondition
-   for `apply_text_edits` in T‑F/T‑G/T‑I to exercise `stale_file` semantics.
+ - Track file SHA after each test (`mcp__unity__get_sha`) and pass it via `precondition_sha256`
+   to `mcp__unity__apply_text_edits` (T‑F/T‑G/T‑I) to exercise `stale_file` semantics.

211-222: T‑J header/state semantics inconsistent with no-op cycle

The steps insert then remove, netting no change; label as No State Change and reflect that in expected state.

Apply:

-### T-J. Idempotency on Modified File (Additive State I)
+### T-J. Idempotency on Modified File (No State Change)
@@
-- **Expected final state**: State H + verified idempotent behavior
+- **Expected final state**: State H (verified idempotent behavior; no content change)
🧹 Nitpick comments (3)
.claude/prompts/nl-unity-suite-full-additive.md (3)

53-58: Format “STRICT OP GUARDRAILS” as a proper subsection

Current inline heading blends into bullets; promote to a bold line for clarity.

Apply:

- - **Precise ranges / atomic batch**: `mcp__unity__apply_text_edits` (non‑overlapping ranges)
- STRICT OP GUARDRAILS
+ - **Precise ranges / atomic batch**: `mcp__unity__apply_text_edits` (non‑overlapping ranges)
+ 
+ **STRICT OP GUARDRAILS**

289-342: Add CDATA gotcha note to prevent malformed XML

If evidence contains “]]>”, the fragment breaks. Briefly warn to avoid or escape that sequence.

Apply (at the end of the Templates section):

+Note: Do not include the literal sequence `]]>` inside `<![CDATA[ ... ]]>` blocks; omit or redact it to keep XML well‑formed.

31-33: Include a failure-fragment template for parity with rule 31

Provide a minimal failure variant so agents don’t invent structure on errors.

Apply:

+```xml
+<testcase name="[TESTID] — [Title]" classname="UnityMCP.NL-T">
+  <failure message="[short reason]"/>
+  <system-out><![CDATA[
+Error details and final SHA: [sha-here]
+  ]]></system-out>
+</testcase>
+```

Also applies to: 285-300

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e1d8ac5 and 8234a5d.

📒 Files selected for processing (1)
  • .claude/prompts/nl-unity-suite-full-additive.md (11 hunks)
🧰 Additional context used
🪛 LanguageTool
.claude/prompts/nl-unity-suite-full-additive.md

[grammar] ~17-~17: There might be a mistake here.
Context: ...T. **CRITICAL XML FORMAT REQUIREMENTS:** - Each file must contain EXACTLY one <tes...

(QB_NEW_EN)


[grammar] ~32-~32: There might be a mistake here.
Context: ..., T-C, T-D, T-E, T-F, T-G, T-H, T-I, T-J 5) NO RESTORATION - tests build additivel...

(QB_NEW_EN)


[grammar] ~33-~33: There might be a mistake here.
Context: ... RESTORATION** - tests build additively on previous state. 6) **STRICT FRAGMENT EM...

(QB_NEW_EN)


[grammar] ~33-~33: There might be a mistake here.
Context: ...ests build additively on previous state. 6) STRICT FRAGMENT EMISSION - After each ...

(QB_NEW_EN)


[grammar] ~53-~53: There might be a mistake here.
Context: ...set "position": "before" or "after". - Precise ranges / atomic batch: `mcp__u...

(QB_NEW_EN)


[grammar] ~54-~54: There might be a mistake here.
Context: ...ply_text_edits(non‑overlapping ranges) STRICT OP GUARDRAILS - Do not useancho...

(QB_NEW_EN)


[grammar] ~55-~55: There might be a mistake here.
Context: ...overlapping ranges) STRICT OP GUARDRAILS - Do not use anchor_replace. Structured ...

(QB_NEW_EN)


[grammar] ~56-~56: There might be a mistake here.
Context: ...thod, delete_method, regex_replace`. - For multi‑spot textual tweaks in one ope...

(QB_NEW_EN)


[grammar] ~76-~76: There might be a mistake here.
Context: .../T‑I to exercise stale_file semantics. - Use content signatures (method names, co...

(QB_NEW_EN)


[grammar] ~113-~113: There might be a mistake here.
Context: ... + ranges; insert immediately before it. - Insert three comment lines before final ...

(QB_NEW_EN)


[grammar] ~164-~164: There might be a mistake here.
Context: ...d Evolution Lifecycle (Additive State G) Goal: Insert → modify → finalize a fie...

(QB_NEW_EN)


[grammar] ~165-~165: There might be a mistake here.
Context: ...fy → finalize a field + companion method Actions: - Insert field: `private in...

(QB_NEW_EN)


[grammar] ~166-~166: There might be a mistake here.
Context: ... a field + companion method Actions: - Insert field: private int Counter = 0;...

(QB_NEW_EN)


[grammar] ~167-~167: There might be a mistake here.
Context: ...ion method Actions: - Insert field: private int Counter = 0; - Update it: find and replace with `privat...

(QB_NEW_EN)


[grammar] ~194-~194: There might be a mistake here.
Context: ...ation on Modified File (No State Change) Goal: Ensure validation works correctl...

(QB_NEW_EN)


[grammar] ~196-~196: There might be a mistake here.
Context: ...ly on heavily modified file Actions: - Run validate_script(level:"standard") ...

(QB_NEW_EN)


[grammar] ~199-~199: There might be a mistake here.
Context: ...e**: State H (validation only, no edits) - Emit reports/T-H_results.xml confirmin...

(QB_NEW_EN)


[grammar] ~211-~211: There might be a mistake here.
Context: ...ency on Modified File (Additive State I) Goal: Verify operations behave predict...

(QB_NEW_EN)


[grammar] ~213-~213: There might be a mistake here.
Context: ...e predictably when repeated Actions: - Insert (structured): `mcp__unity__scri...

(QB_NEW_EN)


[grammar] ~217-~217: There might be a mistake here.
Context: ...o_op: true. - **Remove (structured)**: {"op":"regex_replace","pattern":"(?m)^\s*// idempotency test marker\r?\n?","text":""}- **Remove again** (sameregex_replace`) → ...

(QB_NEW_EN)


[grammar] ~220-~220: There might be a mistake here.
Context: ...pt(level:"standard")- **IMMEDIATELY** write clean XML fragment toreports/T-J_resu...

(QB_NEW_EN)

🔇 Additional comments (2)
.claude/prompts/nl-unity-suite-full-additive.md (2)

112-113: Smart end-of-class targeting is correct

EOF scan or find_in_file+ranges before the final brace avoids brace-matching pitfalls in C#.


160-162: T‑D validation + immediate fragment emission looks good

Validation first, then emit single‑test XML with SHA evidence — matches top‑level rules.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (4)
.claude/prompts/nl-unity-suite-full-additive.md (2)

87-89: Name the precondition parameter explicitly (precondition_sha256).

You require SHA-gated edits but don’t name the exact request field; agents may pass the wrong key and miss stale-file behavior.

Apply:

-- **Precise ranges / atomic batch**: `mcp__unity__apply_text_edits` (non‑overlapping ranges)
+-- **Precise ranges / atomic batch**: `mcp__unity__apply_text_edits` (non‑overlapping ranges; always pass `precondition_sha256` when provided)
@@
- - Track file SHA after each test (`mcp__unity__get_sha`) and use it as a precondition
-  for `apply_text_edits` in T‑F/T‑G/T‑I to exercise `stale_file` semantics.
+ - Track file SHA after each test (`mcp__unity__get_sha`) and send it as `precondition_sha256`
+  on `mcp__unity__apply_text_edits` in T‑F/T‑G/T‑I to exercise `stale_file` semantics.

Also applies to: 62-70


225-236: T‑J is “No State Change”; fix header/state text for consistency.

The steps insert then remove; final content equals State H. Rename section and clarify expected state.

-### T-J. Idempotency on Modified File (Additive State I)
+### T-J. Idempotency on Modified File (No State Change)
@@
-- **Expected final state**: State H + verified idempotent behavior
+- **Expected final state**: State H (verified idempotent behavior; no content change)
.github/workflows/claude-nl-suite.yml (2)

212-214: Mount Unity config/local as read‑write; RO can cause EACCES at runtime.

Warmup uses RW but the persistent container uses :ro. Unity may write caches/state during the suite.

-              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d:ro" \
-              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d:ro" \
+              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
+              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \

105-116: Fix XML-prolog detection; current grep can mis-detect due to BRE \?.

In basic grep, \? is a quantifier; you want a literal string match.

-            if head -c 100 "$f" | grep -qi '<\?xml'; then
+            if head -c 100 "$f" | grep -qiF '<?xml'; then
🧹 Nitpick comments (6)
.claude/prompts/nl-unity-suite-full-additive.md (2)

198-207: Make T‑G’s stale-SHA path unambiguous.

Call out that the second attempt must reuse the prior SHA via precondition_sha256 to force stale_file, then retry with the fresh SHA.

-- Second should return `stale_file`, retry with updated SHA
+- Second should include the previous `precondition_sha256` and return `stale_file`; then retry with the latest SHA

57-59: Use bullets instead of em-dash paragraph for console scan rules.

Minor clarity/readability; avoids agents missing sub-steps.

-— Console scans: perform two reads — last 10 `log/info` lines and up to 3 `error` entries; include ≤ 3 lines total in the fragment; if no errors, state "no errors".
-— Final check is folded into T‑J: perform an errors‑only scan and include a single "no errors" line or up to 3 error lines within the T‑J fragment.
+• Console scans: perform two reads — last 10 `log/info` lines and up to 3 `error` entries; include ≤ 3 lines total in the fragment; if no errors, state "no errors".
+• Final check (T‑J only): errors‑only scan; include "no errors" or up to 3 error lines.
.github/workflows/claude-nl-suite.yml (4)

747-763: Step title punctuation: keep arrow style consistent across workflows.

If other workflows use , align here; otherwise this is fine. Pure cosmetic.

-        - name: NL/T details -> Job Summary
+        - name: NL/T details → Job Summary

1-18: Pin actions to commit SHAs for supply‑chain hardening.

Consider pinning actions (checkout, setup-uv, anthropics, upload-artifact, junit-report) to immutable SHAs.


71-87: Outputs quoting looks good; minor shell style.

has_serial subshell is fine; optional: compute once and export also as env for later steps if reused.


219-219: Trim trailing spaces to satisfy linters.

Minor YAML hygiene; see YAMLlint “trailing spaces” warning.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8234a5d and 2598516.

📒 Files selected for processing (2)
  • .claude/prompts/nl-unity-suite-full-additive.md (12 hunks)
  • .github/workflows/claude-nl-suite.yml (13 hunks)
🧰 Additional context used
🪛 LanguageTool
.claude/prompts/nl-unity-suite-full-additive.md

[grammar] ~17-~17: There might be a mistake here.
Context: ...T. **CRITICAL XML FORMAT REQUIREMENTS:** - Each file must contain EXACTLY one <tes...

(QB_NEW_EN)


[grammar] ~32-~32: There might be a mistake here.
Context: ..., T-C, T-D, T-E, T-F, T-G, T-H, T-I, T-J 5) NO RESTORATION - tests build additivel...

(QB_NEW_EN)


[grammar] ~33-~33: There might be a mistake here.
Context: ... RESTORATION** - tests build additively on previous state. 6) **STRICT FRAGMENT EM...

(QB_NEW_EN)


[grammar] ~33-~33: There might be a mistake here.
Context: ...ests build additively on previous state. 6) STRICT FRAGMENT EMISSION - After each ...

(QB_NEW_EN)


[grammar] ~54-~54: There might be a mistake here.
Context: ...0 chars: brief status + latest SHA only. - Console evidence: fetch the last 10 line...

(QB_NEW_EN)


[grammar] ~56-~56: There might be a mistake here.
Context: ...i‑line diffs; reference markers instead. — Console scans: perform two reads — las...

(QB_NEW_EN)


[grammar] ~62-~62: There might be a mistake here.
Context: ... the T‑J fragment. --- ## Tool Mapping - Anchors/regex/structured: `mcp__unity_...

(QB_NEW_EN)


[grammar] ~63-~63: There might be a mistake here.
Context: ...Mapping - Anchors/regex/structured: mcp__unity__script_apply_edits - Allowed ops: anchor_insert, `replace_m...

(QB_NEW_EN)


[grammar] ~64-~64: There might be a mistake here.
Context: ...ethod, insert_method, delete_method, regex_replace - Foranchor_insert, always set "positi...

(QB_NEW_EN)


[grammar] ~65-~65: There might be a mistake here.
Context: ...set "position": "before" or "after". - Precise ranges / atomic batch: `mcp__u...

(QB_NEW_EN)


[grammar] ~66-~66: There might be a mistake here.
Context: ...ply_text_edits(non‑overlapping ranges) STRICT OP GUARDRAILS - Do not useancho...

(QB_NEW_EN)


[grammar] ~67-~67: There might be a mistake here.
Context: ...overlapping ranges) STRICT OP GUARDRAILS - Do not use anchor_replace. Structured ...

(QB_NEW_EN)


[grammar] ~68-~68: There might be a mistake here.
Context: ...thod, delete_method, regex_replace`. - For multi‑spot textual tweaks in one ope...

(QB_NEW_EN)


[grammar] ~88-~88: There might be a mistake here.
Context: .../T‑I to exercise stale_file semantics. - Use content signatures (method names, co...

(QB_NEW_EN)


[grammar] ~125-~125: There might be a mistake here.
Context: ... + ranges; insert immediately before it. - Insert three comment lines before final ...

(QB_NEW_EN)


[grammar] ~141-~141: There might be a mistake here.
Context: ...: State C (unchanged) - IMMEDIATELY write clean XML fragment to `reports/NL-4_res...

(QB_NEW_EN)


[grammar] ~178-~178: There might be a mistake here.
Context: ...d Evolution Lifecycle (Additive State G) Goal: Insert → modify → finalize a fie...

(QB_NEW_EN)


[grammar] ~179-~179: There might be a mistake here.
Context: ...fy → finalize a field + companion method Actions: - Insert field: `private in...

(QB_NEW_EN)


[grammar] ~180-~180: There might be a mistake here.
Context: ... a field + companion method Actions: - Insert field: private int Counter = 0;...

(QB_NEW_EN)


[grammar] ~181-~181: There might be a mistake here.
Context: ...ion method Actions: - Insert field: private int Counter = 0; - Update it: find and replace with `privat...

(QB_NEW_EN)


[grammar] ~208-~208: There might be a mistake here.
Context: ...ation on Modified File (No State Change) Goal: Ensure validation works correctl...

(QB_NEW_EN)


[grammar] ~210-~210: There might be a mistake here.
Context: ...ly on heavily modified file Actions: - Run validate_script(level:"standard") ...

(QB_NEW_EN)


[grammar] ~213-~213: There might be a mistake here.
Context: ...e**: State H (validation only, no edits) - Emit reports/T-H_results.xml confirmin...

(QB_NEW_EN)


[grammar] ~225-~225: There might be a mistake here.
Context: ...ency on Modified File (Additive State I) Goal: Verify operations behave predict...

(QB_NEW_EN)


[grammar] ~227-~227: There might be a mistake here.
Context: ...e predictably when repeated Actions: - Insert (structured): `mcp__unity__scri...

(QB_NEW_EN)


[grammar] ~231-~231: There might be a mistake here.
Context: ...o_op: true. - **Remove (structured)**: {"op":"regex_replace","pattern":"(?m)^\s*// idempotency test marker\r?\n?","text":""}- **Remove again** (sameregex_replace`) → ...

(QB_NEW_EN)


[grammar] ~235-~235: There might be a mistake here.
Context: ...e "no errors" if none - IMMEDIATELY write clean XML fragment to `reports/T-J_resu...

(QB_NEW_EN)

🪛 YAMLlint (1.37.1)
.github/workflows/claude-nl-suite.yml

[warning] 75-75: wrong indentation: expected 14 but found 12

(indentation)


[warning] 75-75: too many spaces after colon

(colons)


[warning] 76-76: too many spaces after colon

(colons)


[warning] 78-78: too many spaces after colon

(colons)


[warning] 92-92: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: too many spaces after colon

(colons)


[warning] 123-123: too many spaces after colon

(colons)


[warning] 125-125: too many spaces after colon

(colons)


[warning] 166-166: wrong indentation: expected 14 but found 12

(indentation)


[warning] 196-196: wrong indentation: expected 14 but found 12

(indentation)


[error] 219-219: trailing spaces

(trailing-spaces)


[warning] 815-815: wrong indentation: expected 14 but found 12

(indentation)


[warning] 815-815: too many spaces after colon

(colons)


[warning] 817-817: too many spaces after colon

(colons)

🔇 Additional comments (3)
.github/workflows/claude-nl-suite.yml (3)

346-373: Safe canonicalization; LGTM.

Good guardrails: filename-derived IDs, single-<testcase> enforcement, no XML declaration. Matches prompt constraints.


424-473: Backfill placeholders step is solid.

Covers all NL/T IDs and writes minimal valid fragments with a <failure>. Good resilience.


489-588: JUnit assembly logic is robust.

Handles malformed fragments, enforces single testcase, recalculates counts; name repair matches canonicalization rules.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (6)
.github/workflows/claude-nl-suite.yml (6)

3-3: Prefer explicit trigger mapping for consistency.

-on: [workflow_dispatch]
+on:
+  workflow_dispatch:

105-108: Good fix: properly escaped XML prolog in grep.


850-858: License return moved to finalizer — LGTM.


341-341: Document the Bash disallow change inline.

Add a YAML comment to explain policy/context for CI reviewers.

-            disallowed_tools: TodoWrite,Task,Bash
+            # NOTE: Bash is explicitly disallowed to enforce in-editor edits/validation.
+            disallowed_tools: TodoWrite,Task,Bash

787-787: Unify arrow glyph in step names.

Revert to the previously used “→” or standardize across workflows.

-        - name: NL/T details -> Job Summary
+        - name: NL/T details → Job Summary

212-214: Mount Unity config/local as RW to prevent EACCES during runtime.

Read-only mounts can break entitlement renewals and cache writes. Use RW.

-              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d:ro" \
-              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d:ro" \
+              -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
+              -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \
🧹 Nitpick comments (2)
.github/workflows/claude-nl-suite.yml (2)

75-79: Fix YAML lint nits (indent, colons, trailing spaces).

Normalize single space after colons, align env indentation, and remove trailing spaces.

-            UNITY_LICENSE:  ${{ secrets.UNITY_LICENSE }}
-            UNITY_EMAIL:    ${{ secrets.UNITY_EMAIL }}
-            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
+            UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
+            UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
+            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
...
-            UNITY_IMAGE:    ${{ env.UNITY_IMAGE }}
-            UNITY_EMAIL:    ${{ secrets.UNITY_EMAIL }}
-            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
-            UNITY_SERIAL:   ${{ secrets.UNITY_SERIAL }}
+            UNITY_IMAGE: ${{ env.UNITY_IMAGE }}
+            UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
+            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
+            UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}
...
-              -executeMethod MCPForUnity.Editor.MCPForUnityBridge.StartAutoConnect 
+              -executeMethod MCPForUnity.Editor.MCPForUnityBridge.StartAutoConnect
...
-            UNITY_EMAIL:    ${{ secrets.UNITY_EMAIL }}
-            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
-            UNITY_SERIAL:   ${{ secrets.UNITY_SERIAL }}
+            UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
+            UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
+            UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}

Tip: run yamllint to catch remaining indentation width differences.

Also applies to: 92-92, 122-126, 166-168, 196-198, 219-219, 855-857


205-213: Optional: expose bridge status dir to host for easier diagnostics.

Mount /root/.unity-mcp to $RUNNER_TEMP/.unity-mcp and read it directly without docker exec. Helps artifacting/debugging.

-            docker run -d --name unity-mcp --network host \
+            docker run -d --name unity-mcp --network host \
               -e HOME=/root \
               -e UNITY_MCP_ALLOW_BATCH=1 \
               -e UNITY_MCP_STATUS_DIR=/root/.unity-mcp \
               -e UNITY_MCP_BIND_HOST=127.0.0.1 \
-              -v "${{ github.workspace }}:/workspace" -w /workspace \
+              -v "${{ github.workspace }}:/workspace" -w /workspace \
+              -v "$RUNNER_TEMP/.unity-mcp:/root/.unity-mcp" \
               -v "$RUNNER_TEMP/unity-config:/root/.config/unity3d" \
               -v "$RUNNER_TEMP/unity-local:/root/.local/share/unity3d" \

You can then read $RUNNER_TEMP/.unity-mcp from the host and include it in artifacts.

Also applies to: 221-271

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2598516 and 7a73d98.

📒 Files selected for processing (1)
  • .github/workflows/claude-nl-suite.yml (13 hunks)
🧰 Additional context used
🪛 YAMLlint (1.37.1)
.github/workflows/claude-nl-suite.yml

[warning] 75-75: wrong indentation: expected 14 but found 12

(indentation)


[warning] 75-75: too many spaces after colon

(colons)


[warning] 76-76: too many spaces after colon

(colons)


[warning] 78-78: too many spaces after colon

(colons)


[warning] 92-92: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: wrong indentation: expected 14 but found 12

(indentation)


[warning] 122-122: too many spaces after colon

(colons)


[warning] 123-123: too many spaces after colon

(colons)


[warning] 125-125: too many spaces after colon

(colons)


[warning] 166-166: wrong indentation: expected 14 but found 12

(indentation)


[warning] 196-196: wrong indentation: expected 14 but found 12

(indentation)


[error] 219-219: trailing spaces

(trailing-spaces)


[warning] 855-855: wrong indentation: expected 14 but found 12

(indentation)


[warning] 855-855: too many spaces after colon

(colons)


[warning] 857-857: too many spaces after colon

(colons)

🔇 Additional comments (1)
.github/workflows/claude-nl-suite.yml (1)

162-183: Warm-up flow and ULF handoff look solid.

Comment on lines +137 to +147
"$UNITY_IMAGE" bash -lc '
set -euxo pipefail
if [[ -n "${UNITY_SERIAL:-}" ]]; then
/opt/unity/Editor/Unity -batchmode -nographics -logFile - \
-username "$UNITY_EMAIL" -password "$UNITY_PASSWORD" -serial "$UNITY_SERIAL" -quit || true
else
/opt/unity/Editor/Unity -batchmode -nographics -logFile - \
-username "$UNITY_EMAIL" -password "$UNITY_PASSWORD" -quit || true
fi
ls -la /root/.config/unity3d/Unity/licenses || true
'
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Remove command echoing to avoid leaking UNITY credentials.

Inside the container script you run set -euxo pipefail. The -x will echo the Unity -username/-password/-serial command with secrets expanded into logs. Drop -x (or temporarily disable it) around the activation calls.

-              "$UNITY_IMAGE" bash -lc '
-                set -euxo pipefail
+              "$UNITY_IMAGE" bash -lc '
+                set -euo pipefail
                 if [[ -n "${UNITY_SERIAL:-}" ]]; then
-                  /opt/unity/Editor/Unity -batchmode -nographics -logFile - \
-                    -username "$UNITY_EMAIL" -password "$UNITY_PASSWORD" -serial "$UNITY_SERIAL" -quit || true
+                  set +x
+                  /opt/unity/Editor/Unity -batchmode -nographics -logFile - \
+                    -username "$UNITY_EMAIL" -password "$UNITY_PASSWORD" -serial "$UNITY_SERIAL" -quit || true
+                  set -x || true
                 else
-                  /opt/unity/Editor/Unity -batchmode -nographics -logFile - \
-                    -username "$UNITY_EMAIL" -password "$UNITY_PASSWORD" -quit || true
+                  set +x
+                  /opt/unity/Editor/Unity -batchmode -nographics -logFile - \
+                    -username "$UNITY_EMAIL" -password "$UNITY_PASSWORD" -quit || true
+                  set -x || true
                 fi
                 ls -la /root/.config/unity3d/Unity/licenses || true
               '

Also applies to: 140-145

🤖 Prompt for AI Agents
.github/workflows/claude-nl-suite.yml around lines 137-147 (and also lines
140-145): the script uses set -euxo pipefail which causes shell command tracing
(-x) to print Unity activation commands with
UNITY_EMAIL/UNITY_PASSWORD/UNITY_SERIAL into logs; remove -x from the global set
or temporarily disable tracing immediately before the sensitive Unity calls
(e.g., use set +x, run the Unity command(s), then restore tracing with set -x if
needed) so credentials are not echoed, and ensure the rest of the script still
runs with -euo pipefail semantics.

@dsarno
Copy link
Collaborator Author

dsarno commented Sep 7, 2025

Closing, resubmitting improved version.

@dsarno dsarno closed this Sep 7, 2025
@dsarno dsarno deleted the nl-CI-workflow-fixes branch September 7, 2025 23:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant