@laitszkin/apollo-toolkit 3.10.0 → 3.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/analyse-app-logs/scripts/__pycache__/filter_logs_by_time.cpython-312.pyc +0 -0
  3. package/analyse-app-logs/scripts/__pycache__/log_cli_utils.cpython-312.pyc +0 -0
  4. package/analyse-app-logs/scripts/__pycache__/search_logs.cpython-312.pyc +0 -0
  5. package/docs-to-voice/scripts/__pycache__/docs_to_voice.cpython-312.pyc +0 -0
  6. package/generate-spec/SKILL.md +17 -15
  7. package/generate-spec/agents/openai.yaml +1 -1
  8. package/generate-spec/references/TEMPLATE_SPEC.md +103 -84
  9. package/generate-spec/scripts/__pycache__/create-specscpython-312.pyc +0 -0
  10. package/init-project-html/SKILL.md +117 -125
  11. package/init-project-html/agents/openai.yaml +18 -9
  12. package/init-project-html/lib/atlas/assets/architecture.css +161 -0
  13. package/init-project-html/lib/atlas/assets/viewer.client.js +136 -0
  14. package/init-project-html/lib/atlas/cli.js +1023 -0
  15. package/init-project-html/lib/atlas/layout.js +330 -0
  16. package/init-project-html/lib/atlas/render.js +583 -0
  17. package/init-project-html/lib/atlas/schema.js +347 -0
  18. package/init-project-html/lib/atlas/state.js +402 -0
  19. package/init-project-html/references/TEMPLATE_SPEC.md +140 -83
  20. package/init-project-html/sample-demo/resources/project-architecture/assets/architecture.css +160 -1058
  21. package/init-project-html/sample-demo/resources/project-architecture/assets/viewer.client.js +136 -0
  22. package/init-project-html/sample-demo/resources/project-architecture/atlas/atlas.index.yaml +34 -0
  23. package/init-project-html/sample-demo/resources/project-architecture/atlas/features/get-invite-codes.yaml +172 -0
  24. package/init-project-html/sample-demo/resources/project-architecture/atlas/features/invite-code-registration.yaml +160 -0
  25. package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/index.html +67 -52
  26. package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/invite-code-generator.html +64 -163
  27. package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/invite-issuance-service.html +102 -196
  28. package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/postgresql.html +82 -163
  29. package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/public-api.html +88 -150
  30. package/init-project-html/sample-demo/resources/project-architecture/features/get-invite-codes/web-get-invite-ui.html +83 -138
  31. package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/index.html +61 -51
  32. package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/postgresql.html +84 -159
  33. package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/public-api.html +81 -143
  34. package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/registration-service.html +98 -188
  35. package/init-project-html/sample-demo/resources/project-architecture/features/invite-code-registration/web-register-ui.html +83 -138
  36. package/init-project-html/sample-demo/resources/project-architecture/index.html +256 -335
  37. package/init-project-html/scripts/architecture.js +65 -247
  38. package/katex/scripts/__pycache__/render_katex.cpython-312.pyc +0 -0
  39. package/open-github-issue/scripts/__pycache__/open_github_issue.cpython-312.pyc +0 -0
  40. package/package.json +6 -2
  41. package/read-github-issue/scripts/__pycache__/find_issues.cpython-312.pyc +0 -0
  42. package/read-github-issue/scripts/__pycache__/read_issue.cpython-312.pyc +0 -0
  43. package/resolve-review-comments/scripts/__pycache__/review_threads.cpython-312.pyc +0 -0
  44. package/spec-to-project-html/SKILL.md +74 -67
  45. package/spec-to-project-html/agents/openai.yaml +14 -8
  46. package/spec-to-project-html/references/TEMPLATE_SPEC.md +98 -83
  47. package/text-to-short-video/scripts/__pycache__/enforce_video_aspect_ratio.cpython-312.pyc +0 -0
@@ -1,140 +1,85 @@
1
1
  <!DOCTYPE html>
2
- <html lang="zh-Hant">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>子模組 · web-get-invite-ui — 獲取邀請碼</title>
7
- <link rel="preconnect" href="https://fonts.googleapis.com" />
8
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
- <link
10
- href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;600&family=Plus+Jakarta+Sans:wght@400;500;600&display=swap"
11
- rel="stylesheet"
12
- />
13
- <link rel="stylesheet" href="../../assets/architecture.css" />
14
- </head>
15
- <body>
16
- <main class="atlas-page atlas-page--feature">
17
- <nav class="breadcrumb" aria-label="階層導航">
18
- <a href="../../index.html">宏觀架構</a> · <a href="./index.html">獲取邀請碼</a> · <span>web-get-invite-ui</span>
19
- </nav>
20
-
21
- <header class="atlas-header">
22
- <p class="atlas-kicker">Submodule · web-get-invite-ui</p>
23
- <h1 class="atlas-title">web-get-invite-ui</h1>
24
- <p class="atlas-meta">自身職責:登入後顯示「我的邀請碼」、列表載入、生成按鈕。本頁只談自身函式 I/O 與內部資料流。</p>
25
- </header>
26
-
27
- <section class="sub-io">
28
- <h2>函式 I/O</h2>
29
- <table>
30
- <thead><tr><th>函式</th><th>簽名</th><th>副作用</th><th>用途</th></tr></thead>
31
- <tbody>
32
- <tr>
33
- <td><code>useInviteCodes()</code></td>
34
- <td class="sub-io__signature">
35
- <strong>in:</strong> —<br>
36
- <strong>out:</strong> <code>{list, isLoading, refresh}</code>
37
- </td>
38
- <td><span class="sub-io__side sub-io__side--io">network</span> GET 已發放碼</td>
39
- <td>查詢鍵/快取列表。</td>
40
- </tr>
41
- <tr>
42
- <td><code>createInviteCode</code></td>
43
- <td class="sub-io__signature">
44
- <strong>in:</strong> —<br>
45
- <strong>out:</strong> <code>Result&lt;NewCode, UiError&gt;</code>
46
- </td>
47
- <td><span class="sub-io__side sub-io__side--io">network</span> POST</td>
48
- <td>把伺服器產生的新碼樂觀 prepend 到列表。</td>
49
- </tr>
50
- <tr>
51
- <td><code>copyCodeToClipboard</code></td>
52
- <td class="sub-io__signature">
53
- <strong>in:</strong> <code>code: string</code><br>
54
- <strong>out:</strong> <code>void</code>
55
- </td>
56
- <td><span class="sub-io__side sub-io__side--io">browser</span> clipboard API</td>
57
- <td>使用者點復制。</td>
58
- </tr>
59
- <tr>
60
- <td><code>formatQuotaError</code></td>
61
- <td class="sub-io__signature">
62
- <strong>in:</strong> <code>RetryAfter | null</code><br>
63
- <strong>out:</strong> <code>UiMessage</code>
64
- </td>
65
- <td><span class="sub-io__side sub-io__side--pure">pure</span></td>
66
- <td>把 429 訊息翻成本地文字。</td>
67
- </tr>
68
- </tbody>
69
- </table>
70
- </section>
71
-
72
- <section class="sub-vars">
73
- <h2>變數與業務用途</h2>
74
- <p class="sub-vars__intro">本子模組以前端組件狀態為主;下表為決定使用者體驗的識別子。</p>
75
- <table>
76
- <thead><tr><th>變數</th><th>型別</th><th>作用域</th><th>業務用途</th></tr></thead>
77
- <tbody>
78
- <tr>
79
- <td class="sub-vars__name">list</td>
80
- <td class="sub-vars__type">InviteCode[]</td>
81
- <td><span class="sub-vars__scope sub-vars__scope--instance">instance</span></td>
82
- <td>使用者已發放的邀請碼清單;驅動畫面呈現與「複製」按鈕可用性;保留順序讓使用者能識別最近一次取得的碼。</td>
83
- </tr>
84
- <tr>
85
- <td class="sub-vars__name">isLoading</td>
86
- <td class="sub-vars__type">boolean</td>
87
- <td><span class="sub-vars__scope sub-vars__scope--instance">instance</span></td>
88
- <td>生成 API 進行中旗標;防止連按重複生成造成額度被無意義消耗。</td>
89
- </tr>
90
- <tr>
91
- <td class="sub-vars__name">retryAfter</td>
92
- <td class="sub-vars__type">number seconds | null</td>
93
- <td><span class="sub-vars__scope sub-vars__scope--instance">instance</span></td>
94
- <td>後端 429 帶回的下次可生成時間;按鈕禁用倒數的依據,業務上提示使用者「節流而非系統故障」。</td>
95
- </tr>
96
- <tr>
97
- <td class="sub-vars__name">Result</td>
98
- <td class="sub-vars__type">{ok: NewCode} | {err: UiError}</td>
99
- <td><span class="sub-vars__scope sub-vars__scope--call">call</span></td>
100
- <td>一次「生成」呼叫結果;驅動是否要把新碼樂觀插入 <code>list</code>,或顯示錯誤 banner。</td>
101
- </tr>
102
- <tr>
103
- <td class="sub-vars__name">UiMessage</td>
104
- <td class="sub-vars__type">{lang_tag, text}</td>
105
- <td><span class="sub-vars__scope sub-vars__scope--call">call</span></td>
106
- <td>額度/網路錯誤的本地化呈現;使用者透過此訊息知道是自己的額度問題還是系統暫時不可用。</td>
107
- </tr>
108
- </tbody>
109
- </table>
110
- </section>
111
-
112
- <section class="sub-dataflow">
113
- <h2>內部資料流</h2>
114
- <ol>
115
- <li>頁面掛載 → <code>useInviteCodes</code> 取得 <code>list</code> 顯示。</li>
116
- <li>使用者點生成 → <code>createInviteCode</code>:UI <code>idle → loading</code>。</li>
117
- <li><code>Result.ok</code> → 把 <code>NewCode</code> prepend 到 <code>list</code>(保持其餘元素穩定)。</li>
118
- <li><code>Result.err</code> 為 quota → <code>formatQuotaError</code> 顯示 <code>UiMessage</code>,<code>list</code> 不變。</li>
119
- <li>使用者選擇 <code>copyCodeToClipboard(code)</code>,不影響資料模型。</li>
120
- </ol>
121
- </section>
122
-
123
- <section class="sub-errors">
124
- <h2>本子模組可暴露的錯誤</h2>
125
- <table>
126
- <thead><tr><th>來源</th><th>UI 行為</th></tr></thead>
127
- <tbody>
128
- <tr><td>未登入(401)</td><td>路由守衛攔截 → 導向登入;本子模組不顯示業務錯誤。</td></tr>
129
- <tr><td>quota(429)</td><td><code>formatQuotaError</code> banner;按鈕短暫禁用至 <code>retryAfter</code>。</td></tr>
130
- <tr><td>網路錯誤</td><td>泛用提示;可重試。</td></tr>
131
- </tbody>
132
- </table>
133
- </section>
134
-
135
- <footer class="atlas-meta" style="margin-top: 2rem">
136
- <p><a href="../../index.html">← 宏觀架構</a> · <a href="./index.html">← 功能總覽</a></p>
137
- </footer>
138
- </main>
139
- </body>
2
+ <html lang="en" data-atlas-page="submodule">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Get invite codes · web-get-invite-ui</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <link rel="stylesheet" href="../../assets/architecture.css">
8
+ </head>
9
+ <body>
10
+ <header class="submodule-header">
11
+ <nav class="submodule-breadcrumb"><a href="../../index.html">← Atlas</a> · <a href="index.html">← Get invite codes</a></nav>
12
+ <h1>web-get-invite-ui <small class="submodule-kind submodule-kind--ui">UI</small></h1>
13
+ <p class="submodule-role">React page that lets a signed-in member request a new invite code.</p>
14
+ </header>
15
+ <main class="submodule-main">
16
+ <section class="sub-io" aria-label="Function I/O">
17
+ <h2>Function I/O</h2>
18
+ <table class="sub-table">
19
+ <thead><tr><th scope="col">Name</th><th scope="col">In</th><th scope="col">Out</th><th scope="col">Side</th><th scope="col">Purpose</th></tr></thead>
20
+ <tbody>
21
+ <tr><td>handleGenerate</td><td>MouseEvent</td><td>void</td><td>io</td><td>Calls POST /api/invites and renders the returned code.</td></tr>
22
+ </tbody>
23
+ </table>
24
+ </section>
25
+ <section class="sub-vars" aria-label="Variables">
26
+ <h2>Variables</h2>
27
+ <table class="sub-table">
28
+ <thead><tr><th scope="col">Name</th><th scope="col">Type</th><th scope="col">Scope</th><th scope="col">Purpose</th></tr></thead>
29
+ <tbody>
30
+ <tr><td>userId</td><td>string</td><td>call</td><td>Identifies the member who will own the new invite row.</td></tr>
31
+ <tr><td>code</td><td>string</td><td>instance</td><td>Last issued code shown to the member.</td></tr>
32
+ </tbody>
33
+ </table>
34
+ </section>
35
+ <section class="sub-dataflow" aria-label="Internal data flow">
36
+ <h2>Internal data flow</h2>
37
+ <div class="sub-dataflow__canvas" data-pan-zoom-container>
38
+ <div class="sub-dataflow__toolbar" role="toolbar" aria-label="Diagram controls">
39
+ <button type="button" data-pan-zoom="zoom-in" aria-label="Zoom in">+</button>
40
+ <button type="button" data-pan-zoom="zoom-out" aria-label="Zoom out">−</button>
41
+ <button type="button" data-pan-zoom="fit" aria-label="Reset view">Fit</button>
42
+ </div>
43
+ <div class="sub-dataflow__viewport" data-pan-zoom-viewport>
44
+ <svg class="sub-dataflow__svg" data-atlas-svg="sub-dataflow" viewBox="0 0 628 368" role="img" aria-label="Internal dataflow">
45
+ <defs>
46
+ <marker id="sub-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="9" markerHeight="9" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 Z" /></marker>
47
+ </defs>
48
+ <g class="sub-dataflow__step">
49
+ <circle class="sub-dataflow__badge" cx="42" cy="68" r="18" />
50
+ <text class="sub-dataflow__badge-text" x="42" y="73" text-anchor="middle">1</text>
51
+ <rect class="sub-dataflow__box" x="80" y="32" width="520" height="72" rx="14" ry="14" />
52
+ <text class="sub-dataflow__text" x="340" y="74" text-anchor="middle">Read userId from auth context.</text>
53
+ </g>
54
+ <line class="sub-dataflow__arrow" x1="340" y1="110" x2="340" y2="140" marker-end="url(#sub-arrow)" />
55
+ <g class="sub-dataflow__step">
56
+ <circle class="sub-dataflow__badge" cx="42" cy="184" r="18" />
57
+ <text class="sub-dataflow__badge-text" x="42" y="189" text-anchor="middle">2</text>
58
+ <rect class="sub-dataflow__box" x="80" y="148" width="520" height="72" rx="14" ry="14" />
59
+ <text class="sub-dataflow__text" x="340" y="190" text-anchor="middle">POST /api/invites with userId.</text>
60
+ </g>
61
+ <line class="sub-dataflow__arrow" x1="340" y1="226" x2="340" y2="256" marker-end="url(#sub-arrow)" />
62
+ <g class="sub-dataflow__step">
63
+ <circle class="sub-dataflow__badge" cx="42" cy="300" r="18" />
64
+ <text class="sub-dataflow__badge-text" x="42" y="305" text-anchor="middle">3</text>
65
+ <rect class="sub-dataflow__box" x="80" y="264" width="520" height="72" rx="14" ry="14" />
66
+ <text class="sub-dataflow__text" x="340" y="306" text-anchor="middle">Render returned code or surface error.</text>
67
+ </g>
68
+ </svg>
69
+ </div>
70
+ </div>
71
+ </section>
72
+ <section class="sub-errors" aria-label="Errors">
73
+ <h2>Errors</h2>
74
+ <table class="sub-table">
75
+ <thead><tr><th scope="col">Name</th><th scope="col">When</th><th scope="col">Means</th></tr></thead>
76
+ <tbody>
77
+ <tr><td>ErrUnauthenticated</td><td>Session is missing on the client.</td><td>Redirect to sign-in.</td></tr>
78
+ <tr><td>ErrIssuanceFailed</td><td>API returns 500.</td><td>Show retry banner.</td></tr>
79
+ </tbody>
80
+ </table>
81
+ </section>
82
+ </main>
83
+ <script src="../../assets/viewer.client.js" defer></script>
84
+ </body>
140
85
  </html>
@@ -1,53 +1,63 @@
1
1
  <!DOCTYPE html>
2
- <html lang="zh-Hant">
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <title>邀請碼註冊 功能模組總覽</title>
7
- <link rel="preconnect" href="https://fonts.googleapis.com" />
8
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
- <link
10
- href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;600&family=Plus+Jakarta+Sans:wght@400;500;600&display=swap"
11
- rel="stylesheet"
12
- />
13
- <link rel="stylesheet" href="../../assets/architecture.css" />
14
- </head>
15
- <body>
16
- <main class="atlas-page atlas-page--feature">
17
- <nav class="breadcrumb" aria-label="階層導航">
18
- <a href="../../index.html">宏觀架構</a> · <span>邀請碼註冊(功能模組)</span>
19
- </nav>
20
-
21
- <header class="atlas-header">
22
- <p class="atlas-kicker">Feature module · invite-code-registration</p>
23
- <h1 class="atlas-title">邀請碼註冊</h1>
24
- <p class="atlas-meta">對外能力:訪客憑邀請碼建立帳號(消費邀請碼)。</p>
25
- </header>
26
-
27
- <section class="feature-story">
28
- <h2>使用者故事</h2>
29
- <p>訪客提交註冊 → 系統以邀請碼狀態判定 → 通過則建立帳號並核銷邀請碼,失敗則不留下任何持久化副作用。</p>
30
- <p class="atlas-meta">
31
- <strong>跨子模組交互(誰呼叫誰、誰讀誰寫、回應如何流回)以及與「獲取邀請碼」功能的資料行傳遞,已在<a href="../../index.html">宏觀架構圖</a>內統一呈現</strong>,本頁不重述。
32
- </p>
33
- </section>
34
-
35
- <section class="submodule-nav">
36
- <h2>本功能的子模組</h2>
37
- <table>
38
- <thead><tr><th>子模組</th><th>自身職責</th><th>頁面(自身 I/O + 內部資料流)</th></tr></thead>
39
- <tbody>
40
- <tr><td><code>web-register-ui</code></td><td>表單、客戶端驗證、發 HTTP</td><td><a href="web-register-ui.html">web-register-ui.html</a></td></tr>
41
- <tr><td><code>public-api</code></td><td>HTTP 邊界、輸入綁定、錯誤映射</td><td><a href="public-api.html">public-api.html</a></td></tr>
42
- <tr><td><code>registration-service</code></td><td>網域規則、交易編排</td><td><a href="registration-service.html">registration-service.html</a></td></tr>
43
- <tr><td><code>postgresql</code></td><td>SQL:讀邀請碼、寫 user、核銷邀請</td><td><a href="postgresql.html">postgresql.html</a></td></tr>
44
- </tbody>
45
- </table>
46
- </section>
47
-
48
- <footer class="atlas-meta" style="margin-top: 2rem">
49
- <p><a href="../../index.html">← 宏觀架構(含完整交互圖)</a> · <code>features/invite-code-registration/</code></p>
50
- </footer>
51
- </main>
52
- </body>
2
+ <html lang="en" data-atlas-page="feature">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Invite-code registration</title>
6
+ <meta name="viewport" content="width=device-width, initial-scale=1">
7
+ <link rel="stylesheet" href="../../assets/architecture.css">
8
+ </head>
9
+ <body>
10
+ <header class="feature-header">
11
+ <nav class="feature-breadcrumb"><a href="../../index.html">← Atlas</a></nav>
12
+ <h1>Invite-code registration</h1>
13
+ <p class="feature-depends">Depends on: <a href="../get-invite-codes/index.html">get-invite-codes</a></p>
14
+ </header>
15
+ <main class="feature-main">
16
+ <section class="feature-story"><p>A visitor holding an invite code submits email/password plus the code. The registration service validates the code inside a single transaction; on success it creates a new user and consumes the invite_codes row issued earlier by `get-invite-codes`.</p></section>
17
+ <section class="feature-submodules" aria-label="Submodules">
18
+ <h2>Submodules</h2>
19
+ <ul class="submodule-nav">
20
+ <li class="submodule-card">
21
+ <a class="submodule-card__link" href="web-register-ui.html">
22
+ <span class="submodule-card__name">web-register-ui</span>
23
+ <span class="submodule-card__kind submodule-card__kind--ui">UI</span>
24
+ </a>
25
+ <p class="submodule-card__role">React page that captures email, password, and invite code.</p>
26
+ </li>
27
+ <li class="submodule-card">
28
+ <a class="submodule-card__link" href="public-api.html">
29
+ <span class="submodule-card__name">public-api</span>
30
+ <span class="submodule-card__kind submodule-card__kind--api">API</span>
31
+ </a>
32
+ <p class="submodule-card__role">HTTP boundary for `/api/register` POST requests.</p>
33
+ </li>
34
+ <li class="submodule-card">
35
+ <a class="submodule-card__link" href="registration-service.html">
36
+ <span class="submodule-card__name">registration-service</span>
37
+ <span class="submodule-card__kind submodule-card__kind--service">Service</span>
38
+ </a>
39
+ <p class="submodule-card__role">Owns the registration transaction (consumer side of the invite_codes data row).</p>
40
+ </li>
41
+ <li class="submodule-card">
42
+ <a class="submodule-card__link" href="postgresql.html">
43
+ <span class="submodule-card__name">postgresql</span>
44
+ <span class="submodule-card__kind submodule-card__kind--db">DB</span>
45
+ </a>
46
+ <p class="submodule-card__role">Stores `users` rows and applies invite-code state transitions inside the registration tx.</p>
47
+ </li>
48
+ </ul>
49
+ </section>
50
+ <section class="feature-edges" aria-label="Intra-feature edges">
51
+ <h2>Intra-feature edges</h2>
52
+ <ul class="feature-edges__list">
53
+ <li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">web-register-ui → public-api</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">POST /api/register</span></li>
54
+ <li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">public-api → registration-service</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">RegisterWithInvite(ctx, RegisterInput)</span></li>
55
+ <li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">registration-service → postgresql</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">SELECT invite_codes FOR UPDATE</span></li>
56
+ <li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">registration-service → postgresql</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">INSERT users</span></li>
57
+ <li class="feature-edges__item feature-edges__item--call"><span class="feature-edges__endpoints">registration-service → postgresql</span><span class="feature-edges__kind">call</span><span class="feature-edges__label">UPDATE invite_codes.consumed_at</span></li>
58
+ <li class="feature-edges__item feature-edges__item--return"><span class="feature-edges__endpoints">postgresql → registration-service</span><span class="feature-edges__kind">return</span><span class="feature-edges__label">row | rows_affected</span></li>
59
+ </ul>
60
+ </section>
61
+ </main>
62
+ </body>
53
63
  </html>