{
  "summary": "quarkcs.io is a website designed to be operated by agents QCS does not control. Framework M holds content and policy, Astro serves static HTML, and a scoped tool interface lets any agent draft and propose changes while a person retains the only publish authority.",
  "seo_title": "How we built quarkcs.io so any agent can extend it",
  "seo_description": "quarkcs.io is a website designed to be operated by agents QCS does not control. Framework M holds content and policy, Astro serves static HTML, and a scoped",
  "canonical_url": "",
  "social_image": "",
  "schema_type": "WebPage",
  "noindex": false,
  "keywords": [],
  "published": true,
  "featured": true,
  "published_date": "2026-09-15",
  "updated_date": "2026-09-15",
  "last_reviewed": null,
  "slug": "building-quarkcs-io-for-agents",
  "id": "00649d57-78c0-4c97-a3af-7f71d3611a69",
  "name": "ARTI-22DF7BA4",
  "creation": "2026-09-15T12:06:33.426343+00:00",
  "modified": "2026-09-15T14:15:12.319127+00:00",
  "title": "How we built quarkcs.io so any agent can extend it",
  "excerpt": "This site is operated through the same agent interface we sell: any authorised agent can read the schema, the policy and the site graph, draft and link content, and propose changes — and none of them can publish.",
  "content": "This website was built to be operated by agents that we do not control. Not a chatbot bolted onto a CMS — the whole site is a system that any authorised agent can read, extend and propose changes to, through the same interface our own team uses. We built it this way because it is the architecture we sell, and a company that sells agentic operations should be able to point at its own front door.\n\nThis article explains what we built, what an agent actually gets when it connects, and what it is not allowed to do.\n\n## Three layers, one boundary each\n\nThe site has three parts, and each one owns exactly one concern.\n\n**Framework M holds the truth.** Every page — services, reference architectures, case studies, articles — is a record in an open-source, metadata-driven backend. So is everything *about* the pages: the links between them, the editorial policy, the brand rules, the redirect map, the audit trail. Framework M decides what is true, who may change it, and what requires a person.\n\n**Astro serves it.** The public site is static HTML, built from a snapshot of that content. It never queries the backend when a visitor arrives. Every page ships complete markup, JSON-LD, a canonical URL, and a Markdown mirror at the same address with `.md` appended.\n\n**Any agent operates it.** Between the two sits an interface: twenty-two tools over MCP and a REST API, with a scoped credential per agent. Claude, Codex, a local model, a future agent we have not seen yet — they all connect the same way. There is no privileged path for an agent we built ourselves, because we did not build one and do not intend to.\n\n## What an agent gets\n\nAn agent connecting for the first time does not need a prompt explaining how the site works. It asks.\n\n`get_content_schema` returns the fields, types and required values for every content type, generated from the models themselves, so it cannot drift from what the database accepts. `get_editorial_policy` returns the house rules: the voice, the banned phrases, the requirement that every new page be linked from an existing one with descriptive anchor text. `get_brand_guidelines` returns the terminology we use and the terms we refuse. `get_site_graph` returns every page and every typed link between them, so an agent asked to add a capability can see which pages should mention it rather than guessing from search.\n\nWith that context, the tools are intent-level verbs: `create_draft`, `update_draft`, `add_internal_link`, `update_seo`, `propose_change_set`. An agent never sees a table. It sees the same operations an editor sees, with the same validation. A service page cannot be published without a positioning statement. An anonymous case study cannot be published without a descriptor for the client. A reference architecture cannot be published without its trigger, its agent and its action, because those drive the interactive diagram.\n\n## What an agent cannot do\n\nNo tool publishes anything.\n\n`create_draft` forces the published flag off regardless of what the caller sends. `request_publish` files a change set — a reviewable bundle of proposed operations with the rationale for each. A person approves it in the Desk. Only then can `apply_change_set` execute it, and it refuses a change set approved by the same identity that proposed it.\n\nCredentials are scoped by capability, not issued as all-or-nothing keys. A content agent can draft and link. An SEO audit agent can read and recommend. A maintenance agent can apply approved change sets. None of them can delete, and none of them can bypass the approval step. A credential that asks for a publishing scope while capped below the publishing access level is refused when it is created, not discovered to be dangerous later.\n\nEvery write produces an audit record naming the credential, the action, the target, and the person the credential was issued to. An agent acting for someone is recorded as acting for them.\n\n## What the site offers a machine\n\nDiscovery is treated as a design requirement rather than an afterthought. The site publishes `llms.txt`, generated from the same content that generates the pages, so it cannot list something that does not exist. Every page has a Markdown mirror and a structured JSON representation at predictable addresses. `robots.txt` states separately which crawlers may index and which may train, because those are different decisions. The sitemap carries real modification dates from the content, not from the filesystem.\n\nAn agent that lands on the homepage can find clean prose, structured fields, and the full site index without scraping, and a retrieval system can quote any page's summary because each one is written to stand alone.\n\n## What it cost\n\nThe content model is nineteen record types. The tool surface is twenty-two functions. The audit found four defects in our own seed content before launch and reported zero afterwards. The whole stack runs on one small server, because a static site behind a reverse proxy does not need more.\n\nThis article was drafted through that interface, by an agent holding a content credential, and filed as a change set for a person to approve. It is on the site because someone said yes.",
  "category": "Agentic Automation",
  "hero_image": "",
  "hero_image_alt": "",
  "author": "",
  "reading_minutes": 4,
  "sources": [
    "Framework M — https://gitlab.com/framework-m/framework-m",
    "Model Context Protocol — https://modelcontextprotocol.io",
    "llms.txt proposal — https://llmstxt.org"
  ],
  "author_id": null,
  "author_title": "",
  "doctype": "Article",
  "url": "/insights/building-quarkcs-io-for-agents",
  "markdown_url": "/insights/building-quarkcs-io-for-agents.md",
  "api_url": "/api/public/insights/building-quarkcs-io-for-agents.json",
  "collection": "insights"
}