Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions docs/site/generated/DOCS_MARKDOWN_AUDIT.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

Excludes `docs/private` and paths containing `archived`, `releases`, or `in_progress` directory names.

Total files: **707**
Total files: **717**

## By top-level folder under docs/

- **site**: 177
- **site**: 181
- **developer**: 122
- **plans**: 69
- **subsystems**: 49
- **reports**: 48
- **ui**: 42
- **foundation**: 24
- **foundation**: 25
- **architecture**: 20
- **feature_units**: 20
- **use_cases**: 17
Expand All @@ -26,7 +26,9 @@ Total files: **707**
- **legal**: 8
- **security**: 6
- **getting_started**: 4
- **skills**: 4
- **observability**: 3
- **bundles**: 2
- **implementation**: 2
- **infrastructure**: 2
- **migration**: 2
Expand All @@ -41,4 +43,3 @@ Total files: **707**
- **reference**: 1
- **rendered_page.md**: 1
- **research**: 1
- **skills**: 1
4 changes: 3 additions & 1 deletion docs/site/generated/ROUTE_INVENTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ Generated by `scripts/mdx_site_route_inventory.ts`. Do not hand-edit.
| `/capability-delta` | static_mdx |
| `/high-velocity-intake` | static_mdx |
| `/embed-graph` | static_mdx |
| `/usage-telemetry` | static_mdx |
| `/rendered-pages` | static_mdx |
| `/inspector` | other |
| `/inspector/dashboard` | other |
| `/inspector/entities` | other |
Expand Down Expand Up @@ -168,6 +170,6 @@ Generated by `scripts/mdx_site_route_inventory.ts`. Do not hand-edit.

## Counts

- **static_mdx**: 98
- **static_mdx**: 100
- **other**: 59
- **dynamic**: 4
51 changes: 46 additions & 5 deletions docs/site/generated/docs_markdown_audit.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
{
"generated_at": "2026-06-25T10:51:11.155Z",
"total_files": 707,
"generated_at": "2026-06-26T09:16:58.413Z",
"total_files": 717,
"by_top_level_folder": {
"api": 1,
"architecture": 20,
"bundles": 2,
"conventions": 12,
"coverage_manifest.md": 1,
"developer": 122,
"examples": 1,
"feature_units": 20,
"foundation": 24,
"foundation": 25,
"getting_started": 4,
"icp": 10,
"implementation": 2,
Expand All @@ -29,8 +30,8 @@
"reports": 48,
"research": 1,
"security": 6,
"site": 177,
"skills": 1,
"site": 181,
"skills": 4,
"specs": 14,
"subsystems": 49,
"templates": 2,
Expand Down Expand Up @@ -124,6 +125,14 @@
"rel": "docs/architecture/source_material_model.md",
"top": "architecture"
},
{
"rel": "docs/bundles/m5/phase0_field_coverage.md",
"top": "bundles"
},
{
"rel": "docs/bundles/m5/phase0_orphaned_type_map.md",
"top": "bundles"
},
{
"rel": "docs/conventions/always_on_rules_review.md",
"top": "conventions"
Expand Down Expand Up @@ -756,6 +765,10 @@
"rel": "docs/foundation/ai_safety.md",
"top": "foundation"
},
{
"rel": "docs/foundation/bundles.md",
"top": "foundation"
},
{
"rel": "docs/foundation/composability_analysis.md",
"top": "foundation"
Expand Down Expand Up @@ -1616,6 +1629,10 @@
"rel": "docs/site/documentation_outline.md",
"top": "site"
},
{
"rel": "docs/site/faq/schema_modes.md",
"top": "site"
},
{
"rel": "docs/site/generated/DOCS_MARKDOWN_AUDIT.md",
"top": "site"
Expand Down Expand Up @@ -1960,6 +1977,10 @@
"rel": "docs/site/pages/en/procurement.md",
"top": "site"
},
{
"rel": "docs/site/pages/en/rendered-pages.md",
"top": "site"
},
{
"rel": "docs/site/pages/en/replayable-timeline.md",
"top": "site"
Expand All @@ -1984,6 +2005,10 @@
"rel": "docs/site/pages/en/schemas.md",
"top": "site"
},
{
"rel": "docs/site/pages/en/schemas/locked_vs_evolving.md",
"top": "site"
},
{
"rel": "docs/site/pages/en/schemas/merge-policies.md",
"top": "site"
Expand Down Expand Up @@ -2044,6 +2069,10 @@
"rel": "docs/site/pages/en/troubleshooting.md",
"top": "site"
},
{
"rel": "docs/site/pages/en/usage-telemetry.md",
"top": "site"
},
{
"rel": "docs/site/pages/en/versioned-history.md",
"top": "site"
Expand Down Expand Up @@ -2320,6 +2349,18 @@
"rel": "docs/site/README.md",
"top": "site"
},
{
"rel": "docs/skills/core_workflows/close-session/SKILL.md",
"top": "skills"
},
{
"rel": "docs/skills/core_workflows/get-context/SKILL.md",
"top": "skills"
},
{
"rel": "docs/skills/core_workflows/start-session/SKILL.md",
"top": "skills"
},
{
"rel": "docs/skills/skill_strategy.md",
"top": "skills"
Expand Down
8 changes: 8 additions & 0 deletions docs/site/generated/route_inventory.json
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,14 @@
"path": "/embed-graph",
"classification": "static_mdx"
},
{
"path": "/usage-telemetry",
"classification": "static_mdx"
},
{
"path": "/rendered-pages",
"classification": "static_mdx"
},
{
"path": "/inspector",
"classification": "other"
Expand Down
3 changes: 3 additions & 0 deletions docs/site/generated/translation_audit.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,14 @@
| `/primitives/timeline-events` | en, es | 2026-05-07 | canonical, machine_draft |
| `/privacy` | en | 2026-05-07 | canonical |
| `/procurement` | en, es | 2026-05-07 | canonical, machine_draft |
| `/rendered-pages` | en | 2026-06-26 | canonical |
| `/replayable-timeline` | en | 2026-05-07 | canonical |
| `/reproducible-state-reconstruction` | en | 2026-05-07 | canonical |
| `/sandbox` | en, es | 2026-05-07 | canonical, machine_draft |
| `/schema-constraints` | en | 2026-05-07 | canonical |
| `/schema-management` | en | 2026-05-07 | canonical |
| `/schemas` | en, es | 2026-05-07 | canonical, machine_draft |
| `/schemas/locked-vs-evolving` | en | 2026-05-20 | canonical |
| `/schemas/merge-policies` | en, es | 2026-05-07 | canonical, machine_draft |
| `/schemas/registry` | en, es | 2026-05-07 | canonical, machine_draft |
| `/schemas/storage-layers` | en, es | 2026-05-07 | canonical, machine_draft |
Expand All @@ -109,6 +111,7 @@
| `/trading` | en, es | 2026-05-07 | canonical, machine_draft |
| `/transactional-writes` | en | 2026-05-08 | canonical |
| `/troubleshooting` | en | 2026-05-07 | canonical |
| `/usage-telemetry` | en | 2026-06-26 | canonical |
| `/versioned-history` | en | 2026-05-07 | canonical |
| `/zero-setup-onboarding` | en | 2026-05-07 | canonical |

Expand Down
111 changes: 111 additions & 0 deletions docs/site/pages/en/rendered-pages.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
---
path: /rendered-pages
locale: en
page_title: Rendered pages
shell: detail
translation_status: canonical
nav_group: reference
nav_order: 117
---

`publish_rendered_page` turns a `rendered_page` entity into a shareable, guest-accessible URL in a single call. It is the primary way to deliver a Neotoma-authored HTML page to non-authenticated viewers — reports, one-pagers, agent-generated summaries — without granting the reader any write access to your instance.

## What a rendered page is

A `rendered_page` entity stores the full HTML of a standalone page. It has four content fields:

| Field | Type | Notes |
|---|---|---|
| `title` | string | Rendered into `<title>` and the page `<h1>` when no heading appears in `html_body`. |
| `html_body` | string | The page body HTML, injected verbatim into a server template. Do NOT include `<html>`, `<head>`, or `<body>` wrappers. |
| `custom_css` | string | Optional CSS injected as an inline `<style>` in the document `<head>`. |
| `meta_description` | string | Optional `<meta name="description">` value, escaped on render. |

## Publishing a rendered page

`publish_rendered_page` accepts either an existing `rendered_page` entity ID **or** inline content to create one on the fly.

### Using an existing entity

```json
{
"entity_id": "<entity_id>"
}
```

### Creating a new page inline

```json
{
"title": "Q2 Summary",
"html_body": "<h2>Key results</h2><p>Details go here.</p>",
"meta_description": "Q2 operational summary"
}
```

To avoid duplicates on retry, pass `idempotency_key` on the inline-create path:

```json
{
"title": "Q2 Summary",
"html_body": "<h2>Key results</h2><p>Details go here.</p>",
"idempotency_key": "q2-summary-2026-06"
}
```

The same key with the same content reuses the existing `rendered_page` rather than creating a duplicate. The idempotency key is ignored when `entity_id` is supplied.

## The response

A successful call returns:

```json
{
"entity_id": "<entity_id>",
"share_url": "https://<host>/entities/<entity_id>/html?access_token=<access_token>",
"access_token": "<access_token>",
"ttl_seconds": 2592000,
"created": true
}
```

| Field | Notes |
|---|---|
| `entity_id` | The `rendered_page` entity ID (new or existing). |
| `share_url` | Absolute URL usable by non-authenticated viewers. |
| `access_token` | The raw guest token (only returned once — not stored in recoverable form). |
| `ttl_seconds` | Token lifetime in seconds (default 30 days; configurable via `NEOTOMA_GUEST_TOKEN_TTL_SECONDS`). |
| `created` | `true` when a new `rendered_page` was created inline; `false` when publishing an existing entity. |

## Guest URL shape

The URL pattern is:

```
/entities/<entity_id>/html?access_token=<access_token>
```

A non-authenticated viewer opening this URL sees the rendered page without needing a Neotoma account. The token is scoped to that specific entity — it grants read access to that page only.

**Tokens are not stored in recoverable form.** Only a hash of the token is persisted. Each `publish_rendered_page` call mints a fresh token. If you need to share a new link, call `publish_rendered_page` again — repeated calls for the same entity are safe.

## Updating a live page

To update the content of a page that has already been shared, use `correct` to update the entity's fields:

```json
{
"entity_id": "<entity_id>",
"field": "html_body",
"value": "<h2>Updated results</h2><p>New details.</p>",
"idempotency_key": "q2-summary-2026-06-html-body-update-1"
}
```

The existing share URL continues to work — `GET /entities/<id>/html?access_token=<token>` always renders the current snapshot. A correction to the entity's `html_body`, `title`, `custom_css`, or `meta_description` is reflected immediately on the next page load.

## Conformance checks

`publish_rendered_page` runs a non-blocking conformance check on the page's HTML and CSS before returning. If any advisory issues are detected (theming inconsistencies, tokenless cross-links), they appear in `conformance_warnings` alongside the normal response. Publishing never fails on conformance warnings — they are advisory.

See the [changelog](/changelog) for release notes, and [agent auth](/agent-auth) for configuring guest access tokens and AAuth grants.
Loading
Loading