A control plane for docs: pages live in PostgreSQL, published through an API — MkDocs site, version history, and MCP tools for AI agents included.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport streamable-http · http counts 23 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
archive_doc
-
insert_doc_after_heading
-
insert_doc_before_heading
-
know_classify_doc
-
list_docs
-
patch_doc
-
read_doc
-
read_doc_outline
-
read_doc_section
-
replace_doc_section
-
resolve_concept
-
search_docs
-
work_capture
-
work_dispositions
-
work_get
-
work_inbox
-
work_link
-
work_list
-
work_note
-
work_promote
-
work_transition
-
work_triage
-
write_doc
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 9bbf912 · analyzer v33 · 1h ago
danger signals4
- dynamic code execution __import__ sink cpaumelle-docplane-9bbf912/docs-api/tests/test_migrate_compat.py :64
@pytest.mark.skipif(not __import__("os").environ.get("DB_HOST"), reason="requires a PostgreSQL database") - committed secret AWS access key id cpaumelle-docplane-9bbf912/docs-api/tests/test_meter_list.py :159
AKIAIO…(20 chars, redacted) - committed secret AWS access key id cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue.py :310
AKIAIO…(20 chars, redacted) - committed secret AWS access key id cpaumelle-docplane-9bbf912/migration/fixtures/example-secretish.md :20
AKIAZZ…(20 chars, redacted)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 147
filesystem 54
- fs cpaumelle-docplane-9bbf912/dashboard/app.py :4
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/dashboard/tests/test_authoring.py :3
from pathlib import Path - fs cpaumelle-docplane-9bbf912/docs-api/app/generator.py :9
import shutil - fs cpaumelle-docplane-9bbf912/docs-api/app/search.py :75
with open(tmp, "w") as f: - fs cpaumelle-docplane-9bbf912/docs-api/migrate.py :12
import pathlib - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_agent_cold_start_contract.py :4
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_ci_runs_every_test_file.py :28
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_closure_gates_contract.py :14
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_coverage_burndown_contract.py :1
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_domain_e2e.py :19
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_event_channel_vocabulary.py :18
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_fresh_contract.py :5
from pathlib import Path
show 28 more
- fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_generated_condition_derivation_contract.py :5
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_generated_condition_reconciler.py :5
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_generated_conditions.py :5
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_generated_pages_lifecycle.py :21
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_generated_release.py :25
import shutil - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_initiative_dependencies.py :30
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_knowledge_class_apply.py :6
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_knowledge_class_migration.py :7
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_knowledge_class_suggest.py :16
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_meter_list.py :16
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_migrate_compat.py :11
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_model_contract.py :11
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_observe_contract.py :13
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_redirect_serving.py :20
import shutil - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue.py :15
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue_links.py :5
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue_observer.py :9
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue_source.py :30
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_verification_requests_contract.py :12
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_work_capture_contract.py :10
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_work_catalogue.py :12
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_work_read_surfaces.py :18
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/examples/knowledge-classes/seed_examples.py :27
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/mcp/tests/test_allowed_hosts.py :15
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/mcp/tests/test_content_path.py :13
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/mcp/tests/test_docs_tools.py :13
from pathlib import Path - fs (weak) cpaumelle-docplane-9bbf912/mcp/tests/test_work_tools.py :10
from pathlib import Path - fs cpaumelle-docplane-9bbf912/mcp/tools/docs.py :13
from pathlib import Path
14 more not shown — this panel samples each group; the count above is the real total.
shell / exec 10
- shell (weak) cpaumelle-docplane-9bbf912/dashboard/tests/test_authoring.py :4
import subprocess - shell cpaumelle-docplane-9bbf912/docs-api/app/generator.py :10
import subprocess - shell (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_generated_release.py :26
import subprocess - shell (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_meter_list.py :13
import subprocess - shell (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_redirect_serving.py :21
import subprocess - shell (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue.py :12
import subprocess - shell (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue_observer.py :7
import subprocess - shell (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue_source.py :28
import subprocess - shell (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_work_catalogue.py :9
import subprocess - shell (weak) cpaumelle-docplane-9bbf912/migration/tests/test_links.py :15
import subprocess
network 11
- net cpaumelle-docplane-9bbf912/dashboard/control_plane.py :13
import httpx - net cpaumelle-docplane-9bbf912/docs-api/app/runtime.py :13
import requests - net (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_generated_condition_reconciler.py :187
from urllib.parse import parse_qs, urlsplit - net (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue.py :59
"from urllib.parse import urlsplit\n" - net cpaumelle-docplane-9bbf912/mcp/tools/docs.py :17
import httpx - net cpaumelle-docplane-9bbf912/mcp/tools/work.py :11
import httpx - net cpaumelle-docplane-9bbf912/migration/links.py :49
from urllib.parse import unquote - net (weak) cpaumelle-docplane-9bbf912/scripts/knowledge_class_apply.py :60
from urllib.parse import urlencode - net (weak) cpaumelle-docplane-9bbf912/scripts/reconcile_generated_conditions.py :15
import urllib.error - net (weak) cpaumelle-docplane-9bbf912/scripts/schema_catalogue.py :39
import urllib.error - net (weak) cpaumelle-docplane-9bbf912/scripts/schema_catalogue_observer.py :14
import urllib.error
secrets 11
- secrets cpaumelle-docplane-9bbf912/docs-api/app/agent_auth.py :124
configured = os.environ.get("DOCPLANE_BOOTSTRAP_TOKEN", "") - secrets cpaumelle-docplane-9bbf912/docs-api/app/event_cursor.py :15
value = os.environ.get("DOCPLANE_EVENT_CURSOR_SECRET", "") - secrets (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_domain_e2e.py :1429
bootstrap = {"X-DocPlane-Bootstrap-Token": os.environ["DOCPLANE_BOOTSTRAP_TOKEN"]} - secrets (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_principal_token_management.py :23
BOOTSTRAP = {"X-DocPlane-Bootstrap-Token": os.environ["DOCPLANE_BOOTSTRAP_TOKEN"]} - secrets (weak) cpaumelle-docplane-9bbf912/examples/knowledge-classes/seed_examples.py :58
token = os.environ.get("DOCPLANE_TOKEN") - secrets cpaumelle-docplane-9bbf912/mcp/common.py :7
DOCPLANE_TOKEN = os.environ.get("DOCPLANE_TOKEN", "") - secrets cpaumelle-docplane-9bbf912/mcp/server.py :21
MCP_API_KEY = os.environ.get("MCP_API_KEY", "") - secrets (weak) cpaumelle-docplane-9bbf912/scripts/knowledge_class_apply.py :180
token = os.environ.get("DOCPLANE_TOKEN") - secrets (weak) cpaumelle-docplane-9bbf912/scripts/knowledge_class_suggest.py :270
token = os.environ.get("DOCPLANE_TOKEN") - secrets (weak) cpaumelle-docplane-9bbf912/scripts/meter_list.py :623
source_key = os.environ.get("METER_SOURCE_KEY", "").strip() - secrets (weak) cpaumelle-docplane-9bbf912/scripts/schema_catalogue.py :587
db_key = os.environ["CATALOGUE_DB_KEY"]
database 24
- db cpaumelle-docplane-9bbf912/docs-api/app/agent_access_api.py :10
import psycopg2.extras - db cpaumelle-docplane-9bbf912/docs-api/app/agent_api.py :12
import psycopg2.errors - db cpaumelle-docplane-9bbf912/docs-api/app/agent_shortcuts_api.py :14
import psycopg2.extras - db cpaumelle-docplane-9bbf912/docs-api/app/artifact_ownership.py :11
import psycopg2.errors - db cpaumelle-docplane-9bbf912/docs-api/app/db.py :7
import psycopg2 - db cpaumelle-docplane-9bbf912/docs-api/app/event_store.py :9
import psycopg2.extras - db cpaumelle-docplane-9bbf912/docs-api/app/model_api.py :9
import psycopg2.errors - db cpaumelle-docplane-9bbf912/docs-api/app/mutation_receipts.py :26
import psycopg2.extras - db cpaumelle-docplane-9bbf912/docs-api/app/observe_api.py :16
import psycopg2.extras - db cpaumelle-docplane-9bbf912/docs-api/app/publication.py :16
import psycopg2.extras - db cpaumelle-docplane-9bbf912/docs-api/app/reorganisation_api.py :9
import psycopg2.errors - db cpaumelle-docplane-9bbf912/docs-api/app/trust_api.py :10
import psycopg2.extras
show 12 more
- db cpaumelle-docplane-9bbf912/docs-api/app/verification_api.py :18
import psycopg2.extras - db cpaumelle-docplane-9bbf912/docs-api/app/work_api.py :10
import psycopg2.errors - db cpaumelle-docplane-9bbf912/docs-api/app/work_conditions_api.py :14
import psycopg2.extras - db cpaumelle-docplane-9bbf912/docs-api/migrate.py :17
import psycopg2 - db (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_domain_e2e.py :22
import psycopg2.errors - db (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_knowledge_class_migration.py :9
import psycopg2.errors - db (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_private_fabric_access.py :3
import psycopg2.extras - db (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue.py :1002
import psycopg2 - db (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue_observer.py :180
import psycopg2 - db (weak) cpaumelle-docplane-9bbf912/docs-api/tests/test_schema_catalogue_source.py :182
import psycopg2 - db (weak) cpaumelle-docplane-9bbf912/scripts/schema_catalogue.py :45
import psycopg2 - db (weak) cpaumelle-docplane-9bbf912/scripts/schema_catalogue_observer.py :20
import psycopg2
tool registrations 23
- search_docs cpaumelle-docplane-9bbf912/mcp/tools/docs.py :349
- read_doc cpaumelle-docplane-9bbf912/mcp/tools/docs.py :358
- read_doc_outline cpaumelle-docplane-9bbf912/mcp/tools/docs.py :396
- read_doc_section cpaumelle-docplane-9bbf912/mcp/tools/docs.py :405
- patch_doc cpaumelle-docplane-9bbf912/mcp/tools/docs.py :414
- replace_doc_section cpaumelle-docplane-9bbf912/mcp/tools/docs.py :456
- insert_doc_before_heading cpaumelle-docplane-9bbf912/mcp/tools/docs.py :481
- insert_doc_after_heading cpaumelle-docplane-9bbf912/mcp/tools/docs.py :501
- list_docs cpaumelle-docplane-9bbf912/mcp/tools/docs.py :521
- know_classify_doc cpaumelle-docplane-9bbf912/mcp/tools/docs.py :529
- write_doc cpaumelle-docplane-9bbf912/mcp/tools/docs.py :575
- archive_doc cpaumelle-docplane-9bbf912/mcp/tools/docs.py :673
show 11 more
- resolve_concept cpaumelle-docplane-9bbf912/mcp/tools/docs.py :690
- work_capture cpaumelle-docplane-9bbf912/mcp/tools/work.py :42
- work_inbox cpaumelle-docplane-9bbf912/mcp/tools/work.py :66
- work_triage cpaumelle-docplane-9bbf912/mcp/tools/work.py :75
- work_list cpaumelle-docplane-9bbf912/mcp/tools/work.py :98
- work_get cpaumelle-docplane-9bbf912/mcp/tools/work.py :106
- work_note cpaumelle-docplane-9bbf912/mcp/tools/work.py :112
- work_transition cpaumelle-docplane-9bbf912/mcp/tools/work.py :159
- work_promote cpaumelle-docplane-9bbf912/mcp/tools/work.py :205
- work_dispositions cpaumelle-docplane-9bbf912/mcp/tools/work.py :215
- work_link cpaumelle-docplane-9bbf912/mcp/tools/work.py :231
declared dependencies 3
- fastapi@==0.116.1
- httpx@==0.27.2
- uvicorn@[standard]==0.35.0