{
  "markdown": "# sentinel-docs\n\nPublic documentation for Sentinel, implemented as a Sentinel SRE served through\nthe **fcms** plane (file CMS). Staging: **https://sn-docs.dwp.solutions**.\nProduction: **https://docs.ndx-sentinel.com** (dedicated VM).\n\n## Layout\n\n```\nsentinel.yaml          SRE root config (port 8290, default_kit: sn.docs)\nsn.docs/\n  kit.yaml             fcms kit (public, cms_full_html, 600s render cache)\n  ct/                  Markdown source of truth — one .md per doc, frontmatter:\n                       title, description, type, tags, status.\n                       index.md is the public landing page (do not overwrite).\n  ct/README.md         old-filename → slug mapping (MAP block, used by relink)\n  tp/                  Go templates (docs.gohtml = render, home.gohtml = landing)\n  pb/                  static assets (style.css, favicon.ico)\n  pg/home.yaml         default-kit catch-all page at /\n  fl/                  smoke tests (validated by `sentinel sre validate`)\ntools/relink.py        rewrites old relative doc links → /slug links\ntools/bundle_docs.py   OKF / NotebookLM sidecar (writes notebooklm/ only)\nnotebooklm/            generated index.md + sentinel-docs.md — not fcms content\n```\n\n## Run locally\n\n```bash\nsentinel harness start -p . -d --port 8290\ncurl http://127.0.0.1:8290/hl\n# JSON:  /fcms , /fcms/sn/docs/<slug>\n# HTML:  /fcms/render/sn/docs/docs/<slug>\n# assets: /kt/sn/docs/pb/*\n```\n\n## Adding a doc\n\nAdd `sn.docs/ct/<slug>.md` with `title`, `description`, and a required OKF\n`type` (`Overview`, `Guide`, `Reference`, or `Playbook`), plus `tags` and\n`status`. Add the slug to the sidebar nav in `sn.docs/tp/docs.gohtml`, and\nlink it from `index.md`. Then regenerate the NotebookLM sidecar:\n\n```bash\npython3 tools/bundle_docs.py\n```\n\nThat writes `notebooklm/index.md` and `notebooklm/sentinel-docs.md` only.\nNever put generated output in `ct/` — `ct/index.md` is the public homepage.\n\n`ct/` changes are picked up by the harness file watcher — no reload needed.\nChanges to `kit.yaml`, `tp/`, or `pg/` require `POST /hl/kt/sn/docs/rl` (kit\nreload) or a harness restart.\n\n## Deployment (production VM)\n\nThe prod VM runs the same SRE repo. Required setup:\n\n1. **Checkout**: clone `github.com/ndx-au/sentinel-docs` to the VM (polling\n   target: `main` branch).\n2. **Harness**: `sentinel harness start -p <repo> -d --port 8290`. The harness\n   binds `0.0.0.0` — firewall the port so only the host reverse proxy can reach\n   it (for example, allow the proxy container’s bridge network to the host\n   process).\n3. **public_url**: production overrides `public_url` in `sentinel.yaml` to\n   `https://docs.ndx-sentinel.com` (or use an env/config override if the\n   harness supports one — staging keeps the sn-docs value; do not commit the\n   prod override to `main` if it would break staging, prefer per-host config).\n4. **Reverse proxy** (Caddy or equivalent) on the VM:\n   ```\n   docs.ndx-sentinel.com {\n       encode gzip\n       handle /kt/sn/docs/pb/* {\n           reverse_proxy 127.0.0.1:8290\n       }\n       handle {\n           rewrite * /fcms/render/sn/docs/docs{path}\n           reverse_proxy 127.0.0.1:8290\n       }\n   }\n   ```\n   Public URLs are clean slugs: `/getting-started` →\n   `/fcms/render/sn/docs/docs/getting-started`. The JSON API (`/fcms/...`,\n   `/cm/...`) is intentionally NOT routed publicly.\n5. **Deploy model**: harness-native polling of `main` (a Sentinel trigger/flow\n   inside this SRE, not crontab). On new `main`: pull, and the file watcher\n   picks up `ct/` changes automatically; `kit.yaml`/`tp/`/`pg/` changes need a\n   kit reload (`POST /hl/kt/sn/docs/rl`) or harness restart. Later: a CI\n   workflow can replace polling and conditionally issue the kit reload.\n6. **main protection**: enable branch protection + PR workflow once prod is\n   operational.\n\n## Staging wiring\n\n- Point the staging DNS name (`sn-docs.dwp.solutions`) at the staging host\n  behind a private reverse proxy, with TLS appropriate for that zone.\n- Reverse-proxy to the local harness (`127.0.0.1:8290` or the Docker host\n  gateway equivalent) using the same rewrite rules as the prod block above.\n",
  "bytes": 4125,
  "sha": "24ed5172fae46af85229dfbb0abb52ab4824e7203f3d326ca0c5ea047013ba0a",
  "repo_slug": "ndx-au/sentinel-docs",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_ndx_au_sentinel_docs_notebooklm_index_md_698eafe9/readme"
}