SLOPSHOPPER

Claude of Alexandria

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

agents
A shopper browsing a rack in a slop shop
README

Claude of Alexandria Plugin

Rigorous analytical skills for biblical study and teaching preparation.

Model policy

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:

  • a 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.

What runs on your machine

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.

Architecture

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:

PathUse
Context-aware skillsPreserve the user's current request and await specialist results
deep-study workflowRepeatable, bounded orchestration with structured stage contracts
study-teamOptional 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.

MCP Server

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:

ToolQueriesCoverage
query_morphologyWord-level morphological parsingBoth
query_discourse_featuresLevinsohn NT discourse featuresNT
query_paragraph_breaksMasoretic petuchah/setumah markersOT
query_vocabularyLemma frequencies, thematic keywords, clusteringBoth
query_ot_quotesOT quotations and allusions in the NTNT
query_themes_for_lemmasResolve morphology lemmas to vocabulary theme namesBoth
query_lemmasCross-book lemma distributionBoth
query_theme_distributionCross-book distribution of a thematic keyword groupBoth
query_syntaxOpenText clause-level semantic role annotationsNT
query_variantsTextual variant edition comparison across 9 editionsNT
query_lexiconStrong's-based word definitions (TBESH/TBESG)Both
list_booksAvailable books, metadata, and thematic keyword groupsBoth

Entity and context tools:

ToolQueriesCoverage
query_cross_referencesEditorial tradition cross-references between versesBoth
trace_cross_reference_pathBounded path search through the cross-reference graphBoth
query_placesGeographic locations with coordinatesBoth
query_peopleNamed individuals with cross-canonical appearancesBoth
query_eventsTimeline events with participants and locationsBoth
query_person_networkFamily relationships and co-appearancesBoth
query_speakersSpeaker attribution with quotation typeBoth
check_versificationHebrew-English verse numbering differencesOT
query_ot_structureVerse-edge syntax, participant, and speech boundary contextOT

Bible text and commentary tools:

ToolQueriesCoverage
bible_lookupVerse text in 6 translationsBoth
commentary_lookupCommentary entries from 6 commentariesBoth
parallel_textCompare verse text across multiple translationsBoth
confessional_lookupCreeds and confessions (4 query modes)—
liturgical_lookupChurch-year season → passages + themes, passage → season(s) lookup—
query_controversiesContested topics by topic or passage—

Tech stack: TypeScript, Cloudflare Workers, D1 (edge SQLite), MCP SDK (HTTP transport). No local runtime needed.

Available Skills

exegetical-notes

Produces structured, context-neutral exegetical analysis of a biblical passage. Data-grounded. Always English. Saves to file as a reusable reference document.

  • Runs pericope check first - Verifies boundaries before analysis
  • Every claim sourced - Bundled data or web-verified scholarly sources
  • Training knowledge supplements - Never substitutes for data

Usage:

/coa:exegetical-notes Romans 8:1-11

consult-biblical-scholar

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.

  • Confidence tiering - Every answer declares its evidence basis
  • MCP data before answering - No training-data-only verdicts
  • Formal verdict for analogy questions - Structured evaluation, not vibes

Usage:

/coa:consult-biblical-scholar Is "rest" in Hebrews 4 about salvation or sanctification?

argument-flow

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.

  • Conjunction-first analysis - MCP morphology data shapes the argument, not training memory
  • Genre-aware - Different structural methods for epistles, narrative, poetry
  • Numbered proposition chain - Every response includes one, no exceptions

Usage:

/coa:argument-flow Phil 2:1-4

pericope-delimitation

Validates whether a biblical passage constitutes a coherent discourse unit. Recommends boundary extensions or contractions based on linguistic evidence from bundled data.

  • Data-grounded boundaries - Never from commentary tradition alone
  • Inline response - Quick consultation before deeper study
  • Checks actual discourse features - Levinsohn markers, not familiarity with "famous passages"

Usage:

/coa:pericope-delimitation Romans 8:1-17

biblical-segmentation

Divides biblical books into coherent teaching units with integrity safeguards.

  • Refuses impossible divisions - Won't pretend Philemon can be 12 sessions
  • Presents multiple frameworks - Because interpretation isn't a dictatorship
  • Validates against ancient markers - Masoretic markers, Levinsohn discourse features
  • Handles contested books - Isaiah's unity debate gets frameworks, not false consensus

Coverage: All 66 canonical books

Usage:

/coa:biblical-segmentation Divide Romans into 12 sessions for a sermon series.

passage-glossary

Builds a passage reader with a deduplicated, MCP-grounded lemma glossary.

/coa:passage-glossary Philippians 2:5-11

study-team

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

Available Workflow

deep-study

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

Available Agents

Sub-agents are selected by skills or workflows automatically. They are not invoked directly.

AgentModelRole
data-retrieverSonnetFetches MCP data, compresses into structured summaries with testament-aware routing
biblical-scholarSonnetScholarly analysis (ANALYZE, VALIDATE, TRACE modes) with confidence tiers
study-evaluatorSonnetEvaluates study materials against exegetical standards with drift classification
pericope-delimitationSonnetBoundary validation with structured verdicts
argument-flowSonnetLogical structure mapping with proposition chains
smoke-testSonnetPipeline verification
deep-study-retrievalSonnetRead-only MCP evidence retrieval and provenance capture
deep-study-analysisSonnetTool-free boundary, discourse, interpretation, and repair analysis
deep-study-verificationSonnetRead-only MCP claim and reference verification
deep-study-synthesisSonnetTool-free final report rendering
study-team-textual-evidenceSonnetLeaf teammate for textual structure and evidence integrity
study-team-interpretationSonnetLeaf teammate for the evidence-to-interpretation chain
study-team-critiqueSonnetLeaf teammate for adversarial confidence and synthesis review

Development

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.

Hermeneutical Framework

All skills follow historical-grammatical method with theological guardrails:

  • Anti-moralism mandate - No "try harder" applications without gospel
  • Christ-centeredness - Traces redemptive-historical arc
  • Context primacy - Respects discourse units, pericopes, books
  • Genre governance - Right method for the text type
  • Covenantal awareness - Attends to progressive revelation

License

GNU General Public License v3.0 - See repository root for details.

Source 1 files
hooks/guard.ts 27 lines
1// 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