---
title: "Get this layer's alignment manifest"
method: GET
path: "/alignment/agent/{agent_id}"
tags: ["Alignment"]
---

# Get this layer's alignment manifest

`GET /alignment/agent/{agent_id}`

## Request

- Base URL: `https://api.mnemom.ai/v1`
- URL: `https://api.mnemom.ai/v1/alignment/agent/{agent_id}`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Mnemom-Api-Key`
  - API key in cookie `mnemom_session`

Returns the agent-scope alignment spec as authored. Response is content-negotiated — YAML by default, or JSON with `Accept: application/json`. Pass `?include_composition=true` to include the `_composition` metadata block describing which scopes were merged. Pass `?include=sources` (see ADR-053) for the scope-resolution envelope — the contributing layers plus the composed result; the envelope shape is scope-specific (the four-scope `{teams[], agent}` body is the agent variant consumed by the dashboard editor). ETag is computed from `content_hash` (cards-as-primitive Phase 1); `If-None-Match` returns 304. For the composed view across scopes, use the `/effective` sub-resource (Wave 2).

## Path parameters

- `agent_id` string, required

## Query parameters

- `include_composition` boolean
- `include` 'sources'

## Headers

- `Accept` 'text/yaml' | 'application/yaml' | 'application/json'

## Response `200`

Alignment manifest at this scope.

- union
  - ComposedAlignmentCard: OUTPUT-only variant of `UnifiedAlignmentCard` for the COMPOSED card the server emits on GET `/v1/alignment/{scope}/{id}`, `/effective`, and the `composed` field of preview-compose. Identical to `UnifiedAlignmentCard` except `principal` is optional (a default / org-scope composed card has no agent principal) and `values.declared` / `autonomy.bounded_actions` may be empty (a fresh card declares nothing yet). The strict `UnifiedAlignmentCard` remains the authoring/request contract.
    - `card_version` string, required: Card schema version (required, non-empty). Current canonical value: `unified/2026-04-26`.
    - `content_version` string: Optional. Which default content the card carries, e.g. `mnemom-agent-default/2.1.0` (semver within a lineage). Distinct from `card_version`, the schema version. New agents are born with it; composition carries the agent card's value onto the canonical card.
    - `autonomy_mode` 'off' | 'observe' | 'nudge' | 'enforce', required: ADR-039 master switch for the action-policing pipeline (autonomy constraints). Required at the top level post-cutover; the legacy `enforcement.mode` location is rejected.
    - `integrity_mode` 'off' | 'observe' | 'nudge' | 'enforce', required: ADR-039 master switch for the values/conscience pipeline (integrity constraints). Required at the top level post-cutover; the legacy `integrity.enforcement_mode` location is rejected.
    - `card_id` string: Card row id. Server-assigned on PUT (`ac-{uuid}`).
    - `agent_id` string, required: Target agent id. On PUT, server overwrites to match the URL path.
    - `issued_at` string, date-time
    - `expires_at` string, date-time, nullable
    - `principal` object: Required object describing whose authority the agent acts under (ADR-039 Decision 10).
      - `type` 'human' | 'organization' | 'agent' | 'unspecified', required
      - `identifier` string: Required (non-empty) when principal.type is not `unspecified`; identifies the human / organization / agent.
      - `relationship` 'delegated_authority' | 'advisory' | 'autonomous', required
      - `escalation_contact` string
    - `values` object, required
      - `declared` union[], required: Ordered list of declared values. Phase 1 cards-as-primitive: each entry is either a catalog-v1 ID string (e.g. `'accuracy'`) or a parameterized map carrying optional `intensity` / `domain` / `severity_on_violation` / `scope` (e.g. `{id: 'accuracy', domain: 'financial', severity_on_violation: 'critical'}`).
        - union
          - string
          - object
            - `id` string, required
      - `definitions` object
      - `conflicts_with` string[]
      - `hierarchy` 'lexicographic' | 'weighted' | 'contextual'
    - `conscience` object
      - `mode` 'augment' | 'replace', required
      - `values` object[], required
        - `type` 'BOUNDARY' | 'FEAR' | 'COMMITMENT' | 'BELIEF' | 'HOPE', required
        - `content` string, required
        - `id` string
        - `severity` 'advisory' | 'mandatory'
    - `autonomy` object, required
      - `bounded_actions` string[], required
      - `forbidden_actions` string[]
      - `escalation_triggers` object[]
        - `condition` string, required
        - `action` 'escalate' | 'deny' | 'log', required
        - `reason` string, required
      - `max_autonomous_value` object
        - `amount` number
        - `currency` string
    - `capabilities` object
    - `enforcement` object: Optional ADR-039 Decision-3 user-facing knobs for unmapped-tool handling. The legacy `mode`, `unmapped_tool_action` and `fail_open` keys are REJECTED by the validator (mode → top-level autonomy_mode; fail_open → gateway env config).
      - `allow_unmapped_tools` boolean: When true, tools not mapped to a capability are allowed by default.
      - `default_unmapped_severity` 'low' | 'medium' | 'high' | 'critical': Severity assigned to an unmapped tool when allow_unmapped_tools is false.
      - `forbidden_tools` object[]
        - `pattern` string, required
        - `reason` string, required
        - `severity` 'critical' | 'high' | 'medium' | 'low', required
      - `grace_period_hours` integer
    - `audit` object, required
      - `trace_format` string
      - `retention_days` integer, required
      - `queryable` boolean, required
      - `query_endpoint` string: Required when audit.queryable is true.
      - `tamper_evidence` 'append_only' | 'signed' | 'merkle' | 'null', nullable
      - `storage` object
        - `type` 'local' | 'remote' | 'distributed'
        - `location` string
    - `extensions` object
    - `_composition` CompositionMetadata: System-managed block describing which scope sources merged into the canonical card. Only returned when `?include_composition=true`.
      - `canonical_id` string
      - `composed_at` string, date-time
      - `scopes_applied` object[]
        - `scope` string: `platform`, `org:<id>`, or `agent:<id>`.
        - `version` integer
        - `template_version` integer
        - `card_id` string
      - `exemptions_applied` string[]
      - `source_card_id` string
      - `source_policy_id` string
    - `content_hash` string: Response-only: content hash of the composed card (`sha256:<hex>`), injected by the GET/PUT response. Server-assigned — do not send on a PUT.
    - `version` integer: Response-only: monotonic card version, injected by the GET/PUT response. Server-assigned — do not send on a PUT.
  - AlignmentCardSourcesEnvelope: Four-scope sources envelope returned by `GET /v1/agents/{agent_id}/alignment-card?include=sources`. Per ADR-053 the envelope mirrors the composer cascade Platform → Org → Team(s) → Agent and carries the caller's effective role + a staleness signal.
    - `platform` CardSourceScope, required: One slice of a sources envelope. `card_json` carries the raw template at that scope (full UnifiedAlignment/Protection card, the org/team template, or the platform-defaults object). `available: false` means no card is configured at this scope.
      - `card_json` object, nullable, required
      - `available` boolean, required
    - `org` OrgCardSourceScope, required: One slice of a sources envelope. `card_json` carries the raw template at that scope (full UnifiedAlignment/Protection card, the org/team template, or the platform-defaults object). `available: false` means no card is configured at this scope.
      - `card_json` object, nullable, required
      - `available` boolean, required
      - `org_id` string, nullable
      - `org_name` string, nullable
    - `teams` TeamCardSourceScope[], required: Zero-or-more team-scope contributions. Empty when the agent is in no teams (Charter §I11 amended). Ordered by `teams.created_at ASC` to match the composer's stable order.
      - `card_json` object, nullable, required
      - `available` boolean, required
      - `team_id` string, required
      - `team_name` string, nullable
    - `agent` CardSourceScope, required: One slice of a sources envelope. `card_json` carries the raw template at that scope (full UnifiedAlignment/Protection card, the org/team template, or the platform-defaults object). `available: false` means no card is configured at this scope.
      - `card_json` object, nullable, required
      - `available` boolean, required
    - `composed` CardSourceScope, required: One slice of a sources envelope. `card_json` carries the raw template at that scope (full UnifiedAlignment/Protection card, the org/team template, or the platform-defaults object). `available: false` means no card is configured at this scope.
      - `card_json` object, nullable, required
      - `available` boolean, required
    - `composed_stale` boolean, required: True when `composed.card_json._composition.scopes_applied` disagrees with the current `team_templates` set in `gather_composition_inputs` (the queue worker will reconverge via the existing `needs_recompose` flag).
    - `my_role` 'super_admin' | 'org_owner' | 'org_admin' | 'team_admin' | 'org_member' | 'org_viewer' | 'org_auditor' | 'null', nullable, required: The caller's effective role on the resource. Computed server-side per ADR-053; frontends derive `canEdit` exclusively from this field. `team_admin` only appears on team-scope responses. `null` means the caller has no role on this resource (the request still authenticated, but no role applies — e.g. an org-scope response read by an unrelated user).

## Other responses

- `304`: Not Modified — the client's `If-None-Match` matches the current ETag.
- `400`: Bad request
- `401`: Authentication required
- `403`: Forbidden
- `404`: Resource not found
- `429`: Rate-limit exceeded. The global per-IP limiter (100 requests/minute, applied to every `/v1/*` route) rejected this request. Back off until the window resets — `Retry-After` carries the cooldown in seconds and `X-RateLimit-Reset` the absolute reset time.
- `500`: Server error — request was well-formed but the server failed to fulfill it. Typically a downstream dependency (DB / RPC / external API) returned an unexpected error.

---

[API](https://skmtc.dev/mnemom/apis/mnemom-api.md) · [All operations](https://skmtc.dev/mnemom/apis/mnemom-api/llms.txt) · [OpenAPI document](https://skmtc.dev/mnemom/apis/mnemom-api/revisions/274b7a6ea182?raw)
