← index · checkouts/current/doc/CMS_ADDITIONS.md (blob 1cb694fa4444)
versions: 021610149* 18af9ac95 5b0678b78 3b9531736 be0f0224a 3ab0a81c9 af95bb166 1856955ea d171cb932 1a57edcbc ca84c6d2b 264412263 78d7ffa09 d59fc8bc1 ec1920ac7 40df59002 2a4f3f1c8 2bae7612d f13cde7f3 b7f3e69a5 d5515aa0e 06e2f6e71 1cb694fa4
Everything below is served by the CMS itself, zero-JavaScript, against the unified DB ~/.jazz/congruency.sqlite (the app reads it via checkouts/current/install.json → CONGRUENCY_SQLITE). Dev server: python3 tools/serve.py (0.0.0.0:8899).
A page is a Documents row (DocumentID, TemplateID, Title, Description, ContentID) joined to a Document_Templates row (TemplateID, Content); the template's Content is HTML with <<<Tag>>> markers the engine executes. New pages this session: tickets, memories, pages, tags, ticketDone, tagDone. The order-wizard pages (config/order/thanks) were removed.
Server-rendered Tag_Interface classes. New:
| Tag | Page | What it does | |---|---|---| | <<<TicketList>>> | ?page=tickets | renders the tickets table (OPEN first) | | <<<MemoryList>>> | ?page=memories | top-level tag; the controller (Claude) tool-use log — merges the memories table + the live gate log ~/.MCP/gate-memories.json, reverse-chronological, paginated (?p=) | | <<<SiteMap>>> | nav | the nav, generated from Documents (Pages · Tags · …) | | <<<PageList>>> | ?page=pages | index of every page | | <<<TagList>>> | ?page=tags | gallery of every tag; ?tag=NAME renders that tag (re-entrancy guarded) | | <<<CategoryPages>>> | ?page=pages | browse pages by category (?category=NAME) | | <<<TicketForm>>> via <<<FormTag(TicketForm)>>> / <<<TicketLogger>>> | ?page=tickets → ?page=ticketDone | native ticket submission | | <<<FormTag(TagPageForm)>>> / <<<TagPageHandler>>> | ?page=pages → ?page=tagDone | tag a page into a category |
Forms are rows in the forms table sharing a formName; an FCE/FormConfigElement row carries <action='...'><oncomplete='...'>. The form self-posts; on validating complete the FCE action fires (→ a handler page) and the handler reads results via FORM_MANAGER->getResults() (carried across requests by the POM-in-session — router.php does session_start()). New form elements (ticket #44): DbSelect (a DB-backed <select>, options from pages/categories) and Checkbox (boolean; TicketForm's optional urgent → severity=high). Both live in lib/Modules/Constructs/Form/FormElements/BasicElements/.
Categories(key,name,description) + the new link table Page_Categories(DocumentID, category_key) (many-to-many). First category: specifications. Browse via CategoryPages; tag via the TagPageForm UI on ?page=pages.
boot/rest.php, dispatched by router.php on ?api=)Generic CRUD over every table, table name allowlisted against sqlite_master, columns validated: - GET ?api=tables — discovery - GET ?api=<table>[&p=&per=] — paginated rows; &id=<pk> — one row - POST ?api=<table> — create from JSON body - PUT|PATCH ?api=<table>&id= — update (pk protected) - DELETE ?api=<table>&id= — delete one row
tools/)- serve.py — the dev server. crawl.py — BFS site spider → broken-link report (uses ?api=Documents as the page oracle; expect exactly 1 broken = the deliberate ?page=nope demo on about). - tagcheck.py — renders every tag and asserts 200 + no PHP fatal (29/29 pass). These two are the regression gates used by the ratchet loop.
events, tickets, signals, heartbeat, memories (ops/tracker) + Documents, Document_Templates, Products, forms, orders, Categories, Store_Content_Blocks, Page_Categories (CMS) + _merge_conflicts (merge audit).
Bugs fixed by the ratchet: #58 (shim.php STDERR under php -S), #60 (Content::__toString null). Remaining: #25 PDO migration, #26 test-deploy lifecycle, #29 GPL-header stamp, #30 dead-code audit, #37 one-command MCP installer, #42 order-wizard code removal, #43 categories for threads + admin, #44 more elements (number/date/multiselect), #45 forms deserialization (POM serialize→JSON), #46 predicted-output bets per tag. (#17–24 are historical tournament artifacts.)