feat: renumber lib reference into 4-pillar anatomy

Renumber the 15 reference docs into pillar groups (recipe -> anatomy):
- 01 Build Recipe (entry), 02 Composition Root
- domains: 10 Layering Rules
- contract: 20 Spec-First Routing, 21 CRUD Template, 22 Auth Integration
- interfaces/infra: 30 Infra Adapters
- UI: 40 UI: Auto-Rendered Admin & Custom Pages (new; @aetoskia packages,
  client template, x- catalog via react-openapi MCP module)
- pipelines: 50 Pipeline Scaffold, 51 Worker & Progress, 52 Human-in-the-Loop
- delivery/meta: 90 Drone Pipelines, 91 Versioning & Changelog,
  92 Genericity Matrix, 93 Library Registry, 94 Repository Inventory

MCP module names are unchanged (NN_ prefix stripped); all cross-references
(wiki, templates, hooks, registry) updated; lib index rewritten pillar-first;
build recipe bootstraps the client template. Bundle + HTML sites regenerated.
This commit is contained in:
2026-10-19 17:42:55 +05:30
parent e88005d936
commit 406affcfcf
88 changed files with 3017 additions and 2295 deletions

View File

@@ -14,8 +14,6 @@
<link rel="prev" href="..">
<link rel="next" href="../02_layering_rules/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.23">
@@ -374,7 +372,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -396,7 +394,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -418,7 +416,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -440,7 +438,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -462,7 +460,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -484,7 +482,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -506,7 +504,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -528,7 +526,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -550,7 +548,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -572,7 +570,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -594,7 +592,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -616,7 +614,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -638,7 +636,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -660,7 +658,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">
@@ -785,6 +783,10 @@
<p>The ordered, deterministic checklist for generating a new application of the
standard shape. Every step is fixed; only the resource model (step 2), the
codegen pass (step 3), and the pipeline family (step 8) need app-specific work.</p>
<p>The reference pages behind this recipe are organized as an anatomy: the
domains layer, the OpenAPI contract that drives routing <em>and</em> the admin UI,
the interfaces/infra seam, the auto-rendered UI client, and an optional
pipelines layer — see the <a href="../">Standards Reference</a> index.</p>
<p>This page is served by the <code>standards</code> MCP as <code>docs://modules/build_recipe</code>. The
<code>start_app</code> prompt on that server collects the two axes and hands off here; pull
exact files with <code>get_app_component</code>.</p>
@@ -795,204 +797,210 @@ exact files with <code>get_app_component</code>.</p>
<span class="normal"><a href="#__codelineno-0-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a>cp<span class="w"> </span>-r<span class="w"> </span>&lt;docs&gt;/standards/src/templates/app<span class="w"> </span>apps/&lt;your-app&gt;
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2"></a><span class="nb">cd</span><span class="w"> </span>apps/&lt;your-app&gt;
</span></code></pre></div></td></tr></table></div>
<p>Pair it with the React client template when a UI is needed (auto-rendered
admin from the spec — see <a href="../40_ui_admin/">40 – UI</a>):</p>
<div class="language-bash highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-1-1">1</a></span>
<span class="normal"><a href="#__codelineno-1-2">2</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1"></a>cp<span class="w"> </span>-r<span class="w"> </span>&lt;docs&gt;/standards/src/templates/client<span class="w"> </span>apps/&lt;your-app&gt;-client
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2"></a><span class="nb">cd</span><span class="w"> </span>apps/&lt;your-app&gt;-client<span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span>npm<span class="w"> </span>install
</span></code></pre></div></td></tr></table></div>
<p>Install the internal libraries — editable local checkouts (preferred in
development) or the private index (CI / fresh machines). Credentials are
environment-only; never commit them.</p>
<div class="language-bash highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-1-1">1</a></span>
<span class="normal"><a href="#__codelineno-1-2">2</a></span>
<span class="normal"><a href="#__codelineno-1-3">3</a></span>
<span class="normal"><a href="#__codelineno-1-4">4</a></span>
<span class="normal"><a href="#__codelineno-1-5">5</a></span>
<span class="normal"><a href="#__codelineno-1-6">6</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1"></a><span class="c1"># local checkouts</span>
</span><span id="__span-1-2"><a id="__codelineno-1-2" name="__codelineno-1-2"></a>pip<span class="w"> </span>install<span class="w"> </span>-e<span class="w"> </span>../aetos/openapi-first<span class="w"> </span>-e<span class="w"> </span>../aetos/mongo-ops<span class="w"> </span>-e<span class="w"> </span>../aetos/hexa<span class="w"> </span><span class="se">\</span>
</span><span id="__span-1-3"><a id="__codelineno-1-3" name="__codelineno-1-3"></a><span class="w"> </span>-e<span class="w"> </span>../aetos/dagpipe<span class="w"> </span>-e<span class="w"> </span>../aetos/doc-forge
</span><span id="__span-1-4"><a id="__codelineno-1-4" name="__codelineno-1-4"></a><span class="c1"># private index</span>
</span><span id="__span-1-5"><a id="__codelineno-1-5" name="__codelineno-1-5"></a>pip<span class="w"> </span>install<span class="w"> </span>--extra-index-url<span class="w"> </span><span class="se">\</span>
</span><span id="__span-1-6"><a id="__codelineno-1-6" name="__codelineno-1-6"></a><span class="w"> </span><span class="s2">&quot;https://</span><span class="nv">$PIP_REGISTRY_USERNAME</span><span class="s2">:</span><span class="nv">$PIP_REGISTRY_PASSWORD</span><span class="s2">@pip.aetoskia.com/simple&quot;</span><span class="w"> </span>.
<div class="language-bash highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-2-1">1</a></span>
<span class="normal"><a href="#__codelineno-2-2">2</a></span>
<span class="normal"><a href="#__codelineno-2-3">3</a></span>
<span class="normal"><a href="#__codelineno-2-4">4</a></span>
<span class="normal"><a href="#__codelineno-2-5">5</a></span>
<span class="normal"><a href="#__codelineno-2-6">6</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1"></a><span class="c1"># local checkouts</span>
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2"></a>pip<span class="w"> </span>install<span class="w"> </span>-e<span class="w"> </span>../aetos/openapi-first<span class="w"> </span>-e<span class="w"> </span>../aetos/mongo-ops<span class="w"> </span>-e<span class="w"> </span>../aetos/hexa<span class="w"> </span><span class="se">\</span>
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3"></a><span class="w"> </span>-e<span class="w"> </span>../aetos/dagpipe<span class="w"> </span>-e<span class="w"> </span>../aetos/doc-forge
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4"></a><span class="c1"># private index</span>
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5"></a>pip<span class="w"> </span>install<span class="w"> </span>--extra-index-url<span class="w"> </span><span class="se">\</span>
</span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6"></a><span class="w"> </span><span class="s2">&quot;https://</span><span class="nv">$PIP_REGISTRY_USERNAME</span><span class="s2">:</span><span class="nv">$PIP_REGISTRY_PASSWORD</span><span class="s2">@pip.aetoskia.com/simple&quot;</span><span class="w"> </span>.
</span></code></pre></div></td></tr></table></div>
<hr />
<h2 id="agent-prompt-copyable">📋 Agent prompt (copyable)</h2>
<div class="language-markdown highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-2-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-2-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-2-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-2-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-2-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-2-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-2-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-2-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-2-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-2-10">10</a></span>
<span class="normal"><a href="#__codelineno-2-11">11</a></span>
<span class="normal"><a href="#__codelineno-2-12">12</a></span>
<span class="normal"><a href="#__codelineno-2-13">13</a></span>
<span class="normal"><a href="#__codelineno-2-14">14</a></span>
<span class="normal"><a href="#__codelineno-2-15">15</a></span>
<span class="normal"><a href="#__codelineno-2-16">16</a></span>
<span class="normal"><a href="#__codelineno-2-17">17</a></span>
<span class="normal"><a href="#__codelineno-2-18">18</a></span>
<span class="normal"><a href="#__codelineno-2-19">19</a></span>
<span class="normal"><a href="#__codelineno-2-20">20</a></span>
<span class="normal"><a href="#__codelineno-2-21">21</a></span>
<span class="normal"><a href="#__codelineno-2-22">22</a></span>
<span class="normal"><a href="#__codelineno-2-23">23</a></span>
<span class="normal"><a href="#__codelineno-2-24">24</a></span>
<span class="normal"><a href="#__codelineno-2-25">25</a></span>
<span class="normal"><a href="#__codelineno-2-26">26</a></span>
<span class="normal"><a href="#__codelineno-2-27">27</a></span>
<span class="normal"><a href="#__codelineno-2-28">28</a></span>
<span class="normal"><a href="#__codelineno-2-29">29</a></span>
<span class="normal"><a href="#__codelineno-2-30">30</a></span>
<span class="normal"><a href="#__codelineno-2-31">31</a></span>
<span class="normal"><a href="#__codelineno-2-32">32</a></span>
<span class="normal"><a href="#__codelineno-2-33">33</a></span>
<span class="normal"><a href="#__codelineno-2-34">34</a></span>
<span class="normal"><a href="#__codelineno-2-35">35</a></span>
<span class="normal"><a href="#__codelineno-2-36">36</a></span>
<span class="normal"><a href="#__codelineno-2-37">37</a></span>
<span class="normal"><a href="#__codelineno-2-38">38</a></span>
<span class="normal"><a href="#__codelineno-2-39">39</a></span>
<span class="normal"><a href="#__codelineno-2-40">40</a></span>
<span class="normal"><a href="#__codelineno-2-41">41</a></span>
<span class="normal"><a href="#__codelineno-2-42">42</a></span>
<span class="normal"><a href="#__codelineno-2-43">43</a></span>
<span class="normal"><a href="#__codelineno-2-44">44</a></span>
<span class="normal"><a href="#__codelineno-2-45">45</a></span>
<span class="normal"><a href="#__codelineno-2-46">46</a></span>
<span class="normal"><a href="#__codelineno-2-47">47</a></span>
<span class="normal"><a href="#__codelineno-2-48">48</a></span>
<span class="normal"><a href="#__codelineno-2-49">49</a></span>
<span class="normal"><a href="#__codelineno-2-50">50</a></span>
<span class="normal"><a href="#__codelineno-2-51">51</a></span>
<span class="normal"><a href="#__codelineno-2-52">52</a></span>
<span class="normal"><a href="#__codelineno-2-53">53</a></span>
<span class="normal"><a href="#__codelineno-2-54">54</a></span>
<span class="normal"><a href="#__codelineno-2-55">55</a></span>
<span class="normal"><a href="#__codelineno-2-56">56</a></span>
<span class="normal"><a href="#__codelineno-2-57">57</a></span>
<span class="normal"><a href="#__codelineno-2-58">58</a></span>
<span class="normal"><a href="#__codelineno-2-59">59</a></span>
<span class="normal"><a href="#__codelineno-2-60">60</a></span>
<span class="normal"><a href="#__codelineno-2-61">61</a></span>
<span class="normal"><a href="#__codelineno-2-62">62</a></span>
<span class="normal"><a href="#__codelineno-2-63">63</a></span>
<span class="normal"><a href="#__codelineno-2-64">64</a></span>
<span class="normal"><a href="#__codelineno-2-65">65</a></span>
<span class="normal"><a href="#__codelineno-2-66">66</a></span>
<span class="normal"><a href="#__codelineno-2-67">67</a></span>
<span class="normal"><a href="#__codelineno-2-68">68</a></span>
<span class="normal"><a href="#__codelineno-2-69">69</a></span>
<span class="normal"><a href="#__codelineno-2-70">70</a></span>
<span class="normal"><a href="#__codelineno-2-71">71</a></span>
<span class="normal"><a href="#__codelineno-2-72">72</a></span>
<span class="normal"><a href="#__codelineno-2-73">73</a></span>
<span class="normal"><a href="#__codelineno-2-74">74</a></span>
<span class="normal"><a href="#__codelineno-2-75">75</a></span>
<span class="normal"><a href="#__codelineno-2-76">76</a></span>
<span class="normal"><a href="#__codelineno-2-77">77</a></span>
<span class="normal"><a href="#__codelineno-2-78">78</a></span>
<span class="normal"><a href="#__codelineno-2-79">79</a></span>
<span class="normal"><a href="#__codelineno-2-80">80</a></span>
<span class="normal"><a href="#__codelineno-2-81">81</a></span>
<span class="normal"><a href="#__codelineno-2-82">82</a></span>
<span class="normal"><a href="#__codelineno-2-83">83</a></span>
<span class="normal"><a href="#__codelineno-2-84">84</a></span>
<span class="normal"><a href="#__codelineno-2-85">85</a></span>
<span class="normal"><a href="#__codelineno-2-86">86</a></span>
<span class="normal"><a href="#__codelineno-2-87">87</a></span>
<span class="normal"><a href="#__codelineno-2-88">88</a></span>
<span class="normal"><a href="#__codelineno-2-89">89</a></span>
<span class="normal"><a href="#__codelineno-2-90">90</a></span>
<span class="normal"><a href="#__codelineno-2-91">91</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1"></a><span class="gh"># Build a new application from the Aetos Standards blueprint</span>
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2"></a>
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3"></a>You are coding a complete new backend application conforming to the Aetos
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4"></a>standard app blueprint. Execute every step in order. Only steps 2–4 use the
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5"></a>app-specific details provided by the user; everything else is deterministic.
</span><span id="__span-2-6"><a id="__codelineno-2-6" name="__codelineno-2-6"></a>
</span><span id="__span-2-7"><a id="__codelineno-2-7" name="__codelineno-2-7"></a><span class="gu">## Before writing any code</span>
</span><span id="__span-2-8"><a id="__codelineno-2-8" name="__codelineno-2-8"></a>
</span><span id="__span-2-9"><a id="__codelineno-2-9" name="__codelineno-2-9"></a>Connect to the <span class="sb">`standards`</span> MCP server and read:
</span><span id="__span-2-10"><a id="__codelineno-2-10" name="__codelineno-2-10"></a><span class="k">-</span><span class="w"> </span><span class="sb">`docs://nav`</span> (the module list)
</span><span id="__span-2-11"><a id="__codelineno-2-11" name="__codelineno-2-11"></a><span class="k">-</span><span class="w"> </span><span class="sb">`docs://modules/genericity_matrix`</span> (Tier A library / Tier B template / Tier C authored)
</span><span id="__span-2-12"><a id="__codelineno-2-12" name="__codelineno-2-12"></a><span class="k">-</span><span class="w"> </span><span class="sb">`docs://modules/layering_rules`</span> (the dependency rules)
</span><span id="__span-2-13"><a id="__codelineno-2-13" name="__codelineno-2-13"></a>
</span><span id="__span-2-14"><a id="__codelineno-2-14" name="__codelineno-2-14"></a>Then:
</span><span id="__span-2-15"><a id="__codelineno-2-15" name="__codelineno-2-15"></a><span class="k">-</span><span class="w"> </span>call <span class="sb">`find_library`</span> with <span class="sb">`db`</span>, <span class="sb">`di`</span>, <span class="sb">`routing`</span>, <span class="sb">`ingestion`</span>, <span class="sb">`pipeline`</span>, <span class="sb">`docs`</span>
</span><span id="__span-2-16"><a id="__codelineno-2-16" name="__codelineno-2-16"></a> and note the Tier A libraries that already exist — never reimplement one;
</span><span id="__span-2-17"><a id="__codelineno-2-17" name="__codelineno-2-17"></a><span class="k">-</span><span class="w"> </span>call <span class="sb">`list_app_components()`</span> and pull each file you need with
</span><span id="__span-2-18"><a id="__codelineno-2-18" name="__codelineno-2-18"></a> <span class="sb">`get_app_component(kind, resource=..., family=...)`</span> instead of writing it from
</span><span id="__span-2-19"><a id="__codelineno-2-19" name="__codelineno-2-19"></a> scratch.
</span><span id="__span-2-20"><a id="__codelineno-2-20" name="__codelineno-2-20"></a>
</span><span id="__span-2-21"><a id="__codelineno-2-21" name="__codelineno-2-21"></a><span class="gu">## Steps</span>
</span><span id="__span-2-22"><a id="__codelineno-2-22" name="__codelineno-2-22"></a>
</span><span id="__span-2-23"><a id="__codelineno-2-23" name="__codelineno-2-23"></a><span class="k">1.</span> <span class="gs">**Scaffold**</span> — copy <span class="sb">`standards/src/templates/app/`</span> into <span class="sb">`apps/&lt;your-app&gt;/`</span>
</span><span id="__span-2-24"><a id="__codelineno-2-24" name="__codelineno-2-24"></a> (or pull the same tree via <span class="sb">`get_app_template`</span>). Keep the tree: <span class="sb">`domain/`</span>,
</span><span id="__span-2-25"><a id="__codelineno-2-25" name="__codelineno-2-25"></a> <span class="sb">`infra/`</span>, <span class="sb">`interfaces/`</span>, <span class="sb">`pipelines/`</span>, <span class="sb">`tests/`</span>, <span class="sb">`scripts/`</span>, plus
</span><span id="__span-2-26"><a id="__codelineno-2-26" name="__codelineno-2-26"></a> <span class="sb">`pyproject.toml`</span>, <span class="sb">`openapi.yaml`</span>, <span class="sb">`config.py`</span>, <span class="sb">`init.py`</span>, <span class="sb">`main.py`</span>,
</span><span id="__span-2-27"><a id="__codelineno-2-27" name="__codelineno-2-27"></a> <span class="sb">`worker.py`</span>, <span class="sb">`Dockerfile`</span>, <span class="sb">`docker-compose.yaml`</span>, <span class="sb">`.env.example`</span>.
</span><span id="__span-2-28"><a id="__codelineno-2-28" name="__codelineno-2-28"></a>
</span><span id="__span-2-29"><a id="__codelineno-2-29" name="__codelineno-2-29"></a><span class="k">2.</span> <span class="gs">**Author the spec (app-specific)**</span> — write <span class="sb">`openapi.yaml`</span>: resources,
</span><span id="__span-2-30"><a id="__codelineno-2-30" name="__codelineno-2-30"></a> schemas, <span class="sb">`operationId`</span>s, security, and extension metadata. This is the
</span><span id="__span-2-31"><a id="__codelineno-2-31" name="__codelineno-2-31"></a> contract and drives all routing. Every operation MUST have an <span class="sb">`operationId`</span>.
</span><span id="__span-2-32"><a id="__codelineno-2-32" name="__codelineno-2-32"></a>
</span><span id="__span-2-33"><a id="__codelineno-2-33" name="__codelineno-2-33"></a><span class="k">3.</span> <span class="gs">**Generate the scaffold (codegen)**</span> — from the spec, generate the wire
</span><span id="__span-2-34"><a id="__codelineno-2-34" name="__codelineno-2-34"></a> models and the exact handler signatures:
</span><span id="__span-2-35"><a id="__codelineno-2-35" name="__codelineno-2-35"></a><span class="sb"> ```bash</span>
</span><span id="__span-2-36"><a id="__codelineno-2-36" name="__codelineno-2-36"></a><span class="w"> </span>openapi-first<span class="w"> </span>models<span class="w"> </span>openapi.yaml<span class="w"> </span>-o<span class="w"> </span>_gen/models.py
</span><span id="__span-2-37"><a id="__codelineno-2-37" name="__codelineno-2-37"></a><span class="w"> </span>openapi-first<span class="w"> </span>routes<span class="w"> </span>openapi.yaml<span class="w"> </span>-o<span class="w"> </span>_gen/routes<span class="w"> </span><span class="se">\</span>
</span><span id="__span-2-38"><a id="__codelineno-2-38" name="__codelineno-2-38"></a><span class="w"> </span>--use-models<span class="w"> </span>--models-module<span class="w"> </span>_gen.models<span class="w"> </span>--inject-request<span class="w"> </span>--package<span class="w"> </span>--template-style
</span><span id="__span-2-39"><a id="__codelineno-2-39" name="__codelineno-2-39"></a><span class="sb"> ```</span>
</span><span id="__span-2-40"><a id="__codelineno-2-40" name="__codelineno-2-40"></a> <span class="sb">`_gen/models.py`</span> is the <span class="gs">**wire contract**</span> (Pydantic, one class per
</span><span id="__span-2-41"><a id="__codelineno-2-41" name="__codelineno-2-41"></a> <span class="sb">`components.schemas`</span> entry). <span class="sb">`_gen/routes/&lt;resource&gt;/routes.py`</span> lists every
</span><span id="__span-2-42"><a id="__codelineno-2-42" name="__codelineno-2-42"></a> <span class="sb">`operationId`</span> with its exact parameter signature. <span class="sb">`--template-style`</span> makes
</span><span id="__span-2-43"><a id="__codelineno-2-43" name="__codelineno-2-43"></a> those stubs <span class="sb">`async def`</span> with a <span class="sb">`body`</span> parameter, matching the handlers you
</span><span id="__span-2-44"><a id="__codelineno-2-44" name="__codelineno-2-44"></a> keep in <span class="sb">`interfaces/`</span> (without it they are sync <span class="sb">`def`</span> stubs taking
</span><span id="__span-2-45"><a id="__codelineno-2-45" name="__codelineno-2-45"></a> <span class="sb">`payload`</span>; both bind the same way). Treat <span class="sb">`_gen/`</span> as generated
</span><span id="__span-2-46"><a id="__codelineno-2-46" name="__codelineno-2-46"></a> (never hand-edit it) — the canonical handlers live in <span class="sb">`interfaces/`</span>.
</span><span id="__span-2-47"><a id="__codelineno-2-47" name="__codelineno-2-47"></a>
</span><span id="__span-2-48"><a id="__codelineno-2-48" name="__codelineno-2-48"></a><span class="k">4.</span> <span class="gs">**Write each CRUD slice (app-specific)**</span> — per resource create the four-file
</span><span id="__span-2-49"><a id="__codelineno-2-49" name="__codelineno-2-49"></a> slice: <span class="sb">`models.py`</span> (domain model, <span class="gs">**no `id`**</span>), <span class="sb">`ports/db.py`</span>
</span><span id="__span-2-50"><a id="__codelineno-2-50" name="__codelineno-2-50"></a> (<span class="sb">`class XDocument(BaseDocument, X)`</span> — id comes from <span class="sb">`BaseDocument`</span>),
</span><span id="__span-2-51"><a id="__codelineno-2-51" name="__codelineno-2-51"></a> <span class="sb">`ports/service.py`</span>, and optional <span class="sb">`converters.py`</span>. Follow the CRUD template.
</span><span id="__span-2-52"><a id="__codelineno-2-52" name="__codelineno-2-52"></a>
</span><span id="__span-2-53"><a id="__codelineno-2-53" name="__codelineno-2-53"></a><span class="k">5.</span> <span class="gs">**Wire the composition root**</span> — in <span class="sb">`init.py`</span>, build leaf repositories, then
</span><span id="__span-2-54"><a id="__codelineno-2-54" name="__codelineno-2-54"></a> dependent repositories, then services; add infra adapters (db, cache, stores,
</span><span id="__span-2-55"><a id="__codelineno-2-55" name="__codelineno-2-55"></a> progress bus, fetchers). Expose <span class="sb">`get_svc`</span> overloads.
</span><span id="__span-2-56"><a id="__codelineno-2-56" name="__codelineno-2-56"></a>
</span><span id="__span-2-57"><a id="__codelineno-2-57" name="__codelineno-2-57"></a><span class="k">6.</span> <span class="gs">**Add routes**</span> — create <span class="sb">`interfaces/&lt;resource&gt;/routes.py`</span> thin handlers whose
</span><span id="__span-2-58"><a id="__codelineno-2-58" name="__codelineno-2-58"></a> names match the <span class="sb">`operationId`</span>s (use the signatures from step 3 as your
</span><span id="__span-2-59"><a id="__codelineno-2-59" name="__codelineno-2-59"></a> checklist) and re-export them in <span class="sb">`interfaces/openapi.py`</span>. Add the cache
</span><span id="__span-2-60"><a id="__codelineno-2-60" name="__codelineno-2-60"></a> decorator to read endpoints.
</span><span id="__span-2-61"><a id="__codelineno-2-61" name="__codelineno-2-61"></a>
</span><span id="__span-2-62"><a id="__codelineno-2-62" name="__codelineno-2-62"></a><span class="k">7.</span> <span class="gs">**Bootstrap app and worker**</span> — confirm <span class="sb">`main.py`</span> runs the OpenAPI-first app
</span><span id="__span-2-63"><a id="__codelineno-2-63" name="__codelineno-2-63"></a> with its lifespan. If the app has long-running jobs, adapt <span class="sb">`worker.py`</span> to poll
</span><span id="__span-2-64"><a id="__codelineno-2-64" name="__codelineno-2-64"></a> the job collection, run the pipeline, and publish progress.
</span><span id="__span-2-65"><a id="__codelineno-2-65" name="__codelineno-2-65"></a>
</span><span id="__span-2-66"><a id="__codelineno-2-66" name="__codelineno-2-66"></a><span class="k">8.</span> <span class="gs">**Add pipeline families (only if data-driven)**</span> — copy <span class="sb">`pipelines/example/`</span>
</span><span id="__span-2-67"><a id="__codelineno-2-67" name="__codelineno-2-67"></a> to <span class="sb">`pipelines/&lt;family&gt;/`</span> with <span class="sb">`abc.py`</span>, <span class="sb">`impl.py`</span>, <span class="sb">`pipeline.yaml`</span>,
</span><span id="__span-2-68"><a id="__codelineno-2-68" name="__codelineno-2-68"></a> <span class="sb">`resources/`</span>, and reuse <span class="sb">`pipelines/shared/`</span> (loader + registry). Register the
</span><span id="__span-2-69"><a id="__codelineno-2-69" name="__codelineno-2-69"></a> root. Add fixtures and a parity test.
</span><span id="__span-2-70"><a id="__codelineno-2-70" name="__codelineno-2-70"></a>
</span><span id="__span-2-71"><a id="__codelineno-2-71" name="__codelineno-2-71"></a><span class="k">9.</span> <span class="gs">**Add infrastructure only where needed**</span> — Tier A capability: use the
</span><span id="__span-2-72"><a id="__codelineno-2-72" name="__codelineno-2-72"></a> library. Tier B capability: copy the template. Never hand-write a Tier A
</span><span id="__span-2-73"><a id="__codelineno-2-73" name="__codelineno-2-73"></a> library.
</span><span id="__span-2-74"><a id="__codelineno-2-74" name="__codelineno-2-74"></a>
</span><span id="__span-2-75"><a id="__codelineno-2-75" name="__codelineno-2-75"></a><span class="k">10.</span> <span class="gs">**Tests**</span> — integration tests with fakes at the HTTP edge; unit tests for
</span><span id="__span-2-76"><a id="__codelineno-2-76" name="__codelineno-2-76"></a> domain and pipeline logic; a config-consistency test for rule-driven
</span><span id="__span-2-77"><a id="__codelineno-2-77" name="__codelineno-2-77"></a> pipelines. Include <span class="sb">`tests/integration/test_openapi_app_builds.py`</span> (imports
</span><span id="__span-2-78"><a id="__codelineno-2-78" name="__codelineno-2-78"></a> the app, asserts <span class="sb">`import main`</span> binds every operation).
</span><span id="__span-2-79"><a id="__codelineno-2-79" name="__codelineno-2-79"></a>
</span><span id="__span-2-80"><a id="__codelineno-2-80" name="__codelineno-2-80"></a><span class="k">11.</span> <span class="gs">**Scripts and seeds**</span> — operator scripts under <span class="sb">`scripts/`</span> using
</span><span id="__span-2-81"><a id="__codelineno-2-81" name="__codelineno-2-81"></a> <span class="sb">`init()`</span> / <span class="sb">`get_svc()`</span> / <span class="sb">`shutdown()`</span>; run as <span class="sb">`python -m scripts.&lt;name&gt;`</span>.
</span><span id="__span-2-82"><a id="__codelineno-2-82" name="__codelineno-2-82"></a>
</span><span id="__span-2-83"><a id="__codelineno-2-83" name="__codelineno-2-83"></a><span class="k">12.</span> <span class="gs">**Docs**</span> — author GSDFC docstrings, generate <span class="sb">`.pyi`</span> stubs, mark the package
</span><span id="__span-2-84"><a id="__codelineno-2-84" name="__codelineno-2-84"></a> <span class="sb">`py.typed`</span>, and build the docs.
</span><span id="__span-2-85"><a id="__codelineno-2-85" name="__codelineno-2-85"></a>
</span><span id="__span-2-86"><a id="__codelineno-2-86" name="__codelineno-2-86"></a><span class="gs">**Definition of done:**</span>
</span><span id="__span-2-87"><a id="__codelineno-2-87" name="__codelineno-2-87"></a><span class="k">-</span><span class="w"> </span><span class="sb">`python -c &quot;import main&quot;`</span> succeeds.
</span><span id="__span-2-88"><a id="__codelineno-2-88" name="__codelineno-2-88"></a><span class="k">-</span><span class="w"> </span><span class="sb">`pytest`</span> passes.
</span><span id="__span-2-89"><a id="__codelineno-2-89" name="__codelineno-2-89"></a><span class="k">-</span><span class="w"> </span>The app serves every operation in the spec; the worker drains its queue.
</span><span id="__span-2-90"><a id="__codelineno-2-90" name="__codelineno-2-90"></a><span class="k">-</span><span class="w"> </span>No domain module imports a web framework.
</span><span id="__span-2-91"><a id="__codelineno-2-91" name="__codelineno-2-91"></a><span class="k">-</span><span class="w"> </span>No Tier A library was reimplemented.
<div class="language-markdown highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-3-1"> 1</a></span>
<span class="normal"><a href="#__codelineno-3-2"> 2</a></span>
<span class="normal"><a href="#__codelineno-3-3"> 3</a></span>
<span class="normal"><a href="#__codelineno-3-4"> 4</a></span>
<span class="normal"><a href="#__codelineno-3-5"> 5</a></span>
<span class="normal"><a href="#__codelineno-3-6"> 6</a></span>
<span class="normal"><a href="#__codelineno-3-7"> 7</a></span>
<span class="normal"><a href="#__codelineno-3-8"> 8</a></span>
<span class="normal"><a href="#__codelineno-3-9"> 9</a></span>
<span class="normal"><a href="#__codelineno-3-10">10</a></span>
<span class="normal"><a href="#__codelineno-3-11">11</a></span>
<span class="normal"><a href="#__codelineno-3-12">12</a></span>
<span class="normal"><a href="#__codelineno-3-13">13</a></span>
<span class="normal"><a href="#__codelineno-3-14">14</a></span>
<span class="normal"><a href="#__codelineno-3-15">15</a></span>
<span class="normal"><a href="#__codelineno-3-16">16</a></span>
<span class="normal"><a href="#__codelineno-3-17">17</a></span>
<span class="normal"><a href="#__codelineno-3-18">18</a></span>
<span class="normal"><a href="#__codelineno-3-19">19</a></span>
<span class="normal"><a href="#__codelineno-3-20">20</a></span>
<span class="normal"><a href="#__codelineno-3-21">21</a></span>
<span class="normal"><a href="#__codelineno-3-22">22</a></span>
<span class="normal"><a href="#__codelineno-3-23">23</a></span>
<span class="normal"><a href="#__codelineno-3-24">24</a></span>
<span class="normal"><a href="#__codelineno-3-25">25</a></span>
<span class="normal"><a href="#__codelineno-3-26">26</a></span>
<span class="normal"><a href="#__codelineno-3-27">27</a></span>
<span class="normal"><a href="#__codelineno-3-28">28</a></span>
<span class="normal"><a href="#__codelineno-3-29">29</a></span>
<span class="normal"><a href="#__codelineno-3-30">30</a></span>
<span class="normal"><a href="#__codelineno-3-31">31</a></span>
<span class="normal"><a href="#__codelineno-3-32">32</a></span>
<span class="normal"><a href="#__codelineno-3-33">33</a></span>
<span class="normal"><a href="#__codelineno-3-34">34</a></span>
<span class="normal"><a href="#__codelineno-3-35">35</a></span>
<span class="normal"><a href="#__codelineno-3-36">36</a></span>
<span class="normal"><a href="#__codelineno-3-37">37</a></span>
<span class="normal"><a href="#__codelineno-3-38">38</a></span>
<span class="normal"><a href="#__codelineno-3-39">39</a></span>
<span class="normal"><a href="#__codelineno-3-40">40</a></span>
<span class="normal"><a href="#__codelineno-3-41">41</a></span>
<span class="normal"><a href="#__codelineno-3-42">42</a></span>
<span class="normal"><a href="#__codelineno-3-43">43</a></span>
<span class="normal"><a href="#__codelineno-3-44">44</a></span>
<span class="normal"><a href="#__codelineno-3-45">45</a></span>
<span class="normal"><a href="#__codelineno-3-46">46</a></span>
<span class="normal"><a href="#__codelineno-3-47">47</a></span>
<span class="normal"><a href="#__codelineno-3-48">48</a></span>
<span class="normal"><a href="#__codelineno-3-49">49</a></span>
<span class="normal"><a href="#__codelineno-3-50">50</a></span>
<span class="normal"><a href="#__codelineno-3-51">51</a></span>
<span class="normal"><a href="#__codelineno-3-52">52</a></span>
<span class="normal"><a href="#__codelineno-3-53">53</a></span>
<span class="normal"><a href="#__codelineno-3-54">54</a></span>
<span class="normal"><a href="#__codelineno-3-55">55</a></span>
<span class="normal"><a href="#__codelineno-3-56">56</a></span>
<span class="normal"><a href="#__codelineno-3-57">57</a></span>
<span class="normal"><a href="#__codelineno-3-58">58</a></span>
<span class="normal"><a href="#__codelineno-3-59">59</a></span>
<span class="normal"><a href="#__codelineno-3-60">60</a></span>
<span class="normal"><a href="#__codelineno-3-61">61</a></span>
<span class="normal"><a href="#__codelineno-3-62">62</a></span>
<span class="normal"><a href="#__codelineno-3-63">63</a></span>
<span class="normal"><a href="#__codelineno-3-64">64</a></span>
<span class="normal"><a href="#__codelineno-3-65">65</a></span>
<span class="normal"><a href="#__codelineno-3-66">66</a></span>
<span class="normal"><a href="#__codelineno-3-67">67</a></span>
<span class="normal"><a href="#__codelineno-3-68">68</a></span>
<span class="normal"><a href="#__codelineno-3-69">69</a></span>
<span class="normal"><a href="#__codelineno-3-70">70</a></span>
<span class="normal"><a href="#__codelineno-3-71">71</a></span>
<span class="normal"><a href="#__codelineno-3-72">72</a></span>
<span class="normal"><a href="#__codelineno-3-73">73</a></span>
<span class="normal"><a href="#__codelineno-3-74">74</a></span>
<span class="normal"><a href="#__codelineno-3-75">75</a></span>
<span class="normal"><a href="#__codelineno-3-76">76</a></span>
<span class="normal"><a href="#__codelineno-3-77">77</a></span>
<span class="normal"><a href="#__codelineno-3-78">78</a></span>
<span class="normal"><a href="#__codelineno-3-79">79</a></span>
<span class="normal"><a href="#__codelineno-3-80">80</a></span>
<span class="normal"><a href="#__codelineno-3-81">81</a></span>
<span class="normal"><a href="#__codelineno-3-82">82</a></span>
<span class="normal"><a href="#__codelineno-3-83">83</a></span>
<span class="normal"><a href="#__codelineno-3-84">84</a></span>
<span class="normal"><a href="#__codelineno-3-85">85</a></span>
<span class="normal"><a href="#__codelineno-3-86">86</a></span>
<span class="normal"><a href="#__codelineno-3-87">87</a></span>
<span class="normal"><a href="#__codelineno-3-88">88</a></span>
<span class="normal"><a href="#__codelineno-3-89">89</a></span>
<span class="normal"><a href="#__codelineno-3-90">90</a></span>
<span class="normal"><a href="#__codelineno-3-91">91</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1"></a><span class="gh"># Build a new application from the Aetos Standards blueprint</span>
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2"></a>
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3"></a>You are coding a complete new backend application conforming to the Aetos
</span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4"></a>standard app blueprint. Execute every step in order. Only steps 2–4 use the
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5"></a>app-specific details provided by the user; everything else is deterministic.
</span><span id="__span-3-6"><a id="__codelineno-3-6" name="__codelineno-3-6"></a>
</span><span id="__span-3-7"><a id="__codelineno-3-7" name="__codelineno-3-7"></a><span class="gu">## Before writing any code</span>
</span><span id="__span-3-8"><a id="__codelineno-3-8" name="__codelineno-3-8"></a>
</span><span id="__span-3-9"><a id="__codelineno-3-9" name="__codelineno-3-9"></a>Connect to the <span class="sb">`standards`</span> MCP server and read:
</span><span id="__span-3-10"><a id="__codelineno-3-10" name="__codelineno-3-10"></a><span class="k">-</span><span class="w"> </span><span class="sb">`docs://nav`</span> (the module list)
</span><span id="__span-3-11"><a id="__codelineno-3-11" name="__codelineno-3-11"></a><span class="k">-</span><span class="w"> </span><span class="sb">`docs://modules/genericity_matrix`</span> (Tier A library / Tier B template / Tier C authored)
</span><span id="__span-3-12"><a id="__codelineno-3-12" name="__codelineno-3-12"></a><span class="k">-</span><span class="w"> </span><span class="sb">`docs://modules/layering_rules`</span> (the dependency rules)
</span><span id="__span-3-13"><a id="__codelineno-3-13" name="__codelineno-3-13"></a>
</span><span id="__span-3-14"><a id="__codelineno-3-14" name="__codelineno-3-14"></a>Then:
</span><span id="__span-3-15"><a id="__codelineno-3-15" name="__codelineno-3-15"></a><span class="k">-</span><span class="w"> </span>call <span class="sb">`find_library`</span> with <span class="sb">`db`</span>, <span class="sb">`di`</span>, <span class="sb">`routing`</span>, <span class="sb">`ingestion`</span>, <span class="sb">`pipeline`</span>, <span class="sb">`docs`</span>
</span><span id="__span-3-16"><a id="__codelineno-3-16" name="__codelineno-3-16"></a> and note the Tier A libraries that already exist — never reimplement one;
</span><span id="__span-3-17"><a id="__codelineno-3-17" name="__codelineno-3-17"></a><span class="k">-</span><span class="w"> </span>call <span class="sb">`list_app_components()`</span> and pull each file you need with
</span><span id="__span-3-18"><a id="__codelineno-3-18" name="__codelineno-3-18"></a> <span class="sb">`get_app_component(kind, resource=..., family=...)`</span> instead of writing it from
</span><span id="__span-3-19"><a id="__codelineno-3-19" name="__codelineno-3-19"></a> scratch.
</span><span id="__span-3-20"><a id="__codelineno-3-20" name="__codelineno-3-20"></a>
</span><span id="__span-3-21"><a id="__codelineno-3-21" name="__codelineno-3-21"></a><span class="gu">## Steps</span>
</span><span id="__span-3-22"><a id="__codelineno-3-22" name="__codelineno-3-22"></a>
</span><span id="__span-3-23"><a id="__codelineno-3-23" name="__codelineno-3-23"></a><span class="k">1.</span> <span class="gs">**Scaffold**</span> — copy <span class="sb">`standards/src/templates/app/`</span> into <span class="sb">`apps/&lt;your-app&gt;/`</span>
</span><span id="__span-3-24"><a id="__codelineno-3-24" name="__codelineno-3-24"></a> (or pull the same tree via <span class="sb">`get_app_template`</span>). Keep the tree: <span class="sb">`domain/`</span>,
</span><span id="__span-3-25"><a id="__codelineno-3-25" name="__codelineno-3-25"></a> <span class="sb">`infra/`</span>, <span class="sb">`interfaces/`</span>, <span class="sb">`pipelines/`</span>, <span class="sb">`tests/`</span>, <span class="sb">`scripts/`</span>, plus
</span><span id="__span-3-26"><a id="__codelineno-3-26" name="__codelineno-3-26"></a> <span class="sb">`pyproject.toml`</span>, <span class="sb">`openapi.yaml`</span>, <span class="sb">`config.py`</span>, <span class="sb">`init.py`</span>, <span class="sb">`main.py`</span>,
</span><span id="__span-3-27"><a id="__codelineno-3-27" name="__codelineno-3-27"></a> <span class="sb">`worker.py`</span>, <span class="sb">`Dockerfile`</span>, <span class="sb">`docker-compose.yaml`</span>, <span class="sb">`.env.example`</span>.
</span><span id="__span-3-28"><a id="__codelineno-3-28" name="__codelineno-3-28"></a>
</span><span id="__span-3-29"><a id="__codelineno-3-29" name="__codelineno-3-29"></a><span class="k">2.</span> <span class="gs">**Author the spec (app-specific)**</span> — write <span class="sb">`openapi.yaml`</span>: resources,
</span><span id="__span-3-30"><a id="__codelineno-3-30" name="__codelineno-3-30"></a> schemas, <span class="sb">`operationId`</span>s, security, and extension metadata. This is the
</span><span id="__span-3-31"><a id="__codelineno-3-31" name="__codelineno-3-31"></a> contract and drives all routing. Every operation MUST have an <span class="sb">`operationId`</span>.
</span><span id="__span-3-32"><a id="__codelineno-3-32" name="__codelineno-3-32"></a>
</span><span id="__span-3-33"><a id="__codelineno-3-33" name="__codelineno-3-33"></a><span class="k">3.</span> <span class="gs">**Generate the scaffold (codegen)**</span> — from the spec, generate the wire
</span><span id="__span-3-34"><a id="__codelineno-3-34" name="__codelineno-3-34"></a> models and the exact handler signatures:
</span><span id="__span-3-35"><a id="__codelineno-3-35" name="__codelineno-3-35"></a><span class="sb"> ```bash</span>
</span><span id="__span-3-36"><a id="__codelineno-3-36" name="__codelineno-3-36"></a><span class="w"> </span>openapi-first<span class="w"> </span>models<span class="w"> </span>openapi.yaml<span class="w"> </span>-o<span class="w"> </span>_gen/models.py
</span><span id="__span-3-37"><a id="__codelineno-3-37" name="__codelineno-3-37"></a><span class="w"> </span>openapi-first<span class="w"> </span>routes<span class="w"> </span>openapi.yaml<span class="w"> </span>-o<span class="w"> </span>_gen/routes<span class="w"> </span><span class="se">\</span>
</span><span id="__span-3-38"><a id="__codelineno-3-38" name="__codelineno-3-38"></a><span class="w"> </span>--use-models<span class="w"> </span>--models-module<span class="w"> </span>_gen.models<span class="w"> </span>--inject-request<span class="w"> </span>--package<span class="w"> </span>--template-style
</span><span id="__span-3-39"><a id="__codelineno-3-39" name="__codelineno-3-39"></a><span class="sb"> ```</span>
</span><span id="__span-3-40"><a id="__codelineno-3-40" name="__codelineno-3-40"></a> <span class="sb">`_gen/models.py`</span> is the <span class="gs">**wire contract**</span> (Pydantic, one class per
</span><span id="__span-3-41"><a id="__codelineno-3-41" name="__codelineno-3-41"></a> <span class="sb">`components.schemas`</span> entry). <span class="sb">`_gen/routes/&lt;resource&gt;/routes.py`</span> lists every
</span><span id="__span-3-42"><a id="__codelineno-3-42" name="__codelineno-3-42"></a> <span class="sb">`operationId`</span> with its exact parameter signature. <span class="sb">`--template-style`</span> makes
</span><span id="__span-3-43"><a id="__codelineno-3-43" name="__codelineno-3-43"></a> those stubs <span class="sb">`async def`</span> with a <span class="sb">`body`</span> parameter, matching the handlers you
</span><span id="__span-3-44"><a id="__codelineno-3-44" name="__codelineno-3-44"></a> keep in <span class="sb">`interfaces/`</span> (without it they are sync <span class="sb">`def`</span> stubs taking
</span><span id="__span-3-45"><a id="__codelineno-3-45" name="__codelineno-3-45"></a> <span class="sb">`payload`</span>; both bind the same way). Treat <span class="sb">`_gen/`</span> as generated
</span><span id="__span-3-46"><a id="__codelineno-3-46" name="__codelineno-3-46"></a> (never hand-edit it) — the canonical handlers live in <span class="sb">`interfaces/`</span>.
</span><span id="__span-3-47"><a id="__codelineno-3-47" name="__codelineno-3-47"></a>
</span><span id="__span-3-48"><a id="__codelineno-3-48" name="__codelineno-3-48"></a><span class="k">4.</span> <span class="gs">**Write each CRUD slice (app-specific)**</span> — per resource create the four-file
</span><span id="__span-3-49"><a id="__codelineno-3-49" name="__codelineno-3-49"></a> slice: <span class="sb">`models.py`</span> (domain model, <span class="gs">**no `id`**</span>), <span class="sb">`ports/db.py`</span>
</span><span id="__span-3-50"><a id="__codelineno-3-50" name="__codelineno-3-50"></a> (<span class="sb">`class XDocument(BaseDocument, X)`</span> — id comes from <span class="sb">`BaseDocument`</span>),
</span><span id="__span-3-51"><a id="__codelineno-3-51" name="__codelineno-3-51"></a> <span class="sb">`ports/service.py`</span>, and optional <span class="sb">`converters.py`</span>. Follow the CRUD template.
</span><span id="__span-3-52"><a id="__codelineno-3-52" name="__codelineno-3-52"></a>
</span><span id="__span-3-53"><a id="__codelineno-3-53" name="__codelineno-3-53"></a><span class="k">5.</span> <span class="gs">**Wire the composition root**</span> — in <span class="sb">`init.py`</span>, build leaf repositories, then
</span><span id="__span-3-54"><a id="__codelineno-3-54" name="__codelineno-3-54"></a> dependent repositories, then services; add infra adapters (db, cache, stores,
</span><span id="__span-3-55"><a id="__codelineno-3-55" name="__codelineno-3-55"></a> progress bus, fetchers). Expose <span class="sb">`get_svc`</span> overloads.
</span><span id="__span-3-56"><a id="__codelineno-3-56" name="__codelineno-3-56"></a>
</span><span id="__span-3-57"><a id="__codelineno-3-57" name="__codelineno-3-57"></a><span class="k">6.</span> <span class="gs">**Add routes**</span> — create <span class="sb">`interfaces/&lt;resource&gt;/routes.py`</span> thin handlers whose
</span><span id="__span-3-58"><a id="__codelineno-3-58" name="__codelineno-3-58"></a> names match the <span class="sb">`operationId`</span>s (use the signatures from step 3 as your
</span><span id="__span-3-59"><a id="__codelineno-3-59" name="__codelineno-3-59"></a> checklist) and re-export them in <span class="sb">`interfaces/openapi.py`</span>. Add the cache
</span><span id="__span-3-60"><a id="__codelineno-3-60" name="__codelineno-3-60"></a> decorator to read endpoints.
</span><span id="__span-3-61"><a id="__codelineno-3-61" name="__codelineno-3-61"></a>
</span><span id="__span-3-62"><a id="__codelineno-3-62" name="__codelineno-3-62"></a><span class="k">7.</span> <span class="gs">**Bootstrap app and worker**</span> — confirm <span class="sb">`main.py`</span> runs the OpenAPI-first app
</span><span id="__span-3-63"><a id="__codelineno-3-63" name="__codelineno-3-63"></a> with its lifespan. If the app has long-running jobs, adapt <span class="sb">`worker.py`</span> to poll
</span><span id="__span-3-64"><a id="__codelineno-3-64" name="__codelineno-3-64"></a> the job collection, run the pipeline, and publish progress.
</span><span id="__span-3-65"><a id="__codelineno-3-65" name="__codelineno-3-65"></a>
</span><span id="__span-3-66"><a id="__codelineno-3-66" name="__codelineno-3-66"></a><span class="k">8.</span> <span class="gs">**Add pipeline families (only if data-driven)**</span> — copy <span class="sb">`pipelines/example/`</span>
</span><span id="__span-3-67"><a id="__codelineno-3-67" name="__codelineno-3-67"></a> to <span class="sb">`pipelines/&lt;family&gt;/`</span> with <span class="sb">`abc.py`</span>, <span class="sb">`impl.py`</span>, <span class="sb">`pipeline.yaml`</span>,
</span><span id="__span-3-68"><a id="__codelineno-3-68" name="__codelineno-3-68"></a> <span class="sb">`resources/`</span>, and reuse <span class="sb">`pipelines/shared/`</span> (loader + registry). Register the
</span><span id="__span-3-69"><a id="__codelineno-3-69" name="__codelineno-3-69"></a> root. Add fixtures and a parity test.
</span><span id="__span-3-70"><a id="__codelineno-3-70" name="__codelineno-3-70"></a>
</span><span id="__span-3-71"><a id="__codelineno-3-71" name="__codelineno-3-71"></a><span class="k">9.</span> <span class="gs">**Add infrastructure only where needed**</span> — Tier A capability: use the
</span><span id="__span-3-72"><a id="__codelineno-3-72" name="__codelineno-3-72"></a> library. Tier B capability: copy the template. Never hand-write a Tier A
</span><span id="__span-3-73"><a id="__codelineno-3-73" name="__codelineno-3-73"></a> library.
</span><span id="__span-3-74"><a id="__codelineno-3-74" name="__codelineno-3-74"></a>
</span><span id="__span-3-75"><a id="__codelineno-3-75" name="__codelineno-3-75"></a><span class="k">10.</span> <span class="gs">**Tests**</span> — integration tests with fakes at the HTTP edge; unit tests for
</span><span id="__span-3-76"><a id="__codelineno-3-76" name="__codelineno-3-76"></a> domain and pipeline logic; a config-consistency test for rule-driven
</span><span id="__span-3-77"><a id="__codelineno-3-77" name="__codelineno-3-77"></a> pipelines. Include <span class="sb">`tests/integration/test_openapi_app_builds.py`</span> (imports
</span><span id="__span-3-78"><a id="__codelineno-3-78" name="__codelineno-3-78"></a> the app, asserts <span class="sb">`import main`</span> binds every operation).
</span><span id="__span-3-79"><a id="__codelineno-3-79" name="__codelineno-3-79"></a>
</span><span id="__span-3-80"><a id="__codelineno-3-80" name="__codelineno-3-80"></a><span class="k">11.</span> <span class="gs">**Scripts and seeds**</span> — operator scripts under <span class="sb">`scripts/`</span> using
</span><span id="__span-3-81"><a id="__codelineno-3-81" name="__codelineno-3-81"></a> <span class="sb">`init()`</span> / <span class="sb">`get_svc()`</span> / <span class="sb">`shutdown()`</span>; run as <span class="sb">`python -m scripts.&lt;name&gt;`</span>.
</span><span id="__span-3-82"><a id="__codelineno-3-82" name="__codelineno-3-82"></a>
</span><span id="__span-3-83"><a id="__codelineno-3-83" name="__codelineno-3-83"></a><span class="k">12.</span> <span class="gs">**Docs**</span> — author GSDFC docstrings, generate <span class="sb">`.pyi`</span> stubs, mark the package
</span><span id="__span-3-84"><a id="__codelineno-3-84" name="__codelineno-3-84"></a> <span class="sb">`py.typed`</span>, and build the docs.
</span><span id="__span-3-85"><a id="__codelineno-3-85" name="__codelineno-3-85"></a>
</span><span id="__span-3-86"><a id="__codelineno-3-86" name="__codelineno-3-86"></a><span class="gs">**Definition of done:**</span>
</span><span id="__span-3-87"><a id="__codelineno-3-87" name="__codelineno-3-87"></a><span class="k">-</span><span class="w"> </span><span class="sb">`python -c &quot;import main&quot;`</span> succeeds.
</span><span id="__span-3-88"><a id="__codelineno-3-88" name="__codelineno-3-88"></a><span class="k">-</span><span class="w"> </span><span class="sb">`pytest`</span> passes.
</span><span id="__span-3-89"><a id="__codelineno-3-89" name="__codelineno-3-89"></a><span class="k">-</span><span class="w"> </span>The app serves every operation in the spec; the worker drains its queue.
</span><span id="__span-3-90"><a id="__codelineno-3-90" name="__codelineno-3-90"></a><span class="k">-</span><span class="w"> </span>No domain module imports a web framework.
</span><span id="__span-3-91"><a id="__codelineno-3-91" name="__codelineno-3-91"></a><span class="k">-</span><span class="w"> </span>No Tier A library was reimplemented.
</span></code></pre></div></td></tr></table></div>
<hr />
<h2 id="where-the-steps-land">🧭 Where the steps land</h2>
@@ -1120,7 +1128,7 @@ the two mechanical parts of the build:</p>
<hr />
<h2 id="related">Related</h2>
<ul>
<li><a href="../02_layering_rules/">02 – Layering Rules</a> · <a href="../05_crud_template/">05 – CRUD Template</a> · <a href="../06_pipeline_scaffold/">06 – Pipeline Scaffold</a> · <a href="../12_genericity_matrix/">12 – Genericity Matrix</a></li>
<li><a href="../10_layering_rules/">10 – Layering Rules</a> · <a href="../21_crud_template/">21 – CRUD Template</a> · <a href="../22_auth_integration/">22 – Auth Integration</a> · <a href="../40_ui_admin/">40 – UI</a> · <a href="../50_pipeline_scaffold/">50 – Pipeline Scaffold</a> · <a href="../92_genericity_matrix/">92 – Genericity Matrix</a></li>
</ul>

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../02_layering_rules/">
<link rel="next" href="../04_spec_first_routing/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -288,32 +284,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Composition Root
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -324,71 +298,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-resource-registry" class="md-nav__link">
<span class="md-ellipsis">
The resource registry
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shape" class="md-nav__link">
<span class="md-ellipsis">
Shape
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#typed-accessors" class="md-nav__link">
<span class="md-ellipsis">
Typed accessors
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#rules" class="md-nav__link">
<span class="md-ellipsis">
Rules
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -400,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -422,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -444,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -466,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -488,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -510,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -532,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -554,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -576,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -598,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -620,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -642,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../01_build_recipe/">
<link rel="next" href="../03_composition_root/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -266,32 +262,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Layering Rules
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -302,80 +276,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#allowed-imports" class="md-nav__link">
<span class="md-ellipsis">
Allowed imports
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#forbidden-imports" class="md-nav__link">
<span class="md-ellipsis">
Forbidden imports
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#why" class="md-nav__link">
<span class="md-ellipsis">
Why
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-portadapter-contract" class="md-nav__link">
<span class="md-ellipsis">
The port/adapter contract
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#enforcement" class="md-nav__link">
<span class="md-ellipsis">
Enforcement
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -387,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -409,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -431,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -453,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -475,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -497,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -519,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -541,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -563,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -585,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -607,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -629,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -651,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../03_composition_root/">
<link rel="next" href="../05_crud_template/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -310,32 +306,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Spec-First Routing
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -346,98 +320,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-contract" class="md-nav__link">
<span class="md-ellipsis">
The contract
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#app-bootstrap" class="md-nav__link">
<span class="md-ellipsis">
App bootstrap
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#handler-registry" class="md-nav__link">
<span class="md-ellipsis">
Handler registry
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#handler-shape" class="md-nav__link">
<span class="md-ellipsis">
Handler shape
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#conventions" class="md-nav__link">
<span class="md-ellipsis">
Conventions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#authless-apps" class="md-nav__link">
<span class="md-ellipsis">
Authless apps
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#codegen" class="md-nav__link">
<span class="md-ellipsis">
Codegen
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -449,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -471,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -493,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -515,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -537,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -559,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -581,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -603,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -625,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -647,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -669,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../04_spec_first_routing/">
<link rel="next" href="../06_pipeline_scaffold/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -332,32 +328,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
CRUD Template
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -368,107 +342,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-slice" class="md-nav__link">
<span class="md-ellipsis">
The slice
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-id-rule-model-vs-document" class="md-nav__link">
<span class="md-ellipsis">
The id rule (model vs. document)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#modelspy" class="md-nav__link">
<span class="md-ellipsis">
models.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#portsdbpy" class="md-nav__link">
<span class="md-ellipsis">
ports/db.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nested-references" class="md-nav__link">
<span class="md-ellipsis">
Nested references
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#portsservicepy" class="md-nav__link">
<span class="md-ellipsis">
ports/service.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#naming-conventions" class="md-nav__link">
<span class="md-ellipsis">
Naming conventions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#optional-files" class="md-nav__link">
<span class="md-ellipsis">
Optional files
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -480,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -502,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -524,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -546,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -568,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -590,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -612,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -634,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -656,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -678,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../12_genericity_matrix/">
<link rel="next" href="../13_library_registry/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -335,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -357,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -379,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -401,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -423,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -445,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -467,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -489,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -511,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -530,32 +526,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Auth Integration
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -566,104 +540,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#read-the-contract" class="md-nav__link">
<span class="md-ellipsis">
Read the contract
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#wire-it-up-declare-dont-code" class="md-nav__link">
<span class="md-ellipsis">
Wire it up: declare, don't code
</span>
</a>
<nav class="md-nav" aria-label="Wire it up: declare, don&#39;t code">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#public-operations" class="md-nav__link">
<span class="md-ellipsis">
Public operations
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#environment" class="md-nav__link">
<span class="md-ellipsis">
Environment
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#path-1-jwtlib-client-no-generator" class="md-nav__link">
<span class="md-ellipsis">
Path 1: jwtlib client (no generator)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#golden-rules" class="md-nav__link">
<span class="md-ellipsis">
Golden rules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes" class="md-nav__link">
<span class="md-ellipsis">
Notes
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -675,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../08_human_in_loop/">
<link rel="next" href="../10_drone_pipelines/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -335,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -357,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -379,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -401,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -420,32 +416,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Infra Adapters
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -456,98 +430,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#database-mongodb" class="md-nav__link">
<span class="md-ellipsis">
Database (MongoDB)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#http-response-cache" class="md-nav__link">
<span class="md-ellipsis">
HTTP response cache
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#event-progress-bus" class="md-nav__link">
<span class="md-ellipsis">
Event / progress bus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#external-clients-ingestion" class="md-nav__link">
<span class="md-ellipsis">
External clients (ingestion)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#llm-clients" class="md-nav__link">
<span class="md-ellipsis">
LLM clients
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#key-value-store" class="md-nav__link">
<span class="md-ellipsis">
Key-value store
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#rule" class="md-nav__link">
<span class="md-ellipsis">
Rule
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -559,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -581,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -603,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -625,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -647,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -669,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -260,7 +260,7 @@
<li class="md-nav__item">
<a href="/02_layering_rules/" class="md-nav__link">
<a href="/02_layering_rules.md" class="md-nav__link">
@@ -282,7 +282,7 @@
<li class="md-nav__item">
<a href="/03_composition_root/" class="md-nav__link">
<a href="/03_composition_root.md" class="md-nav__link">
@@ -304,7 +304,7 @@
<li class="md-nav__item">
<a href="/04_spec_first_routing/" class="md-nav__link">
<a href="/04_spec_first_routing.md" class="md-nav__link">
@@ -326,7 +326,7 @@
<li class="md-nav__item">
<a href="/05_crud_template/" class="md-nav__link">
<a href="/05_crud_template.md" class="md-nav__link">
@@ -348,7 +348,7 @@
<li class="md-nav__item">
<a href="/06_pipeline_scaffold/" class="md-nav__link">
<a href="/06_pipeline_scaffold.md" class="md-nav__link">
@@ -370,7 +370,7 @@
<li class="md-nav__item">
<a href="/07_worker_and_progress/" class="md-nav__link">
<a href="/07_worker_and_progress.md" class="md-nav__link">
@@ -392,7 +392,7 @@
<li class="md-nav__item">
<a href="/08_human_in_loop/" class="md-nav__link">
<a href="/08_human_in_loop.md" class="md-nav__link">
@@ -414,7 +414,7 @@
<li class="md-nav__item">
<a href="/09_infra_adaptors/" class="md-nav__link">
<a href="/09_infra_adaptors.md" class="md-nav__link">
@@ -436,7 +436,7 @@
<li class="md-nav__item">
<a href="/10_drone_pipelines/" class="md-nav__link">
<a href="/10_drone_pipelines.md" class="md-nav__link">
@@ -458,7 +458,7 @@
<li class="md-nav__item">
<a href="/11_versioning_and_changelog/" class="md-nav__link">
<a href="/11_versioning_and_changelog.md" class="md-nav__link">
@@ -480,7 +480,7 @@
<li class="md-nav__item">
<a href="/15_repository_inventory/" class="md-nav__link">
<a href="/15_repository_inventory.md" class="md-nav__link">
@@ -502,7 +502,7 @@
<li class="md-nav__item">
<a href="/12_genericity_matrix/" class="md-nav__link">
<a href="/12_genericity_matrix.md" class="md-nav__link">
@@ -524,7 +524,7 @@
<li class="md-nav__item">
<a href="/14_auth_integration/" class="md-nav__link">
<a href="/14_auth_integration.md" class="md-nav__link">
@@ -546,7 +546,7 @@
<li class="md-nav__item">
<a href="/13_library_registry/" class="md-nav__link">
<a href="/13_library_registry.md" class="md-nav__link">

View File

@@ -0,0 +1,804 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="The rules and library registry of the standardized application blueprint.">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.23">
<title>UI: Auto-Rendered Admin & Custom Pages - Aetos Standards — Reference</title>
<link rel="stylesheet" href="../assets/stylesheets/main.84d31ad4.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Inter";--md-code-font:"JetBrains Mono"}</style>
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="cyan">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#ui-auto-rendered-admin-custom-pages" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="Aetos Standards — Reference" class="md-header__button md-logo" aria-label="Aetos Standards — Reference" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Aetos Standards — Reference
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
UI: Auto-Rendered Admin &amp; Custom Pages
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="deep-purple" data-md-color-accent="cyan" aria-hidden="true" type="radio" name="__palette" id="__palette_0">
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<a href="javascript:void(0)" class="md-search__icon md-icon" title="Share" aria-label="Share" data-clipboard data-clipboard-text="" data-md-component="search-share" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.15c-.05.21-.08.43-.08.66 0 1.61 1.31 2.91 2.92 2.91s2.92-1.3 2.92-2.91A2.92 2.92 0 0 0 18 16.08"/></svg>
</a>
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="Aetos Standards — Reference" class="md-nav__button md-logo" aria-label="Aetos Standards — Reference" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Aetos Standards — Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../01_build_recipe/" class="md-nav__link">
<span class="md-ellipsis">
Build Recipe
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../02_layering_rules.md" class="md-nav__link">
<span class="md-ellipsis">
Layering Rules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../03_composition_root.md" class="md-nav__link">
<span class="md-ellipsis">
Composition Root
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../04_spec_first_routing.md" class="md-nav__link">
<span class="md-ellipsis">
Spec-First Routing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../05_crud_template.md" class="md-nav__link">
<span class="md-ellipsis">
CRUD Template
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
<span class="md-ellipsis">
Pipeline Scaffold
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../07_worker_and_progress.md" class="md-nav__link">
<span class="md-ellipsis">
Worker & Progress
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../08_human_in_loop.md" class="md-nav__link">
<span class="md-ellipsis">
Human-in-the-Loop
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../09_infra_adaptors.md" class="md-nav__link">
<span class="md-ellipsis">
Infra Adapters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../10_drone_pipelines.md" class="md-nav__link">
<span class="md-ellipsis">
Drone Pipelines
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
<span class="md-ellipsis">
Versioning & Changelog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../15_repository_inventory.md" class="md-nav__link">
<span class="md-ellipsis">
Repository Inventory
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../12_genericity_matrix.md" class="md-nav__link">
<span class="md-ellipsis">
Genericity Matrix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../14_auth_integration.md" class="md-nav__link">
<span class="md-ellipsis">
Auth Integration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../13_library_registry.md" class="md-nav__link">
<span class="md-ellipsis">
Library Registry
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#scaffold" class="md-nav__link">
<span class="md-ellipsis">
Scaffold
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#x-extensions-how-the-spec-steers-the-ui" class="md-nav__link">
<span class="md-ellipsis">
x- extensions: how the spec steers the UI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#golden-rules" class="md-nav__link">
<span class="md-ellipsis">
Golden rules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes" class="md-nav__link">
<span class="md-ellipsis">
Notes
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="ui-auto-rendered-admin-custom-pages">UI: Auto-Rendered Admin &amp; Custom Pages</h1>
<h2 id="summary">Summary</h2>
<p>The UI axis of an Aetos app is a <strong>published React client</strong>, not code written
per application. Two npm packages carry the whole surface:</p>
<table>
<thead>
<tr>
<th>Package</th>
<th>Role</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@aetoskia/react-openapi</code></td>
<td>Renders a complete admin panel (CRUD tables, forms, filters, sorting, pagination, uploads) <strong>from the app's <code>openapi.yaml</code></strong> — zero UI code.</td>
</tr>
<tr>
<td><code>@aetoskia/react-auth</code></td>
<td>Auth contexts and pages (login/register/me) wired to the auth-server, plus the axios client with token handling.</td>
</tr>
</tbody>
</table>
<p>Both publish to the private registry <code>https://npm.aetoskia.com</code>. The server
spec is the single source of truth: the same <code>openapi.yaml</code> that drives
<code>openapi-first</code> routing drives the admin UI, through <strong>x- extension fields</strong>
(see below).</p>
<hr />
<h2 id="scaffold">Scaffold</h2>
<div class="language-bash highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-0-1">1</a></span>
<span class="normal"><a href="#__codelineno-0-2">2</a></span>
<span class="normal"><a href="#__codelineno-0-3">3</a></span>
<span class="normal"><a href="#__codelineno-0-4">4</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1"></a>cp<span class="w"> </span>-r<span class="w"> </span>&lt;docs&gt;/standards/src/templates/client<span class="w"> </span>apps/&lt;your-app&gt;-client
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2"></a><span class="nb">cd</span><span class="w"> </span>apps/&lt;your-app&gt;-client
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3"></a>npm<span class="w"> </span>install<span class="w"> </span><span class="c1"># deps come from npm.aetoskia.com via .npmrc</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4"></a>npm<span class="w"> </span>run<span class="w"> </span>dev
</span></code></pre></div></td></tr></table></div>
<p>The client template is a Vite + MUI app with:</p>
<ul>
<li><code>src/openapi-config.ts</code> — points the renderer at the app's spec and the
auth-server's spec;</li>
<li><code>.env.example</code> — <code>VITE_API_BASE_URL</code> (app API) and <code>VITE_AUTH_BASE_URL</code>
(auth-server);</li>
<li>a <code>Home</code> page that auto-lists every resource the spec declares, and a
<code>Header</code>/<code>Footer</code>/theme scaffold.</li>
</ul>
<p>Custom pages are ordinary React routes layered on top; the auto-rendered admin
is available per resource at <code>#/resource/&lt;name&gt;</code>.</p>
<hr />
<h2 id="x-extensions-how-the-spec-steers-the-ui">x- extensions: how the spec steers the UI</h2>
<p>The admin renderer reads a catalog of OpenAPI extension fields (<code>x-resource</code>,
<code>x-list-columns</code>, <code>x-display-format</code>, <code>x-label</code>, <code>x-order</code>, <code>x-hidden</code>,
<code>x-sortable</code>, <code>x-filterable</code>, <code>x-autocomplete</code>, <code>x-fk</code>, <code>x-ui-type</code>,
<code>x-upload</code>, <code>x-sse</code>, <code>x-profile</code>, and the auth wiring <code>x-server-url</code> /
<code>x-login-path</code> / <code>x-me-path</code> / …) declared on schemas and properties.</p>
<p><strong>The catalog is canonical in the react-openapi source, not in this doc.</strong>
Read it from the MCP bundle:</p>
<div class="language-text highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"><a href="#__codelineno-1-1">1</a></span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1"></a>docs://modules/react-openapi # module: specExtensions — the full catalog
</span></code></pre></div></td></tr></table></div>
<p>The app's own spec carries the per-resource values; the catalog explains what
each field does. The template's <code>openapi.yaml</code> shows the convention on the
example <code>Item</code> and <code>Job</code> schemas.</p>
<hr />
<h2 id="golden-rules">Golden rules</h2>
<ol>
<li><strong>The spec owns the UI.</strong> Add a resource or rename a column in
<code>openapi.yaml</code>; the admin follows. Never fork the renderer per app.</li>
<li><strong>Custom pages for workflows, auto-render for CRUD.</strong> Anything that is
"list / create / edit / delete an entity" is a spec concern; anything that
is a bespoke workflow is a React page.</li>
<li><strong>Auth is consumed, never re-implemented.</strong> <code>@aetoskia/react-auth</code> holds
tokens and calls the auth-server endpoints declared by the x- wiring; pages
read the context.</li>
<li><strong>Publish, don't vendor.</strong> UI shared across apps belongs in
<code>@aetoskia/react-openapi</code> or <code>@aetoskia/react-auth</code> (SemVer, tag-triggered
npm release), not copy-pasted into app trees.</li>
</ol>
<hr />
<h2 id="notes">Notes</h2>
<ul>
<li>The server template ships authless by default (see
<a href="../22_auth_integration/">22 – Auth Integration</a>); the client template pairs
with it and degrades to "no login" until a security scheme is declared.</li>
<li><code>react/vet</code> is the full-stack reference implementation: spec with x-
extensions, server, and the consuming client in one tree.</li>
</ul>
</article>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.sections", "navigation.expand", "navigation.top", "navigation.instant", "navigation.tracking", "navigation.indexes", "content.code.copy", "content.code.annotate", "content.tabs.link", "content.action.edit", "search.highlight", "search.share", "search.suggest"], "search": "../assets/javascripts/workers/search.973d3a69.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.f55a23d4.min.js"></script>
</body>
</html>

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../05_crud_template/">
<link rel="next" href="../07_worker_and_progress/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -335,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -354,32 +350,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Pipeline Scaffold
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -390,98 +364,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#when-to-use-a-pipeline" class="md-nav__link">
<span class="md-ellipsis">
When to use a pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#structure-of-a-family" class="md-nav__link">
<span class="md-ellipsis">
Structure of a family
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#shared-scaffolding" class="md-nav__link">
<span class="md-ellipsis">
Shared scaffolding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-loader" class="md-nav__link">
<span class="md-ellipsis">
The loader
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-registry" class="md-nav__link">
<span class="md-ellipsis">
The registry
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#driving-a-pipeline" class="md-nav__link">
<span class="md-ellipsis">
Driving a pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#testing" class="md-nav__link">
<span class="md-ellipsis">
Testing
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -493,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -515,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -537,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -559,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -581,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -603,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -625,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -647,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -669,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../06_pipeline_scaffold/">
<link rel="next" href="../08_human_in_loop/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -110,7 +106,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Worker & Progress
Worker &amp; Progress
</span>
</div>
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -335,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -357,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -376,32 +372,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Worker & Progress
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -412,71 +386,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-status-machine" class="md-nav__link">
<span class="md-ellipsis">
The status machine
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-poll-loop" class="md-nav__link">
<span class="md-ellipsis">
The poll loop
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#progress-events" class="md-nav__link">
<span class="md-ellipsis">
Progress events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#streaming-endpoint" class="md-nav__link">
<span class="md-ellipsis">
Streaming endpoint
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -488,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -510,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -532,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -554,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -576,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -598,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -620,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -642,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../07_worker_and_progress/">
<link rel="next" href="../09_infra_adaptors/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -335,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -357,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -379,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -398,32 +394,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Human-in-the-Loop
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -434,80 +408,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-mechanism" class="md-nav__link">
<span class="md-ellipsis">
The mechanism
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-question-document" class="md-nav__link">
<span class="md-ellipsis">
The question document
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#resume-map" class="md-nav__link">
<span class="md-ellipsis">
Resume map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#resolve-endpoint" class="md-nav__link">
<span class="md-ellipsis">
Resolve endpoint
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cli-parity" class="md-nav__link">
<span class="md-ellipsis">
CLI parity
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -519,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -541,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -563,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -585,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -607,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -629,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -651,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../09_infra_adaptors/">
<link rel="next" href="../11_versioning_and_changelog/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -335,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -357,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -379,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -401,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -423,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -442,32 +438,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Drone Pipelines
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -478,71 +452,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#type-a-pypi-package-python-libyaml" class="md-nav__link">
<span class="md-ellipsis">
Type A — PyPI package (python-lib.yaml)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#type-b-docker-deployment-service-dockeryaml" class="md-nav__link">
<span class="md-ellipsis">
Type B — Docker deployment (service-docker.yaml)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what-not-to-do" class="md-nav__link">
<span class="md-ellipsis">
What not to do
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#related" class="md-nav__link">
<span class="md-ellipsis">
Related
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -554,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -576,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -598,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -620,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -642,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">
@@ -788,7 +697,7 @@ with <code>from_secret</code> — never commit credentials.</p>
<li><code>check-version</code> — <strong>guard</strong>: fail unless <code>$DRONE_TAG</code> equals the version in
<code>pyproject.toml</code>; then read <code>name</code> / <code>version</code> and query
<code>$PIP_REPO_URL/simple/&lt;package&gt;/</code>; if that version already exists, exit
<code>78</code> and skip the whole build (see <a href="../11_versioning_and_changelog/">11 – Versioning &amp; Changelog</a>).</li>
<code>78</code> and skip the whole build (see <a href="../91_versioning_and_changelog/">91 – Versioning &amp; Changelog</a>).</li>
<li><code>quality-gate</code> — install the package with its <code>[dev]</code> extras from the
private index, then <code>black --check</code>, <code>ruff check</code>, <code>mypy</code>, <code>pydoclint</code>,
<code>pytest</code>.</li>
@@ -815,7 +724,7 @@ triggered on <code>tag</code>:</p>
<li><code>fetch-tags</code> — resolve the latest tag into <code>LATEST_TAG.txt</code>; fail if there
are no tags.</li>
<li><code>check-version</code> — <strong>guard</strong>: fail unless <code>$DRONE_TAG</code> equals the repo-root
<code>VERSION</code> file (see <a href="../11_versioning_and_changelog/">11 – Versioning &amp; Changelog</a>).</li>
<code>VERSION</code> file (see <a href="../91_versioning_and_changelog/">91 – Versioning &amp; Changelog</a>).</li>
<li><code>check-remote-image</code> — if <code>aetos/&lt;app&gt;:&lt;tag&gt;</code> already exists locally, exit
<code>78</code> and skip the build.</li>
<li><code>quality-gate</code> — install from <code>requirements.txt</code> and run
@@ -871,14 +780,14 @@ triggered on <code>tag</code>:</p>
index and the running container against duplicate publishes.</li>
<li>Do not drop the tag↔version guard. A package needs its <code>pyproject.toml</code>
version to equal the tag; a service needs a root <code>VERSION</code> file that equals
the tag. See <a href="../11_versioning_and_changelog/">11 – Versioning &amp; Changelog</a>.</li>
the tag. See <a href="../91_versioning_and_changelog/">91 – Versioning &amp; Changelog</a>.</li>
<li>Do not rename the pipelines; tooling and runbooks key off
<code>build-and-publish-pypi</code> and <code>build-and-deploy-service</code>.</li>
</ul>
<hr />
<h2 id="related">Related</h2>
<ul>
<li><a href="../01_build_recipe/">01 – Build Recipe</a> · <a href="../09_infra_adaptors/">09 – Infra Adapters</a> · <a href="../11_versioning_and_changelog/">11 – Versioning &amp; Changelog</a> · <a href="../13_library_registry/">13 – Library Registry</a></li>
<li><a href="../01_build_recipe/">01 – Build Recipe</a> · <a href="../30_infra_adaptors/">30 – Infra Adapters</a> · <a href="../91_versioning_and_changelog/">91 – Versioning &amp; Changelog</a> · <a href="../93_library_registry/">93 – Library Registry</a></li>
</ul>

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../10_drone_pipelines/">
<link rel="next" href="../15_repository_inventory/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -110,7 +106,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Versioning & Changelog
Versioning &amp; Changelog
</span>
</div>
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -335,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -357,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -379,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -401,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -423,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -445,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -464,32 +460,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Versioning & Changelog
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -500,134 +474,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-version-contract" class="md-nav__link">
<span class="md-ellipsis">
The version contract
</span>
</a>
<nav class="md-nav" aria-label="The version contract">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#pre-10-0yz" class="md-nav__link">
<span class="md-ellipsis">
Pre-1.0 (0.y.z)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#the-changelog" class="md-nav__link">
<span class="md-ellipsis">
The changelog
</span>
</a>
<nav class="md-nav" aria-label="The changelog">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#reconcile-before-releasing" class="md-nav__link">
<span class="md-ellipsis">
Reconcile before releasing
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#tagging-strategy-mr-based" class="md-nav__link">
<span class="md-ellipsis">
Tagging strategy (MR-based)
</span>
</a>
<nav class="md-nav" aria-label="Tagging strategy (MR-based)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#agent-assisted-tagging" class="md-nav__link">
<span class="md-ellipsis">
Agent-assisted tagging
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#release-checklist" class="md-nav__link">
<span class="md-ellipsis">
Release checklist
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#why-the-guard-matters" class="md-nav__link">
<span class="md-ellipsis">
Why the guard matters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#related" class="md-nav__link">
<span class="md-ellipsis">
Related
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -639,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -661,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -683,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -705,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">
@@ -878,7 +724,7 @@ releases in a <a href="https://keepachangelog.com/en/1.1.0/">Keep a Changelog</a
The <strong>version file is the source of truth</strong>, the <strong>git tag must equal it</strong>, and
a Drone guard enforces that equality before anything is published. Releases are
cut manually; a tag is what triggers the pipeline.</p>
<p>This page pairs with <a href="../10_drone_pipelines/">10 – Drone Pipelines</a>: the version
<p>This page pairs with <a href="../90_drone_pipelines/">90 – Drone Pipelines</a>: the version
and tag contract is exactly what those two CI shapes consume.</p>
<hr />
<h2 id="the-version-contract">The version contract</h2>
@@ -1047,7 +893,7 @@ Drone guard turns that silent no-op into a hard failure.</p>
<hr />
<h2 id="related">Related</h2>
<ul>
<li><a href="../10_drone_pipelines/">10 – Drone Pipelines</a> · <a href="../15_repository_inventory/">15 – Repository Inventory</a> · <a href="../01_build_recipe/">01 – Build Recipe</a> · <a href="../13_library_registry/">13 – Library Registry</a></li>
<li><a href="../90_drone_pipelines/">90 – Drone Pipelines</a> · <a href="../94_repository_inventory/">94 – Repository Inventory</a> · <a href="../01_build_recipe/">01 – Build Recipe</a> · <a href="../93_library_registry/">93 – Library Registry</a></li>
</ul>

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../15_repository_inventory/">
<link rel="next" href="../14_auth_integration/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -335,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -357,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -379,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -401,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -423,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -445,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -467,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -489,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -508,32 +504,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Genericity Matrix
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -544,80 +518,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tier-a-library-backed-use-never-reimplement" class="md-nav__link">
<span class="md-ellipsis">
Tier A — Library-backed (use; never reimplement)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tier-b-template-provided-copy-from-templatesapp-then-adapt" class="md-nav__link">
<span class="md-ellipsis">
Tier B — Template-provided (copy from templates/app, then adapt)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tier-b-patterns-port-from-the-reference-app" class="md-nav__link">
<span class="md-ellipsis">
Tier B (patterns) — port from the reference app
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#tier-c-app-specific-must-be-authored" class="md-nav__link">
<span class="md-ellipsis">
Tier C — App-specific (must be authored)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#the-two-axes" class="md-nav__link">
<span class="md-ellipsis">
The two axes
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -629,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -651,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">

View File

@@ -11,8 +11,6 @@
<link rel="prev" href="../14_auth_integration/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -267,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -289,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -311,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -333,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -355,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -377,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -399,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -421,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -443,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -465,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -487,7 +485,7 @@
<li class="md-nav__item">
<a href="../15_repository_inventory/" class="md-nav__link">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -509,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -531,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -550,32 +548,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Library Registry
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../13_library_registry.md" class="md-nav__link">
@@ -586,71 +562,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#catalog" class="md-nav__link">
<span class="md-ellipsis">
Catalog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#how-to-choose" class="md-nav__link">
<span class="md-ellipsis">
How to choose
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#discovery" class="md-nav__link">
<span class="md-ellipsis">
Discovery
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#notes" class="md-nav__link">
<span class="md-ellipsis">
Notes
</span>
</a>
</li>
</ul>
</nav>
</li>

View File

@@ -11,10 +11,6 @@
<link rel="prev" href="../11_versioning_and_changelog/">
<link rel="next" href="../12_genericity_matrix/">
<link rel="icon" href="../assets/images/favicon.png">
@@ -269,7 +265,7 @@
<li class="md-nav__item">
<a href="../02_layering_rules/" class="md-nav__link">
<a href="../02_layering_rules.md" class="md-nav__link">
@@ -291,7 +287,7 @@
<li class="md-nav__item">
<a href="../03_composition_root/" class="md-nav__link">
<a href="../03_composition_root.md" class="md-nav__link">
@@ -313,7 +309,7 @@
<li class="md-nav__item">
<a href="../04_spec_first_routing/" class="md-nav__link">
<a href="../04_spec_first_routing.md" class="md-nav__link">
@@ -335,7 +331,7 @@
<li class="md-nav__item">
<a href="../05_crud_template/" class="md-nav__link">
<a href="../05_crud_template.md" class="md-nav__link">
@@ -357,7 +353,7 @@
<li class="md-nav__item">
<a href="../06_pipeline_scaffold/" class="md-nav__link">
<a href="../06_pipeline_scaffold.md" class="md-nav__link">
@@ -379,7 +375,7 @@
<li class="md-nav__item">
<a href="../07_worker_and_progress/" class="md-nav__link">
<a href="../07_worker_and_progress.md" class="md-nav__link">
@@ -401,7 +397,7 @@
<li class="md-nav__item">
<a href="../08_human_in_loop/" class="md-nav__link">
<a href="../08_human_in_loop.md" class="md-nav__link">
@@ -423,7 +419,7 @@
<li class="md-nav__item">
<a href="../09_infra_adaptors/" class="md-nav__link">
<a href="../09_infra_adaptors.md" class="md-nav__link">
@@ -445,7 +441,7 @@
<li class="md-nav__item">
<a href="../10_drone_pipelines/" class="md-nav__link">
<a href="../10_drone_pipelines.md" class="md-nav__link">
@@ -467,7 +463,7 @@
<li class="md-nav__item">
<a href="../11_versioning_and_changelog/" class="md-nav__link">
<a href="../11_versioning_and_changelog.md" class="md-nav__link">
@@ -486,32 +482,10 @@
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Repository Inventory
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<li class="md-nav__item">
<a href="../15_repository_inventory.md" class="md-nav__link">
@@ -522,80 +496,6 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#packages-type-a" class="md-nav__link">
<span class="md-ellipsis">
Packages (Type A)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#services-type-b" class="md-nav__link">
<span class="md-ellipsis">
Services (Type B)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#required-files-per-repo" class="md-nav__link">
<span class="md-ellipsis">
Required files per repo
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#reading-this-at-runtime" class="md-nav__link">
<span class="md-ellipsis">
Reading this at runtime
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#related" class="md-nav__link">
<span class="md-ellipsis">
Related
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -607,7 +507,7 @@
<li class="md-nav__item">
<a href="../12_genericity_matrix/" class="md-nav__link">
<a href="../12_genericity_matrix.md" class="md-nav__link">
@@ -629,7 +529,7 @@
<li class="md-nav__item">
<a href="../14_auth_integration/" class="md-nav__link">
<a href="../14_auth_integration.md" class="md-nav__link">
@@ -651,7 +551,7 @@
<li class="md-nav__item">
<a href="../13_library_registry/" class="md-nav__link">
<a href="../13_library_registry.md" class="md-nav__link">
@@ -767,8 +667,8 @@
<p>The canonical list of Aetos repositories covered by the CI and versioning
standards, with the artifact each one produces, its version source, and its
Drone shape. Every entry maps to the contract in
<a href="../11_versioning_and_changelog/">11 – Versioning &amp; Changelog</a> and the two CI
files in <a href="../10_drone_pipelines/">10 – Drone Pipelines</a>.</p>
<a href="../91_versioning_and_changelog/">91 – Versioning &amp; Changelog</a> and the two CI
files in <a href="../90_drone_pipelines/">90 – Drone Pipelines</a>.</p>
<p>The same data is published machine-readably as the <code>registry://repos</code> MCP
resource (and the <code>list_repos</code> tool), sourced from <code>standards/src/repos.json</code>.
Paths are relative to the <code>aetos/</code> workspace root.</p>
@@ -898,7 +798,7 @@ merged, and the tag is created on the merged commit.</p>
<hr />
<h2 id="related">Related</h2>
<ul>
<li><a href="../10_drone_pipelines/">10 – Drone Pipelines</a> · <a href="../11_versioning_and_changelog/">11 – Versioning &amp; Changelog</a> · <a href="../13_library_registry/">13 – Library Registry</a></li>
<li><a href="../90_drone_pipelines/">90 – Drone Pipelines</a> · <a href="../91_versioning_and_changelog/">91 – Versioning &amp; Changelog</a> · <a href="../93_library_registry/">93 – Library Registry</a></li>
</ul>

View File

@@ -232,6 +232,19 @@
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Home
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="." class="md-nav__link md-nav__link--active">
@@ -244,6 +257,88 @@
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#anatomy" class="md-nav__link">
<span class="md-ellipsis">
Anatomy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pillar-1-domains" class="md-nav__link">
<span class="md-ellipsis">
Pillar 1 — Domains
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pillar-2-openapi-spec-the-contract" class="md-nav__link">
<span class="md-ellipsis">
Pillar 2 — OpenAPI Spec (the contract)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pillar-3-interfaces-infra" class="md-nav__link">
<span class="md-ellipsis">
Pillar 3 — Interfaces &amp; Infra
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pillar-4-ui" class="md-nav__link">
<span class="md-ellipsis">
Pillar 4 — UI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pipelines-optional-layer" class="md-nav__link">
<span class="md-ellipsis">
Pipelines (optional layer)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#delivery-meta" class="md-nav__link">
<span class="md-ellipsis">
Delivery &amp; Meta
</span>
</a>
</li>
</ul>
</nav>
</li>
@@ -277,7 +372,7 @@
<li class="md-nav__item">
<a href="02_layering_rules/" class="md-nav__link">
<a href="02_layering_rules.md" class="md-nav__link">
@@ -299,7 +394,7 @@
<li class="md-nav__item">
<a href="03_composition_root/" class="md-nav__link">
<a href="03_composition_root.md" class="md-nav__link">
@@ -321,7 +416,7 @@
<li class="md-nav__item">
<a href="04_spec_first_routing/" class="md-nav__link">
<a href="04_spec_first_routing.md" class="md-nav__link">
@@ -343,7 +438,7 @@
<li class="md-nav__item">
<a href="05_crud_template/" class="md-nav__link">
<a href="05_crud_template.md" class="md-nav__link">
@@ -365,7 +460,7 @@
<li class="md-nav__item">
<a href="06_pipeline_scaffold/" class="md-nav__link">
<a href="06_pipeline_scaffold.md" class="md-nav__link">
@@ -387,7 +482,7 @@
<li class="md-nav__item">
<a href="07_worker_and_progress/" class="md-nav__link">
<a href="07_worker_and_progress.md" class="md-nav__link">
@@ -409,7 +504,7 @@
<li class="md-nav__item">
<a href="08_human_in_loop/" class="md-nav__link">
<a href="08_human_in_loop.md" class="md-nav__link">
@@ -431,7 +526,7 @@
<li class="md-nav__item">
<a href="09_infra_adaptors/" class="md-nav__link">
<a href="09_infra_adaptors.md" class="md-nav__link">
@@ -453,7 +548,7 @@
<li class="md-nav__item">
<a href="10_drone_pipelines/" class="md-nav__link">
<a href="10_drone_pipelines.md" class="md-nav__link">
@@ -475,7 +570,7 @@
<li class="md-nav__item">
<a href="11_versioning_and_changelog/" class="md-nav__link">
<a href="11_versioning_and_changelog.md" class="md-nav__link">
@@ -497,7 +592,7 @@
<li class="md-nav__item">
<a href="15_repository_inventory/" class="md-nav__link">
<a href="15_repository_inventory.md" class="md-nav__link">
@@ -519,7 +614,7 @@
<li class="md-nav__item">
<a href="12_genericity_matrix/" class="md-nav__link">
<a href="12_genericity_matrix.md" class="md-nav__link">
@@ -541,7 +636,7 @@
<li class="md-nav__item">
<a href="14_auth_integration/" class="md-nav__link">
<a href="14_auth_integration.md" class="md-nav__link">
@@ -563,7 +658,7 @@
<li class="md-nav__item">
<a href="13_library_registry/" class="md-nav__link">
<a href="13_library_registry.md" class="md-nav__link">
@@ -598,6 +693,77 @@
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#anatomy" class="md-nav__link">
<span class="md-ellipsis">
Anatomy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pillar-1-domains" class="md-nav__link">
<span class="md-ellipsis">
Pillar 1 — Domains
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pillar-2-openapi-spec-the-contract" class="md-nav__link">
<span class="md-ellipsis">
Pillar 2 — OpenAPI Spec (the contract)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pillar-3-interfaces-infra" class="md-nav__link">
<span class="md-ellipsis">
Pillar 3 — Interfaces &amp; Infra
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pillar-4-ui" class="md-nav__link">
<span class="md-ellipsis">
Pillar 4 — UI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#pipelines-optional-layer" class="md-nav__link">
<span class="md-ellipsis">
Pipelines (optional layer)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#delivery-meta" class="md-nav__link">
<span class="md-ellipsis">
Delivery &amp; Meta
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
@@ -615,26 +781,54 @@
<h1 id="standards-reference">Standards Reference</h1>
<p>The reference half of the Standards description: the enforceable rules,
patterns, and the internal library catalog that agents consult while coding.</p>
<p>The reference is organized as an <strong>anatomy</strong> — one entry checklist and four
pillars describing what an application is made of, plus delivery/meta pages
and an optional pipelines layer.</p>
<h2 id="anatomy">Anatomy</h2>
<ul>
<li><strong>Build Recipe</strong> — the ordered, agentic checklist for a new app; the entry
point that walks the whole anatomy.</li>
</ul>
<h2 id="pillar-1-domains">Pillar 1 — Domains</h2>
<ul>
<li><strong>Build Recipe</strong> — the ordered, agentic checklist for a new app.</li>
<li><strong>Layering Rules</strong> — the strict request → domain → repository layering and
the rules that enforce it.</li>
</ul>
<h2 id="pillar-2-openapi-spec-the-contract">Pillar 2 — OpenAPI Spec (the contract)</h2>
<ul>
<li><strong>Composition Root</strong> — a single composition point wiring the whole app.</li>
<li><strong>Spec-First Routing</strong> — the OpenAPI contract as the routing source of truth.</li>
<li><strong>CRUD Template</strong> — the standardized generic resource endpoint scaffold.</li>
<li><strong>Auth Integration</strong> — consuming the shared auth-server service (spec-driven,
no auth code).</li>
</ul>
<h2 id="pillar-3-interfaces-infra">Pillar 3 — Interfaces &amp; Infra</h2>
<ul>
<li><strong>Infra Adapters</strong> — how infrastructure connects without leaking into domain.</li>
</ul>
<h2 id="pillar-4-ui">Pillar 4 — UI</h2>
<ul>
<li><strong>UI: Auto-Rendered Admin &amp; Custom Pages</strong> — the <code>@aetoskia/react-openapi</code>
admin rendered from the spec's x- extensions, and <code>@aetoskia/react-auth</code>
for auth pages; the client template scaffold.</li>
</ul>
<h2 id="pipelines-optional-layer">Pipelines (optional layer)</h2>
<ul>
<li><strong>Pipeline Scaffold</strong> — the deterministic pipeline skeleton for multi-stage
jobs.</li>
<li><strong>Worker &amp; Progress</strong> — queued work, progress reporting, and visibility.</li>
<li><strong>Human-in-the-Loop</strong> — guardrails and approvals inside automations.</li>
<li><strong>Infra Adapters</strong> — how infrastructure connects without leaking into domain.</li>
<li><strong>Drone Pipelines</strong> — the two CI shapes: a PyPI package or a Docker deployment.</li>
<li><strong>Versioning &amp; Changelog</strong> — SemVer, the tag↔version contract, and the release
changelog.</li>
</ul>
<h2 id="delivery-meta">Delivery &amp; Meta</h2>
<ul>
<li><strong>Drone Pipelines</strong> — the two CI shapes: a PyPI/npm package or a Docker
deployment.</li>
<li><strong>Versioning &amp; Changelog</strong> — SemVer, the tag↔version contract, and the
release changelog.</li>
<li><strong>Repository Inventory</strong> — every covered repo, its type, version source, and
Drone shape.</li>
<li><strong>Genericity Matrix</strong> — what is library-backed, template-provided, or authored.</li>
<li><strong>Auth Integration</strong> — consuming the shared auth-server service (spec-driven,
no auth code).</li>
<li><strong>Genericity Matrix</strong> — what is library-backed, template-provided, or
authored.</li>
<li><strong>Library Registry</strong> — the catalog of internal libraries behind all of it.</li>
</ul>
<p>Read the <strong>Wiki</strong> for the philosophy and rationale; these pages are the

File diff suppressed because one or more lines are too long