Skip to content

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’s knowledge-catalog repo locally. It resolves three things the base TECH could not, because at authoring time the reference_agent was 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-catalogokf/, 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 fullokf/src/reference_agent/: agent.py (ADK Agent + FunctionTool, DEFAULT_MODEL="gemini-flash-latest"), runner.py (ReferenceRunner: per-concept enrich_concept BQ pass → run_web_passregenerate_indexes), cli.py (the enrich and visualize subcommands), tools/{bundle_tools,source_tools,web_tools,context}.py, bundle/{document,paths,index,synthesizer}.py, sources/base.py (the Source ABC), prompts/{reference_instruction,web_ingestion_instruction}.md, and viewer/ (generator.py + templates/viz.html + static/viz.{css,js} — the viewer DOES exist).
  • Shipped slices read via git show{132.5} commit 9b1e876d (producer/agent_loop.py, worktree agent-a87ac7cd56940fc7c) and {132.6} commit 609462e4 (producer/resource_uri.py + producer/frontmatter.py, worktree agent-a9d853494ae08b57c), each read against the real reference tool contracts + bundle/document.py.
  • Note (unrelated stale citation, non-blocking): okf-record-model-v3.md is 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 producerMaps onto ID-133 / 134 / 135Ignore
iokf/src/reference_agentTHE 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_conceptrun_web_passregenerate_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).
iisamples/discoveryADK 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.
iiitoolbox/enrichment/srcADK-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.
ivsamples/enrichment/srcADK-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.

  1. 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.
  2. No reference agent has a real quality-gate or a review surface — only path-traversal guards (fileskb _safe_path, md/fileset.ts safePath) and git diff review. ID-135’s accept/edit/reject bridge (DR-016/DR-013) is net-new; the git diff --no-index posture is the nearest precedent.
  3. Only okf/reference_agent is a true lift source for ID-132; the other three are enrichment-pattern confirmations (the MarkdownFileset reader, 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.pygenerate_visualization(bundle_root, out): walks *.md (skips index.md), parses frontmatter+body via OKFDocument.parse, extracts internal .md links (_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), the marked-rendered body, and a “Cited by” backlinks list. Controls: search (title/id/tag), type filter, layout selector (cose/concentric/breadthfirst/circle/ grid), reset. Internal .md links 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-derivationgenerator.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 libscytoscape + 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.md progressive-disclosure nav, and log.md history 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 a resource: canonical://source_documents/<uuid> or canonical://reference_items/<uuid> pointer resolves the live record via api.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 to api.q_a_pairs filtered, 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_embeddings is NOT a viewer read at all (it is the producer’s write target, BI-25) — drop it from the viewer’s api list.

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 ported bundle-graph.ts output). One fetch; the bundle fits one context window (BI-24) so wholesale is fine.
  • useBundleNav(bundleId) → the parsed index.md themes→concepts tree (progressive disclosure, below).
  • useBundleLog(bundleId)log.md rendered 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; the viz.js style block re-expressed with semantic tokens; the layout/search/type-filter/reset controls; _TYPE_PALETTE re-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), the react-markdown-rendered body, and the “Cited by” backlinks list. Internal .md links → in-app node focus (rewriteInternalLinks port). A resource: pointer renders as a chip that lazily resolves via useResource (secondary lane).
    • <BundleLog>NATIVE ADDITION: log.md read-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”):

  1. Level 1 — themes (the ~17 BID-RESPONSE-INDEX ##/### theme headings, PRODUCT.md:88-92): the <BundleNav> initial state shows theme headings only, collapsed.
  2. Level 2 — concepts under a theme: expanding a theme reveals its concept entries as title — one-line description rows (the description frontmatter, verbatim per the reference’s index.md convention, reference_instruction.md:23-25).
  3. 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}.

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”.

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 calling write_concept_doc(concept_id, frontmatter, body) as its terminal action (reference_instruction.md:15-16: “call write_concept_doc exactly once. Do not call any tools after that”) — the body lives in the tool-call arguments. The shipped loop instead treats a non-tool_use stop_reason as “the final concept body” (the body lives in the terminal text turn). This is a legitimate KH design change (KH writes via cocoindex declare_file, not an agent tool — TECH §“producer at a glance”), but it means {132.8} must NOT lift reference_instruction.md verbatim — the reference prompt instructs the model to terminate by calling a write tool, which the KH loop would treat as a never-ending tool_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. Reference build_bq_agent (agent.py:32-38) registers list_concepts, read_concept_raw, sample_rows, read_existing_doc, write_concept_doc. {132.5} ships two (correctly, per its brief). But the reference uses list_concepts for 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 a list_concepts tool (or inject the concept catalogue into the Pass-1 prompt), Pass-1 cannot cross-link and BI-9 is under-served. (read_existing_doc and write_concept_doc are correctly omitted — KH replaces “refine existing doc” with cocoindex memo + the DR-016 override re-apply, and writes via declare_file.) Amendment intent for {132.8} below.
  • {location: agent_loop.py:188-229 (executor error posture)}, {severity: LOW}No soft is_error recovery channel. The reference tools return {"error": …} dicts as normal tool_results so the model self-corrects (e.g. write_concept_doc validation failure → bundle_tools.py:100-108 tells 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_result DOES json.dumps a returned dict, so a soft-error dict IS surfaced to the model. The only gap: the loop never sets Anthropic’s is_error: true on the tool_result block. Note for {132.9} (Pass-2 write/validate tools): return soft-error dicts (do not raise) for model-recoverable failures, and set is_error so 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 growing messages array is re-processed uncached each turn. Enhancement: add a cache_control breakpoint 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} — with tool_choice={"type":"auto"} a terminal turn may carry multiple TextBlocks (narration + body). {132.8}’s body extraction must concatenate all TextBlocks, 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 analoguecanonical:// 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 via yaml.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_quoting only quotes on leading special chars, ": ", trailing :, and " #" — so a concept titled "NO" or a metric titled "99.9", and notably the unquoted timestamp: 2026-07-07T12:00:00Z (rendered raw at frontmatter.py:177), will re-parse under a YAML 1.1 loader (PyYAML — which the reference OKFDocument.parse and 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_quoting with a YAML 1.1 type-ambiguity check (bool/null/number/timestamp regex) and quote timestamp explicitly; or (b) pin pyyaml in requirements.txt and use yaml.safe_dump as 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 is type, title, description, timestamp, resource, tags; the reference prefers type, 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’s write_concept_doc carries a web-pass augmentation guard (refuses a Pass-2 write that shrinks a BigQuery-Table doc’s # Schema field set or # Citations count — “augment, not replace”). KH’s declare_file write 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)”
  1. {132.14} G-VIEWER — DE-ESCALATE + re-scope to lift-and-shift. The S451 escalation is resolved (source viewer exists; owner fork readable). Replace the details data-posture line: primary lane = the bundle graph read server-side from the client bundle (ported generator.pylib/okf/ bundle-graph.ts); api.* (ID-131 G-API) is the secondary resource-resolution lane only; drop record_embeddings from 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). Route app/okf/[bundleId]/page.tsx + loader app/api/okf/[bundleId]/graph/route.ts. Adopt the refined testStrategy above. Soft-depends on {132.10} for index.md (falls back to type-grouping if absent); Task-level dep on ID-131 G-API for the secondary lane only.
  2. {132.8} G-PASS1 — amend details: (a) do NOT lift reference_instruction.md verbatim — author a Pass-1 prompt whose terminal contract is “emit frontmatter+body as terminal TEXT” (the loop treats a write-tool call as non-terminal); (b) add a list_concepts tool (or inject the concept catalogue) so Pass-1 can cross-link concepts (BI-9); (c) concatenate ALL terminal TextBlocks when extracting the body.
  3. {132.6}/{132.7} — YAML quoting gap: fold a fix for frontmatter.py’s under-quoting of YAML-type-ambiguous scalars (quote timestamp; 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}.
  4. {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/# Citations on Pass-2 or on regeneration over a human-edited file) — the semantic behind BI-17/BI-22/DR-016-BI-27 that vanished with the write_concept_doc tool.
  5. Housekeeping (non-blocking): the okf-record-model-v3.md citation is a dangling reference in PRODUCT/TECH (absent from the docs-site checkout) — Orchestrator to route (Curator/docs).