knowledgeflow / design-doc · v0.1 · 2026
Knowledge graph DITA MVP
KNOWLEDGEFLOW v0.1  ·  answers across documentation sets  ·  2026

KnowledgeFlow: Answer questions across documentation silos
from the links writers already maintain

Disclaimer. This is a portfolio design document. Google has not engaged, sponsored or endorsed this work. The sample content is adapted from the Cloud TPU and Cloud NAT documentation, which Google publishes under the Creative Commons Attribution 4.0 licence1. The adapted versions are modified from the originals. The sample questions, issues and pull requests are written for this document. Stakeholders are job roles, not real people. The two readers in §3 are fictional.

6
edge types read from
structure, with no model call
1
edge type proposed by Gemini,
used only with a label
0
answer steps delivered
without a checked source
Abstract

Product teams write Google's data center documentation. Each team keeps its own documentation set, and each set links well inside itself. Questions from employees often cross sets. In the 2024 Stack Overflow survey, 61% of professional developers spent more than 30 minutes a day searching for answers, and 30% said knowledge silos affected their productivity ten or more times a week2.

KnowledgeFlow is an agent that answers an employee's question with a cited path across documentation sets. It builds a knowledge graph from the structure that writers already maintain: DITA maps, relationship tables, keys, content references, cross-references and subject classifications. Gemini reads prose only to find mentions that have no link. Each edge it finds stays proposed until an information architect approves it.

Fixed checks decide whether an answer is grounded. Every step must cite a topic and the edge that reached it, and every value must match its source. When a step fails, KnowledgeFlow drops that step, says so, and opens a gap issue for writers. An approved edge becomes a relationship table row in the source, so the next build reads it without the model.

knowledge graphDITArelationship tablessubject schemedocs as codegroundingGeminiAgent Development KitFirestoreNetworkXhuman reviewCloud Run

§1 Client Brief

Google publishes documentation for its data center products and services. Two of those products are Cloud TPU (Tensor Processing Unit) accelerators and Cloud NAT (network address translation). Different teams write the two documentation sets, and each product publishes release notes.

This MVP uses three samples from the first two projects in this series. The Cloud TPU sample is the DITA set from MANIFEST, with its maps, keys and relationship tables3. The Cloud NAT sample is the MyST Markdown set from the Autonomous Author4. The third sample is the Cloud NAT release notes10. One set is still in DITA and one is already docs as code. That is the state of a team during a migration, and KnowledgeFlow reads both.

The samples are a good test because a real question crosses them. An engineer who creates a TPU VM without an external IP address, and then needs the internet, finds half the answer in the TPU docs and half in the Cloud NAT docs (§2.1). The published pages give the reference answer for each step.

TermMeaning in this documentExample
Documentation setThe topics that one team writes and publishes for one product.Cloud TPU docs; Cloud NAT docs
DITA mapA file that lists topics and their hierarchy.tpu.ditamap
Relationship tableA table in a map. Each row relates the topics referenced in its cells11.A task row joined to its concept and reference topics
Key and content referenceA key stores a value once. A content reference (conref) reuses an element. MANIFEST keeps both as MyST substitutions and includes3.tpu7x-chips-per-pod = 9,2165
Subject schemeA map that defines subjects, such as products and features, and their controlled terms12. Topics are classified with subject references13.Subject no-external-ip
Knowledge graphNodes (topics, values, subjects) joined by typed edges.configure-networking -[about]-> no-external-ip
Authored and proposed edgeAn authored edge comes from a line that a writer wrote. A proposed edge comes from Gemini and carries a label until a person approves it.about (authored); mentions (proposed)
Grounded answerAn answer where every step cites a topic and the edge that reached it, and every value appears in that topic.Figure 8
Gap issueA docs issue that records a step the graph could not answer, with the edge that is missing.Issue #58
Figure 1
System context: as-is state
CLOUD TPU DOCS CLOUD NAT DOCS RELEASE NOTES TPU docs team DITA · maps · keys Networking docs team MyST · Git Product teams dated entries Cloud TPU topics configure networking Cloud NAT pages overview · tune NAT Release notes new TIME_WAIT default Site search TPU pages only Site search NAT pages only Release notes page read by date no link ML engineer at Google searches each set in turn Support engineer answers from own notes asks
Each set is complete inside itself. The dashed red line is the gap. Nothing joins the TPU networking page to the Cloud NAT pages, so the reader or an expert makes the join by hand.

§2 Problem Statement

Writers link topics well inside a documentation set. A link across sets needs a writer who knows the other product. Site search covers one set at a time, and it returns pages, not the path between them. Employees fill the gap by asking colleagues, and 53% of professional developers say that waiting for answers disrupts their workflow2.

2.1 Where the path breaks

Figure 2 follows one real question through the published pages. Every step has an answer somewhere. One join between the steps is missing.

Figure 2
One question across the published pages: a TPU VM with no external IP address that needs the internet
StepWhere the answer isJoin from the step beforeStatus
1. Create a TPU VM without an external IP addressTPU docs, Configure networking and access: the --no-address or --internal-ips flag67StartStart
2. Reach Google APIs, such as Cloud StorageSame page: Private Google Access7Link on the same pageLinked
3. Reach a destination on the internet, such as a public package indexCloud NAT docs, Cloud NAT overview: Public NAT8No link from either TPU pageMissing
4. Check the timeout when connections dropCloud NAT docs, Tune NAT configuration9Same documentation set as step 3Same set
Sources: both versions of the TPU networking page, last updated 5 August 20266 and 9 September 20267, and the Cloud NAT overview8, checked on 19 October 2026.
Example from a live page
Both TPU networking pages explain why to keep a TPU VM on internal IP addresses, and how Private Google Access reaches Google APIs and services67. Neither page mentions Cloud NAT. The Cloud NAT overview says that Public NAT lets resources with no external IPv4 address connect to destinations on the internet8. A reader must already know the networking product to find the second half of the answer.
2.2 Why the current options fail
OptionWhat it doesWhat it missesResult
Site search for each setFinds pages inside one documentation set.Pages in other sets. The path between pages.One silo
Ask an expertA person who knows both products answers.Costs expert time, and the asker waits2. The answer stays in chat.Slow
Vector search over all docsFinds chunks with similar wording.Steps that use different words. In VaultRAG, a fuse replacement query missed the isolation procedure in the same SOP for this reason18.Misses joins
Graph built by a language modelGraphRAG uses a language model to extract a graph from every document15. LazyGraphRAG avoids the upfront summarisation cost16.Every edge is a model guess. The structure that writers already maintain is ignored.Inferred
Enterprise graph platformThe original KnowledgeFlow v2.1 design: Neo4j Aura Enterprise, GKE and a SIEM audit layer17.Its pilot tier needs about €5,800 a month in infrastructure17.Costly
KnowledgeFlowBuilds the graph from DITA and MyST structure. Uses Gemini only for unlinked mentions. Answers with a checked path.Cannot join two sets that share no subject, link or named entity. It reports the gap instead (§5.4).Checked
Problem statement
Google's data center documentation is written as separate documentation sets, one for each product. Each set links well inside itself, but questions that cross sets have no path, so employees search each set in turn or ask an expert. A knowledge graph built by a language model can join the sets, but every edge it makes is a guess. Most of the edges already exist in the maps, relationship tables, keys and classifications that writers maintain, and no tool reads them.

§3 User Profiles

Five roles at Google run or depend on KnowledgeFlow. Two readers ask it questions.

Stakeholders
Docs Platform LeadSponsor
GoalEmployees find answers across documentation sets without asking an expert.
Measured byCross-set questions answered with a cited path; questions sent to experts.
TodayEach team runs its own site search.
ConcernAn AI answer that sounds right and is wrong.
SuccessEvery answer cites its path, and every gap becomes an issue.
Information ArchitectOwner
GoalRelationships between sets live in the content model, not in people's heads.
Measured byAuthored edges between sets; proposed edges reviewed.
TodayMaintains maps, keys and relationship tables inside each set.
ConcernLinks made by a model enter the docs without review.
SuccessProposed edges arrive as pull requests that she approves or closes.
Senior Technical WriterWriter
GoalKnow which missing links cost readers time.
Measured byGap issues closed each sprint.
TodayLearns about gaps from support cases.
ConcernA stream of vague, low-value issues.
SuccessEach gap issue names the question, the path and the missing edge.
Software EngineerAsker
GoalGet an answer about another team's product without waiting.
Measured byTime to a usable answer.
TodayPosts the question in a team chat.
ConcernA long answer that does not say where it came from.
SuccessA short answer with each step linked to its page.
Technical Support EngineerSupport
GoalAnswer cases that span products quickly and correctly.
Measured byTime to answer cases that involve two or more products.
TodayKeeps personal notes on which pages connect.
ConcernAn answer that mixes values from two TPU generations or quotes an old default.
SuccessValues come from one key, for the generation the customer uses.
Readers
Lena HoffmannML engineer, Google
TaskCreates TPU VMs without external IP addresses for a training job. The job installs packages from the internet.
ConcernThe TPU docs stop at Private Google Access.
SuccessOne answer that joins the TPU page to the Cloud NAT page.
Daniel OseiSite reliability engineer, Google
TaskInvestigates dropped connections from TPU VMs behind a Cloud NAT gateway.
ConcernHe cannot tell which timeout default his gateway has.
SuccessThe default, the rule behind it and the command to check it.

§4 User Stories

Each story comes from the Goal and Success fields in §3. The acceptance criteria are what the checks in §5 test.

US-01 · Docs Platform Lead
As the Docs Platform Lead, I want every answer to show its path or say what it could not find, so that employees can trust answers across documentation sets.
Accepted when: every answer step cites a topic and an edge · a step that fails the checks is never delivered · every dropped step opens or updates a gap issue.
US-02 · Information Architect
As the information architect, I want links that the model finds to reach me as proposals, so that the content model stays under writer control.
Accepted when: model-found edges are stored as proposed · an answer that uses one labels that step · an approved edge becomes a relationship table row or link in a pull request · the next build reads it as authored.
US-03 · Senior Technical Writer
As a senior technical writer, I want each gap issue to show the question, the path found and the missing edge, so that I fix the links that cost readers the most time.
Accepted when: each gap issue has the question, the topics reached, the failed step and a suggested relationship table row · repeat questions add to one issue for each missing edge.
US-04 · Software Engineer
As a software engineer, I want a short answer with each step linked to its page, so that I get an answer about another team's product without waiting.
Accepted when: the answer arrives in under 20 seconds on the sample sets · each step links to its published topic.
US-05 · Technical Support Engineer
As a support engineer, I want values in answers to come from their key, for the right TPU generation, so that I never give a customer a value from the wrong page.
Accepted when: every keyed value in an answer matches its key value · an answer never mixes values from two generations unless the question names both.
US-06 · Lena (reader)
As an ML engineer, I want one answer that joins the TPU networking page to the Cloud NAT overview, so that my TPU VMs reach the internet without external IP addresses.
Accepted when: the answer cites topics from both sets · every edge between them is authored or labelled.
US-07 · Daniel (reader)
As a site reliability engineer, I want the timeout default and the rule behind it, so that I check the right value on my gateway.
Accepted when: the default and its rule come from the Tune NAT configuration topic · the command and field name match the source exactly.
Figure 3
Where each story is tested
01 · 02 Build the graph 03 · 04 Find and walk 05 Compose (Gemini) 06 Check the answer 07 · 08 Gaps and reviews US-02 US-04 · US-05 US-06 no story US-01 · US-04 · US-05 US-06 · US-07 US-01 · US-02 US-03 No story depends on the model alone. Every acceptance test is a fixed check or a person's approval.
Gemini writes the answer, but no story is accepted because the model says so. The checks and the information architect decide.

§5 Proposed Design

KnowledgeFlow does one thing. It answers an employee's question with a path through the documentation, and it checks every step of the path. It is an agent built with Agent Development Kit (ADK), Google's open-source agent framework. ADK is licensed under Apache 2.0 and its agents can run on Cloud Run19. Gemini 3.8 Flash (gemini-3.8-flash, a stable model20) runs the agent and calls its tools through Gemini function calling21. The embedding model gemini-embedding-001 finds entry topics by meaning22.

The agent has six plain Python tools that give the same result every time, and two model steps. Gemini proposes edges from prose, and it writes the answer. The checks decide whether each step is grounded. The agent cannot change a check result, and it cannot add an edge to the graph as authored.

5.1 How it works

KnowledgeFlow has two parts. The build runs on every docs merge. It reads the structure of each documentation set and writes the graph. The answer runs on every question. It finds entry topics, walks the graph and writes a checked answer. Figure 4 adds KnowledgeFlow to the system in Figure 1.

Figure 4
System context: KnowledgeFlow added
Cloud TPU docs DITA · maps · reltables Cloud NAT docs MyST · includes · links Release notes dated entries GitHub Actions on docs merge · build KnowledgeFlow agent ADK · gemini-3.8-flash · Cloud Run build_graph propose_mentions find_entry walk_graph compose (Gemini) check_answer report_gap record_review tools: plain Python · Gemini: compose and propose Firestore graph · vectors BigQuery question log Docs repositories gap issues · edge PRs Employee asks a question cited path, or what it could not find Information architect approves edge PRs
Compare with Figure 1. The documentation sets and their teams stay as they are. The join that a reader or an expert made by hand now comes from edges that writers already maintain.
5.2 The graph

The graph has four node types and seven edge types. Six edge types come from structure. KnowledgeFlow reads them with lxml from DITA maps and topics, and with MyST-Parser from MyST pages, where MANIFEST kept reuse as includes, substitutions and targets3. One edge type comes from the model.

Figure 5
Node types and edge types
Map or MyST toctree Topic concept · task · reference Topic in the same or another set Value from a key Subject product · feature · generation contains states about related · reuses · links-to mentions authored: read from a map, a table, a key, a conref, a link or a subject reference proposed by Gemini, labelled
Every authored edge stores the file and line it came from. A proposed edge stores the sentence that Gemini quoted.
EdgeRead fromMeaningStatus
containsMap hierarchy (topicref nesting), or the MyST table of contentsThe topic is part of this map or section.Authored
relatedRelationship table row11A task is supported by these concept and reference topics.Authored
reusesConref, or MyST include3The topic shares this element.Authored
statesKey reference, or MyST substitution3The topic states this value.Authored
links-toCross-reference, or MyST linkThe topic sends the reader to another topic.Authored
aboutSubject reference in a topic or map13The topic is about this subject.Authored
mentionsGemini, from prose that has no linkThe topic names this subject but does not link to it.Proposed

MANIFEST has no mapping for relationship tables. KnowledgeFlow reads them from the DITA source, which MANIFEST leaves unchanged3.

A shared subject scheme joins the sets. Each team classifies its own topics against the same subjects, once. Writers do not maintain a link from every TPU topic to every networking topic. The DITA standard expects this use: tools such as search tools can use subject classifications to find related content14.

One real thing is one node. Subject nodes take their names and aliases from the subject scheme, key names and topic titles. The TPU7x page is titled TPU7x (Ironwood), so both names resolve to one subject5. A name with no match in the subject scheme never becomes a new subject on its own. It becomes a proposal for the information architect.

5.3 Agent tools

1 · Build the graph build_graph

Runs in GitHub Actions on every merge to a documentation set. Parses DITA maps and topics with lxml, and MyST pages with MyST-Parser. Writes one document for each node and edge it reads, with the file and line it came from. Makes no model call.

Output: graph in Firestore · counts by edge type and by source

2 · Propose unlinked mentions (Gemini) propose_mentions

Gemini reads the prose of changed topics and lists subjects that a topic names but does not link. Each proposal must quote its sentence. A fixed check keeps a proposal only when the subject name or one of its aliases appears in that sentence. Proposals that pass are stored as mentions edges with the status proposed.

Output: proposed edges with the quoted sentence · changed topics only

3 · Find entry topics find_entry

Finds the topics where an answer starts. SQLite FTS5 ranks exact terms, such as flags, commands and version strings, with BM2525. Firestore vector search finds topics by meaning with a K-nearest-neighbour query23. Aliases resolve first, so Ironwood finds TPU7x topics.

Output: up to 5 entry topics, each with the match that found it

4 · Walk the graph walk_graph

Follows typed edges from the entry topics, up to three hops. It follows authored edges first, and proposed edges only when no authored path exists. It applies the audience and generation filter from the subject scheme, so a TPU7x question does not reach v5e values.

Output: candidate paths, each edge with its ID and status

5 · Compose the answer (Gemini) compose

Gemini writes the answer as numbered steps. Each step cites one topic and the edge that reached it, from the candidate paths only. Gemini may restate text from that topic. It may not add facts from outside the paths. On a failed check, it revises only the failed steps.

Output: answer steps with citations · at most 2 revisions

6 · Check the answer check_answer

Runs four checks. Source: every step cites a topic in the candidate paths. Literals: every number, unit, flag, field and command in a step appears in its topic or in its key value. Path: each cited topic is joined to the question's entry topics by edges in the graph. Labels: every step reached through a proposed edge carries a label.

Output: pass or fail for each step, with the reason

7 · Report the gap report_gap

Runs when a step still fails after two revisions. The agent drops the step and tells the employee what it could not answer. This tool opens one docs issue for each missing edge, with the question, the topics reached, the failed step and a suggested relationship table row. A repeat question adds to the same issue. Every question writes one row to the question log.

Output: gap issue · question log row

8 · Turn approved edges into structure record_review

For each proposed edge that an answer used, opens a pull request that adds the edge as a relationship table row in the DITA map, or as a link in the MyST page. Branch protection requires the information architect's approval33. After merge, the next build reads the edge as authored. A closed pull request is stored as rejected, so Gemini does not propose that edge again.

Output: edge pull request · rejected-proposal list
5.4 Agent loop

The agent runs find_entry and walk_graph, then asks Gemini to compose. check_answer tests every step. When a step fails, Gemini reads the reason and revises only that step, and the checks run again. After two failed revisions, the agent drops the step, says so in the answer, and report_gap opens an issue. No step reaches the employee without a passing check.

The build follows the same rule. Gemini proposes, a check filters, and a person approves. As approved edges become structure, fewer edges are proposed, so the model is called less at build time.

Figure 6
What happens to one question
Find entry topics and walk the graph Gemini composes cites topic, edge Check answer source · literal · path pass Answer with cited path proposed edges labelled fail Gemini revises failed steps only check again · max 2 Drop failed step gap issue for writers
Every path ends in an answer that contains only checked steps. A step that cannot be checked becomes a gap issue, not a guess.
5.5 A sample path

Figure 7 shows the path for Lena's question, scenario 2 in §6. Two about edges join the sets. Both come from subject references that the information architect added to the sample sets.

Figure 7
Path for "My TPU VM has no external IP. How does it reach a package index on the internet?"
CLOUD TPU DOCS · DITA CLOUD NAT DOCS · MYST entry · BM25 match on --no-address Configure networking and access task · internal IP addresses Configure Private Google Access Google APIs and services only links-to context, not the answer Subject no-external-ip Cloud NAT overview concept · Public NAT Tune NAT configuration task · timeouts links-to about about Answer path in teal: 2 authored about edges join the sets · 0 proposed edges
The published pages have no link between these two topics (Figure 2). The subject classification joins them, and each team wrote only its own half.
5.6 Why build the graph from structure first

Microsoft's guidance is that GraphRAG suits a use case only when its benefits outweigh the upfront cost of building the graph index15. For DITA content, most of that index already exists.

ApproachHow edges are madeModel use at build timeWhat an edge is worth
GraphRAGA language model extracts a graph from every document15.Every documentInferred
LazyGraphRAGNo prior summarisation of the source data. A relevance test budget sets the cost and quality at query time16.Low at build time; model calls move to query timeInferred
KnowledgeFlowRead from maps, relationship tables, keys, conrefs, links and subject references. Gemini proposes only unlinked mentions.Prose of changed topics only; falls as proposals are approvedAuthored edges trace to a line

The build logs the number of edges from each source and the model tokens it used. So the share of edges that cost no model call is measured on every build, not estimated (§7).

5.7 Where it runs
PartServiceNote
Graph buildGitHub Actions, on merge to a documentation setStandard runners are free for public repositories28.
Graph storeFirestore, one document for each node and edge. The agent loads the graph into NetworkX when it starts.Free quota: 50,000 reads and 20,000 writes a day, on one database for each project24. NetworkX uses the 3-clause BSD licence26. Limit: an in-memory graph suits the sample sets. A full documentation set needs a graph database, and Spanner Graph has a 90-day free trial, then needs the Enterprise edition27.
Entry searchFirestore vector search with gemini-embedding-001; SQLite FTS5 in the agent containerK-nearest-neighbour queries23. The embedding model has a free tier22. FTS5 has BM25 ranking built in25.
AgentCloud Run service, one request for each questionFree tier: 180,000 vCPU-seconds and 2 million requests a month29.
Question logBigQueryFree tier: 10 GiB storage and 1 TiB of queries a month30.
Ask pageFirebase HostingNo-cost plan: 10 GB storage and 360 MB of data transfer a day31. Limit: the sample docs are public, so the MVP has no access control for each set. Private docs need it.
ModelGemini API, gemini-3.8-flashThe free tier is acceptable here because the sample content is public. Free tier content is used to improve Google products, so private docs need the paid tier. The paid tier costs $0.75 per million input tokens and $3.75 per million output tokens until 31 December 202632. Each question logs its tokens, so the cost of an answer is measured, not estimated.

§6 Answer Simulator

The simulator runs three sample questions through KnowledgeFlow. Each run shows the tools in order and the log that the agent writes. The runs are scripted to show the design. They do not call Gemini, Firestore or GitHub.

knowledgeflow · answer simulator
idle
Sample question
// choose a sample question and run it
Scripted demo. No live model call. Scores and timings are illustrative.

§7 Success Metrics

The MVP runs on the three sample sets and an evaluation set of 30 questions. Each question has a reference path, written from the published pages, and half the questions cross documentation sets. The MVP succeeds if the numbers below are met. The first metric matters most: an answer with one unchecked step is worse than an answer that says what it could not find.

MetricHow it is measuredMVP target
Unchecked steps deliveredAnswer steps that reached the asker without a passing check, from a review of every answer in the evaluation set0
Steps with a cited topic and edgeSteps with a citation ÷ steps delivered100%
Cross-set questions answered with a full pathCross-set questions whose answer cites every topic in the reference pathHigher than a vector-search-only baseline on the same questions
Values that match their keyKeyed values in answers that equal the key value, for the right generation100%
Proposed edges labelledSteps that use a proposed edge and carry the label ÷ steps that use a proposed edge100%
Dropped steps with a gap issueDropped steps that opened or updated a gap issue100%
Edges from structureAuthored edges ÷ all edges, from the build logReported on every build
Model tokens per buildTokens used by propose_mentions, from the build logFalls as proposed edges are approved
Time to answerQuestion received to answer shown, from the question logUnder 20 seconds on the sample sets
Figure 8
Sample answer report for Daniel's question, scenario 3 in §6 (illustrative values)
question Q-0412 · Daniel OseiAnswered · 1 step uses an unreviewed link
Steps4
Authored edges4
Proposed edges1
Steps dropped1
Question

Connections from our TPU VMs through Cloud NAT drop under load. Which timeout applies, and what is our gateway's default?

Answer
StepSourceCheck
1. Your TPU VMs have no external IP addresses, so Cloud NAT gives them shared external addresses for outbound connections.nat/overview, reached by aboutpass
2. The default TCP TIME_WAIT timeout is 30 seconds for gateways created after 30 September 2026, and 120 seconds for older gateways.nat/tune-nat-configuration, key nat_tcp_time_wait_defaultliterals 3/3
3. To see the value in effect, run gcloud compute routers nats describe and read effectiveTcpTimeWaitTimeoutSec.nat/tune-nat-configurationliterals 2/2
4. Google announced the new default on 31 March 2026.release-notes/2026-03-31, reached by a proposed edgeunreviewed link
Path
  • authored configure-networking -[about]-> no-external-ip (subject reference, TPU map)
  • authored nat/overview -[about]-> no-external-ip (subject reference, NAT page)
  • authored nat/overview -[links-to]-> nat/tune-nat-configuration
  • authored nat/tune-nat-configuration -[states]-> nat_tcp_time_wait_default
  • proposed release-notes/2026-03-31 -[mentions]-> tcp-time-wait
Sent to people
  • dropped The first draft had a step that said to restart the TPU VMs to apply the change. No topic in the paths states it. Gemini removed it in revision 1.
  • edge PR #57 For the information architect: add a link from the 31 March 2026 release note to Tune NAT configuration. The quoted sentence is attached.
  • logged One row in the question log, with tokens, time and the edges used.
The report is the evidence for US-01 and US-02. Every step names its source. The one step that depends on a model-found edge says so, and that edge is now a pull request for a person.

Sources

Checked on 19 October 2026.

  1. Google Developers, "Site Policies." developers.google.com/site-policies
  2. Stack Overflow, "2024 Developer Survey: Professional developers." survey.stackoverflow.co/2024/professional-developers
  3. Siddharth Rao, "MANIFEST: Migrate DITA to Markdown without losing content," design document. siddharthraop.github.io/Manifest
  4. Siddharth Rao, "The Autonomous Author," design document. siddharthraop.github.io/The-Autonomous-Author
  5. Google Cloud, "TPU7x (Ironwood)." docs.cloud.google.com/tpu/docs/tpu7x
  6. Google Cloud, "Configure networking and access to your Cloud TPU," last updated 5 August 2026. docs.cloud.google.com/tpu/docs/configure-networking-access
  7. Google Cloud, "Configure networking and access to a TPU instance," last updated 9 September 2026. docs.cloud.google.com/tpu/docs/configure-networking-access-compute
  8. Google Cloud, "Cloud NAT overview." docs.cloud.google.com/nat/docs/overview
  9. Google Cloud, "Tune NAT configuration." docs.cloud.google.com/nat/docs/tune-nat-configuration
  10. Google Cloud, "Cloud NAT release notes." docs.cloud.google.com/nat/docs/release-notes
  11. DITA language reference, "reltable." dita-lang.org/dita/langref/base/reltable
  12. DITA language reference, "subjectdef." dita-lang.org/dita/langref/base/subjectdef
  13. OASIS, DITA 1.3 specification, "subjectref." docs.oasis-open.org/dita/dita/v1.3/.../subjectref.html
  14. DITA 1.3 language reference, "topicSubjectTable," as published in the Adobe FrameMaker documentation. help.adobe.com/.../topicSubjectTable.html
  15. Pure AI, "Microsoft Open Sources AI Tool for Exploring Large Document Datasets," July 2024. pureai.com/Articles/2024/07/12/Microsoft-Open-Sources-AI-Tool.aspx
  16. Microsoft Research, "LazyGraphRAG: Setting a new standard for quality and cost." microsoft.com/en-us/research/blog/lazygraphrag-setting-a-new-standard-for-quality-and-cost
  17. Siddharth Rao, "KnowledgeFlow: Enterprise Knowledge Graph Architecture v2.1" (Agentic Org Memory). github.com/raosiddharthp/Agentic-Org-Memory
  18. Siddharth Rao, "VaultRAG." github.com/raosiddharthp/VaultRAG
  19. Google, Agent Development Kit documentation README. github.com/google/adk-docs
  20. Google AI for Developers, "Gemini models." ai.google.dev/gemini-api/docs/models
  21. Google AI for Developers, "Function calling with the Gemini API." ai.google.dev/gemini-api/docs/function-calling
  22. Google Developers Blog, "Gemini Embedding now generally available in the Gemini API." developers.googleblog.com/en/gemini-embedding-available-gemini-api
  23. Google Cloud, "Search with vector embeddings" (Firestore). cloud.google.com/firestore/docs/vector-search
  24. Google Cloud, "Firestore pricing." cloud.google.com/firestore/pricing
  25. SQLite, "SQLite FTS5 Extension: The bm25() function." sqlite.org/fts5.html
  26. NetworkX, "License." networkx.org/documentation/networkx-2.5/license.html
  27. Google Codelabs, "Getting started with Spanner Graph." codelabs.developers.google.com/codelabs/spanner-graph-getting-started
  28. GitHub Docs, "How use of GitHub Actions is measured." docs.github.com/en/billing/concepts/product-billing/github-actions
  29. Google Cloud, "Cloud Run pricing." cloud.google.com/run/pricing
  30. Google Cloud, "BigQuery pricing." cloud.google.com/bigquery/pricing
  31. Firebase, "Pricing." firebase.google.com/pricing
  32. Google AI for Developers, "Gemini Developer API pricing." ai.google.dev/gemini-api/docs/pricing
  33. GitHub Docs, "About protected branches." docs.github.com/.../about-protected-branches