Skip to content

docs: add AGENTS.md (AI-contributor guardrails) + AGENTS_USER_EXAMPLE.md#343

Open
MichaelLeeHobbs wants to merge 3 commits into
OpenIntegrationEngine:mainfrom
MichaelLeeHobbs:feature/claude-md-ai-guidance
Open

docs: add AGENTS.md (AI-contributor guardrails) + AGENTS_USER_EXAMPLE.md#343
MichaelLeeHobbs wants to merge 3 commits into
OpenIntegrationEngine:mainfrom
MichaelLeeHobbs:feature/claude-md-ai-guidance

Conversation

@MichaelLeeHobbs

@MichaelLeeHobbs MichaelLeeHobbs commented Jul 9, 2026

Copy link
Copy Markdown

Updated per review (#342): renamed the files to the vendor-neutral AGENTS.md /
AGENTS_USER_EXAMPLE.md (thanks @kryskool), corrected the CI build-path wording, and noted that
OIE defaults rhino.languageversion = es6 (so arrow functions / let / const work on Rhino 1.7.13).

Closes #342.

Adds two documentation files to help contributors who use AI coding assistants.

AGENTS.md (repo root) — guardrails for AI-assisted work on the engine

Designed to keep AI contributions small, reviewable, and from degrading code quality in a production healthcare engine:

  • Push back, don't rubber-stamp — for non-trivial work, state the change + any concrete disagreement + a better alternative before editing (calibrated to blast radius, so no "pushback theater" on a typo).
  • Anti-sprawl in breadth and depth — one concern, minimal diff, ≤3 files, ~40–50-line/whole-method cap; no drive-by reformatting or renames.
  • Preserve behavior & compatibility — public API / serialization / DB / wire-HL7, plus the subtle breaks (charset, timezone/locale, null-vs-empty, HL7 delimiters); golden-output tests for donkey//serialization changes.
  • Healthcare security — no PHI logging; no unsafe reflective deserialization (XStream/ObjectInputStream) / XXE, referencing this codebase's documented RCE history.
  • Issue-first-and-wait, red-green tests, MPL header copied verbatim from server/license-header.txt, no slop tells.
  • Grounded in the real build (Java 17 + Ant server/mirth-build.xml), the module map, and CONTRIBUTING.md. No orchestration/automation skill by design. Advisory — it also notes which rules belong in CI/PR-template as hard gates.

AGENTS_USER_EXAMPLE.md — starter for a user's own channel/template repo

A copy-me AGENTS.md for JavaScript that runs on the Rhino runtime: ES5/Rhino constraints, the loop-scoping bug, Java-interop gotchas, engine globals, and code patterns. Points at oie-examples and the docs site. (Could alternatively live in oie-examples — happy to move it.)

Disclosure

Both files were drafted with AI assistance (Claude Code). The content reflects my years of hands-on Mirth/Connect experience and research, and I have reviewed both in full and stand behind them. Feedback and scope changes welcome.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Adds repository documentation intended to guide AI-assisted contributions and provide a copyable starter template for users writing OIE channel/template JavaScript.

Changes:

  • Adds CLAUDE.md at the repo root with guardrails for AI-assisted work on the engine codebase.
  • Adds CLAUDE_USER_EXAMPLE.md as a copy-me starter CLAUDE.md for user-owned channel/template JavaScript repositories.

Reviewed changes

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

File Description
CLAUDE.md Documents AI-contributor guardrails and contribution/build expectations for engine changes.
CLAUDE_USER_EXAMPLE.md Provides a user-repo template describing Rhino/JS constraints and recommended patterns for deployed scripts.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread CLAUDE.md Outdated
Comment on lines +81 to +83
- **Build + test** (what CI runs off `main`): `cd server && ant -f mirth-build.xml -DdisableSigning=true -Dcoverage=true`
(the signed build drops the flags and runs on `main`). JUnit results land under
`*/build/test-results/**/*.xml`. **A red build is not reviewable — never open a PR on one.**
Comment thread AGENTS_USER_EXAMPLE.md
Comment on lines +54 to +74
### Supported ES6 features (safe to use)
- `const` and `let` — prefer over `var`. `const` by default, `let` when reassignment is needed (but see the
Rhino loop-scoping bug below).
- Arrow functions `() => {}` — fine in callbacks, `.map()`, `.filter()`, etc.
- Object/array destructuring — `const { a, b } = options`
- `Object.keys()`, `Object.values()`, `Object.entries()`, `Object.assign()`
- Array methods: `.map()`, `.filter()`, `.reduce()`, `.forEach()`, `.find()`, `.some()`, `.every()`

### Prohibited ES6+ features (will break at runtime in OIE)
- **Template literals** — NEVER use backtick strings. `` `Hello ${name}` `` fails at runtime. Use string
concatenation or `Array.join()` (see "String building").
- **Optional chaining `?.`** — not supported; use a try/catch helper (see "Safe property access").
- **Nullish coalescing `??`** — use `||` or an explicit ternary.
- **`async`/`await`** — not supported. Transformers are synchronous; use callbacks/retries.
- **`Promise`** — not available in the runtime.
- **ES6 classes (`class`/`extends`)** — use constructor functions with `.prototype` methods.
- **ES6 modules (`import`/`export`)** — share code via Code Templates plus `/* global */` and
`/* exported */` comments (see "Module/export pattern").
- **Spread syntax `...args`** — minimal/unreliable support; avoid, especially in parameter lists.
- **`for...of` loops** — use `.forEach()` or a traditional indexed `for` loop.
- **Default parameters** — use `param = param || defaultValue` instead.
@github-actions

Copy link
Copy Markdown

Test Results

  112 files  ±0    216 suites  ±0   6m 59s ⏱️ + 1m 13s
  654 tests ±0    654 ✅ ±0  0 💤 ±0  0 ❌ ±0 
1 308 runs  ±0  1 308 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit cef5fd1. ± Comparison against base commit 7e35abe.

@MichaelLeeHobbs MichaelLeeHobbs changed the title docs: add CLAUDE.md (AI-contributor guardrails) + CLAUDE_USER_EXAMPLE.md docs: add AGENTS.md (AI-contributor guardrails) + AGENTS_USER_EXAMPLE.md Jul 10, 2026
@MichaelLeeHobbs

Copy link
Copy Markdown
Author

Thanks for the review — both addressed in 9af1d8c:

1. CI build path — correct, fixed. The -DdisableSigning=true -Dcoverage=true command is the PR build (and what to run locally); on main CI runs the signed build (same target, without those flags). Reworded to say that.

2. Arrow functions — respectfully, this one I'd push back on. Rhino 1.7.13 does support arrow functions; the feature is gated on the Context language version, and OIE ships rhino.languageversion = es6 by default (server/conf/mirth.properties), which puts the bundled Rhino in ES6 mode. So arrow functions (and let/const/destructuring) work out of the box on a stock OIE install. I've kept the line as "supported" and added a note making the ES6-default explicit — and flagging that a server which overrides that setting to an older version should re-verify the borderline features.

Comment thread AGENTS.md Outdated
- Toolchain is pinned in [`.sdkmanrc`](./.sdkmanrc) — install [SDKMAN](https://sdkman.io/) and run
`sdk env install` in the repo root (the JavaFX-bundled JDK is required; the `client` GUI imports JavaFX).
- **Build + test** (run this locally; it's also the CI build on pull requests):
`cd server && ant -f mirth-build.xml -DdisableSigning=true -Dcoverage=true`. CI runs this unsigned +

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This part must adapt to use the new gradle build

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Good catch, thanks — fixed in aa5ca2a. I also rebased the branch onto the post-Gradle main (it was still based on the Ant tree).

The build section now points at the wrapper and mirrors what CI actually invokes:

  • PRs: ./gradlew build -PdisableSigning=true -Pcoverage=true
  • main: ./gradlew build (signed)

Everything else in the section checked out as still accurate against the new layout (.sdkmanrc/JavaFX JDK, and JUnit results still under */build/test-results/**/*.xml), and the other paths the file cites (server/license-header.txt, server/conf/mirth.properties) did not move.

While verifying I pulled two things out of your new CONTRIBUTING.md that seemed worth calling out to an agent specifically, since both fail CI in ways the diff does not explain — the cold-cache dependency-verification-metadata refresh, and the output-parity check on build-logic changes. I kept them to one line each and deferred the detail to CONTRIBUTING.md rather than duplicating it. Happy to drop them if you would rather that guidance live in exactly one place.

MichaelLeeHobbs and others added 3 commits July 11, 2026 15:42
…EXAMPLE.md

CLAUDE.md: strict guidance for AI coding assistants working on the engine itself,
designed to protect the project from low-quality sprawling AI changes ("vibeslop").
- Push-back-first: for non-trivial work, state the change + any concrete disagreement
  + a better alternative BEFORE editing (calibrated to blast radius, so no theater).
- Anti-sprawl bounded in breadth AND depth (<=3 files; ~40-50 line / whole-method cap).
- Preserve behavior/compat incl. the subtle breaks (charset, tz/locale, HL7 delimiters);
  golden-output test for donkey/serialization changes; red-green regression tests.
- Healthcare security: no PHI logging; no unsafe deserialization/XXE (documented RCE class).
- Issue-first-and-wait; MPL header copied from server/license-header.txt; no slop tells.
- Grounded in the repo (Java 17 + Ant server/mirth-build.xml, module map, CONTRIBUTING).
- No orchestration skill by design. Advisory; notes which gates belong in CI.

CLAUDE_USER_EXAMPLE.md: a copy-me starter CLAUDE.md for a user's own channel/template
repo (JS on the Rhino runtime) — Rhino/ES5 constraints, loop-scoping bug, Java interop,
engine globals, code patterns; points at oie-examples and the docs site.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…o ES6 default

- Rename CLAUDE.md -> AGENTS.md and CLAUDE_USER_EXAMPLE.md -> AGENTS_USER_EXAMPLE.md, and drop the
  Claude-specific wording, per maintainer preference in OpenIntegrationEngine#342 for a vendor-neutral instructions file.
- Fix the build note: the `-DdisableSigning=true -Dcoverage=true` build is what CI runs on PRs; on
  `main` CI runs the signed build (same target, without those flags).
- Note that OIE defaults `rhino.languageversion = es6` (server/conf/mirth.properties), which is what
  makes arrow functions / `let` / `const` work on the bundled Rhino 1.7.13.
The Ant build was replaced by Gradle (24c96f5), so the build/test command
in AGENTS.md was stale. Point it at the wrapper and mirror the CI
invocation; add the two build traps that fail CI without an obvious cause
(cold-cache dependency verification metadata, build-logic output parity),
deferring the detail to CONTRIBUTING.md.
@MichaelLeeHobbs MichaelLeeHobbs force-pushed the feature/claude-md-ai-guidance branch from 9af1d8c to aa5ca2a Compare July 11, 2026 19:43
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.

Add CLAUDE.md: guardrails for AI-assisted contributions + a channel/template starter

3 participants