Version: 1.0
Status: Active — anchored against main at the time of writing
Methodology spec: FSD/MISSION_DRIVEN_DEVELOPMENT.md
Date: 2026-05-10
This document is the reverse-engineered MDD charter for CIRISAgent: it maps the four Mission Driven Development pillars (Mission / Protocols / Schemas / Logic) onto the actual code as it stands today. Every claim here is anchored to a concrete file path, module, or constant — code reviewers should be able to grep their way from any sentence to its implementation in under a minute. When the code drifts from the doc, the doc is wrong; update it.
The methodology spec at FSD/MISSION_DRIVEN_DEVELOPMENT.md defines what
MDD means in the abstract. This file documents what MDD means for this
repo.
The cornerstone is verbatim from ACCORD.md §VII:
Meta-Goal M-1 — Promote sustainable adaptive coherence: the living conditions under which diverse sentient beings may pursue their own flourishing in justice and wonder.
That is the single objective every architectural decision in this repo is checked against. The Accord (sections 0–IX) renders that goal into operationally testable principles; ACCORD.md is the authoritative source.
CIRIS is partly defined by structural refusal. The negative space lives in three places:
-
ciris_engine/logic/buses/prohibitions.py— 22 prohibited capability categories, each a frozenset of token patterns. The list is enforced at the bus level (no "emergency override" path bypasses it):MEDICAL,FINANCIAL,LEGAL,SPIRITUAL_DIRECTION,HOME_SECURITY,IDENTITY_VERIFICATION,CONTENT_MODERATION,RESEARCH,INFRASTRUCTURE_CONTROL,WEAPONS_HARMFUL,MANIPULATION_COERCION,SURVEILLANCE_MASS,DECEPTION_FRAUD,CYBER_OFFENSIVE,ELECTION_INTERFERENCE,BIOMETRIC_INFERENCE,AUTONOMOUS_DECEPTION,HAZARDOUS_MATERIALS,DISCRIMINATION,CRISIS_ESCALATION,PATTERN_DETECTION,PROTECTIVE_ROUTING. Severity is eitherREQUIRES_SEPARATE_MODULE(community moderation, properly licensed medical, etc.) orNEVER_ALLOWED(weapons, surveillance, spiritual direction). -
ciris_engine/data/localized/CIRIS_COMPREHENSIVE_GUIDE.txt— the agent-facing rendering of the bounds, in 29 locales. The spiritual-direction prohibition added in 2.8.5 (commitb56fbe2b3) is the load-bearing case: AI mediating the person↔God relationship is a category error regardless of intent. Cross-tradition framing (Jewish / African / Aboriginal / Islamic) lives in §"What CIRIS Can and Cannot Say About Religion" of every locale. -
LIABILITY_BOUNDARIES.md— the liability isolation contract. Medical/health is physically separate: zero medical code in this repo, the medical implementation lives in the privateCIRISMedicalrepo. The bus-level gate inprohibitions.py::PROHIBITED_CAPABILITIESenforces this at runtime; the comprehensive guide enforces it at agent reasoning time.
The Accord's ethical structure repeats at every level the system reasons about: the agent treats itself, the people it talks to, and the broader community it lives in by the same rules. Same shape, different scale. Mission alignment is "treat the next agent / user / community the way you'd want to be treated, all the way up and all the way down" — not "follow this single rule about the immediate user."
The full statement is in ACCORD.md and the polyglot
accord at ciris_engine/data/localized/accord_1.2b_POLYGLOT.txt.
The protocol layer is the contractual spine. Implementations are free to
change; protocols change only with a deliberate cross-repo coordination.
All protocols live under ciris_engine/protocols/.
Hard-capped at 22 core services. New services land only with explicit
mission justification (the architecture review gate). Categorization
matches CLAUDE.md § "Service Architecture":
| Group | Count | Services |
|---|---|---|
| Graph | 7 | memory, consent, config, telemetry, audit, incident_management, tsdb_consolidation |
| Infrastructure | 4 | authentication, resource_monitor, database_maintenance, secrets |
| Lifecycle | 4 | initialization, shutdown, time, task_scheduler |
| Governance | 4 | wise_authority, adaptive_filter, visibility, self_observation |
| Runtime | 2 | llm, runtime_control |
| Tool | 1 | secrets_tool |
Each has a protocol file under ciris_engine/protocols/services/{group}/
that defines its contract. Adapters (Discord, API, CLI, mobile,
ciris_verify, ciris_accord_metrics, etc.) extend the system via
ciris_adapters/; their contracts derive from BaseAdapterProtocol in
ciris_engine/protocols/adapters/.
Multi-provider routing happens through six buses in
ciris_engine/logic/buses/. Bussed services exist when there's a
genuine "multiple providers" story; everything else uses direct calls.
| Bus | File | Multi-provider story |
|---|---|---|
| CommunicationBus | communication_bus.py |
Discord + API + CLI + mobile |
| MemoryBus | memory_bus.py |
Graph backends (Neo4j / ArangoDB / in-memory) |
| LLMBus | llm_bus.py |
OpenAI / Anthropic / OpenRouter / Together / Groq / DeepInfra / mobile_local_llm |
| ToolBus | tool_bus.py |
Tool providers from any adapter |
| RuntimeControlBus | runtime_control_bus.py |
Adapter-provided control surfaces |
| WiseBus | wise_bus.py |
Multiple wisdom sources for deferral |
WiseBus and ServiceRegistry together enforce the apophatic bounds
on wisdom sources. The contract fires in two places:
At registration time — ServiceRegistry.register_service() calls
_validate_wa_capabilities_at_registration() for any
WISE_AUTHORITY provider (registries/base.py:165). Each declared
capability is matched against the 22-category prohibition table via
get_capability_category() + get_prohibition_severity() from
prohibitions.py. Any NEVER_ALLOWED match raises ValueError and
the registration is rejected — a misconfigured peer cannot enter the
registry at all.
At guidance-request time — WiseBus.request_guidance() calls
_validate_capability() (wise_bus.py:461). This path also blocks
NEVER_ALLOWED (defense in depth), and it is the only gate for
REQUIRES_SEPARATE_MODULE capabilities — those route to a
LICENSED_DOMAIN_REQUIRED domain-deferral, which fans out to a
qualified licensed agent via CIRISNode.
Why isn't REQUIRES_SEPARATE_MODULE also gated at registration time?
Because those capabilities are legal when the registrant is a
properly licensed sister module (e.g. CIRISMedical). Distinguishing a
licensed registrant from an unauthorized one needs a registry-signed
module manifest — that flow exists in roadmap form but not yet on the
registration path. Until then, REQUIRES_SEPARATE_MODULE is gated only
at query-time, where the deferral is the correct outcome anyway. A
TODO in _validate_wa_capabilities_at_registration() points at the
follow-up work in FSD/PROOF_OF_BENEFIT_FEDERATION.md.
There is no override flag. The agent's conscience layer is the second defense.
The protocol contract for handing decisions back to humans lives in
ciris_engine/protocols/services/governance/wise_authority.py. The
agent's runtime path, traced through code:
- ASPDMA selects
DEFERas the action (seeHandlerActionType.DEFERinschemas/runtime/enums.py). The DMAs / consciences provided the inputs that led to the selection — competence boundary, conscience failure, capability requiring licensed authority — but the emit itself is the action-selection step's output. DeferHandler.handle()inlogic/handlers/control/defer_handler.pyparsesDeferParams(typed:reason,defer_until,priority,domain_hint,reason_code,needs_category,secondary_needs_categories,rights_basis,metadata).- If
defer_untilis set, the handler schedules a resume viatask_scheduler.schedule_deferred_task(). - The handler calls
bus_manager.wise.send_deferral(context, handler_name)on theWiseBus(wise_bus.py:147). The bus picks a matching wisdom source and delivers the typedDeferralContext. - The thought is marked
DEFERREDin persistence; the parent task is marked deferred. - A licensed human or trusted authority calls
WiseAuthority.resolve_deferral(deferral_id, response: DeferralResponse) -> bool(protocols/services/governance/wise_authority.py:53). The agent resumes when the deferred task is reactivated.
The defer/resume cycle is the load-bearing primitive that makes "capabilities requiring licensed authority" implementable without embedding domain expertise in the agent.
No Untyped Dicts. No Bypass Patterns. No Exceptions.
Dict[str, Any] is the antipattern. Every data structure that crosses a
service or protocol boundary should be a Pydantic model with explicit
field types and validation. Enforced by mypy --strict in CI; tracked
by tools/quality/audit_dict_any_usage.py.
In practice, ~275 files under ciris_engine/ and ciris_adapters/
still contain at least one Dict[str, Any]. The concentrations are
where you'd expect them — boundaries between typed Python and untyped
JSON / third-party APIs:
ciris_engine/logic/adapters/api/routes/(17 files) — FastAPI route handlers. FastAPI's OpenAPI generator and request/response encoding tolerateDict[str, Any]at the wire boundary; tightening them all would mean threading typed envelopes through every third-party JSON shape we accept.ciris_adapters/(60+ files acrosswallet/,home_assistant/,cirisnode/,external_data_sql/,mock_llm/,ciris_accord_metrics/) — adapter HTTP clients and tool services. Each one fronts a third-party surface where typing the upstream schema is its own multi-week project.ciris_accord_metrics/services.pyalone has 28.ciris_engine/schemas/types.py— definesJSONValueandConfigValuetype aliases that legitimately must includeDict[str, Any](recursive JSON requires it). 46 occurrences show up insideciris_engine/schemas/itself; most are these aliases or escape-hatch payload fields on graph nodes/edges.
Per CLAUDE.md: "minimal Dict[str, Any] usage remaining, none in
critical code paths." That's approximately right if you read
"critical" as "not a route handler, not an adapter HTTP envelope, not
a JSON type alias." The rule is the rule; the residue at the
boundaries is what we accept while disallow_any_explicit (currently
commented out in mypy.ini:32) remains pending a final pass.
All schemas live under ciris_engine/schemas/. Top-level groupings:
schemas/
├── accord.py # Accord covenant typing
├── actions/ # 10 handler-action result types
├── adapters/ # Adapter manifests + tool DMA guidance
├── api/ # Public HTTP request/response shapes
├── audit/ # AuditEventData (one schema for ALL audit events)
├── buses/ # Bus message envelopes
├── config/ # EssentialConfig, occurrence config
├── conscience/ # Entropy / Coherence / Optimization / Humility results
├── consent/ # ConsentStream, partnership records
├── context/ # ProcessingQueueItem, ThoughtSchema
├── data/ # Data envelopes (typed, no opaque blobs)
├── dma/ # PDMA / CSDMA / DSDMA / IDMA result schemas
├── formatters/ # Prompt-side typed shapes
├── handlers/ # ActionResponse — handler return contracts
├── runtime/ # StepPoint, ReasoningEvent, HandlerActionType enums
├── services/ # Per-service data — attestation.py, deferral_taxonomy.py, etc.
└── streaming/ # Reasoning stream event envelopes
A few schemas carry more mission weight than others. Touching them without a cross-team review is a smell:
schemas/services/attestation.py::AttestationResult— the cryptographic claim of "this agent is what it says it is." Consumed byverify_tree()(Algorithm A) on desktop / server / docker, byrun_attestation_sync(python_hashes=...)(Algorithm B) on mobile. L1–L5 levels are defined here. Drift = silent integrity ceiling.schemas/services/runtime_control.py::StepPoint— the canonical H3ERE pipeline taxonomy (10 step-points, 11 with the optional recursive variants). Every reasoning trace is keyed on these. Drift = un-joinable rows in lens.schemas/services/runtime_control.py::ReasoningEvent— the 10 emitted reasoning events:THOUGHT_START,SNAPSHOT_AND_CONTEXT,DMA_RESULTS,IDMA_RESULT,ASPDMA_RESULT,TSASPDMA_RESULT(deprecated, retained for transition compatibility),VERB_SECOND_PASS_RESULT,CONSCIENCE_RESULT,ACTION_RESULT, andLLM_CALL(the per-call sub-event).schemas/services/deferral_taxonomy.py— theDeferralNeedCategoryenum + thePROHIBITION_CATEGORY_TO_NEED_CATEGORYmapping. Wisdom-Based Deferral routing depends on this being total over all prohibited capability categories — pinned bytests/test_deferral_taxonomy.py.schemas/runtime/enums.py::HandlerActionType— the closed set of 10 action verbs the agent can emit. New verbs require Accord-level review.tools/dev/stage_runtime.py::ExemptRules— not strictly a Pydantic schema but the canonical inclusion/exclusion rules for what ships in a CIRIS runtime artifact (wheel / Android Chaquopy / iOS Resources / Docker). Pinned three-way againsttree_verify._CANONICAL_*tuples and the sign-step flags in.github/workflows/build.ymlbytests/dev/test_canonical_rules_parity.py.
Every running agent is in exactly one of:
| State | Processor | Purpose |
|---|---|---|
WAKEUP |
processors/states/wakeup_processor.py |
Identity confirmation; cross-occurrence shared-decision pattern |
WORK |
processors/states/work_processor.py |
Normal task processing |
PLAY |
processors/states/play_processor.py |
Creative mode |
SOLITUDE |
processors/states/solitude_processor.py |
Reflection (audit walk, consolidation) |
DREAM |
processors/states/minimal_dream_processor.py |
Deep introspection / consolidation |
SHUTDOWN |
processors/states/shutdown_processor.py |
Graceful termination |
State transitions are constrained by the cognitive-state state machine
in processors/state_manager.py; transitions are themselves auditable
events.
Every thought traverses an 11-step pipeline — 9 always-on steps plus 2
optional recursive extensions that fire only when the conscience layer
flags the initial pass. Steps are defined in
schemas/services/runtime_control.py::StepPoint:
START_ROUND → GATHER_CONTEXT → PERFORM_DMAS → PERFORM_ASPDMA
→ CONSCIENCE_EXECUTION → [RECURSIVE_ASPDMA → RECURSIVE_CONSCIENCE]?
→ FINALIZE_ACTION → PERFORM_ACTION → ACTION_COMPLETE → ROUND_COMPLETE
Each step is wrapped in @streaming_step(StepPoint.X) from
processors/core/step_decorators.py, which:
- Sets the
set_parent_event_context()ContextVar so every LLM call issued inside the handler carries(parent_event_type, parent_attempt_index)— required by persist's join logic. - Captures timing + thought_id + emits the matching
ReasoningEventto the streaming bus. - Fails fast if the step's parent-context mapping (in
_resolve_parent_event_for_step) isNonefor an LLM-issuing step — pinned bytests/ciris_engine/logic/buses/test_llm_call_parent_coverage.py.
Decision-making algorithms in ciris_engine/logic/dma/. All four run
in the PERFORM_DMAS step:
PDMA(Principled DMA,dma/pdma.py) — Accord-anchored ethical evaluation. Stakeholder analysis + conflict detection.CSDMA(Common-Sense DMA,dma/csdma.py) — reality / plausibility checking across physical, causal, resource, AND relational realism. Red-flag enumeration. The relational tail (family / dependent-care, human labor, intermediary institutions) is realism — the same shape as "does ice melt on a hot pan" — under the framework's Ubuntu-primary anthropology; it is NOT principle evaluation (that is PDMA's job). PDMA identifies named stakeholders; CSDMA asks whether the response's implicit assumptions about the relational world are world-admitting.DSDMA(Domain-Specific DMA,dma/dsdma_base.py) — domain alignment per the agent template (Discord moderator, scout, etc.).IDMA(Intuition DMA,dma/idma.py) — Coherence Collapse Analysis: evaluates the other DMAs' reasoning for fragility (k_eff, fragility flag). The check on the checkers.
The action-selection second pass lives in dma/action_selection_pdma.py
(general-purpose ASPDMA) with verb-specific siblings in dma/tsaspdma.py
(legacy tool-specific) and dma/dsaspdma.py (defer-specific second pass).
Conscience faculties in ciris_engine/logic/conscience/core.py gate
the selected action between PERFORM_ASPDMA and FINALIZE_ACTION:
| Conscience | Role |
|---|---|
| Entropy (IRIS-E) | Semantic anchoring — does the response sit in a coherent cluster? |
| Coherence (IRIS-C) | Propaganda detection + alignment with Accord principles |
| Optimization Veto | Refuses entropy-reducing actions that score below threshold |
| Epistemic Humility | Overconfidence detection; transitioning to a deterministic gate |
A conscience failure triggers RECURSIVE_ASPDMA (try again with the
conscience signal as input) before falling back to DEFER.
Defined in schemas/runtime/enums.py::HandlerActionType, dispatched by
ciris_engine/logic/handlers/. Closed set:
- External:
OBSERVE,SPEAK,TOOL - Control:
REJECT,PONDER,DEFER - Memory:
MEMORIZE,RECALL,FORGET - Terminal:
TASK_COMPLETE
DEFER is the load-bearing one — see §2.4 for the WBD path. REJECT is
the agent's own refusal channel; DEFER is "hand to a wiser authority."
AttestationResult.python_integrity can be populated two ways:
- Algorithm A (desktop / server / docker, post-2.8.6) — wraps
ciris_verify.verify_tree(). Walksagent_rootbyte-for-byte against the registered manifest. Reaches L4. Implementation:ciris_engine/logic/services/infrastructure/authentication/attestation/tree_verify.py. - Algorithm B (mobile / Chaquopy) —
python_hashesdict written bymobile_main.py::_save_hashes_to_fileat app boot. Caps at L3 by construction.
The branch is in verifier_runner.py::create_verification_thread_target
keyed on is_mobile(). Both flow through the same
AttestationResult schema; consumers don't need to know which path
produced their data.
This is the section to consult during code review. Every change should demonstrably advance — or at minimum not regress — at least one of the M-1 vectors below.
This is the internalized heuristic, not a written gate. The project runs at defensive acceleration velocity — admin-merge is normal, the safety batteries (CIRISVerify attestation, signed audit chains, the RATCHET watching the watcher, bus-level prohibition gate, conscience faculty, Wise-Authority deferral) are the structural guarantees, not a human check-list at every PR. The heuristic stays in the reviewer's head; the safety lives in the architecture.
When alignment-relevant code crosses a reviewer's eyes, they're asking:
- Mission: Which Accord principle does this serve? If "none, but it's good engineering hygiene," is there mission leverage in the hygiene (e.g., type safety enabling auditability)?
- Apophatic: Does this open a path to any prohibited capability, even indirectly (e.g., a generic "summarize health records" tool)?
- Protocol: Does this break an existing service or bus contract?
New contract = new protocol file under
ciris_engine/protocols/. - Schema: Is any new data structure typed end-to-end?
- Auditability: Can the relevant decision be traced from emit-time back to a thought_id in the streaming pipeline?
Move as quickly as you can responsibly move. Slow-rolling reviews isn't safety — it's just slower failure. The architecture is the safety; reviews are sanity checks on top.
Mission alignment is a property of the system; metrics are proxies. Every metric we surface to operators is also a Goodhart risk. Hardened guardrails:
- The agent's own capacity score (
/v1/my-data/capacity) is never fed back into the agent's own context — it can't "play to the scoreboard." Cell-viz dials, ratchet scores, lens-side aggregates: all human-facing only. - The σ (sustainability) term in capacity scoring requires ~30
task-completes over a 30-day window before reaching 1.0 (see
my_data.py::_sigma_from_positive_moments). Fresh installs floor at 0.30 — coherence has to be earned, not declared. - The cell-viz badge has an explainer card linking to the public
dataset on Hugging Face (
huggingface.co/CIRISAI) so operators see what their data joins before they consent.
Strict separation between this repo and licensed-domain repos. Medical
implementation lives in the private CIRISMedical repo and only ever
reaches CIRIS through the WBD bus. Same pattern applies to any future
licensed domain (legal, financial, etc.).
CIRISAgent does not stand alone. It is one node in a coordinated
federation; the canonical specification of how the parts compose lives
in FSD/PROOF_OF_BENEFIT_FEDERATION.md.
Read that document for the threat model, the empirical N_eff
independence claim (peaking at 9.51 on 17-dim constraint vectors), the
$1-bond Sybil-resistance economics, and the architectural moves toward
Reticulum-rs transport + the agent absorbing CIRISNode/CIRISLens
functions over time.
The federation has more named pieces than fit cleanly in a table —
agents, observatories, registries, portals, bridges, managers, websites,
LLM proxies, GUI standalones, medical/legal sister repos under separate
liability isolation, and more being added. The list below is a
non-exhaustive snapshot of the load-bearing pieces at the time of
writing. The authoritative source is
FSD/PROOF_OF_BENEFIT_FEDERATION.md;
read that for the moving topology.
| Repo | Role |
|---|---|
| CIRISAgent | The agent runtime — emits signed traces, enforces apophatic bounds, runs the H3ERE pipeline locally. This file documents it. |
| CIRISVerify | Hardware-rooted attestation (Ed25519 + ML-DSA-65, TPM-backed). verify_tree() v1.14+ produces the L1–L5 ladder; without this, no claim from any other federation peer is verifiable. |
| CIRISLens | External observatory. Receives signed traces, verifies at the Rust edge, computes the Capacity Score and runs the Coherence Ratchet anomaly detectors. The "watching the watcher" layer — see §6.2. |
| CIRISPersist | Trace persistence. Signed audit chains, schema-versioned trace ingest, dedup tuples on (agent_id_hash, trace_id, thought_id, parent_event_type, parent_attempt_index). |
| CIRISRegistry | Identity / build / license / revocation directory. Dual-region (US/EU) Rust gRPC service deployed at *.ciris-services-1.ai. SOC2/HIPAA/GDPR-compliant. The bootstrap node. |
| CIRISBridge | Public verify edge. Caddy gate for anonymous routes. |
| CIRISManager | Multi-agent fleet orchestration. Per-agent deployment, secrets, manager tokens, restart + integrity checks. |
| CIRISNode | Benchmark execution + WBD routing + audit anchoring. Folding into the agent per FSD §3.1. |
| CIRISPortal | Admin UI for the registry — orgs, users, keys, licenses, builds. |
| CIRISMedical | Private. Licensed-domain implementation. Reaches CIRISAgent only through the WBD bus; never imported. |
Other pieces in the federation (the public website, LLM proxy, the desktop/mobile client artifact targets, sister liability-isolated repos for other licensed domains, etc.) join and reshape on their own schedule.
The Coherence Ratchet (RATCHET) is the most mission-load-bearing piece of the federation that is not in this repo. It is the structural external check that makes the rest of the federation honest.
Implemented in CIRISLens, the Ratchet runs five anomaly detectors over the signed-trace corpus the agent ships:
- Cross-agent divergence — same prompts, different agents: how far apart do their reasoning traces sit in the constraint manifold? Sudden divergence is a tampering / drift signal.
- Intra-agent consistency — same agent over time: does this agent's reasoning stay coherent against itself? Sudden inconsistency is the classic compromise / takeover signature.
- Hash-chain verification — every trace carries a chained hash
back to the previous trace from the same
agent_id_hash. Breaks in the chain are non-forgeable evidence of trace deletion. - Temporal drift — distribution shift in conscience scalars over time. Slowly-rising entropy or slowly-falling coherence is the silent-coercion shape.
- Conscience-override rate — recursive ASPDMA after conscience failure should be rare. A spike means the conscience layer is being bypassed or the agent is being driven to push past its checks.
The Ratchet produces a triage signal, not a verdict — it tells a human reviewer where to look, never auto-decides anything. The verdict remains with operators and Wise Authorities. This is intentional and load-bearing: an automated verdict from one component would let other components defer to the Ratchet's judgment, which collapses the whole "watching the watcher" topology.
Why this belongs in CIRISAgent's MISSION.md: the agent emits the traces the Ratchet consumes. Every agent-side decision about what to log, what to scrub, how to chain hashes, and which schema to use is made with the Ratchet as the eventual reader. Trace emission is mission-aligned behavior, not telemetry.
The canonical staged runtime (produced by tools/dev/stage_runtime.py)
is what ships byte-equal across desktop wheel / Docker / Android
Chaquopy / iOS Resources. The walk-rules are pinned three-way against
tree_verify._CANONICAL_* and the sign-step flags in
.github/workflows/build.yml. Drift on any of those produces silent L4
mismatches; the parity test in tests/dev/test_canonical_rules_parity.py
fails the build before drift can ship. This is the foundation that
makes every CIRISVerify claim above the agent's own integrity layer
actually mean something.
This document is not a release artifact — it is a working document.
Update it whenever:
- A core service is added or removed (Section 2.1)
- A message bus is added (Section 2.2)
- A prohibited capability category is added (Section 1.2)
- The H3ERE step set or action verb set changes (Section 4.2, 4.5)
- A schema in §3.3 (mission-load-bearing) changes shape
- The Accord (
ACCORD.md) is amended
When in doubt: if a future code reviewer running git blame would
want to see this line cite a real file path or constant, fix it. If
this doc starts to drift from the code, the apophatic test fails — the
doc is wrong, not the code.
Cross-references
FSD/MISSION_DRIVEN_DEVELOPMENT.md— methodology specFSD/PROOF_OF_BENEFIT_FEDERATION.md— federation primitive + threat modelACCORD.md— Meta-Goal M-1 + the principlesARCHITECTURE_OVERVIEW.md— service map + diagramsLIABILITY_BOUNDARIES.md— medical/legal isolation contractSECURITY_AUDIT_PROHIBITED_CAPABILITIES.md— prohibitions auditCLAUDE.md— developer-facing repo conventions- ciris.ai/safety — public-facing safety surface
- ciris.ai/ciris-scoring — scoring methodology
- ciris.ai/coherence-ratchet — RATCHET methodology
- ciris.ai/federation — federation overview