@zigrivers/scaffold 3.29.0 → 3.31.0

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 (86) hide show
  1. package/content/guides/AUTHORING.md +146 -0
  2. package/content/guides/cli/index.html +1855 -0
  3. package/content/guides/cli/index.md +206 -0
  4. package/content/guides/concepts/index.html +1970 -0
  5. package/content/guides/concepts/index.md +347 -0
  6. package/content/guides/dashboard/index.html +1913 -0
  7. package/content/guides/dashboard/index.md +264 -0
  8. package/content/guides/index.html +368 -15
  9. package/content/guides/install/.diagrams/diagram-0.svg +1 -0
  10. package/content/guides/install/.diagrams/manifest.json +3 -0
  11. package/content/guides/install/index.html +1653 -0
  12. package/content/guides/install/index.md +186 -0
  13. package/content/guides/knowledge/.diagrams/diagram-0.svg +1 -0
  14. package/content/guides/knowledge/.diagrams/manifest.json +3 -0
  15. package/content/guides/knowledge/index.html +1765 -0
  16. package/content/guides/knowledge/index.md +209 -0
  17. package/content/guides/knowledge-freshness/.diagrams/diagram-0.svg +1 -0
  18. package/content/guides/knowledge-freshness/.diagrams/manifest.json +3 -0
  19. package/content/guides/knowledge-freshness/index.html +2795 -0
  20. package/content/guides/knowledge-freshness/index.md +893 -0
  21. package/content/guides/mmr/index.html +407 -36
  22. package/content/guides/mmr/index.md +39 -16
  23. package/content/guides/multi-agent/.diagrams/diagram-0.svg +1 -0
  24. package/content/guides/multi-agent/.diagrams/manifest.json +3 -0
  25. package/content/guides/multi-agent/index.html +1715 -0
  26. package/content/guides/multi-agent/index.md +243 -0
  27. package/content/guides/observability/.diagrams/diagram-0.svg +1 -0
  28. package/content/guides/observability/.diagrams/diagram-1.svg +1 -0
  29. package/content/guides/observability/.diagrams/diagram-2.svg +1 -0
  30. package/content/guides/observability/.diagrams/diagram-3.svg +1 -0
  31. package/content/guides/observability/.diagrams/manifest.json +6 -0
  32. package/content/guides/observability/index.html +3257 -0
  33. package/content/guides/observability/index.md +1097 -0
  34. package/content/guides/pipeline/.diagrams/diagram-0.svg +1 -0
  35. package/content/guides/pipeline/.diagrams/diagram-1.svg +1 -0
  36. package/content/guides/pipeline/.diagrams/manifest.json +4 -0
  37. package/content/guides/pipeline/index.html +1973 -0
  38. package/content/guides/pipeline/index.md +387 -0
  39. package/content/guides/review-workflow/.diagrams/diagram-0.svg +1 -0
  40. package/content/guides/review-workflow/.diagrams/diagram-1.svg +1 -0
  41. package/content/guides/review-workflow/.diagrams/manifest.json +4 -0
  42. package/content/guides/review-workflow/index.html +1790 -0
  43. package/content/guides/review-workflow/index.md +248 -0
  44. package/dist/guides/build.d.ts +1 -1
  45. package/dist/guides/build.d.ts.map +1 -1
  46. package/dist/guides/build.js +21 -9
  47. package/dist/guides/build.js.map +1 -1
  48. package/dist/guides/build.test.js +47 -0
  49. package/dist/guides/build.test.js.map +1 -1
  50. package/dist/guides/chrome.d.ts.map +1 -1
  51. package/dist/guides/chrome.js +83 -12
  52. package/dist/guides/chrome.js.map +1 -1
  53. package/dist/guides/dashboard-theme.css +8 -0
  54. package/dist/guides/directives-cite.test.d.ts +2 -0
  55. package/dist/guides/directives-cite.test.d.ts.map +1 -0
  56. package/dist/guides/directives-cite.test.js +26 -0
  57. package/dist/guides/directives-cite.test.js.map +1 -0
  58. package/dist/guides/directives-tabs.test.js +47 -0
  59. package/dist/guides/directives-tabs.test.js.map +1 -1
  60. package/dist/guides/directives.d.ts +1 -0
  61. package/dist/guides/directives.d.ts.map +1 -1
  62. package/dist/guides/directives.js +38 -0
  63. package/dist/guides/directives.js.map +1 -1
  64. package/dist/guides/guides.css +268 -0
  65. package/dist/guides/index-page.d.ts.map +1 -1
  66. package/dist/guides/index-page.js +41 -8
  67. package/dist/guides/index-page.js.map +1 -1
  68. package/dist/guides/links.d.ts +14 -0
  69. package/dist/guides/links.d.ts.map +1 -0
  70. package/dist/guides/links.js +56 -0
  71. package/dist/guides/links.js.map +1 -0
  72. package/dist/guides/links.test.d.ts +2 -0
  73. package/dist/guides/links.test.d.ts.map +1 -0
  74. package/dist/guides/links.test.js +72 -0
  75. package/dist/guides/links.test.js.map +1 -0
  76. package/dist/guides/render.d.ts +1 -0
  77. package/dist/guides/render.d.ts.map +1 -1
  78. package/dist/guides/render.js +1 -1
  79. package/dist/guides/render.js.map +1 -1
  80. package/dist/guides/sanitize.d.ts.map +1 -1
  81. package/dist/guides/sanitize.js +5 -0
  82. package/dist/guides/sanitize.js.map +1 -1
  83. package/dist/guides/template.d.ts.map +1 -1
  84. package/dist/guides/template.js +7 -2
  85. package/dist/guides/template.js.map +1 -1
  86. package/package.json +2 -2
@@ -0,0 +1,209 @@
1
+ ---
2
+ title: Knowledge Base
3
+ topic: knowledge
4
+ description: What the knowledge base is, how entries are injected during assembly, and how to author or override them
5
+ category: reference
6
+ order: 55
7
+ ---
8
+
9
+ ## What the knowledge base is
10
+
11
+ The knowledge base (KB) is a curated library of domain-expertise entries under
12
+ `content/knowledge/`, organized into category directories (`backend`, `core`,
13
+ `web-app`, `web3`, `ml`, …). Each entry is a single Markdown file with
14
+ YAML frontmatter and a body. During prompt assembly, the entries a pipeline step
15
+ declares are spliced into that step's **Knowledge Base** section so the agent
16
+ running the step gets the relevant expertise inline — no web lookup, no
17
+ guessing.
18
+
19
+ The KB is **orthogonal to the pipeline**: a step references entries by `name`,
20
+ and the same entry can be reused by many steps. Entries are versioned as a set
21
+ via `content/knowledge/VERSION` (bumped on merge by the freshness workflow).
22
+
23
+ :::callout{type=note}
24
+ **Scope of this guide.** This guide covers *authoring*, *injection*, and
25
+ *overriding* entries. The freshness lifecycle — volatility cadence, the daily
26
+ audit cron, the five PR gates, Lens-I gap detection, and the source
27
+ allowlist — lives in the
28
+ [Knowledge Freshness guide](../knowledge-freshness/index.md), along with the
29
+ live entry/category counts (see its KB inventory section). Counts and tiers are
30
+ **not** restated here.
31
+ :::
32
+
33
+ ## How entries are injected during assembly
34
+
35
+ When `scaffold run <step>` assembles a prompt, it builds a merged name→path
36
+ index of every entry, loads the names the step declares, and renders each into
37
+ the step's Knowledge Base section.
38
+
39
+ ```mermaid
40
+ flowchart TB
41
+ STEP["pipeline step
42
+ frontmatter: knowledge-base: [names]"] --> SELECT
43
+ OVERLAY["resolved overlay.knowledge[step]
44
+ (or step frontmatter)"] --> SELECT
45
+ SELECT["loadEntries(index, names)"] --> RENDER
46
+ INDEX["buildIndexWithOverrides
47
+ global + .scaffold/knowledge"] --> SELECT
48
+ RENDER["buildKnowledgeBaseSection
49
+ ## name: description + body"] --> TAIL
50
+ TAIL["renderGapSignalTail
51
+ (unless QUIET)"] --> OUT["Knowledge Base section
52
+ in the assembled prompt"]
53
+ ```
54
+
55
+ The injection runs in three stages:
56
+
57
+ 1. **Index.** `buildIndexWithOverrides(projectRoot, globalKnowledgeDir)` walks
58
+ the global KB and the project-local override dir, returning a map of
59
+ entry `name` → file path (:cite[src/core/assembly/knowledge-loader.ts:217]).
60
+ The global dir is resolved by `getPackageKnowledgeDir`, which prefers a
61
+ repo-local `content/knowledge` and otherwise falls back to the package's
62
+ bundled copy (:cite[src/utils/fs.ts:55]).
63
+ 2. **Select + load.** `scaffold run` reads the entry names from the pipeline
64
+ overlay (if set) or the step's `knowledge-base` frontmatter, then calls
65
+ `loadEntries` (:cite[src/cli/commands/run.ts:370-374]). A name that isn't in
66
+ the index becomes a non-fatal `FRONTMATTER_KB_ENTRY_MISSING` warning rather
67
+ than an error.
68
+ 3. **Render.** `buildKnowledgeBaseSection` emits one `## <name>: <description>`
69
+ block per entry followed by the entry content (:cite[src/core/assembly/engine.ts:174-185]).
70
+
71
+ ### Deep Guidance vs. Summary (the dual-channel split)
72
+
73
+ An entry body may contain a `## Summary` section and a `## Deep Guidance`
74
+ section. For runtime CLI assembly, `loadEntries` injects **only** the Deep
75
+ Guidance — `extractDeepGuidance` finds the `## Deep Guidance` heading and
76
+ returns everything after it, falling back to the full body when the heading is
77
+ absent (:cite[src/core/assembly/knowledge-loader.ts:156]). The loader stores
78
+ `deepOnly ?? fullBody` as the entry content
79
+ (:cite[src/core/assembly/knowledge-loader.ts:315]). This avoids re-stating
80
+ guidance the command prompt already shows the user. The `scaffold build`
81
+ path (self-contained generated commands) instead uses `loadFullEntries`, which
82
+ keeps the complete body since no runtime assembly is available downstream.
83
+
84
+ ### The gap-signal tail
85
+
86
+ After the entry bodies, assembly appends a **gap-signal tail** that tells the
87
+ agent to emit a `knowledge_gap_signal` observability event if it searches the
88
+ section and finds nothing useful (:cite[src/core/assembly/engine.ts:183]). The
89
+ template lives in `renderGapSignalTail`, which returns the empty string when
90
+ `SCAFFOLD_GAP_SIGNAL_QUIET=1` so tests and CI stay deterministic
91
+ (:cite[src/core/assembly/gap-signal-tail.ts:45]). Those signals feed Lens I —
92
+ see the [Knowledge Freshness guide](../knowledge-freshness/index.md){mode=advisory}
93
+ for what happens to them.
94
+
95
+ ## Browsing and overriding entries
96
+
97
+ The KB resolves in two layers. **Global** entries ship with Scaffold under
98
+ `content/knowledge/`. **Local** overrides live under a project's
99
+ `.scaffold/knowledge/` directory (:cite[src/core/assembly/knowledge-loader.ts:225]).
100
+ When both define the same `name`, the **local override wins** — the merge layers
101
+ local on top of global (:cite[src/core/assembly/knowledge-loader.ts:265]).
102
+
103
+ Use the `scaffold knowledge` subcommands to inspect and manage the effective set:
104
+
105
+ :::filter-table
106
+ | Command | What it does | Source |
107
+ | --- | --- | --- |
108
+ | `scaffold knowledge list` | List every entry — global plus local overrides — with a `global` / `local override` source label and description. `--format json` for machine output. | :cite[src/cli/commands/knowledge.ts:45] |
109
+ | `scaffold knowledge show <name>` | Print the *effective* content of an entry (the local override if present, else the global entry), prefixed with its source path. | :cite[src/cli/commands/knowledge.ts:109] |
110
+ | `scaffold knowledge reset <name>` | Remove a local override, reverting to the global entry. Refuses to delete a dirty override unless `--auto` is passed. | :cite[src/cli/commands/knowledge.ts:167] |
111
+ | `scaffold knowledge update <target> [instructions..]` | Assemble a knowledge-update prompt for one entry or every entry in a pipeline step (`--step`). Unlike the other subcommands, it resolves targets from the **global** KB index and reads step lists from **base step frontmatter** — not local-only overrides or pipeline overlays. | :cite[src/cli/commands/knowledge.ts:251] |
112
+ :::
113
+
114
+ To author a local override, create `.scaffold/knowledge/<category>/<name>.md`
115
+ with the same `name:` as the global entry you want to replace, using the same
116
+ frontmatter shape described below. A duplicate `name` *within* the local dir
117
+ emits a `warn: duplicate knowledge override name` to stderr and the last file
118
+ wins.
119
+
120
+ ### `--knowledge-root` (a separate resolver)
121
+
122
+ The `scaffold knowledge` commands resolve the global dir via
123
+ `getPackageKnowledgeDir` and the local dir via `.scaffold/knowledge/`. The
124
+ `--knowledge-root` flag is a **different** mechanism: it belongs to the
125
+ observability audit's Lens-I suppression, which needs to locate a KB to know
126
+ which gap topics are already covered. It does **not** redirect prompt assembly
127
+ or the `scaffold knowledge` subcommands. Its three-tier resolution
128
+ (CLI flag → yaml → auto-detect) is documented in the
129
+ [Knowledge Freshness guide](../knowledge-freshness/index.md){mode=advisory}.
130
+
131
+ ## Authoring a new entry
132
+
133
+ 1. **Pick a category directory** under `content/knowledge/<category>/`. Prefer
134
+ an existing category; a brand-new category is a larger change.
135
+ 2. **Name the file after the slug.** The basename should match the `name:`
136
+ field (e.g. `backend-api-design.md` ↔ `name: backend-api-design`). The index
137
+ keys on the frontmatter `name`, not the filename
138
+ (:cite[src/core/assembly/knowledge-loader.ts:198]), but keeping them aligned
139
+ prevents confusion and keeps freshness/suppression matching predictable.
140
+ 3. **Write the frontmatter** (fields below).
141
+ 4. **Structure the body** with an optional intro paragraph, then `## Summary`
142
+ and `## Deep Guidance`. The Deep Guidance section is what gets injected into
143
+ runtime prompts.
144
+ 5. **Wire it into a step** by adding the `name` to that pipeline step's
145
+ `knowledge-base:` frontmatter list (or a pipeline overlay).
146
+ 6. **Validate**: `make validate-knowledge` runs the frontmatter validator over
147
+ every entry (:cite[src/cli/commands/validate-knowledge.ts:20]).
148
+
149
+ ### Frontmatter fields
150
+
151
+ The frontmatter is YAML between `---` fences. The runtime loader coerces these
152
+ fields (:cite[src/core/assembly/knowledge-loader.ts:65]); the freshness
153
+ validator enforces them as a Zod schema (:cite[src/validation/knowledge-frontmatter-validator.ts:42-50]).
154
+ Only `name` is strictly required for an entry to be indexed at all
155
+ (:cite[src/core/assembly/knowledge-loader.ts:102]).
156
+
157
+ :::filter-table
158
+ | Field | Required | Shape | Notes |
159
+ | --- | --- | --- | --- |
160
+ | `name` | yes | `/^[a-z][a-z0-9-]*$/` (must start with a letter) | The index key. Steps reference entries by this. An entry with no `name` is silently dropped from the index. |
161
+ | `description` | yes | string | Rendered into the `## <name>: <description>` heading at injection. The validator warns past ~200 chars but does not fail. |
162
+ | `topics` | no | string[] (default `[]`) | Free-form tags carried as discovery and audit metadata. They are parsed and stored on the entry but do **not** drive selection — injection is always by explicit `name` (see above). |
163
+ | `volatility` | no | `stable|evolving|fast-moving` (default `evolving`) | Drives the freshness cadence — see the freshness guide. |
164
+ | `last-reviewed` | no | `YYYY-MM-DD` or `null` | ISO date; unquoted dates are coerced to strings. Audited entries advance this on a `current`/drift verdict. |
165
+ | `version-pin` | no | string or `null` | Pins the entry to an edition (e.g. `"OWASP Top 10 2021"`). |
166
+ | `sources` | no | object[] (default `[]`) | Each: `url` (SSRF-checked), optional `anchor` (must start with `#`), `retrieved` (ISO date), `hash` (sha256). An entry with no `sources` is skipped by the freshness cron. |
167
+ :::
168
+
169
+ A minimal entry:
170
+
171
+ ```markdown
172
+ ---
173
+ name: retry-with-jitter
174
+ description: Exponential backoff with full jitter for resilient client retries
175
+ topics: [resilience, networking, retries]
176
+ volatility: stable
177
+ last-reviewed: null
178
+ version-pin: null
179
+ sources:
180
+ - url: https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/
181
+ ---
182
+
183
+ One-paragraph framing of why this matters.
184
+
185
+ ## Summary
186
+
187
+ A short overview that may overlap with the command prompt's own text.
188
+
189
+ ## Deep Guidance
190
+
191
+ The supplementary expertise that gets injected into runtime prompts. This is
192
+ the section assembly keeps for CLI prompts (see the dual-channel split above).
193
+ ```
194
+
195
+ :::callout{type=tip}
196
+ **Want the freshness cron to keep it current?** Add at least one `sources[]`
197
+ entry and pick a `volatility` tier. Entries without sources are still injected
198
+ into prompts, but the daily audit skips them. The cadence model, source
199
+ allowlist, and audit verdicts are all in the
200
+ [Knowledge Freshness guide](../knowledge-freshness/index.md).
201
+ :::
202
+
203
+ ## See also
204
+
205
+ - [Knowledge Freshness](../knowledge-freshness/index.md){mode=advisory} —
206
+ volatility cadence, the audit cron, the five PR gates, Lens-I gap detection,
207
+ the source allowlist, and the live KB inventory.
208
+ - [Build Observability](../observability/index.md){mode=advisory} — the audit
209
+ engine that hosts Lens I and reads `knowledge_gap_signal` events.
@@ -0,0 +1 @@
1
+ <svg id="my-svg" width="100%" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="flowchart" style="max-width: 951.219px; background-color: transparent;" viewBox="0 0 951.21875 940.3999633789062" role="graphics-document document" aria-roledescription="flowchart-v2"><style>#my-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#000000;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#my-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#my-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#my-svg .error-icon{fill:#552222;}#my-svg .error-text{fill:#552222;stroke:#552222;}#my-svg .edge-thickness-normal{stroke-width:1px;}#my-svg .edge-thickness-thick{stroke-width:3.5px;}#my-svg .edge-pattern-solid{stroke-dasharray:0;}#my-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#my-svg .edge-pattern-dashed{stroke-dasharray:3;}#my-svg .edge-pattern-dotted{stroke-dasharray:2;}#my-svg .marker{fill:#666;stroke:#666;}#my-svg .marker.cross{stroke:#666;}#my-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#my-svg p{margin:0;}#my-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#000000;}#my-svg .cluster-label text{fill:#333;}#my-svg .cluster-label span{color:#333;}#my-svg .cluster-label span p{background-color:transparent;}#my-svg .label text,#my-svg span{fill:#000000;color:#000000;}#my-svg .node rect,#my-svg .node circle,#my-svg .node ellipse,#my-svg .node polygon,#my-svg .node path{fill:#eee;stroke:#999;stroke-width:1px;}#my-svg .rough-node .label text,#my-svg .node .label text,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-anchor:middle;}#my-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#my-svg .rough-node .label,#my-svg .node .label,#my-svg .image-shape .label,#my-svg .icon-shape .label{text-align:center;}#my-svg .node.clickable{cursor:pointer;}#my-svg .root .anchor path{fill:#666!important;stroke-width:0;stroke:#666;}#my-svg .arrowheadPath{fill:#333333;}#my-svg .edgePath .path{stroke:#666;stroke-width:1px;}#my-svg .flowchart-link{stroke:#666;fill:none;}#my-svg .edgeLabel{background-color:white;text-align:center;}#my-svg .edgeLabel p{background-color:white;}#my-svg .edgeLabel rect{opacity:0.5;background-color:white;fill:white;}#my-svg .labelBkg{background-color:rgba(255, 255, 255, 0.5);}#my-svg .cluster rect{fill:hsl(0, 0%, 98.9215686275%);stroke:#707070;stroke-width:1px;}#my-svg .cluster text{fill:#333;}#my-svg .cluster span{color:#333;}#my-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(-160, 0%, 93.3333333333%);border:1px solid #707070;border-radius:2px;pointer-events:none;z-index:100;}#my-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#000000;}#my-svg rect.text{fill:none;stroke-width:0;}#my-svg .icon-shape,#my-svg .image-shape{background-color:white;text-align:center;}#my-svg .icon-shape p,#my-svg .image-shape p{background-color:white;padding:2px;}#my-svg .icon-shape .label rect,#my-svg .image-shape .label rect{opacity:0.5;background-color:white;fill:white;}#my-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#my-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#my-svg .node .neo-node{stroke:#999;}#my-svg [data-look="neo"].node rect,#my-svg [data-look="neo"].cluster rect,#my-svg [data-look="neo"].node polygon{stroke:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].node path{stroke:url(#my-svg-gradient);stroke-width:1px;}#my-svg [data-look="neo"].node .outer-path{filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].node .neo-line path{stroke:#999;filter:none;}#my-svg [data-look="neo"].node circle{stroke:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].node circle .state-start{fill:#000000;}#my-svg [data-look="neo"].icon-shape .icon{fill:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg [data-look="neo"].icon-shape .icon-neo path{stroke:url(#my-svg-gradient);filter:drop-shadow( 1px 2px 2px rgba(185,185,185,1));}#my-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker id="my-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointEnd-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="11.5" refY="7" markerUnits="userSpaceOnUse" markerWidth="10.5" markerHeight="14" orient="auto"><path d="M 0 0 L 11.5 7 L 0 14 z" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-pointStart-margin" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="1" refY="7" markerUnits="userSpaceOnUse" markerWidth="11.5" markerHeight="14" orient="auto"><polygon points="0,7 11.5,14 11.5,0" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleEnd-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refY="5" refX="12.25" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-circleStart-margin" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-2" refY="5" markerUnits="userSpaceOnUse" markerWidth="14" markerHeight="14" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 0; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="my-svg_flowchart-v2-crossEnd-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="17.7" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5;"/></marker><marker id="my-svg_flowchart-v2-crossStart-margin" class="marker cross flowchart-v2" viewBox="0 0 15 15" refX="-3.5" refY="7.5" markerUnits="userSpaceOnUse" markerWidth="12" markerHeight="12" orient="auto"><path d="M 1,1 L 14,14 M 1,14 L 14,1" class="arrowMarkerPath" style="stroke-width: 2.5; stroke-dasharray: 1, 0;"/></marker><g class="root"><g class="clusters"><g class="cluster" id="my-svg-gap" data-look="classic"><rect style="" x="390.40625" y="8" width="552.8125" height="625.5999908447266"/><g class="cluster-label" transform="translate(636.375, 8)"><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">Gap</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> arm</tspan></tspan></text></g></g></g><g class="cluster" id="my-svg-refresh" data-look="classic"><rect style="" x="8" y="149.5999984741211" width="362.40625" height="782.7999877929688"/><g class="cluster-label" transform="translate(146.1015625, 149.5999984741211)"><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">Refresh</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> arm</tspan></tspan></text></g></g></g></g><g class="edgePaths"><path d="M132.684,241.2L132.684,245.367C132.684,249.533,132.684,257.867,132.684,267C132.684,276.133,132.684,286.067,132.684,291.033L132.684,296" id="my-svg-L_CRON_PF_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_CRON_PF_0" data-points="W3sieCI6MTMyLjY4MzU5Mzc1LCJ5IjoyNDEuMTk5OTk2OTQ4MjQyMn0seyJ4IjoxMzIuNjgzNTkzNzUsInkiOjI2Ni4xOTk5OTY5NDgyNDIyfSx7IngiOjEzMi42ODM1OTM3NSwieSI6Mjk5Ljk5OTk5NjE4NTMwMjczfV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M132.684,366.6L132.684,372.233C132.684,377.867,132.684,389.133,132.684,398.267C132.684,407.4,132.684,414.4,132.684,417.9L132.684,421.4" id="my-svg-L_PF_RUN_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_PF_RUN_0" data-points="W3sieCI6MTMyLjY4MzU5Mzc1LCJ5IjozNjYuNTk5OTk0NjU5NDIzOH0seyJ4IjoxMzIuNjgzNTkzNzUsInkiOjQwMC4zOTk5OTM4OTY0ODQ0fSx7IngiOjEzMi42ODM1OTM3NSwieSI6NDI1LjM5OTk5Mzg5NjQ4NDR9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M132.684,492L132.684,496.167C132.684,500.333,132.684,508.667,132.684,516.333C132.684,524,132.684,531,132.684,534.5L132.684,538" id="my-svg-L_RUN_APPLY_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_RUN_APPLY_0" data-points="W3sieCI6MTMyLjY4MzU5Mzc1LCJ5Ijo0OTEuOTk5OTkyMzcwNjA1NDd9LHsieCI6MTMyLjY4MzU5Mzc1LCJ5Ijo1MTYuOTk5OTkyMzcwNjA1NX0seyJ4IjoxMzIuNjgzNTkzNzUsInkiOjU0MS45OTk5OTIzNzA2MDU1fV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M132.684,608.6L132.684,612.767C132.684,616.933,132.684,625.267,132.684,638.45C132.684,651.633,132.684,669.667,138.932,687.163C145.18,704.66,157.676,721.62,163.925,730.1L170.173,738.58" id="my-svg-L_APPLY_GATES_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_APPLY_GATES_0" data-points="W3sieCI6MTMyLjY4MzU5Mzc1LCJ5Ijo2MDguNTk5OTkwODQ0NzI2Nn0seyJ4IjoxMzIuNjgzNTkzNzUsInkiOjYzMy41OTk5OTA4NDQ3MjY2fSx7IngiOjEzMi42ODM1OTM3NSwieSI6Njg3LjY5OTk4OTMxODg0Nzd9LHsieCI6MTcyLjU0NTU2MjYyNjY1MDAyLCJ5Ijo3NDEuNzk5OTg3NzkyOTY4OH1d" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M190.598,790.8L190.598,794.967C190.598,799.133,190.598,807.467,190.598,815.133C190.598,822.8,190.598,829.8,190.598,833.3L190.598,836.8" id="my-svg-L_GATES_MERGE_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_GATES_MERGE_0" data-points="W3sieCI6MTkwLjU5NzY1NjI1LCJ5Ijo3OTAuNzk5OTg3NzkyOTY4OH0seyJ4IjoxOTAuNTk3NjU2MjUsInkiOjgxNS43OTk5ODc3OTI5Njg4fSx7IngiOjE5MC41OTc2NTYyNSwieSI6ODQwLjc5OTk4Nzc5Mjk2ODh9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M536.594,99.6L536.594,103.767C536.594,107.933,536.594,116.267,536.594,124.6C536.594,132.933,536.594,141.267,536.594,148.933C536.594,156.6,536.594,163.6,536.594,167.1L536.594,170.6" id="my-svg-L_TAIL_EVENT_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_TAIL_EVENT_0" data-points="W3sieCI6NTM2LjU5Mzc1LCJ5Ijo5OS41OTk5OTg0NzQxMjExfSx7IngiOjUzNi41OTM3NSwieSI6MTI0LjU5OTk5ODQ3NDEyMTF9LHsieCI6NTM2LjU5Mzc1LCJ5IjoxNDkuNTk5OTk4NDc0MTIxMX0seyJ4Ijo1MzYuNTkzNzUsInkiOjE3NC41OTk5OTg0NzQxMjExfV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M536.594,241.2L536.594,245.367C536.594,249.533,536.594,257.867,536.594,267C536.594,276.133,536.594,286.067,536.594,291.033L536.594,296" id="my-svg-L_EVENT_LEDGER_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_EVENT_LEDGER_0" data-points="W3sieCI6NTM2LjU5Mzc1LCJ5IjoyNDEuMTk5OTk2OTQ4MjQyMn0seyJ4Ijo1MzYuNTkzNzUsInkiOjI2Ni4xOTk5OTY5NDgyNDIyfSx7IngiOjUzNi41OTM3NSwieSI6Mjk5Ljk5OTk5NjE4NTMwMjczfV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M536.594,366.6L536.594,372.233C536.594,377.867,536.594,389.133,544.883,398.65C553.172,408.168,569.751,415.935,578.04,419.819L586.329,423.703" id="my-svg-L_LEDGER_LENSI_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_LEDGER_LENSI_0" data-points="W3sieCI6NTM2LjU5Mzc1LCJ5IjozNjYuNTk5OTk0NjU5NDIzOH0seyJ4Ijo1MzYuNTkzNzUsInkiOjQwMC4zOTk5OTM4OTY0ODQ0fSx7IngiOjU4OS45NTEyNDk2MjYyMTg2LCJ5Ijo0MjUuMzk5OTkzODk2NDg0NH1d" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M661.023,492L661.023,496.167C661.023,500.333,661.023,508.667,661.023,516.333C661.023,524,661.023,531,661.023,534.5L661.023,538" id="my-svg-L_LENSI_FINDING_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_LENSI_FINDING_0" data-points="W3sieCI6NjYxLjAyMzQzNzUsInkiOjQ5MS45OTk5OTIzNzA2MDU0N30seyJ4Ijo2NjEuMDIzNDM3NSwieSI6NTE2Ljk5OTk5MjM3MDYwNTV9LHsieCI6NjYxLjAyMzQzNzUsInkiOjU0MS45OTk5OTIzNzA2MDU1fV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M785.453,375.4L785.453,379.567C785.453,383.733,785.453,392.067,777.164,400.117C768.875,408.168,752.296,415.935,744.007,419.819L735.718,423.703" id="my-svg-L_RESOLVER_LENSI_0" class="edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_RESOLVER_LENSI_0" data-points="W3sieCI6Nzg1LjQ1MzEyNSwieSI6Mzc1LjM5OTk5Mzg5NjQ4NDR9LHsieCI6Nzg1LjQ1MzEyNSwieSI6NDAwLjM5OTk5Mzg5NjQ4NDR9LHsieCI6NzMyLjA5NTYyNTM3Mzc4MTQsInkiOjQyNS4zOTk5OTM4OTY0ODQ0fV0=" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/><path d="M661.023,608.6L661.023,612.767C661.023,616.933,661.023,625.267,592.271,638.45C523.52,651.633,386.016,669.667,311.015,687.163C236.015,704.66,223.519,721.62,217.271,730.1L211.023,738.58" id="my-svg-L_FINDING_GATES_0" class="edge-thickness-normal edge-pattern-dotted edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_FINDING_GATES_0" data-points="W3sieCI6NjYxLjAyMzQzNzUsInkiOjYwOC41OTk5OTA4NDQ3MjY2fSx7IngiOjY2MS4wMjM0Mzc1LCJ5Ijo2MzMuNTk5OTkwODQ0NzI2Nn0seyJ4IjoyNDguNTExNzE4NzUsInkiOjY4Ny42OTk5ODkzMTg4NDc3fSx7IngiOjIwOC42NDk3NDk4NzMzNDk5OCwieSI6NzQxLjc5OTk4Nzc5Mjk2ODh9XQ==" data-look="classic" marker-end="url(#my-svg_flowchart-v2-pointEnd)"/></g><g class="edgeLabels"><g class="edgeLabel"><g class="label" data-id="L_CRON_PF_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel"><g class="label" data-id="L_PF_RUN_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel"><g class="label" data-id="L_RUN_APPLY_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel"><g class="label" data-id="L_APPLY_GATES_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel"><g class="label" data-id="L_GATES_MERGE_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel"><g class="label" data-id="L_TAIL_EVENT_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel"><g class="label" data-id="L_EVENT_LEDGER_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel"><g class="label" data-id="L_LEDGER_LENSI_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel"><g class="label" data-id="L_LENSI_FINDING_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel"><g class="label" data-id="L_RESOLVER_LENSI_0" transform="translate(0, 0)"><text y="-10.1" text-anchor="middle"><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"/></text></g></g><g><rect class="background" style="stroke: none"/></g><g class="edgeLabel" transform="translate(433.84693, 663.39369)"><g class="label" data-id="L_FINDING_GATES_0" transform="translate(0, -28.099998474121094)"><g><rect class="background" style="" x="-95.828125" y="-1" width="191.65625" height="58.19999694824219"/><text y="-10.1" text-anchor="middle" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em" text-anchor="middle"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">operator</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> adds</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> an</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> entry</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em" text-anchor="middle"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">whose</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> name:</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> matches</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> the</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="2.1em" dy="1.1em" text-anchor="middle"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">bucket</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> →</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> PR</tspan></tspan></text></g></g></g></g><g class="nodes"><g class="node default" id="my-svg-flowchart-CRON-0" data-look="classic" transform="translate(132.68359375, 207.89999771118164)"><rect class="basic label-container" style="" x="-86.40625" y="-33.29999923706055" width="172.8125" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">cron</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">09:00</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> UTC</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> daily</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-PF-1" data-look="classic" transform="translate(132.68359375, 333.2999954223633)"><rect class="basic label-container" style="" x="-81.59375" y="-33.29999923706055" width="163.1875" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">audit-prefilter</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">--max=10</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-RUN-3" data-look="classic" transform="translate(132.68359375, 458.6999931335449)"><rect class="basic label-container" style="" x="-85.171875" y="-33.29999923706055" width="170.34375" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">audit-run-entry</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">grounded</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> LLM</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-APPLY-5" data-look="classic" transform="translate(132.68359375, 575.299991607666)"><rect class="basic label-container" style="" x="-70.84375" y="-33.29999923706055" width="141.6875" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">audit-apply</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">--open-pr</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-GATES-7" data-look="classic" transform="translate(190.59765625, 766.2999877929688)"><rect class="basic label-container" style="" x="-67.1328125" y="-24.5" width="134.265625" height="49"/><g class="label" style="" transform="translate(0, -9.5)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">5</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> PR</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> gates</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-MERGE-9" data-look="classic" transform="translate(190.59765625, 874.0999870300293)"><rect class="basic label-container" style="" x="-92.9609375" y="-33.29999923706055" width="185.921875" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">human</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> merge</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">→</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> VERSION</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> bump</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-TAIL-10" data-look="classic" transform="translate(536.59375, 66.29999923706055)"><rect class="basic label-container" style="" x="-90.6171875" y="-33.29999923706055" width="181.234375" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">gap-signal-tail</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">89</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> pipeline</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> steps</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-EVENT-11" data-look="classic" transform="translate(536.59375, 207.89999771118164)"><rect class="basic label-container" style="" x="-111.1875" y="-33.29999923706055" width="222.375" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">scaffold</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> observe</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> event</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">knowledge_gap_signal</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-LEDGER-13" data-look="classic" transform="translate(536.59375, 333.2999954223633)"><rect class="basic label-container" style="" x="-76.09375" y="-33.29999923706055" width="152.1875" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">ledger</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">activity.jsonl</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-LENSI-15" data-look="classic" transform="translate(661.0234375, 458.6999931335449)"><rect class="basic label-container" style="" x="-83.65625" y="-33.29999923706055" width="167.3125" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">Lens</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> I</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">90-day</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> window</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-FINDING-17" data-look="classic" transform="translate(661.0234375, 575.299991607666)"><rect class="basic label-container" style="" x="-56.3359375" y="-33.29999923706055" width="112.671875" height="66.5999984741211"/><g class="label" style="" transform="translate(0, -18.299999237060547)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">finding</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">P1</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> /</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> P2</tspan></tspan></text></g></g></g><g class="node default" id="my-svg-flowchart-RESOLVER-18" data-look="classic" transform="translate(785.453125, 333.2999954223633)"><rect class="basic label-container" style="" x="-122.765625" y="-42.099998474121094" width="245.53125" height="84.19999694824219"/><g class="label" style="" transform="translate(0, -27.099998474121094)"><rect/><g><rect class="background" style="stroke: none"/><text y="-10.1" style=""><tspan class="text-outer-tspan row" x="0" y="-0.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">3-tier</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> --knowledge-root</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">resolver</tspan></tspan><tspan class="text-outer-tspan row" x="0" y="2.1em" dy="1.1em"><tspan font-style="normal" class="text-inner-tspan" font-weight="normal">suppresses</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> covered</tspan><tspan font-style="normal" class="text-inner-tspan" font-weight="normal"> topics</tspan></tspan></text></g></g></g></g></g></g><defs><filter id="my-svg-drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><defs><filter id="my-svg-drop-shadow-small" height="150%" width="150%"><feDropShadow dx="2" dy="2" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><linearGradient id="my-svg-gradient" gradientUnits="objectBoundingBox" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" stop-color="hsl(0, 0%, 83.3333333333%)" stop-opacity="1"/><stop offset="100%" stop-color="hsl(0, 0%, 88.9215686275%)" stop-opacity="1"/></linearGradient></svg>
@@ -0,0 +1,3 @@
1
+ {
2
+ "diagram-0": "c08617e8996ef893"
3
+ }