ID-132 TECH ADDENDUM — reference-agent mapping + {132.14} G-VIEWER lift-and-shift + {132.5}/{132.6} retro-check
TECH ADDENDUM — the reference agents are now readable
Section titled “TECH ADDENDUM — the reference agents are now readable”Status:
DRAFT — 07/07/2026.A spec-repair addendum to{132.2}TECH, authored by a FRESH Planner after the owner forked Google’sknowledge-catalogrepo locally. It resolves three things the base TECH could not, because at authoring time thereference_agentwas believed non-vendored (TECH.md:60-64): (1) a per-agent mapping of the four reference agents onto the ID-132/133/134/135 surface; (2) the{132.14}G-VIEWER escalation (S451 — “lift-and-shift with nothing to lift”), now a real lift-and-shift because the source viewer exists and is readable; (3) a retro-check of the two already-shipped slices ({132.5}agent loop,{132.6}resource_uri + frontmatter) against the real reference source they were built blind of.Scope boundary. This addendum does NOT re-open ratified behaviour (PRODUCT BIs) or the base TECH’s producer architecture. It supplies the viewer §-section the base TECH deferred (“a separate TS surface (§Viewer)”, TECH.md:154 / TECH.md:571) but never wrote, plus mapping + retro-check findings. DRs in force and honoured: DR-016 (bundle = client-owned git repo; human edits are producer overrides), DR-018 (producer trigger chained off a successful walk), DR-019 (documented OKF superset; ISO-8601 timestamps), DR-027 (materialised effective ontology ships in the bundle).
De-identification: the first ingest corpus is “the first client” throughout.
Context — code-intelligence orientation (verbatim; Checker: confirm this ran)
Section titled “Context — code-intelligence orientation (verbatim; Checker: confirm this ran)”The reference source is now readable at the owner’s local fork (read-only for the producer wave):
GoogleCloudPlatform/knowledge-catalog → okf/, samples/, toolbox/. This does not overturn the
base TECH’s empirical-verification scope note (TECH.md:482-491): we still re-author the protocol
natively on the Anthropic tool-use surface (the reference is Google ADK + Gemini) — but the source is
now a concrete lift-and-shift reference for the viewer and a retro-check oracle for the shipped slices.
Orientation performed (07/07/2026):
- Reference producer read in full —
okf/src/reference_agent/:agent.py(ADKAgent+FunctionTool,DEFAULT_MODEL="gemini-flash-latest"),runner.py(ReferenceRunner: per-conceptenrich_conceptBQ pass →run_web_pass→regenerate_indexes),cli.py(theenrichandvisualizesubcommands),tools/{bundle_tools,source_tools,web_tools,context}.py,bundle/{document,paths,index,synthesizer}.py,sources/base.py(theSourceABC),prompts/{reference_instruction,web_ingestion_instruction}.md, andviewer/(generator.py+templates/viz.html+static/viz.{css,js}— the viewer DOES exist). - Shipped slices read via
git show—{132.5}commit9b1e876d(producer/agent_loop.py, worktreeagent-a87ac7cd56940fc7c) and{132.6}commit609462e4(producer/resource_uri.py+producer/frontmatter.py, worktreeagent-a9d853494ae08b57c), each read against the real reference tool contracts +bundle/document.py. - Note (unrelated stale citation, non-blocking):
okf-record-model-v3.mdis cited throughout PRODUCT/TECH but is absent from the docs-site checkout (flagged in the{132.14}S451 escalation too). Not this addendum’s to fix; surfaced for the Orchestrator.
Part 1 — The four reference agents mapped
Section titled “Part 1 — The four reference agents mapped”| # | Agent (path) | What it is (loop / tools / output) | Maps onto ID-132 producer | Maps onto ID-133 / 134 / 135 | Ignore |
|---|---|---|---|---|---|
| i | okf/src/reference_agent | THE port source. ADK Agent+Runner (no hand-rolled loop); two agents (build_bq_agent, build_web_agent); tools list_concepts / read_concept_raw / sample_rows / read_existing_doc / write_concept_doc / fetch_url; 2-pass enrich_concept→run_web_pass→regenerate_indexes; output = a markdown OKF bundle (declare_file-shaped writes) + a self-contained HTML viewer/. | Nearly all of it, 1:1. agent_loop ({132.5}), Source adapter ({132.4}), 2-pass ({132.8}/{132.9}), resource:/frontmatter ({132.6}), validator gate ({132.7} ← bundle_tools.write_concept_doc guards), bundle-writer+index/log ({132.10} ← bundle/index.py+synthesizer.py), viewer ({132.14} ← viewer/). | ID-133: no ontology exists in the source (validator is only required-key + shape). ID-134: bundle-repo shape. ID-135: none. | Gemini/ADK harness; sources/bigquery.py; web/fetcher.py (we gate to a local corpus, TECH.md:235-243). |
| ii | samples/discovery | ADK LlmAgent (Gemini via Vertex); one tool knowledge_catalog_search; prompt = decompose → ≤3 query variations + baseline → parallel search → merge → rerank; output = reranked entry names (chat), no files. | Not the producer. Owner intent (de-couple from Knowledge Catalog) → a generic semantic-search agent over OUR store: swap the one tool’s body to record_embeddings hybrid_search. This is a future retrieval surface (the BI-24/BI-25 RAG-consumer / an MCP search tool), NOT an ID-132 slice. | ID-133: the “Predicate Reference Table” (SKILL.md:139-169) is a weak controlled-vocab precedent only. ID-134/135: none. | Dataplex CatalogServiceClient, the predicate table, GOOGLE_CLOUD_PROJECT path assumptions. Reusable = the decompose/rerank prompt pattern, source-agnostic. |
| iii | toolbox/enrichment/src | ADK-JS (@google/adk, gemini-2.5-flash, Vertex); InMemoryRunner.runEphemeral; tools = update_documentation (write-back) + MCP toolsets + skills; bundled md/ MCP server exposes list_fileset_contents/search_fileset_contents/read_fileset_file; output = markdown written back into a Dataplex overview aspect. | Confirms the Pass-2 MarkdownFileset lift already noted (TECH.md:235-243): src/tools/md/fileset.ts safePath + list/read/search is the framework-agnostic local-corpus reader for {132.9}. update_documentation ≈ reference write_concept_doc (write-sink shape). | ID-133: none. ID-134: none. ID-135: the ADK-JS thought-stream trace (command.ts:94-109) is a debug UI only, not a review surface. | patchadk.ts/patchpb.ts (ADK-JS/protobuf/bun-compile hacks — irrelevant to Anthropic/Python); kcmd/Dataplex updateEntry; Vertex wiring. |
| iv | samples/enrichment/src | ADK-Python LlmAgent (gemini-3.1-pro-preview frontmatter-driven) + InMemoryRunner.run_async; 3-stage batch download → enrich → publish; tool update_table; fileskb FastMCP server (list/read/search over a markdown KB); output = per-table markdown snapshot → published back as the Dataplex overview aspect. | The download→enrich→publish staging is a precedent for our git knowledge-sync ({132.12}): the local snapshot is the working tree; “publish” is the commit. fileskb = a second MarkdownFileset-equivalent for {132.9}. Per-table single-pass enrich ≈ Pass-1 per-concept. | ID-133: none. ID-134: the snapshot/publish split ≈ produce-then-publish gating. ID-135: human review via git diff --no-index (README.md:79-82) is the concrete precedent for the DR-016 diff-review bridge. | Dataplex catalog.py/snapshot.py, BigQuery create_data.py, GOOGLE_GENAI_USE_VERTEXAI. |
Cross-cutting takeaways.
- No reference agent has an ontology. ID-133’s closed 12-entity/10-relation register + validator
(DR-027: materialised effective ontology ships in-bundle) is genuinely net-new — the four agents’
“validators” are required-key/shape checks (
bundle/document.py:REQUIRED_FRONTMATTER_KEYS) and soft prompt rubrics (“good documentation”), not a semantic linter. Do not expect to lift ID-133. - No reference agent has a real quality-gate or a review surface — only path-traversal guards
(
fileskb_safe_path,md/fileset.tssafePath) andgit diffreview. ID-135’s accept/edit/reject bridge (DR-016/DR-013) is net-new; thegit diff --no-indexposture is the nearest precedent. - Only
okf/reference_agentis a true lift source for ID-132; the other three are enrichment-pattern confirmations (theMarkdownFilesetreader, the write-back tool shape, the produce-then-publish split) and one future-search precedent (discovery). This matches TECH.md’s v3 §7.2 split.
Part 2 — {132.14} G-VIEWER: the lift-and-shift TECH §Viewer (the escalation fix)
Section titled “Part 2 — {132.14} G-VIEWER: the lift-and-shift TECH §Viewer (the escalation fix)”Finding: a viewer exists → lift-and-shift, native-implementation branch NOT needed
Section titled “Finding: a viewer exists → lift-and-shift, native-implementation branch NOT needed”okf/src/reference_agent/viewer/ is a real, self-contained bundle viewer. The S451 escalation
(“nothing to lift”) is resolved by the owner’s fork (resolution path (c) in the escalation). This
section is the §Viewer the base TECH deferred.
Source inventory (what we lift FROM):
viewer/generator.py—generate_visualization(bundle_root, out): walks*.md(skipsindex.md), parses frontmatter+body viaOKFDocument.parse, extracts internal.mdlinks (_extract_links), builds a graph{nodes, edges, bodies, types, palette}(_build_graph), inlines into one HTML. Node ={id, label, type, description, resource, tags, color, size}; edge = a resolved internal link; backlinks derived client-side.viewer/templates/viz.html+static/viz.js— a two-pane UI: Cytoscape force-graph (left ~60%) + a detail panel (right ~40%) rendering the type-chip, title, id, a frontmatter<dl>(description/resource/tags), themarked-rendered body, and a “Cited by” backlinks list. Controls: search (title/id/tag), type filter, layout selector (cose/concentric/breadthfirst/circle/ grid), reset. Internal.mdlinks rewrite to in-app node navigation (rewriteInternalLinks).static/viz.css— hardcoded slate palette + a per-type node palette (_TYPE_PALETTE).
The two material reframes (why this is not a byte-for-byte lift)
Section titled “The two material reframes (why this is not a byte-for-byte lift)”Reframe A — static Python HTML generator → authed Next.js React surface. The reference is a
build-time Python script emitting one HTML file with CDN-loaded cytoscape/marked. Our target is a
runtime, authed app route under our CSP (no external CDNs). So: (1) port the graph-derivation —
generator.py _walk_concepts/_extract_links/_build_graph → a TS module lib/okf/bundle-graph.ts
returning the SAME {nodes, edges, bodies, types} shape; (2) npm the libs — cytoscape +
react-markdown (or marked) as net-new bundled dependencies (FLAG: Executor adds them; not CDN);
(3) semantic tokens replace every literal colour in viz.css/_TYPE_PALETTE/viz.js style block.
Reframe B — the viewer’s PRIMARY data is the BUNDLE, not api.*. The reference viewer reads the
bundle directory only; it never touches a database (the resource: field renders as a plain external
link, viz.js:157-169). The existing {132.14} details say the viewer “reads
api.record_embeddings/api.q_a_pairs/api.source_documents” — that is the base TECH’s assumption
(TECH.md:168-178) and is only correct for a secondary lane. Corrected posture:
- Primary lane — the bundle graph (NO
api.*). The concept graph (nodes/edges/bodies),index.mdprogressive-disclosure nav, andlog.mdhistory are all read from the client-owned bundle (BI-14). For the first client the read source is the synced copy D10 already keeps outside the main repo for integration testing (TECH.md:373-379 coordination note; do NOT invent a new hosting mechanism — bundle hosting is ID-134’s call). A server route reads that working tree and returns the graph JSON. - Secondary lane — resource resolution (the ONE place
api.*bites). Following aresource: canonical://source_documents/<uuid>orcanonical://reference_items/<uuid>pointer resolves the live record viaapi.source_documents/api.reference_items(ID-131’s G-API surface, inherited; no ID-132 api work). This is an enhancement, gated behind a click — not the graph’s data source.canonical://q_a_pairs?scope_tag=…(BI-8) resolves toapi.q_a_pairsfiltered, never a row.
{132.14} details CORRECTION (amendment intent below): replace “reads
api.record_embeddings/api.q_a_pairs/api.source_documents” as the primary posture with “renders the bundle graph read server-side from the client bundle;api.*(via ID-131 G-API) is the secondary resource-resolution lane only.”record_embeddingsis NOT a viewer read at all (it is the producer’s write target, BI-25) — drop it from the viewer’s api list.
Target TS surface (implementable spec)
Section titled “Target TS surface (implementable spec)”Route (authed; NOT in proxy.ts publicRoutes): app/okf/[bundleId]/page.tsx (client component
shell) backed by a server loader/route app/api/okf/[bundleId]/graph/route.ts. getAuthorisedClient()
→ check auth.success, route failure via authFailureResponse(auth). bundleId selects which client
bundle (first client = the synced Platform/first-client copy).
Data (TanStack Query only; keys/fetchers in lib/query/okf.ts):
useBundleGraph(bundleId)→ GET…/graph→{nodes, edges, bodies, types}(the portedbundle-graph.tsoutput). One fetch; the bundle fits one context window (BI-24) so wholesale is fine.useBundleNav(bundleId)→ the parsedindex.mdthemes→concepts tree (progressive disclosure, below).useBundleLog(bundleId)→log.mdrendered read-only.useResource(uri)(lazy, on pointer click) →api.source_documents/api.reference_items/api.q_a_pairs.
Component structure (port of viz.html/viz.js; semantic tokens throughout):
<BundleViewer>— three-region layout: nav rail + graph + detail.<BundleNav>— NATIVE ADDITION (see progressive disclosure). Collapsible themes→concepts.<ConceptGraph>— Cytoscape canvas; theviz.jsstyle block re-expressed with semantic tokens; the layout/search/type-filter/reset controls;_TYPE_PALETTEre-mapped to OUR concept types{topic, product, company, certification, case_study, metric, dataset, playbook}via semantic tokens.<ConceptDetail>— type-chip, title, id, frontmatter<dl>(description / resource / tags), thereact-markdown-rendered body, and the “Cited by” backlinks list. Internal.mdlinks → in-app node focus (rewriteInternalLinksport). Aresource:pointer renders as a chip that lazily resolves viauseResource(secondary lane).<BundleLog>— NATIVE ADDITION:log.mdread-only, reverse-chronological (ISO-8601 dates, DR-019).
Operationally defining “progressive disclosure” for index.md
Section titled “Operationally defining “progressive disclosure” for index.md”The reference viewer skips index.md (generator.py _walk_concepts continues on _INDEX_NAME),
so the graph alone does NOT satisfy the {132.14} testStrategy (“renders concepts + index.md
progressive disclosure + log.md”). Two native additions close the gap. Progressive disclosure is
defined as a three-level disclosure of the index.md structure (which PRODUCT BI-5/BI-11 define as
“themes → concepts, with one-line descriptions”):
- Level 1 — themes (the ~17 BID-RESPONSE-INDEX
##/###theme headings, PRODUCT.md:88-92): the<BundleNav>initial state shows theme headings only, collapsed. - Level 2 — concepts under a theme: expanding a theme reveals its concept entries as
title — one-line descriptionrows (thedescriptionfrontmatter, verbatim per the reference’sindex.mdconvention,reference_instruction.md:23-25). - Level 3 — the concept: clicking a concept entry focuses its graph node AND opens
<ConceptDetail>(full body). This is the disclosure the flat graph cannot express.
Parsing: index.md is producer-generated ({132.10} G-BUNDLE regenerate_indexes()), so its structure
is known — a lib/okf/parse-index.ts reads its theme (##/###) → concept-link ([title](path.md) — description) tree. If {132.10} has not landed, <BundleNav> falls back to grouping graph nodes by
type (still a two-level disclosure) — so the viewer is not hard-blocked on {132.10}.
Quality bars (inherited)
Section titled “Quality bars (inherited)”Semantic design tokens ONLY (map every viz.css literal + the type palette); auth.success +
authFailureResponse(auth); getAuthorisedClient()/sb()/tryQuery() for the secondary api.* lane;
no barrel re-exports (direct file imports); TanStack Query ONLY (keys in lib/query/); bun run test
(Vitest; never bun test); behaviour-first per test-philosophy.md. Code-intel (TS): gitnexus impact
upstream before touching any existing symbol; ast-dataflow column-reads to pin any api.* consumer;
gitnexus detect_changes pre-commit. De-identify: “the first client”.
TestStrategy (refined for {132.14})
Section titled “TestStrategy (refined for {132.14})”bun run test (Vitest): the viewer renders the concept graph from a fixture bundle (nodes+edges from
internal .md links; backlinks correct); <BundleNav> shows index.md themes→concepts three-level
disclosure; <BundleLog> renders log.md read-only; a resource: click resolves via TanStack Query
against api.* (not public.*); NO record_embeddings read from the viewer; semantic tokens only;
an auth failure routes via authFailureResponse(auth).
Part 3 — Retro-check of the two shipped slices (findings only; no code edits)
Section titled “Part 3 — Retro-check of the two shipped slices (findings only; no code edits)”Both slices were built from the base TECH’s functional description, blind of the real source. Read
against it, both are faithful to the KH-adapted design and reference-correct where the reference
applies; the findings below are (a) reference semantics the functional-description port could not see,
and (b) one robustness gap. Packet format {location, severity, description}.
{132.5} producer/agent_loop.py (commit 9b1e876d)
Section titled “{132.5} producer/agent_loop.py (commit 9b1e876d)”The reference has no hand-rolled loop — it delegates to ADK Runner.run (runner.py:212). So there
is no line-by-line loop to lift; the shipped run_tool_use_loop is a clean, correct Anthropic
re-implementation, and its reuse of _anthropic_retry/_guard_not_truncated/ANTHROPIC_MODEL is exactly
per TECH. Findings are about the tool contract, not the loop mechanics.
{location: agent_loop.py:207-208 (terminal-turn = concept body); wiring lands in {132.8}},{severity: MEDIUM}— Concept-body provenance is INVERTED vs the reference. In the reference the concept doc is delivered by the agent callingwrite_concept_doc(concept_id, frontmatter, body)as its terminal action (reference_instruction.md:15-16: “callwrite_concept_docexactly once. Do not call any tools after that”) — the body lives in the tool-call arguments. The shipped loop instead treats a non-tool_usestop_reasonas “the final concept body” (the body lives in the terminal text turn). This is a legitimate KH design change (KH writes via cocoindexdeclare_file, not an agent tool — TECH §“producer at a glance”), but it means{132.8}must NOT liftreference_instruction.mdverbatim — the reference prompt instructs the model to terminate by calling a write tool, which the KH loop would treat as a never-endingtool_use.{132.8}’s Pass-1 prompt must instruct the model to emit the final frontmatter+body as terminal text. Flagged so the prompt port doesn’t silently inherit the wrong terminal contract.{location: agent_loop.py:116 (PASS1_TOOLS = [read_concept_raw, sample_rows]); {132.8} scope},{severity: MEDIUM}— Pass-1 tool set is narrower than the reference’s five tools. Referencebuild_bq_agent(agent.py:32-38) registerslist_concepts,read_concept_raw,sample_rows,read_existing_doc,write_concept_doc.{132.5}ships two (correctly, per its brief). But the reference useslist_conceptsfor cross-linking (reference_instruction.md:53-64, workflow step 4 — “weave cross-links”) which is exactly BI-9 concept→concept citation by path. If{132.8}does not add alist_conceptstool (or inject the concept catalogue into the Pass-1 prompt), Pass-1 cannot cross-link and BI-9 is under-served. (read_existing_docandwrite_concept_docare correctly omitted — KH replaces “refine existing doc” with cocoindex memo + the DR-016 override re-apply, and writes viadeclare_file.) Amendment intent for{132.8}below.{location: agent_loop.py:188-229 (executor error posture)},{severity: LOW}— No softis_errorrecovery channel. The reference tools return{"error": …}dicts as normal tool_results so the model self-corrects (e.g.write_concept_docvalidation failure →bundle_tools.py:100-108tells the model to re-call with complete frontmatter; the web-pass augmentation guard,bundle_tools.py:110-155, does the same). The shipped loop propagates executor exceptions (kills the loop) — correct for Pass-1 DB reads (a genuine DB failure SHOULD escalate, per the KH “don’t paper over” posture) — and_stringify_tool_resultDOESjson.dumpsa returned dict, so a soft-error dict IS surfaced to the model. The only gap: the loop never sets Anthropic’sis_error: trueon thetool_resultblock. Note for{132.9}(Pass-2 write/validate tools): return soft-error dicts (do not raise) for model-recoverable failures, and setis_errorso the model treats them as retryable — otherwise the reference’s self-correction loop is lost.{location: agent_loop.py:196-205 (system-only cache; incremental caching)},{severity: LOW}— Prompt-cache posture caches the system block only. Not a reference divergence (the reference is Gemini, no Anthropic caching). But on a multi-turn tool-use loop the growingmessagesarray is re-processed uncached each turn. Enhancement: add acache_controlbreakpoint on the last content block of the most recent turn (Anthropic allows up to 4) to cache the conversation prefix incrementally. Efficiency only; not correctness.{location: agent_loop.py:207-208 (terminal text extraction); {132.8}},{severity: LOW}— withtool_choice={"type":"auto"}a terminal turn may carry multipleTextBlocks (narration + body).{132.8}’s body extraction must concatenate allTextBlocks, not just the first. Minor note.
{132.6} producer/resource_uri.py + producer/frontmatter.py (commit 609462e4)
Section titled “{132.6} producer/resource_uri.py + producer/frontmatter.py (commit 609462e4)”resource_uri.py has no reference analogue — canonical:// is a KH invention (the reference’s
resource is a plain BigQuery REST URI set by the agent). It is structurally sound against BI-6/7/8/9/10
(the build_per_row_uri allow-list makes the q_a_pairs master un-emittable; build_q_a_pairs_query_uri
has no uuid parameter at all). No reference-divergence findings. frontmatter.py maps to the reference’s
bundle/document.py:
{location: frontmatter.py:149-167 (_needs_quoting/_yaml_scalar hand-rolled emitter)},{severity: LOW-MEDIUM}— The hand-rolled YAML scalar emitter under-quotes YAML-type-ambiguous plain scalars. The reference serialises viayaml.safe_dump(sort_keys=False, allow_unicode=True)(document.py:50-52), which quotes any string that would re-parse as a non-string on reload (true/false/null/yes/no, bare numbers, date/timestamp-looking values). The shipped_needs_quotingonly quotes on leading special chars,": ", trailing:, and" #"— so a concept titled"NO"or a metric titled"99.9", and notably the unquotedtimestamp: 2026-07-07T12:00:00Z(rendered raw atfrontmatter.py:177), will re-parse under a YAML 1.1 loader (PyYAML — which the referenceOKFDocument.parseand any lifted viewer use) as a bool/number/datetime, not a string — a silent round-trip type drift. DR-019’s stated goal is “a strict OKF consumer must machine-parse timestamps” (PRODUCT.md:223); an unquoted ISO timestamp IS machine-parseable, so this is low-severity in the common case, but the title/description edge values are a real correctness gap. Fix options: (a) extend_needs_quotingwith a YAML 1.1 type-ambiguity check (bool/null/number/timestamp regex) and quotetimestampexplicitly; or (b) pinpyyamlinrequirements.txtand useyaml.safe_dumpas the reference does (the commit hand-rolled specifically because PyYAML is unpinned). Recommend folding into{132.7}G-VALIDATE, which round-trip-parses frontmatter anyway (so it will detect the drift), OR a tiny{132.6}follow-up. Amendment intent below.{location: frontmatter.py:170-187 (key order) vs bundle_tools.py:15 _PREFERRED_KEY_ORDER},{severity: NIT / no action}— the shipped order istype, title, description, timestamp, resource, tags; the reference preferstype, resource, title, description, tags, timestamp. YAML mappings are unordered for a conformant consumer, so this is cosmetic. No action.{location: frontmatter.py (scope) vs bundle_tools.py:110-155 augmentation guard},{severity: informational — forward note for {132.9}/{132.7}/{132.10}}— the reference’swrite_concept_doccarries a web-pass augmentation guard (refuses a Pass-2 write that shrinks a BigQuery-Table doc’s# Schemafield set or# Citationscount — “augment, not replace”). KH’sdeclare_filewrite path has no equivalent, and{132.6}(frontmatter/resource only) is not where it belongs. This semantic underpins BI-17 (point-not-copy), BI-22 (no silent drop), and DR-016/BI-27 (human-edit overrides). It must be re-implemented in{132.7}G-VALIDATE and/or the{132.9}Pass-2 /{132.12}git-sync reconcile — otherwise Pass-2 can silently clobber Pass-1’s record-grounded Schema/Citations. Flagged so it is not lost with the framework.
No fix subtasks warranted on {132.5} itself — it is correctly scoped and reference-correct for the
KH contract; its findings are constraints on {132.8}/{132.9}. {132.6} has one low-medium robustness
gap (YAML quoting) best folded into {132.7}.
Execution host + async-architecture boundary (explicitly out of scope)
Section titled “Execution host + async-architecture boundary (explicitly out of scope)”The producer’s execution host is ASSUMED to be co-located with the ingest pipeline
(scripts/cocoindex_pipeline/) as a second flow entry point, triggered chained off a successful ingest
walk with source_documents deltas (DR-018, {132.16} G-TRIGGER), with manual operator invocation
retained. This addendum does not answer how the producer runs as a headless/async worker — the
Vercel-based async worker architecture (queues/workflows) for the future headless-agent fleet
(Goose → id-71 / id-104) is a separate, parallel Planner’s remit. Pointer, not answer: when that
architecture lands, {132.16}’s trigger and the viewer’s bundle-read source may re-home onto it; nothing
in this addendum presumes a synchronous host beyond the DR-018 walk-chain.
Subtask-amendment intents (for the Orchestrator; NO ledger writes here)
Section titled “Subtask-amendment intents (for the Orchestrator; NO ledger writes here)”{132.14}G-VIEWER — DE-ESCALATE + re-scope to lift-and-shift. The S451 escalation is resolved (source viewer exists; owner fork readable). Replace thedetailsdata-posture line: primary lane = the bundle graph read server-side from the client bundle (portedgenerator.py→lib/okf/ bundle-graph.ts);api.*(ID-131 G-API) is the secondary resource-resolution lane only; droprecord_embeddingsfrom the viewer’s api list (it is a producer write target, not a viewer read). Add the two native additions (index.md three-level progressive-disclosure<BundleNav>; log.md read-only<BundleLog>) and the net-new deps (cytoscape+ a markdown renderer, bundled not CDN). Routeapp/okf/[bundleId]/page.tsx+ loaderapp/api/okf/[bundleId]/graph/route.ts. Adopt the refined testStrategy above. Soft-depends on{132.10}forindex.md(falls back to type-grouping if absent); Task-level dep on ID-131 G-API for the secondary lane only.{132.8}G-PASS1 — amenddetails: (a) do NOT liftreference_instruction.mdverbatim — author a Pass-1 prompt whose terminal contract is “emit frontmatter+body as terminal TEXT” (the loop treats awrite-tool call as non-terminal); (b) add alist_conceptstool (or inject the concept catalogue) so Pass-1 can cross-link concepts (BI-9); (c) concatenate ALL terminalTextBlocks when extracting the body.{132.6}/{132.7}— YAML quoting gap: fold a fix forfrontmatter.py’s under-quoting of YAML-type-ambiguous scalars (quotetimestamp; add a bool/null/number/date check) into{132.7}G-VALIDATE (which round-trip-parses anyway), or a tiny{132.6}follow-up. Prefer{132.7}.{132.7}G-VALIDATE +{132.9}G-PASS2 +{132.12}G-GITSYNC — forward note: re-implement the reference’s augmentation guard (never shrink record-grounded# Schema/# Citationson Pass-2 or on regeneration over a human-edited file) — the semantic behind BI-17/BI-22/DR-016-BI-27 that vanished with thewrite_concept_doctool.- Housekeeping (non-blocking): the
okf-record-model-v3.mdcitation is a dangling reference in PRODUCT/TECH (absent from the docs-site checkout) — Orchestrator to route (Curator/docs).