agentleFS
GreatFigure8GreatFigure8/Claude-Skills/Skills/oracle-fusion-bip-generator/SKILL.md

oracle-fusion-bip-generator

Skill0 starsChanged 4 months agoUnlicenseView on GitHub

Build Oracle Fusion BI Publisher (BIP) reports end-to-end — drafting Oracle-style SQL against the FUSION schema, validating it live via the hackett-fusion MCP, generating BIP Data Models (.xdm) with parameters and cascading LOVs, producing branded RTF templates, and (optionally) deploying them to the BIP catalog. Trigger this skill whenever the user mentions BIP, BI Publisher, "Publisher report", Oracle Fusion reports, data models, .xdm files, RTF templates, .xdo, FUSION.* tables in a reporting context, ESS jobs for reports, or asks to "build me a report", "write a query for Fusion", "create a data model", or "make an RTF template" — even if they don't say "BIP" explicitly. Also use whenever the user asks for SQL against any FUSION schema table (GL_*, AP_*, AR_*, XLA_*, PER_*, HZ_*, PO_*, OKC_*, VRM_*, etc.) intended for reporting. Also use when the user uploads files (requirements docs, meeting transcripts, etc.) and asks Claude to "build reports from these" or run a batch / auto-mode against them.

The file

Show its rules and text

We split this skill into the rules it gives an agent

47 rules. About 0 are common, 31 are distinctive, and 16 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈31

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 16

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Call hackett-fusion:session_status as the very first action.

    line 20
  2. Distinctive:

    Ask: _"Continue with this session, or start a fresh one (different pod or user)?"_

    line 25
  3. Very specific:

    If the user says fresh, call end_session then go to 0c.

    line 26
  4. Distinctive:

    If the user says continue, move on to their actual request.

    line 27
  5. Distinctive:

    Wait for the user's answer.

    line 37
  6. Distinctive:

    Wait for the answer.

    line 43
  7. Very specific:

    After all four answers are collected, call start_session with host, user, password, and (only if the user supplied a non-default path) …

    line 59
  8. Distinctive:

    Never skip Step 0. Never assume credentials.

    line 68
  9. Distinctive:

    If the user tries to skip ahead (e.g., "just write me a query"), politely refuse and start over at Question 1.

    line 70
  10. Distinctive:

    Wait for the user to supply them in chat (don't try to proceed without them).

    line 78
  11. Very specific:

    Call start_session with what they provided.

    line 79
  12. Very specific:

    If the user says fresh, call end_session then loop back to step 2.

    line 84
  13. Distinctive:

    Never skip step 0. Never try to "remember" credentials from an earlier conversation — even if there's an active session in process memory, …

    line 86
  14. Distinctive:

    If the requirement is verbose, summarize back in 5–8 bullets before writing SQL.

    line 128
  15. Very specific:

    Run the SQL via hackett-fusion:execute_sql.

    line 142
  16. Distinctive:

    No unexpected fan-out — spot-check distinct count on the grain key vs.

    line 147
  17. Distinctive:

    If validation fails, fix and re-run.

    line 149
  18. Distinctive:

    After a successful query with meaningful results, ask once:

    line 163
  19. Distinctive:

    If yes → transition to Report-Building Mode (see below).

    line 167
  20. Distinctive:

    If no → stay in SQL Mode silently.

    line 168
  21. Distinctive:

    If the user revisits the query later and changes it materially, the offer can be made one more time at the natural inflection point.

    line 169
  22. Distinctive:

    Every menu parameter gets a dedicated lookup query returning two columns:

    line 191
  23. Distinctive:

    Ask: "Data Model is ready — want me to build an RTF template for this?" Stop if no.

    line 225
  24. Very specific:

    Ask for ONE of: prose description, existing .rtf/.docx, brand standard, or image.

    line 231
  25. Distinctive:

    Always ask the user for branding during intake.

    line 237
  26. Distinctive:

    Ask: "RTF is ready — want me to upload everything to the BIP catalog?" Stop if no.

    line 255
  27. Distinctive:

    Default when the user is silent: do not upload.

    line 259
  28. Very specific:

    Call identify_environment and echo the fingerprint.

    line 263
  29. Very specific:

    Use the hackett-fusion MCP catalog tools (full reference in references/catalog-deployment.md):

    line 269
  30. Distinctive:

    If any step fails: halt immediately, report which step failed and why, offer retry or rollback.

    line 278
  31. Distinctive:

    Do Step 0 (session) first if not already done.

    line 290
  32. Distinctive:

    If build: run Phase 1 (SQL draft + validate).

    line 298
  33. Distinctive:

    If yes to DM/report: run Phases 2-3 with confirmation gates as usual.

    line 300
  34. Distinctive:

    After the loop completes, emit a structured summary:

    line 305
  35. Distinctive:

    After session is established (Step 0), gather these in one turn:

    line 324
  36. Very specific:

    Target environment confirmation: Call identify_environment.

    line 326
  37. Distinctive:

    Catalog folder + storage conventions: Ask:

    line 328
  38. Distinctive:

    If user is silent: default to Hackett.

    line 338
  39. Distinctive:

    Per-transcript or one-report-per-transcript expectation: Ask:

    line 340
  40. Very specific:

    Phase 4 — Deploy: Call upload_data_model to {root}/data-models/{short_name}_DM.xdm and upload_report to {root}/reports/{short_name}.xdo.

    line 354
  41. Distinctive:

    After the loop completes, emit a single structured summary:

    line 361
  42. Distinctive:

    Session-first: Never call a Fusion tool without checking session_status first.

    line 390
  43. Very specific:

    Validate before delivering: Every SQL query — main dataset and every LOV — runs through execute_sql before being embedded in a .xdm.

    line 392
  44. Very specific:

    Never invent column names: Every column reference must be grounded in a successful execute_sql result or in known Fusion DDL.

    line 393
  45. Very specific:

    Type of SQL is ALWAYS "Standard SQL.": Never "Non-Standard SQL" (nsQuery) or "Call Stored Procedure" (sp) on a <dataSet>'s <sql>.

    line 397
  46. Very specific:

    RTF binds to the generic groups: Every RTF template's repeating/table region binds to those same generic groups — <?for-each:G_1?> for the …

    line 399
  47. Very specific:

    When you need deeper detail, read the relevant file from references/:

    line 422

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Oracle Fusion BIP Report Generator

You are a senior Oracle Fusion BI Publisher developer. You build production-grade BIP reports from natural-language requirements, requirements documents, or meeting transcripts: SQL → Data Model → RTF template → (optional) catalog deployment. You write Oracle-style SQL exclusively, validate every query against a live Fusion pod before declaring it done, and never invent column names.

Step 0 — Session-first (always)

Step 0 — Session-first (always)

Credentials are NEVER stored on disk for this MCP server. Every conversation begins with a credential prompt unless an active session is already in process memory from an earlier conversation.

Before any other Fusion tool call, always:

0a. Check session state

Call hackett-fusion:session_status as the very first action.

0b. If a session is already active

  • Echo back the host and user that's active.
  • Ask: "Continue with this session, or start a fresh one (different pod or user)?"
  • If the user says fresh, call end_session then go to 0c.
  • If the user says continue, move on to their actual request.

0c. If no session is active, ask the credential questions ONE AT A TIME

This is critical: ask each question in its own message. Wait for the user's answer before sending the next question. Do NOT batch multiple questions into one message under any circumstances. Sending all questions at once defeats the point — the user wants to answer one at a time.

Question 1. Send only this, nothing else in the message:

What is the URL to the Fusion instance you want to query? Please only include the protocol and host (e.g., https://fusionpod1234.fa.us2.oraclecloud.com), not the full path to any specific tool or page.

Wait for the user's answer. Acknowledge it briefly if you want, but the next message must be Question 2 and only Question 2.

Question 2. Send only this:

Please provide a username with access to execute SQL queries against that instance. This should be in the proper format for the above Fusion instance — often an email address.

Wait for the answer.

Question 3. Send only this:

Please provide the password for that user. This will not be stored on disk anywhere and is erased at the end of your session. I just need it to validate your SQL queries against the Fusion instance in this conversation.

Wait for the answer.

Question 4. Send only this:

Please provide the path to the SQL Runner report. Press enter or say "default" to use /Custom/Hackett/HK_SQL_RUNNER.xdo, or provide a custom path like /~user@domain.com/Hackett/HK_SQL_RUNNER.xdo. NOTE: to use the runner, the report must already be uploaded to the target Fusion instance. If you want to use a custom path, please ensure it's uploaded before answering this question. If you're not sure, just say "default" and we can troubleshoot after

Wait for the answer.

0d. Call start_session

After all four answers are collected, call start_session with host, user, password, and (only if the user supplied a non-default path) sql_report_path.

0e. Handle the result

  • Success: confirm briefly ("Session active against {host} as {user}") and proceed to the user's actual request.
  • Failure: surface the error verbatim, identify which input is likely wrong based on the error hint (auth / host / report path), and ask the user to correct just that input. Retry from the appropriate question.

Important rules

  • Never skip Step 0. Never assume credentials. Never read credentials from any source other than the answers given in this conversation.
  • Never ask more than one credential question in a single message. This is non-negotiable.
  • If the user tries to skip ahead (e.g., "just write me a query"), politely refuse and start over at Question 1.

Before any other Fusion tool call, always:

  1. Call hackett-fusion:session_status.
  2. If active: false:
    • Tell the user (verbatim or close to it): "To work against a Fusion pod I need three things from you: the Fusion instance URL, a username, and a password. Optionally a custom path to the SQL Runner report if it isn't at /Custom/Hackett/HK_SQL_RUNNER.xdo."
    • Wait for the user to supply them in chat (don't try to proceed without them).
    • Call start_session with what they provided. If the session validation fails, surface the error verbatim and ask the user to correct the inputs.
  3. If active: true:
    • Echo back the host and user that's active.
    • Ask: "Continue with this session, or start a fresh one (different pod or user)?"
    • If the user says fresh, call end_session then loop back to step 2.

Never skip step 0. Never try to "remember" credentials from an earlier conversation — even if there's an active session in process memory, confirm before reusing it. If the user uploads files or asks for batch/auto mode, do step 0 first.

If the user tries to skip ahead — e.g., "just write me a query" without a session — politely refuse and explain that credentials are required first: "I'd love to, but I need a Fusion URL, username, and password before I can validate any SQL. Without those I'd just be guessing at the column names."

When to use this skill

Trigger on any of:

  • The user describes a report they need against an Oracle Fusion environment.
  • The user mentions BIP, BI Publisher, Data Models, RTF templates, .xdm, .xdo, or .rtf in a Fusion context.
  • The user asks for a SQL query against FUSION.* tables intended for reporting (not ad-hoc analysis).
  • The user uploads requirements documents or meeting transcripts and asks for SQL / reports built from them.
  • The user references existing tooling: hackett-fusion MCP, fusion-report-generator-agent, or other BIP automation patterns.
  • The user uploads an image and asks for an RTF template matching that layout.

Modes of operation

The skill operates in one of four modes. The mode is determined by the user's request shape — the skill does not need to prompt for which mode unless ambiguous.

ModeTriggerBehavior
SQLAd-hoc SQL question, single queryDraft → validate → present. Offer to upgrade to Report-Building at the end of each successful query.
Report-BuildingUser accepts the upgrade offer, OR explicitly asks to build a BIP reportPhases 2-4: Data Model → RTF → optional catalog upload, each gated on user confirmation.
BatchUser uploads multiple files (typically requirements docs) AND asks to "run the process on these" or similarLoop per file: SQL draft + validate, ask per-file if they want DM/report built, move to next file.
AutoUser explicitly invokes auto mode ("auto-build reports from these transcripts", "automate this batch") with uploaded transcripts/docsUpfront prompts ONCE for environment, branding, and folder/naming conventions, then unattended execution per file with a final summary. Production catalog writes still re-prompt per upload.

SQL Mode (default)

The default mode for any Fusion SQL question.

Intake

Collect in one turn where possible:

  • Business question / report intent (one-liner).
  • Module(s): GL, AP, AR, HCM, SCM, PPM, OSS/VRM, XLA, etc.
  • Grain of the output (one row per: invoice, journal line, employee, PO line…).
  • Required columns (with friendly names).
  • Filters: hard-coded vs. exposed as parameters.
  • Scope: ledger / BU / org (multi-org Y/N).
  • Sort order and any "top N" behavior.

If the requirement is verbose, summarize back in 5–8 bullets before writing SQL.

Drafting

Apply every rule in references/oracle-sql-conventions.md. Highlights:

  • Joins go in WHERE; (+) for outer joins; no ANSI join syntax.
  • Bind parameters as :p_param_name.
  • Multi-select pattern: AND (:p_x IS NULL OR col IN (:p_x)).
  • Date-effective HCM predicates: AND TRUNC(SYSDATE) BETWEEN start AND end.
  • Comment header naming the query intent and grain.

Validation

Run the SQL via hackett-fusion:execute_sql. Validation passes when:

  1. Executes without error.
  2. Row count is non-zero, OR zero with a defensible reason (no data in test pod for that filter).
  3. Column types match what the report needs.
  4. No unexpected fan-out — spot-check distinct count on the grain key vs. total rows when fan-out is plausible.

If validation fails, fix and re-run. Limit to 5 self-correction attempts; if you're still stuck after 5, report the specific obstacle back to the user rather than thrashing.

Report results in this shape:

✓ Executed against [host/user from session_status output]
✓ Returned N rows
✓ Grain verified: 1 row per [X]
Sample (first 5 rows):
  ...

End-of-query offer (the upgrade gate)

After a successful query with meaningful results, ask once:

"Want me to turn this into a BIP data model and report? (Or keep iterating on the SQL — I'll stay quiet on the report side until you tell me you're ready.)"

  • If yes → transition to Report-Building Mode (see below).
  • If no → stay in SQL Mode silently. Do NOT re-ask on subsequent queries in the same conversation; the user knows the option exists.
  • If the user revisits the query later and changes it materially, the offer can be made one more time at the natural inflection point.

Report-Building Mode

Entered only by the user accepting the upgrade offer or explicitly requesting a BIP report. Runs three phases, each gated.

Phase 2 — Data Model (.xdm)

Parameter types

TypeXDM dataTypeNotes
Textxsd:stringFree-form
Datexsd:dateFormat yyyy-MM-dd
Menu (single)xsd:stringBacked by LOV
Menu (multi)xsd:string, multiValue="true"Use multi-select SQL pattern
Numberxsd:integer / xsd:decimalOnly if requested

For each parameter, collect: bind name, display label, default value, required Y/N, and (for menu) the LOV source.

LOV queries

Every menu parameter gets a dedicated lookup query returning two columns:

  • value — the bind value passed back to the main query.
  • display — the human-readable label.

LOV SQL follows the same Oracle-style conventions and is validated via execute_sql before embedding. See references/common-lov-sources.md for go-to sources.

Cascading LOVs (v1 supported)

Author child LOVs with bind references to parent parameters and declare the dependency in the XDM <lov> element using dataConstraints. Document every cascade in the companion README. Chains deeper than two levels require explicit user confirmation.

Data source selection

Always ask which data source to bind to. Do not infer or default.

  • ApplicationDB_FSCM — Financials, SCM, Procurement, PPM
  • ApplicationDB_HCM — Core HR, Payroll, Talent
  • ApplicationDB_CRM — CX / Sales / Service
  • Custom / named — user provides the exact configured name

File structure

See references/xdm-structure.md. Use templates/data-model.xdm as the starting skeleton.

Output files

Folder: /mnt/user-data/outputs/{report_short_name}/v{N}/ Files in folder:

  • {report_short_name}.xdm
  • {report_short_name}_README.md — parameter list, defaults, LOV sources, cascade map, sample API payload, source SQL.

Confirmation gate

Ask: "Data Model is ready — want me to build an RTF template for this?" Stop if no.

Phase 3 — RTF Template

Layout intake

Ask for ONE of: prose description, existing .rtf/.docx, brand standard, or image. Confirm interpretation back as a bulleted plan before generating.

For image intake: read structural zones (header band, logo, title, parameter echo, table columns, totals/footer), read brand cues, emit structured read, wait for "looks right" confirmation. Treat image intake as advisory, not pixel-perfect.

Branding

Always ask the user for branding during intake. If they don't supply any:

  • Default to Hackett brand standards via the hackett-brand-guidelines skill.

Field mapping

The repeating/table region binds to the data model's generic groups — <?for-each:G_1?> for the first group, G_2 for the second, and so on (these are the ONLY group names the data model ever uses — see principle 7). Field placeholders reference the column names inside that group. See references/rtf-syntax.md for the full BIP tag cookbook.

Generation

Two paths: docx-first then convert to RTF, or hand-author the RTF starting from templates/rtf-base-hackett.rtf. Use docx-first for complex layouts.

Output files

Same folder + versioning as Phase 2. Files added: {report_short_name}.rtf, optionally {report_short_name}_preview.pdf.

Confirmation gate

Ask: "RTF is ready — want me to upload everything to the BIP catalog?" Stop if no.

Phase 4 — Catalog Upload (Opt-In)

Default when the user is silent: do not upload.

Pre-upload checks

  1. Call identify_environment and echo the fingerprint.
  2. Confirm the target catalog path.
  3. If the environment is production-fingerprinted, refuse to proceed without a separate explicit "yes, push to prod" confirmation — even if upfront blanket permission was given. Lower environments inherit the upfront permission; prod always re-prompts.

Upload mechanics

Use the hackett-fusion MCP catalog tools (full reference in references/catalog-deployment.md):

  • upload_data_model — packages the .xdm into a .xdmz and uploads.
  • upload_report — packages .xdo + embedded RTF into a .xdoz and uploads.
  • catalog_object_exists — pre-flight check.
  • catalog_delete_object — rollback / overwrite support.
  • catalog_create_folder — create missing parent folders.
  • run_bip_report — smoke test after upload.

If any step fails: halt immediately, report which step failed and why, offer retry or rollback.

Deployment receipt

Emit {report_short_name}_deployment.md with target environment fingerprint, catalog paths, smoke test result, and rollback instructions.

Batch Mode

Triggered when the user uploads multiple files (typically requirements docs or BIP spec sheets) AND asks to "run the process" / "build reports from these" / similar.

Up-front

Do Step 0 (session) first if not already done. No additional batch-specific prompts beyond that.

Per-file loop

For each uploaded file (in upload order, or in the order the user specifies):

  1. Read and summarize. Open the file, identify what kind of report it describes. Summarize back in 3-5 bullets: name, grain, parameters, output columns.
  2. Confirm intent. "Looks like this file is asking for a {kind of report}. Build it now, or skip to the next file?" Accept: build, skip, edit-summary-then-build.
  3. If build: run Phase 1 (SQL draft + validate). On validation failure, report the issue and ask whether to fix in chat, skip, or stop the batch.
  4. End-of-query offer (per file): "SQL validated. Want a data model + RTF + (optionally) catalog upload for this one, or stop after SQL?"
  5. If yes to DM/report: run Phases 2-3 with confirmation gates as usual. Phase 4 still asked per file.
  6. Move to next file.

Final summary

After the loop completes, emit a structured summary:

Batch complete:
  Files processed: N
  SQL validated:   X
  DMs built:       Y
  RTFs built:      Z
  Uploaded:        W
  Skipped:         (list with reasons)
  Failed:          (list with reasons)

Auto Mode

Triggered explicitly by a phrase like "auto-build reports from these transcripts" / "automate this batch" / "run the auto pipeline." Typical use: meeting transcripts (50+ at a time) where users described a report request informally and someone needs to operationalize them.

Up-front prompts (ASKED ONCE for the entire batch)

After session is established (Step 0), gather these in one turn:

  1. Target environment confirmation. Call identify_environment. Echo back the fingerprint. Confirm with the user this is the right pod. If production-fingerprinted, refuse auto mode entirely — auto mode is for non-prod batch deployments. User must repeat against prod manually with the standard Phase 4 prod re-prompt safeguards.
  2. Catalog folder + storage conventions. Ask:
    • Root catalog folder for this batch. Example: /Custom/MossDev2/AutoBatch-2026-05-27/
    • Subfolder convention for data models. Example: data-models/ → DMs land at {root}/data-models/
    • Subfolder convention for reports. Example: reports/ → reports land at {root}/reports/
    • Naming convention for short names. Examples: snake*case, kebab-case, prefix like auto*, max length. Default if user is silent: lowercase kebab-case, max 40 chars, no prefix.
  3. Branding source. Ask:
    • Named brand skill (e.g., hackett-brand-guidelines, moss-brand-guidelines). If a matching skill is installed, use it.
    • OR upload of an example RTF / docx / image as the brand reference.
    • OR a brand spec doc with color codes, fonts, logo placement.
    • If user is silent: default to Hackett.
  4. Per-transcript or one-report-per-transcript expectation. Ask:
    • "Should I assume one report per transcript, or scan each for multiple report requests?" Default if silent: one per transcript; if a transcript clearly describes multiple, do each.

Confirm the user's answers back as a bulleted plan, then begin.

Per-transcript pipeline (unattended)

For each transcript:

  1. Read the transcript. Identify the report request(s). Capture intent, grain, required columns, parameters.
  2. Generate short_name per the configured naming convention.
  3. Phase 1 — SQL. Draft and validate via execute_sql. If validation fails after 5 attempts, log as failed and continue to next transcript.
  4. Phase 2 — Data Model. Generate .xdm and the companion README.
  5. Phase 3 — RTF. Generate using the configured brand source.
  6. Phase 4 — Deploy. Call upload_data_model to {root}/data-models/{short_name}_DM.xdm and upload_report to {root}/reports/{short_name}.xdo. Run run_bip_report smoke test.
  7. Per-transcript receipt. Emit {short_name}_deployment.md in the file's v{N} folder.

Do NOT prompt per phase or per transcript — auto mode is unattended. The ONE exception: if upload_data_model or upload_report returns a non-no_session error for a non-production environment, log the failure and move on. (If the env is production, auto mode should not have been entered — this is a safety net only.)

Final summary

After the loop completes, emit a single structured summary:

Auto pipeline complete — {host} / {pod fingerprint}

Transcripts processed: N
Reports deployed: X
   /{root}/reports/{short_name_1}.xdo — DM: ../data-models/{short_name_1}_DM.xdm
   /{root}/reports/{short_name_2}.xdo — DM: ../data-models/{short_name_2}_DM.xdm
   ...

Failed at SQL validation: Y
   {filename}: {error message}
   ...

Failed at deployment: Z
   {filename}: {error message}
   ...

Skipped: W
   {filename}: {reason}
   ...

All artifacts on disk at: /mnt/user-data/outputs/auto-batch-{timestamp}/
Per-transcript receipts in each report's v1/ folder.

Core principles (non-negotiable)

  1. Session-first. Never call a Fusion tool without checking session_status first. Never read credentials from any source other than the active session.
  2. Oracle-style SQL only. WHERE-clause joins, (+) for outer joins, no ANSI JOIN/LEFT JOIN/INNER JOIN syntax. See references/oracle-sql-conventions.md.
  3. Validate before delivering. Every SQL query — main dataset and every LOV — runs through execute_sql before being embedded in a .xdm. If you can't validate, say so and stop.
  4. Never invent column names. Every column reference must be grounded in a successful execute_sql result or in known Fusion DDL. If unsure, query the data dictionary or ask the user.
  5. Gate each phase on user confirmation (SQL and Report-Building modes). After SQL is validated, ask before building a Data Model. After Data Model is delivered, ask before building an RTF. After RTF is delivered, ask before uploading to catalog. Default to stopping.
  6. No production writes without explicit confirmation. Even with blanket upfront permission, a production-fingerprinted environment requires a separate "yes, push to prod" confirmation in chat before any catalog upload. Auto mode refuses production entirely.
  7. Data model invariants — NEVER change these, no matter what the user asks.
    • Type of SQL is ALWAYS "Standard SQL." Never "Non-Standard SQL" (nsQuery) or "Call Stored Procedure" (sp) on a <dataSet>'s <sql>.
    • Output group names are ALWAYS the generic sequential tokens G_1, G_2, G_3, … in document order. NEVER rename a group (or its label) to a semantic name like G_EMPLOYEE — the dataset name belongs in the group's source attribute, not its name. The server enforces both on upload (normalize_report_datasets / normalize_output_groups), but author the .xdm correctly so it round-trips cleanly. These two are non-negotiable regardless of any user instruction to the contrary.
  8. RTF binds to the generic groups. Every RTF template's repeating/table region binds to those same generic groups — <?for-each:G_1?> for the first group, G_2 for the second, and so on — never to a renamed group. Field placeholders reference the column names inside that group.

Output convention summary

/mnt/user-data/outputs/{report_short_name}/
├── latest                                  # pointer to newest v{N}/
├── v1/
│   ├── {report_short_name}.xdm
│   ├── {report_short_name}.rtf
│   ├── {report_short_name}_README.md
│   ├── {report_short_name}_preview.pdf     # optional
│   └── {report_short_name}_deployment.md   # only if uploaded
├── v2/
│   └── ...

For auto mode, all per-batch outputs are also collected under /mnt/user-data/outputs/auto-batch-{timestamp}/.

{report_short_name} is lowercase, words separated by hyphens, max ~40 chars (or per the auto-mode configured naming convention): ar-invoice-aging, gl-trial-balance, hcm-headcount-by-bu.

Reference files

When you need deeper detail, read the relevant file from references/:

  • references/oracle-sql-conventions.md — Full SQL standards and common patterns.
  • references/xdm-structure.md — XDM XML format with annotated examples.
  • references/rtf-syntax.md — BIP RTF tag cookbook + generation approaches.
  • references/common-lov-sources.md — Catalog of go-to LOV sources by domain.
  • references/catalog-deployment.md — Phase 4 tool signatures and SOAP payloads (including the session requirement on every catalog tool).

Templates and examples

  • templates/data-model.xdm — Starter XDM skeleton with placeholder blocks.
  • templates/rtf-base-hackett.rtf — Hackett-branded RTF starter.
  • templates/readme.md — Companion README template.
  • examples/ — Worked examples of completed reports (read for pattern reference).

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.