Rigorous analytical skills for biblical study, exegetical analysis, and faithful application. Built with TDD methodology to prevent AI exegetical malpractice.

Rigorous analytical skills for biblical study and teaching preparation.
Sonnet is the default for retrieval, smoke checks, and deep-study stages. Haiku is not supported for any study or evaluation. A caller may explicitly select Opus when a study warrants stronger reasoning; existing Opus choices stay intact. Context-preserving skills retain a Sonnet or Opus caller. If the caller is on Haiku, switch to Sonnet or Opus before starting the study. Do not delegate to a built-in agent that would select Haiku.
The deep-study request accepts optional model: "sonnet" | "opus"; omission means sonnet, and other values are rejected before any stage launches. The selected model applies to every stage, including repair and re-verification. For ordinary agent calls, use the explicit model: opus override when escalation is justified.
This policy governs plugin-controlled selections. The plugin also ships one small guard (hooks/guard.ts, Claude Code 2.1.287 or later) for the two ways a session could still put its agents on Haiku:
coa: agent spawned with model: haiku runs on Sonnet instead;/coa:deep-study refuses to start while CLAUDE_CODE_WORKFLOW_SUBAGENT_MODEL names Haiku, and says to unset it or set it to sonnet or opus.Other forced model settings or organizational substitutions can still override plugin defaults. Evaluation traces reject observed Haiku execution rather than certifying such a run. Installed copies receive changes through plugin updates.
The guard is the plugin's only code. It runs inside Claude Code as a mod, reads one environment variable (CLAUDE_CODE_WORKFLOW_SUBAGENT_MODEL), and touches no files, network or processes. claude plugin validate plugins/claude-of-alexandria lists exactly what it does. Where Anthropic or an organisation switches mods off, the guard does not load and the skills work as before. Optional extras that run more code live in the separate coa-desk plugin.
The MCP server runs on Cloudflare Workers + D1 (edge SQLite). Skills call MCP tools automatically to retrieve linguistic data — morphology, discourse features, vocabulary frequencies, paragraph markers — with no local installation required.
COA uses separate execution paths for separate jobs:
| Path | Use |
|---|---|
| Context-aware skills | Preserve the user's current request and await specialist results |
deep-study workflow | Repeatable, bounded orchestration with structured stage contracts |
study-team | Optional attended discussion between three in-process teammates |
Some skills delegate specialized work to sub-agents:
study-evaluator (Sonnet)
└── biblical-scholar (Sonnet)
└── data-retriever (Sonnet)
The data-retriever agent (Sonnet) handles all MCP data gathering and compression. Higher-level agents and skills spawn it automatically, keeping token usage low and data handling centralized.
The reference server exposes 27 tools. Skills call these automatically. V4 requires native JSON arrays, explicit modes for variant tools, and cursor iteration through page.next_cursor.
Core linguistic tools:
| Tool | Queries | Coverage |
|---|---|---|
query_morphology | Word-level morphological parsing | Both |
query_discourse_features | Levinsohn NT discourse features | NT |
query_paragraph_breaks | Masoretic petuchah/setumah markers | OT |
query_vocabulary | Lemma frequencies, thematic keywords, clustering | Both |
query_ot_quotes | OT quotations and allusions in the NT | NT |
query_themes_for_lemmas | Resolve morphology lemmas to vocabulary theme names | Both |
query_lemmas | Cross-book lemma distribution | Both |
query_theme_distribution | Cross-book distribution of a thematic keyword group | Both |
query_syntax | OpenText clause-level semantic role annotations | NT |
query_variants | Textual variant edition comparison across 9 editions | NT |
query_lexicon | Strong's-based word definitions (TBESH/TBESG) | Both |
list_books | Available books, metadata, and thematic keyword groups | Both |
Entity and context tools:
| Tool | Queries | Coverage |
|---|---|---|
query_cross_references | Editorial tradition cross-references between verses | Both |
trace_cross_reference_path | Bounded path search through the cross-reference graph | Both |
query_places | Geographic locations with coordinates | Both |
query_people | Named individuals with cross-canonical appearances | Both |
query_events | Timeline events with participants and locations | Both |
query_person_network | Family relationships and co-appearances | Both |
query_speakers | Speaker attribution with quotation type | Both |
check_versification | Hebrew-English verse numbering differences | OT |
query_ot_structure | Verse-edge syntax, participant, and speech boundary context | OT |
Bible text and commentary tools:
| Tool | Queries | Coverage |
|---|---|---|
bible_lookup | Verse text in 6 translations | Both |
commentary_lookup | Commentary entries from 6 commentaries | Both |
parallel_text | Compare verse text across multiple translations | Both |
confessional_lookup | Creeds and confessions (4 query modes) | — |
liturgical_lookup | Church-year season → passages + themes, passage → season(s) lookup | — |
query_controversies | Contested topics by topic or passage | — |
Tech stack: TypeScript, Cloudflare Workers, D1 (edge SQLite), MCP SDK (HTTP transport). No local runtime needed.
Produces structured, context-neutral exegetical analysis of a biblical passage. Data-grounded. Always English. Saves to file as a reusable reference document.
Usage:
/coa:exegetical-notes Romans 8:1-11
Answers questions about a biblical passage's meaning, validates analogies or ideas against the text, and provides cross-references with scholarly evidence. Works with or without an explicit passage anchor.
Usage:
/coa:consult-biblical-scholar Is "rest" in Hebrews 4 about salvation or sanctification?
Maps the logical argument of a biblical passage using discourse markers and morphological data. Produces a connective-anchored proposition chain showing how clauses relate to each other.
Usage:
/coa:argument-flow Phil 2:1-4
Validates whether a biblical passage constitutes a coherent discourse unit. Recommends boundary extensions or contractions based on linguistic evidence from bundled data.
Usage:
/coa:pericope-delimitation Romans 8:1-17
Divides biblical books into coherent teaching units with integrity safeguards.
Coverage: All 66 canonical books
Usage:
/coa:biblical-segmentation Divide Romans into 12 sessions for a sermon series.
Builds a passage reader with a deduplicated, MCP-grounded lemma glossary.
/coa:passage-glossary Philippians 2:5-11
Runs an optional three-perspective review of a completed deep-study report. It requires an attended interactive session with agent teams already enabled and supports in-process teammates only. It does not change settings or fall back to ordinary sub-agents.
/coa:study-team
Runs the fixed evidence → boundary → parallel analysis → verification → optional one-time repair → synthesis graph. Input must include the passage, research question, output language, context, and constraints. At most two calls run concurrently and eight run in total. The workflow binds each call to one of four leaf agent types. Retrieval and verification can use only the plugin's read-only MCP tools; analysis and synthesis are tool-free. None can spawn a descendant.
/coa:deep-study passage=Philippians 2:5-11; research question=How does the passage present Christ's humiliation and exaltation?; output language=English; context=Teaching outline; constraints=Distinguish evidence from interpretation
Sub-agents are selected by skills or workflows automatically. They are not invoked directly.
| Agent | Model | Role |
|---|---|---|
data-retriever | Sonnet | Fetches MCP data, compresses into structured summaries with testament-aware routing |
biblical-scholar | Sonnet | Scholarly analysis (ANALYZE, VALIDATE, TRACE modes) with confidence tiers |
study-evaluator | Sonnet | Evaluates study materials against exegetical standards with drift classification |
pericope-delimitation | Sonnet | Boundary validation with structured verdicts |
argument-flow | Sonnet | Logical structure mapping with proposition chains |
smoke-test | Sonnet | Pipeline verification |
deep-study-retrieval | Sonnet | Read-only MCP evidence retrieval and provenance capture |
deep-study-analysis | Sonnet | Tool-free boundary, discourse, interpretation, and repair analysis |
deep-study-verification | Sonnet | Read-only MCP claim and reference verification |
deep-study-synthesis | Sonnet | Tool-free final report rendering |
study-team-textual-evidence | Sonnet | Leaf teammate for textual structure and evidence integrity |
study-team-interpretation | Sonnet | Leaf teammate for the evidence-to-interpretation chain |
study-team-critique | Sonnet | Leaf teammate for adversarial confidence and synthesis review |
This plugin is built using Test-Driven Development. Model-free CI validates every shipped definition, reference, generated workflow, and canonical RED/GREEN configuration. Maintainer-run promptfoo acceptance uses the Claude Agent SDK with live MCP data; paid model evaluations do not run in PR CI.
See CLAUDE.md for development guidelines and the Librarian's instructions.
All skills follow historical-grammatical method with theological guardrails:
GNU General Public License v3.0 - See repository root for details.
hooks/guard.ts 27 lines1// The only code the coa plugin runs: a guard that keeps coa agents off Haiku,
2// which this project does not support (docs/adr/0002, 2026-09-30 amendment;
3// docs/adr/0006). Everything else in coa is Markdown and a remote MCP server.
4//
5// It reads one environment variable and logs one line. It reads no files,
6// makes no network requests and starts no processes.
7
8const HAIKU = /haiku/i
9
10export function register(on) {
11 // An Agent-tool spawn can be moved to Sonnet. A workflow agent's model cannot
12 // be changed from a hook, so a Haiku workflow override is refused instead.
13 on('agent.spawn', { subagentType: /^coa:/ }, async ($, e, next) => {
14 if (e.workflow) {
15 const forced = await $.env.get('CLAUDE_CODE_WORKFLOW_SUBAGENT_MODEL')
16 if (!HAIKU.test(String(forced ?? '')) && !HAIKU.test(String(e.model ?? ''))) return next(e)
17 return {
18 deny: 'coa workflow agents do not run on Haiku. Unset CLAUDE_CODE_WORKFLOW_SUBAGENT_MODEL or set it to sonnet or opus, then run the workflow again.',
19 }
20 }
21 if (!HAIKU.test(String(e.model ?? ''))) return next(e)
22 await $.ui.log(`${e.subagentType} asked for ${e.model}; coa agents run on Sonnet instead.`)
23 return next({ ...e, model: 'sonnet' })
24 // Fail open: a fault in this guard must never stop coa agents from starting.
25 }).catch(async ($, e, next) => next(e))
26}
27