{"id":1301,"date":"2026-02-15T20:14:30","date_gmt":"2026-02-15T20:14:30","guid":{"rendered":"https:\/\/docs.ai.drawconclusions.org\/?page_id=1301"},"modified":"2026-02-24T12:45:55","modified_gmt":"2026-02-24T12:45:55","slug":"conventions","status":"publish","type":"page","link":"https:\/\/docs.ai.drawconclusions.org\/?page_id=1301","title":{"rendered":"Conventions"},"content":{"rendered":"<h2>Database IDs<\/h2>\n<h2>Uuid<\/h2>\n<ul>\n<li>All tables use UUIDv4 primary keys.<\/li>\n<li>Auto-increment IDs are not used.<\/li>\n<li>PostgreSQL uses <code>gen_random_uuid()<\/code> via the <code>pgcrypto<\/code> extension.<\/li>\n<\/ul>\n<h2>Database Timestamps<\/h2>\n<h2>Dates<\/h2>\n<ul>\n<li>All tables must include <code>date_created<\/code> and <code>date_modified<\/code> columns.<\/li>\n<li>These columns are mandatory and appear at the end of the table schema.<\/li>\n<li><code>date_modified<\/code> auto-updates on any row change.<\/li>\n<\/ul>\n<h2>Validation<\/h2>\n<ul>\n<li>Frontend performs user-facing validation (inline errors, form hints).<\/li>\n<li>Backend PHP enforces the same validation rules and throws\/returns errors on violations.<\/li>\n<li>Validation rules must stay identical between FE and BE.<\/li>\n<li>Backend validation is centralized in <code>server\/var_www\/symfony_be\/src\/Service\/ValidationService.php<\/code>.<\/li>\n<\/ul>\n<h2>Documentation Crosslinks<\/h2>\n<h2>Crosslinks<\/h2>\n<ul>\n<li>No one-way references: if a doc links to another doc, the reverse link must also exist.<\/li>\n<li>If the reverse link is not obvious, search the codebase and populate it.<\/li>\n<\/ul>\n<h2>Naming Consistency<\/h2>\n<h2>Naming<\/h2>\n<ul>\n<li>Use stable identifiers for services, routes, and tables (match the canonical doc page names).<\/li>\n<li>Avoid long schema lists on feature pages; link to the canonical table pages instead.<\/li>\n<\/ul>\n<h2>Inline Edit UI<\/h2>\n<h2>Edit<\/h2>\n<ul>\n<li>Edit buttons live on the right edge of the field row.<\/li>\n<li>Clicking Edit switches to inline edit mode.<\/li>\n<li>Inline edit mode must provide Cancel and Save actions.<\/li>\n<li>Use the User Profile edit flow as the reference pattern.<\/li>\n<\/ul>\n<h2>Subpages<\/h2>\n<ul>\n<li>Password Policy (<code>passwords.md<\/code>)<\/li>\n<li>Code Conventions (<code>code_conventions.md<\/code>)<\/li>\n<\/ul>\n<p class=\"developerdocs-id-search\" aria-hidden=\"true\">DeveloperDoc ID: dd_id_2c8ee9dfab<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Database IDs Uuid All tables use UUIDv4 primary keys. Auto-increment IDs are not used. PostgreSQL uses gen_random_uuid() via the pgcrypto extension. Database Timestamps Dates All tables must include date_created and date_modified columns. These columns are mandatory and appear at the end of the table schema. date_modified auto-updates on any row change. Validation Frontend performs user-facing [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1289,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"doc_category":[],"doc_layer":[30],"class_list":["post-1301","page","type-page","status-publish","hentry","layer-dd_id_8f59177ca0"],"_links":{"self":[{"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=\/wp\/v2\/pages\/1301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1301"}],"version-history":[{"count":5,"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=\/wp\/v2\/pages\/1301\/revisions"}],"predecessor-version":[{"id":3817,"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=\/wp\/v2\/pages\/1301\/revisions\/3817"}],"up":[{"embeddable":true,"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=\/wp\/v2\/pages\/1289"}],"wp:attachment":[{"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1301"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=%2Fwp%2Fv2%2Fdoc_category&post=1301"},{"taxonomy":"doc_layer","embeddable":true,"href":"https:\/\/docs.ai.drawconclusions.org\/index.php?rest_route=%2Fwp%2Fv2%2Fdoc_layer&post=1301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}