Skip to content

ulams living

Generated from front/cli (ulams schema)

Export the audit trail of a course as CSV or JSON (stdout, or –out ).

Kind: read (idempotent). Stability: stable. MCP tool: living_audit_export. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/sessions/{session}/audit/export.

Flag Type Required Description
--session (positional) string yes Builder session id (the course’s session; from ulams builder sessions list).
--format string Default csv.
--action string
--from string
--to string
--out string Write to this file.
Terminal window
# To a file
ulams living audit export <session> --format json --out audit.json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "string",
"description": "Builder session id (the course's session; from `ulams builder sessions list`)."
},
"format": {
"description": "Default csv.",
"type": "string",
"enum": [
"csv",
"json"
]
},
"action": {
"type": "string"
},
"from": {
"type": "string"
},
"to": {
"type": "string"
},
"out": {
"description": "Write to this file.",
"type": "string"
}
},
"required": [
"session"
]
}

Export the audit trail of the whole academy as CSV or JSON (admins only).

Kind: read (idempotent). Stability: stable. MCP tool: living_audit_export_all. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/audit/export.

Flag Type Required Description
--format string Default csv.
--action string
--from string
--to string
--out string Write to this file.
Terminal window
# Everything to a file
ulams living audit export-all --format json --out audit-all.json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"format": {
"description": "Default csv.",
"type": "string",
"enum": [
"csv",
"json"
]
},
"action": {
"type": "string"
},
"from": {
"type": "string"
},
"to": {
"type": "string"
},
"out": {
"description": "Write to this file.",
"type": "string"
}
}
}

The audit trail of a course’s updates, newest first.

Kind: read (idempotent). Stability: stable. MCP tool: living_audit_list. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/sessions/{session}/audit.

Flag Type Required Description
--session (positional) string yes Builder session id (the course’s session; from ulams builder sessions list).
--action string Action prefix, e.g. proposal. or item.accepted.
--actor-type string
--from string Date-time.
--to string Date-time.
--source string
--page integer
--per-page integer
Terminal window
# Recent decisions
ulams living audit list <session> --action item. --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "string",
"description": "Builder session id (the course's session; from `ulams builder sessions list`)."
},
"action": {
"description": "Action prefix, e.g. proposal. or item.accepted.",
"type": "string"
},
"actorType": {
"type": "string"
},
"from": {
"description": "Date-time.",
"type": "string"
},
"to": {
"description": "Date-time.",
"type": "string"
},
"source": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"perPage": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"session"
]
}

Recompute the audit hash chain and report whether it is intact.

The chain covers the whole academy, not one course.

Kind: read (idempotent). Stability: stable. MCP tool: living_audit_verify. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/sessions/{session}/audit/verify.

Flag Type Required Description
--session (positional) string yes Builder session id (the course’s session; from ulams builder sessions list).
Terminal window
# Verify
ulams living audit verify <session> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "string",
"description": "Builder session id (the course's session; from `ulams builder sessions list`)."
}
},
"required": [
"session"
]
}

Recompute the audit hash chain of the whole academy (admins only).

Kind: read (idempotent). Stability: stable. MCP tool: living_audit_verify_all. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/audit/verify.

Terminal window
# Verify
ulams living audit verify-all --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {}
}

Check a connected source for a new revision now.

Kind: write (idempotent). Stability: stable. MCP tool: living_connections_check. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/connections/{connection}/check.

Flag Type Required Description
--connection (positional) string yes Connection id (from living sources list).
Terminal window
# Check now
ulams living connections check <connection> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"connection": {
"type": "string",
"description": "Connection id (from `living sources list`)."
}
},
"required": [
"connection"
]
}

Stop checking a source and forget its secrets (revisions and the audit trail stay).

Kind: destructive (idempotent). Stability: stable. MCP tool: living_connections_delete. Scopes: living-course:write.

Endpoints: DELETE /api/admin/living-course/connections/{connection}.

Flag Type Required Description
--connection (positional) string yes Connection id.
Terminal window
# Disconnect
ulams living connections delete <connection> --yes --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"connection": {
"type": "string",
"description": "Connection id."
}
},
"required": [
"connection"
]
}

Change a connection: schedule, automatic analysis, pause, learner notices, settings.

Kind: write (idempotent). Stability: stable. MCP tool: living_connections_update. Scopes: living-course:write.

Endpoints: PUT /api/admin/living-course/connections/{connection}.

Flag Type Required Description
--connection (positional) string yes Connection id.
--schedule string
--auto-analyse boolean Analyse new revisions automatically (within the cost limit).
--status string
--show-pending-to-learners boolean Tell learners an update is under review.
--notify-learners-of-updates boolean Notify learners when an update is applied.
--config object Replace the connector settings (JSON or @file).
--secrets object Write-only values; a field left out keeps its stored value.
Terminal window
# Pause
ulams living connections update <connection> --status paused --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"connection": {
"type": "string",
"description": "Connection id."
},
"schedule": {
"type": "string",
"enum": [
"hourly",
"daily",
"weekly",
"manual"
]
},
"autoAnalyse": {
"description": "Analyse new revisions automatically (within the cost limit).",
"type": "boolean"
},
"status": {
"type": "string",
"enum": [
"active",
"paused"
]
},
"showPendingToLearners": {
"description": "Tell learners an update is under review.",
"type": "boolean"
},
"notifyLearnersOfUpdates": {
"description": "Notify learners when an update is applied.",
"type": "boolean"
},
"config": {
"description": "Replace the connector settings (JSON or @file).",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"secrets": {
"description": "Write-only values; a field left out keeps its stored value.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
},
"required": [
"connection"
]
}

Rotate the webhook secret of a connection (shown once; the old one stops working).

Kind: write. Stability: stable. MCP tool: living_connections_webhook_secret. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/connections/{connection}/webhook-secret.

Flag Type Required Description
--connection (positional) string yes Connection id.
Terminal window
# Rotate
ulams living connections webhook-secret <connection> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"connection": {
"type": "string",
"description": "Connection id."
}
},
"required": [
"connection"
]
}

List the source connectors this instance offers.

Kind: read (idempotent). Stability: stable. MCP tool: living_connectors_list. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/connectors.

Terminal window
# Connectors
ulams living connectors list --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {}
}

Accept one item of a proposal.

Nothing reaches the course until living proposals apply. Item ids come from living proposals get.

Kind: write (idempotent). Stability: stable. MCP tool: living_proposals_accept. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/proposals/{proposal}/items/{item}/accept.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
--item string yes Proposal item id (from ulams living proposals get <proposal>).
Terminal window
# accept
ulams living proposals accept <proposal> --item <item> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
},
"item": {
"type": "string",
"description": "Proposal item id (from `ulams living proposals get <proposal>`)."
}
},
"required": [
"proposal",
"item"
]
}

Accept every pending item of a proposal.

Kind: write (idempotent). Stability: stable. MCP tool: living_proposals_accept_all. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/proposals/{proposal}/accept-all.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
Terminal window
# Accept all
ulams living proposals accept-all <proposal> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
}
},
"required": [
"proposal"
]
}

Start (or resume) the AI analysis of a proposal.

Costs model tokens. When the estimate is above the automatic limit the API answers CONFLICT with the estimate: repeat with –confirm-estimate. 503 FEATURE_DISABLED when AI is off.

Kind: write. Stability: stable. MCP tool: living_proposals_analyse. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/proposals/{proposal}/analyse.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
--confirm-estimate boolean Accept the cost estimate.
Terminal window
# Analyse
ulams living proposals analyse <proposal> --confirm-estimate --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
},
"confirmEstimate": {
"description": "Accept the cost estimate.",
"type": "boolean"
}
},
"required": [
"proposal"
]
}

Apply the accepted items as a new course version.

Creates a blueprint version of kind update and applies it through the course services. A 409 lists conflicts (items that cannot apply) or admin edits made since the last apply; repeat with –overwrite to replace those edits. Waits for the run (–no-wait returns the handle).

Kind: write. Stability: stable. MCP tool: living_proposals_apply. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/proposals/{proposal}/apply.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
--overwrite boolean Overwrite admin edits made since the last apply.
Terminal window
# Apply
ulams living proposals apply <proposal> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
},
"overwrite": {
"description": "Overwrite admin edits made since the last apply.",
"type": "boolean"
}
},
"required": [
"proposal"
]
}

Show a proposal: its items grouped by lesson, the decisions and the analysis steps.

Kind: read (idempotent). Stability: stable. MCP tool: living_proposals_get. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/proposals/{proposal}.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
Terminal window
# A proposal
ulams living proposals get <proposal> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
}
},
"required": [
"proposal"
]
}

Set the note learners see about this update (up to 500 characters; empty restores the suggested one).

Kind: write (idempotent). Stability: stable. MCP tool: living_proposals_learner_note. Scopes: living-course:write.

Endpoints: PUT /api/admin/living-course/proposals/{proposal}/learner-note.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
--note string yes The note, plain text.
Terminal window
# Set the note
ulams living proposals learner-note <proposal> --note "Lesson 3 now covers the new API." --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
},
"note": {
"type": "string",
"description": "The note, plain text."
}
},
"required": [
"proposal",
"note"
]
}

List the update proposals of a course, newest first.

Kind: read (idempotent). Stability: stable. MCP tool: living_proposals_list. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/sessions/{session}/proposals.

Flag Type Required Description
--session (positional) string yes Builder session id (the course’s session; from ulams builder sessions list).
Terminal window
# Proposals
ulams living proposals list <session> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "string",
"description": "Builder session id (the course's session; from `ulams builder sessions list`)."
}
},
"required": [
"session"
]
}

Start over from the newest revision (the open proposal is superseded; decisions are not carried over).

Kind: write. Stability: stable. MCP tool: living_proposals_reanalyse. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/proposals/{proposal}/reanalyse.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
Terminal window
# Reanalyse
ulams living proposals reanalyse <proposal> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
}
},
"required": [
"proposal"
]
}

Ask for a new suggestion for one item, with a comment (at most three per item).

One new model call for one element.

Kind: write. Stability: stable. MCP tool: living_proposals_regenerate. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/proposals/{proposal}/items/{item}/regenerate.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
--item string yes Proposal item id (from ulams living proposals get <proposal>).
--comment string What to do differently (up to 1000 characters).
Terminal window
# Regenerate
ulams living proposals regenerate <proposal> --item <item> --comment "Keep the example" --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
},
"item": {
"type": "string",
"description": "Proposal item id (from `ulams living proposals get <proposal>`)."
},
"comment": {
"description": "What to do differently (up to 1000 characters).",
"type": "string"
}
},
"required": [
"proposal",
"item"
]
}

Reject one item of a proposal.

Nothing reaches the course until living proposals apply. Item ids come from living proposals get.

Kind: write (idempotent). Stability: stable. MCP tool: living_proposals_reject. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/proposals/{proposal}/items/{item}/reject.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
--item string yes Proposal item id (from ulams living proposals get <proposal>).
Terminal window
# reject
ulams living proposals reject <proposal> --item <item> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
},
"item": {
"type": "string",
"description": "Proposal item id (from `ulams living proposals get <proposal>`)."
}
},
"required": [
"proposal",
"item"
]
}

Reject the whole proposal and acknowledge the source revision.

Kind: destructive (idempotent). Stability: stable. MCP tool: living_proposals_reject_all. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/proposals/{proposal}/reject.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
Terminal window
# Reject
ulams living proposals reject-all <proposal> --yes --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
}
},
"required": [
"proposal"
]
}

Reset a decision on one item.

Nothing reaches the course until living proposals apply. Item ids come from living proposals get.

Kind: write (idempotent). Stability: stable. MCP tool: living_proposals_reset. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/proposals/{proposal}/items/{item}/reset.

Flag Type Required Description
--proposal (positional) string yes Update proposal id (from ulams living proposals list <session>).
--item string yes Proposal item id (from ulams living proposals get <proposal>).
Terminal window
# reset
ulams living proposals reset <proposal> --item <item> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"proposal": {
"type": "string",
"description": "Update proposal id (from `ulams living proposals list <session>`)."
},
"item": {
"type": "string",
"description": "Proposal item id (from `ulams living proposals get <proposal>`)."
}
},
"required": [
"proposal",
"item"
]
}

What changed in a revision (fragments added, removed, moved, changed) and which course elements cite them.

Kind: read (idempotent). Stability: stable. MCP tool: living_revisions_changes. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/revisions/{revision}/changes.

Flag Type Required Description
--revision (positional) string yes Revision id.
--against string Compare with this revision (default: the one it was compared with).
Terminal window
# Changes
ulams living revisions changes <revision> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"revision": {
"type": "string",
"description": "Revision id."
},
"against": {
"description": "Compare with this revision (default: the one it was compared with).",
"type": "string"
}
},
"required": [
"revision"
]
}

Show one source revision.

Kind: read (idempotent). Stability: stable. MCP tool: living_revisions_get. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/revisions/{revision}.

Flag Type Required Description
--revision (positional) string yes Revision id.
Terminal window
# A revision
ulams living revisions get <revision> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"revision": {
"type": "string",
"description": "Revision id."
}
},
"required": [
"revision"
]
}

List the revisions of a source, newest first.

Kind: read (idempotent). Stability: stable. MCP tool: living_revisions_list. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/sources/{source}/revisions.

Flag Type Required Description
--source (positional) string yes Source id (from living sources list).
Terminal window
# Revisions
ulams living revisions list <source> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"source": {
"type": "string",
"description": "Source id (from `living sources list`)."
}
},
"required": [
"source"
]
}

Upload a new version of a source file as a new revision.

created is false when the file equals the latest revision. A changed file starts change detection and, when AI is on, an update proposal.

Kind: write. Stability: stable. MCP tool: living_revisions_upload. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/sources/{source}/revisions.

Flag Type Required Description
--source (positional) string yes Source id.
--file (positional) string yes Local file (Markdown, PDF or DOCX).
Terminal window
# A new version
ulams living revisions upload <source> ./handbook-v2.md --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"source": {
"type": "string",
"description": "Source id."
},
"file": {
"type": "string",
"description": "Local file (Markdown, PDF or DOCX)."
}
},
"required": [
"source",
"file"
]
}

Add a source document (Markdown, PDF or DOCX) to a course’s session.

Uploads a file or a URL’s document as a new source; later versions of it go through living revisions upload <source> <file>. For a Git repository or web pages use living sources connect.

Kind: write. Stability: stable. MCP tool: living_sources_add. Scopes: builder:write.

Endpoints: POST /api/admin/course-builder/sessions/{session}/sources.

Flag Type Required Description
--session (positional) string yes Builder session id (the course’s session; from ulams builder sessions list).
--file array Local file; repeat for several.
--url array URL of the document itself; repeat for several.
Terminal window
# Add a file
ulams living sources add <session> --file ./handbook-v2.md --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "string",
"description": "Builder session id (the course's session; from `ulams builder sessions list`)."
},
"file": {
"description": "Local file; repeat for several.",
"type": "array",
"items": {
"type": "string"
}
},
"url": {
"description": "URL of the document itself; repeat for several.",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"session"
]
}

Connect a Git repository or web pages as a source that is checked for changes.

The API fetches revision 1 and starts the interview. –config is the connector’s settings (see living connectors list for the schema), –secrets holds write-only values such as a Git token (prefer @file over typing it). The webhook secret, if the connector has webhooks, is returned once.

Kind: write. Stability: stable. MCP tool: living_sources_connect. Scopes: living-course:write.

Endpoints: POST /api/admin/living-course/sessions/{session}/sources/connect.

Flag Type Required Description
--session (positional) string yes Builder session id (the course’s session; from ulams builder sessions list).
--connector string yes Connector key: git, url, or a plugin’s key.
--config object yes Connector settings as JSON or @file, e.g. {“host”:“github”,“repository”:“owner/name”,“branch”:“main”,“paths”:[“docs”]}.
--secrets object Write-only values, e.g. {“token”:“…”}; JSON or @file.
--schedule string How often to check (default: the connector’s).
Terminal window
# A Git docs folder
ulams living sources connect <session> --connector git --config '{"host":"github","repository":"owner/name","branch":"main","paths":["docs"]}' --schedule daily --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "string",
"description": "Builder session id (the course's session; from `ulams builder sessions list`)."
},
"connector": {
"type": "string",
"description": "Connector key: git, url, or a plugin's key."
},
"config": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "Connector settings as JSON or @file, e.g. {\"host\":\"github\",\"repository\":\"owner/name\",\"branch\":\"main\",\"paths\":[\"docs\"]}."
},
"secrets": {
"description": "Write-only values, e.g. {\"token\":\"...\"}; JSON or @file.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"schedule": {
"description": "How often to check (default: the connector's).",
"type": "string",
"enum": [
"hourly",
"daily",
"weekly",
"manual"
]
}
},
"required": [
"session",
"connector",
"config"
]
}

List the sources of a course with their connection and sync state.

Kind: read (idempotent). Stability: stable. MCP tool: living_sources_list. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/sessions/{session}/sources.

Flag Type Required Description
--session (positional) string yes Builder session id (the course’s session; from ulams builder sessions list).
Terminal window
# Sources
ulams living sources list <session> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "string",
"description": "Builder session id (the course's session; from `ulams builder sessions list`)."
}
},
"required": [
"session"
]
}

Which course elements are out of date against their sources.

Works with AI disabled: it is deterministic change detection.

Kind: read (idempotent). Stability: stable. MCP tool: living_staleness. Scopes: living-course:read.

Endpoints: GET /api/admin/living-course/sessions/{session}/staleness.

Flag Type Required Description
--session (positional) string yes Builder session id (the course’s session; from ulams builder sessions list).
Terminal window
# Staleness
ulams living staleness <session> --json
Input JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"session": {
"type": "string",
"description": "Builder session id (the course's session; from `ulams builder sessions list`)."
}
},
"required": [
"session"
]
}