Capability Architecture · Steps 32–34Chapter 33 of 45

Which Shared Components Actually Unlock More Capability? Build a Capability Dependency Graph

Page content

A capability portfolio tells you what the platform should own.

It does not yet tell you what the platform should build first.

That is a different problem.

Suppose you want to add five new agent capabilities:

  • repository migration planning,
  • browser-based account reconciliation,
  • incident diagnosis,
  • autonomous research synthesis,
  • schema-aware data repair.

You could build each capability independently.

That is often the obvious path.

It is also often the expensive path.

The five capabilities may depend on the same underlying primitives:

  • reliable state capture,
  • provenance,
  • structured tool interfaces,
  • sandboxed execution,
  • verifier infrastructure,
  • retrieval,
  • policy enforcement,
  • replay,
  • scheduling,
  • durable checkpoints.

If you build the shared primitive once, several capabilities may become cheaper to acquire.

But there is a catch.

A shared primitive can also become a shared failure domain.

If every production capability depends on one retrieval index, one verifier service, one browser pool, one policy engine, or one state-capture mechanism, then a defect in that component can degrade the entire portfolio at once.

So the problem is not simply:

Which shared component unlocks the most features?

The real problem is:

Which dependency investments create the most verified capability leverage without creating unacceptable correlated risk?

That is what a capability dependency graph is for.

The core rule for this post is:

Optimize shared primitives for verified portfolio leverage, then harden the dependencies whose failure would invalidate many competence claims at once.


The Search Problem: “What Should I Build First in an AI Agent Platform?”

Agent roadmaps are frequently organized as a list of features.

coding agent
browser agent
research agent
DevOps agent
analytics agent

That list hides the architecture.

The platform may actually look more like this:

                           provenance
                              |
                  ____________|____________
                 /            |            \
            state capture   replay      incident forensics
                 |            |            |
                 |            |            |
          _______|____________|____________|______
         /                |                |      \
   coding repair      browser action   research  DevOps
         \                |                |      /
          \_______________|________________|_____/
                          |
                    verification

The feature list says five products.

The dependency graph says a smaller set of shared primitives supports them.

That matters for investment.

It also matters for reliability.


Capabilities Are Not Independent Assets

Step 32 treated capabilities as portfolio assets with acquisition and carrying costs.

That is useful, but capabilities are rarely independent.

A capability may depend on:

model capability
+ tool support
+ state representation
+ retrieval
+ verifier
+ sandbox
+ authority policy
+ scheduler
+ provenance
+ release compatibility

Another capability may reuse seven of those ten pieces.

That means the marginal cost of the second capability may be far lower than the first.

Or far higher if one shared dependency is weak.

This is why feature-by-feature planning can misallocate engineering effort.


Model the Capability Graph Explicitly

A useful graph has at least two node classes:

Capability nodes
Primitive nodes

For example:

Capability: repository repair
    depends on
        repository snapshot
        code search
        sandbox
        patch application
        test verifier
        provenance

Capability: dependency upgrade
    depends on
        repository snapshot
        package metadata
        sandbox
        patch application
        test verifier
        provenance

Capability: incident repair
    depends on
        repository snapshot
        telemetry retrieval
        sandbox
        patch application
        test verifier
        provenance

Immediately, several shared primitives become visible.

repository snapshot
sandbox
patch application
test verifier
provenance

Those are platform investments.


A Minimal Graph Representation

The graph does not need to begin as a graph database.

Start with ordinary data structures.

from dataclasses import dataclass
from typing import Literal

NodeKind = Literal["capability", "primitive"]


@dataclass(frozen=True)
class DependencyNode:
    node_id: str
    kind: NodeKind
    version: str


@dataclass(frozen=True)
class DependencyEdge:
    parent_id: str
    dependency_id: str
    required: bool
    minimum_version: str | None
    evidence_ref: str

The important thing is not the storage technology.

The important thing is that dependencies become explicit and versioned.


Not Every Dependency Is the Same

A capability can depend on another component in different ways.

Useful dependency types include:

REQUIRED
OPTIONAL
PERFORMANCE
VERIFICATION
AUTHORITY
OBSERVABILITY
RECOVERY

These distinctions matter.

For example:

research synthesis
    REQUIRED retrieval
    REQUIRED citation extraction
    VERIFICATION source validation
    OBSERVABILITY provenance
    OPTIONAL specialist critic

If the critic fails, the capability may degrade.

If citation extraction fails, the capability may become unusable.

Those are different operational consequences.


Capability Dependency Graphs Are Directed

The edge direction matters.

capability
   ↓ depends on
primitive

For example:

browser purchase proposal
DOM state capture
browser session runtime

But the reverse is not true.

A browser runtime does not depend on the purchase-proposal capability.

This lets you calculate downstream impact.


The First Useful Query: What Does This Primitive Unlock?

For any primitive, ask:

which capabilities depend on it directly?
which capabilities depend on it transitively?
which authority levels depend on it?
which verifier paths depend on it?

Suppose sandbox_runtime_v4 supports:

repository repair
migration planning
package upgrades
schema migration
incident reproduction
capability acquisition

That is high capability leverage.

But leverage alone is not enough.


The Second Useful Query: What Breaks If This Primitive Fails?

Now reverse the perspective.

Suppose the same sandbox runtime fails.

sandbox runtime unavailable
repository repair unavailable
migration planning limited
package upgrades unavailable
schema migration limited
incident reproduction degraded
capability acquisition blocked

That is correlated risk.

A platform primitive can be both:

high leverage
and
high blast radius

Those are often the components that deserve the most reliability investment.


Leverage Is Not Just Capability Count

A naïve metric might be:

leverage = number of downstream capabilities

That is too crude.

A primitive supporting ten rarely used low-value capabilities may matter less than one supporting two high-volume critical workflows.

A better representation is:

portfolio leverage
    ≈ downstream demand
    × capability value
    × dependency criticality
    × authority relevance

Do not pretend this is an exact formula.

The point is to make the relevant dimensions explicit.


Add Verification Leverage

Some primitives unlock capability because they let the model do something.

Other primitives unlock capability because they let the platform verify something.

That distinction is important.

Consider a deterministic test harness.

It may not improve generation at all.

But it can expand the usable competence envelope for:

repository repair
refactoring
dependency upgrades
schema migrations
performance optimization

because those capabilities can now be externally checked.

That is verifier leverage.

Step 32 already suggested building the verifier first when verification is the bottleneck.

The dependency graph makes that visible across the whole portfolio.


A Verifier Can Be a Portfolio Primitive

For example:

pytest verifier
Python repair
Python refactoring
Python dependency upgrades
Python migration tasks

Or:

DOM postcondition verifier
form filling
account updates
checkout workflows
browser navigation

Or:

citation/source verifier
research summaries
market reports
fact extraction
policy analysis

When a verifier supports several capabilities, verifier reliability becomes portfolio reliability.


Competence Claims Depend on the Graph

Step 30 defined competence as evidence-backed reliability within a task regime.

That competence claim implicitly assumes the dependencies used during validation remain valid.

Suppose a capability was validated with:

retrieval_v8
verifier_v3
browser_runtime_v5
policy_v6

Then production silently changes to:

retrieval_v9
verifier_v3
browser_runtime_v5
policy_v6

The capability graph should make that dependency visible.

Otherwise the platform may accidentally treat historical evidence as transferable when a critical primitive changed.


Version Every Important Edge

A dependency edge should not merely say:

research_agent depends on retriever

It should be able to say something closer to:

research_agent_release_12
    requires retriever >= 8.2
    validated with retriever 8.4
    verifier requirement source_verifier >= 3.1

This matters for compatibility and replay.


Dependency Changes Can Invalidate Evidence

When a primitive changes, ask:

which competence claims were validated against the old version?

Then classify the change.

compatible
requires shadow validation
requires partial revalidation
requires full revalidation
invalidates competence claim

This is release engineering applied to dependency graphs.


High-Leverage Dependencies Deserve Stronger Change Control

If one primitive supports a large portion of the portfolio, its release policy should reflect that.

For example:

low-leverage helper
    → ordinary canary

shared verifier gateway
    → broad shadow comparison
       cohort validation
       rollback-ready release
       stricter promotion gate

Change control should scale with downstream impact.


Use Dependency Centrality Carefully

Graph theory gives you several notions of centrality.

You may calculate:

  • degree centrality,
  • betweenness centrality,
  • reachability,
  • weighted downstream count.

These can be useful.

But do not let graph mathematics replace operational meaning.

A node with high graph centrality is not automatically a high-value investment.

It may be:

  • easy to replace,
  • low risk,
  • rarely exercised,
  • backed by excellent fallback capacity.

The metric is evidence, not the decision.


A Better Primitive Record

A primitive should carry more than an identifier.

from dataclasses import dataclass


@dataclass(frozen=True)
class PrimitiveProfile:
    primitive_id: str
    version: str
    downstream_capabilities: tuple[str, ...]
    critical_downstream_count: int
    fallback_available: bool
    verifier_role: bool
    authority_role: bool
    replay_role: bool
    observed_failure_rate: float | None
    maintenance_cost: float | None
    change_frequency: float | None

Again, do not obsess over exact numeric scoring initially.

Make the architecture visible first.


Dependency Classes Matter for Failure Propagation

A failure can propagate through the graph in different ways.

Hard failure

primitive unavailable
capability unavailable

Quality degradation

retrieval quality drops
evidence quality drops
false-success risk rises

Verification degradation

verifier weakens
PASS becomes less trustworthy
competence evidence invalidates

Authority degradation

approval/fencing gateway unhealthy
consequential commit authority removed

Those are different propagation paths.


Correlated Failure Is the Hidden Cost of Reuse

Software engineering correctly encourages reuse.

But reuse concentrates dependence.

If twelve capabilities share one primitive, then a single defect can affect twelve capabilities.

That does not mean reuse is bad.

It means reuse must be paired with failure-domain design.

The goal is not:

minimize shared components

It is:

maximize useful reuse
while bounding correlated failure

Example: One Retriever for Everything

Imagine one retrieval service powers:

coding context
research evidence
incident logs
browser knowledge
policy lookup
memory recall

That looks efficient.

Then a ranking regression occurs.

Now every subsystem sees degraded evidence.

The platform may experience:

worse patches
worse research
worse incident diagnosis
worse browser choices
worse policy decisions
worse memory selection

Infrastructure may still be healthy.

This is exactly the kind of correlated behavioral drift Step 23 was designed to detect.

The dependency graph tells you why the drift is correlated.


Sometimes Duplication Is a Reliability Feature

Not all duplication is waste.

For critical shared primitives, independent implementations may reduce correlated risk.

For example:

primary source verifier
secondary deterministic checker

or:

primary model provider
fallback provider

or:

central policy evaluator
local deterministic guardrails

The important question is whether the alternatives share the same failure mode.

Two wrappers around the same dependency are not independent redundancy.


Independence Must Be Real

Suppose you use two verifiers.

Verifier A → same foundation model
Verifier B → same foundation model

They may fail together.

That is correlated redundancy.

A stronger design might be:

Verifier A → deterministic tests
Verifier B → static analysis
Verifier C → model-based semantic review

Different mechanisms create different failure surfaces.


Dependency Graphs Should Include External Systems

Do not stop at your own code.

Capabilities may depend on:

model provider
browser provider
cloud region
vector database
GitHub
payment API
email API
identity provider
package registry
DNS
external data source

These are real dependencies.

If they matter to competence or authority, they belong in the graph.


Include Human Dependencies Too

A capability may depend on a human approval queue.

For example:

production schema mutation
qualified DBA approval

That human role is part of the capability dependency graph.

So are:

  • escalation queues,
  • security review,
  • domain expertise,
  • legal approval,
  • operations approval.

If the queue becomes unavailable, the capability changes state.


Human Review Can Be a Bottleneck Primitive

Suppose several high-risk capabilities require the same specialist reviewer group.

production deploy
payment correction
access-control change
incident rollback

Then human review capacity is a shared platform dependency.

Step 29 treated human attention as schedulable capacity.

The dependency graph shows which portfolio capabilities depend on it.


Graph the Authority Path Separately

It is useful to distinguish:

capability dependency graph

from:

authority dependency graph

For example:

repository patch proposal
    depends on model + repo state + patch generator

repository patch commit
    additionally depends on approval policy + verifier + fenced commit gateway

The generation capability may remain available while commit authority is unavailable.

That distinction prevents unnecessary full outages.


Graph Verification Paths Separately Too

A capability might have several verifier layers:

syntax check
unit tests
integration tests
security scan
postcondition check

The capability may require all of them for a particular authority level.

This gives you a verification dependency graph.

That graph is often more useful than a single verifier=true flag.


A Capability Can Have Multiple Operating Modes

Suppose a browser agent normally supports:

read
propose
submit

If the mutation verifier fails, the capability may degrade to:

read
propose

The dependency graph should support conditional capability modes.

submit requires mutation_verifier
propose does not

This makes graceful degradation much cleaner.


Capability Mode as a Graph Query

Given current dependency health, ask:

what is the maximum safe authority mode currently available?

For example:

def max_authority(capability, health, policy):
    for authority in reversed(policy.allowed_authorities):
        required = policy.dependencies_for(capability, authority)
        if all(health[d].usable for d in required):
            return authority
    return "UNAVAILABLE"

This connects the dependency graph directly to runtime authority.


Dependency Health Should Affect Admission

Step 21 introduced global admission control.

The scheduler should not admit work that cannot complete under current dependency health.

For example:

request requires browser mutation
mutation verifier unavailable

Possible scheduler decision:

DEFER

or:

DOWNGRADE_TO_PROPOSAL

rather than admitting the run and discovering the missing dependency fifteen minutes later.


Graph-Aware Backpressure

Backpressure can also follow dependency edges.

Suppose the verifier queue saturates.

Then capabilities that depend heavily on that verifier should reduce upstream generation.

verifier pressure
capability scheduler
reduce candidate fan-out
reduce speculative branches
queue low-priority work

The dependency graph tells the scheduler where to propagate pressure.


The Graph Can Improve Budget Scheduling

Step 16 allocated compute dynamically.

The dependency graph adds another signal.

If several branches depend on the same expensive primitive, the scheduler can recognize shared cost.

For example:

branch A → retrieval snapshot X
branch B → retrieval snapshot X
branch C → retrieval snapshot X

The runtime may coalesce the shared dependency work rather than paying three times.


Shared Work Can Be Cached More Safely

Dependency identity helps caching.

A cache key can include:

primitive version
input artifact hash
environment version
policy version

This reduces accidental reuse across incompatible contexts.

It also makes cached outputs replayable.


Dependency Graphs Expose Platform Multipliers

Some primitives have unusually high option value.

Common examples include:

State capture

Better state capture improves:

coding
browser automation
DevOps
incident forensics
replay
verification

Provenance

Better provenance improves:

replay
incident investigation
release validation
competence evidence
capability acquisition
audit

Sandboxing

Better sandboxing improves:

coding
browser simulation
capability acquisition
migration testing
incident reproduction

Verifier infrastructure

Better verification improves almost every authority-bearing capability.

These are platform multipliers.


But Multipliers Can Become Monocultures

A primitive that unlocks everything can also fail everything.

That is the architecture tension.

shared primitive
high leverage
high concentration
high correlated risk

The answer is not automatically fragmentation.

The answer is to design explicit resilience around high-concentration primitives.


Measure Concentration Risk

Useful concentration signals include:

percentage of production capabilities depending on primitive
percentage of critical authority paths depending on primitive
percentage of verifier paths depending on primitive
percentage of revenue/workload volume depending on primitive
percentage of SLO budget exposed to primitive failure

These are more meaningful than raw node degree alone.


A Simple Concentration Record

@dataclass(frozen=True)
class ConcentrationProfile:
    primitive_id: str
    production_capability_share: float
    critical_authority_share: float
    verifier_path_share: float
    workload_volume_share: float
    slo_exposure_share: float

Do not treat the numbers as perfect risk probabilities.

Treat them as evidence for architectural review.


Failure Injection Should Follow the Graph

Step 22 introduced failure containment.

The dependency graph gives you a systematic way to choose failure-injection tests.

For each high-impact primitive:

fail it
slow it
corrupt its output
return stale output
return partially valid output
make it disagree with backup

Then measure downstream behavior.


Do Not Test Only Hard Outages

Hard outages are easy to detect.

Silent semantic degradation is often worse.

For a retriever:

service remains 200 OK
ranking quality degrades

For a verifier:

service remains available
false PASS rises

For state capture:

snapshot succeeds
but misses a relevant file

These failures can contaminate multiple capabilities simultaneously.


Shared Dependencies Need Behavioral SLOs

Infrastructure SLOs are not enough.

A retriever can be available but useless.

A verifier can be fast but permissive.

A browser runtime can be healthy but capture the wrong DOM state.

So critical shared primitives need behavioral SLOs too.

Examples:

retrieval usefulness
verifier false-pass ceiling
state-capture completeness
sandbox isolation integrity
provenance completeness
replay completeness

Primitive SLOs Roll Up Into Capability SLOs

This lets you reason about reliability hierarchically.

primitive SLOs
capability SLOs
portfolio SLOs

But be careful.

You cannot generally multiply component success rates and claim the result is system reliability.

Dependencies interact.

Use observed end-to-end verified outcomes as the final authority.


Keep End-to-End Verification Stronger Than Graph Inference

The graph may predict:

all dependencies healthy

Yet the capability can still fail.

The graph is an explanatory and planning model.

It is not a substitute for end-to-end verification.


Use the Graph to Prioritize Platform Investment

Suppose you have three possible infrastructure projects:

A: improve sandbox startup latency
B: build stronger repository state snapshots
C: add another specialist critic

The dependency graph shows:

A supports 4 capabilities
B supports 11 capabilities
C supports 1 capability

That is useful.

Then Step 28’s reliability economics adds:

expected reliability gain
engineering effort
risk reduction
maintenance cost

Now the investment decision is far better grounded.


Shared Infrastructure Has Option Value

A primitive may be valuable even before all downstream capabilities exist.

For example, durable provenance might enable future:

incident replay
scientific evaluation
regulatory audit
capability learning
cross-run optimization

That is option value.

But option value should not become an excuse for speculative platform building.

Require plausible downstream demand.


Avoid Architecture Astronautics

A capability graph can tempt teams into building a perfect universal platform before real workloads exist.

Do not.

Start with observed capability demand.

Then identify repeated dependencies.

Then extract shared primitives.

real workloads
repeated mechanisms
shared primitive

not:

imagined universal platform
hope capabilities appear later

Extraction Should Follow Evidence

A good threshold for extracting a shared primitive is not simply “used twice.”

Ask:

is behavior sufficiently similar?
is lifecycle sufficiently similar?
is failure handling sufficiently similar?
is authority semantics sufficiently similar?

Two superficially similar mechanisms may deserve separate implementations.


Beware False Reuse

For example:

coding retrieval
research retrieval

Both are called retrieval.

But coding retrieval may optimize for:

symbol locality
dependency edges
repository freshness
exact file versions

Research retrieval may optimize for:

source authority
recency
source diversity
citation traceability

Forcing them into one universal abstraction may create worse architecture.

Reuse should be semantic, not cosmetic.


Primitive Boundaries Should Reflect Failure Boundaries

If two workloads have very different failure modes, consider separate primitives or separate policy layers.

For example:

read-only browser inspection
financial browser mutation

They may share the low-level browser driver.

But they should not necessarily share:

credentials
authority gateway
mutation verifier
queue

Shared implementation does not require shared failure domain.


Bulkheads Belong in the Graph

Step 22 introduced bulkheads.

The graph should encode isolation boundaries.

browser_pool_readonly
browser_pool_mutating

or:

research_retrieval_pool
incident_retrieval_pool

Even when the underlying software is similar, separate resource pools can prevent cascade.


Dependency Graphs Help Design Bulkheads

If several critical capabilities share one resource pool, ask whether they should.

For example:

incident response
background research

Both use browser sessions.

But incident response may deserve reserved capacity.

The graph makes the contention relationship visible.


Shared Dependencies Affect Scheduling Fairness

Step 21’s global scheduler can become graph-aware.

Suppose one capability requires:

GPU + browser + verifier

while another requires:

CPU + retrieval

The scheduler should understand the dependency resource vector rather than treating both as generic jobs.

This reduces head-of-line blocking and resource fragmentation.


Dependency Graphs Can Predict Admission Feasibility

Before a run starts, ask:

are all required critical dependencies available?
are reserved verifier resources available?
is required human approval capacity available?
is the authority gateway healthy?

If not, defer or downgrade immediately.

That is much cheaper than discovering infeasibility midway through a run.


Graph the Expected Verification Reserve

A capability should carry expected verification demand.

For example:

repository repair
    test verifier: 2-5 minutes
    static analysis: 30 seconds
    security scan: optional

The scheduler can reserve that capacity before spending all resources on generation.

This connects directly to Step 16’s protected verification reserve.


Dependency Failures Can Change Search Policy

Suppose the primary semantic verifier becomes degraded.

The platform might respond by:

reducing search width
increasing deterministic checks
requiring human escalation
blocking high-authority outputs

The dependency graph tells the control plane which policies are affected.


Track Dependency Provenance Per Run

Every run should record the actual primitive versions used.

run_123
    model = m42
    retriever = r8.4
    verifier = v3.2
    sandbox = s5
    policy = p12

That lets Step 25 replay reconstruct the execution accurately.

It also lets Step 26 incident forensics answer:

Which downstream failures correlate with this primitive version?


Blast Radius Queries Become Powerful

Suppose verifier_v3.2 is found to be permissive.

The graph can answer:

which capabilities used verifier_v3.2?
which production runs depended on it?
which competence claims were validated with it?
which releases promoted based on its evidence?
which authority decisions assumed its strength?

That is a real blast-radius analysis.


This Is Where Provenance and Architecture Meet

The dependency graph describes structural relationships.

Provenance records historical execution relationships.

Together:

structural dependency graph
        +
run provenance graph
actual impact analysis

This is much stronger than either graph alone.


Structural Dependency vs Runtime Dependency

A capability may declare:

depends on retriever A or B

But a specific run used:

retriever B

The structural graph tells you possibility.

The runtime provenance tells you actuality.

Keep them separate.


Capability Dependencies Can Be Conditional

For example:

small repository repair
    no semantic index required

large repository repair
    semantic index required

The dependency graph should support predicates.

@dataclass(frozen=True)
class ConditionalDependency:
    capability_id: str
    dependency_id: str
    condition: str

The condition may eventually become structured policy rather than free text.


Avoid Hiding Policy in the Graph

The graph should not become an opaque policy engine.

Keep distinct layers:

dependency facts
policy decisions
runtime evidence

For example:

Fact:
capability requires verifier X for authority A4

Policy:
A4 forbidden when verifier X degraded

Evidence:
verifier X currently DEGRADED

That separation improves auditability.


The Graph Should Be Versioned

Capability dependencies evolve.

Record graph versions.

graph_version_2026_08_09_01

A production run can then reference:

dependency_graph_version

This helps replay old scheduler and authority decisions.


Diff the Graph During Releases

When a behavioral release changes dependencies, generate a graph diff.

For example:

ADDED:
repository_repair -> semantic_retriever_v9

REMOVED:
repository_repair -> lexical_retriever_v4

CHANGED:
test_verifier minimum version 4.1 -> 4.3

This is far more informative than “agent version bumped.”


Dependency Diffs Should Affect Release Gates

A release that changes a high-centrality primitive should require more evidence than a leaf-only change.

Possible rule:

if changed primitive downstream critical share > threshold:
    require expanded shadow evaluation
    require cohort replay
    require rollback drill

Keep thresholds versioned and external to the candidate release.


Shared Dependencies Create Hidden Coupling

You may think two agent capabilities are independent because they have separate code paths.

But they may share:

same model endpoint
same retrieval index
same policy store
same database
same verifier gateway
same browser provider
same queue

That is operational coupling.

The dependency graph surfaces it.


Hidden Coupling Explains Correlated Incidents

Suppose coding and research agents begin failing at the same time.

Without the graph, teams inspect two products separately.

With the graph, you may immediately see:

coding_agent ─────┐
                  ├── retriever_cluster_2
research_agent ───┘

That shortens incident localization dramatically.


Add Failure-Domain Metadata

A useful primitive record can include failure domain.

provider
region
cluster
queue
credential scope
data source
model family

Then you can detect apparent redundancy that is actually co-located.


Example: False Provider Redundancy

You might have:

Model endpoint A
Model endpoint B

but both run:

same model family
same cloud region
same account quota
same network path

That is weaker redundancy than it looks.

The graph should represent shared failure-domain metadata.


Shared Verifiers Need Extra Scrutiny

A shared verifier is particularly dangerous because it defines what the platform believes is success.

If one verifier becomes permissive, many capabilities can simultaneously appear healthy while becoming worse.

That is why verifier dependency centrality deserves special treatment.


Build Independent Gold Checks for Central Verifiers

For highly central verifiers, maintain independent reference cases.

gold PASS cases
gold FAIL cases
adversarial false-PASS cases
boundary cases

Run them independently of ordinary production traffic.

This is a central-dependency health check.


Central Verifiers May Need Diverse Mechanisms

For example:

coding verifier stack
    deterministic tests
    static analysis
    type checker
    semantic review

Do not let one model-based critic become the sole definition of correctness for the entire coding portfolio.


Shared State Capture Is Another Critical Primitive

If all agents make decisions from captured state, then state capture quality controls the entire platform.

A stale or partial snapshot can create:

wrong routing
wrong planning
wrong tool actions
wrong verification
wrong replay

This makes state capture a high-leverage, high-risk primitive.


State Identity Should Flow Through the Graph

A run should know:

capability used state_snapshot S42

and every downstream candidate, decision, and verifier result should bind to that snapshot or a known descendant.

This reduces TOCTOU ambiguity.


Provenance Is Often More Valuable Than Another Agent

Teams frequently invest in another specialist agent before investing in provenance.

But provenance may improve:

replay
incident diagnosis
competence evidence
release safety
drift analysis
capability learning

The dependency graph makes this leverage explicit.

This is exactly the kind of platform multiplier Step 32’s portfolio model should surface.


Shared Platform Primitives Can Reduce Prompt Complexity

A good primitive can move work out of prompts.

For example:

prompt says:
"remember to check repository state"

is weaker than:

runtime guarantees repository snapshot identity

Similarly:

prompt says:
"do not perform unauthorized actions"

is weaker than:

authority gateway blocks unauthorized mutations

Shared infrastructure can simplify agent reasoning.


The Best Dependency Is Often Deterministic

When a shared primitive can be deterministic, that is often valuable.

Examples:

schema validation
state hashing
policy enforcement
idempotency checks
fencing
rate limiting
resource accounting
provenance linking

These mechanisms should not be delegated to model reasoning unless necessary.


Do Not Build a Model for Everything

The dependency graph should expose places where ordinary software can replace model calls.

Suppose five capabilities each ask a model to classify file type.

If the rule is deterministic, extract it.

five model calls
one deterministic primitive

That improves cost, reproducibility, and correlated correctness.


But Deterministic Primitives Can Still Be Wrong

A deterministic shared component can produce perfectly repeatable errors.

That can be worse because the failure propagates consistently.

So deterministic does not mean infallible.

It means easier to specify, test, replay, and reason about.


Dependency Testing Needs Contract Tests

Each primitive should have contracts.

For example:

state capture contract
    every referenced artifact has immutable identity
    snapshot completeness policy explicit
    stale state detectable

or:

verifier contract
    result binds exact candidate hash
    UNKNOWN supported
    missing evidence cannot become PASS

or:

authority gateway contract
    stale approval rejected
    fencing epoch enforced
    idempotency key required

These contracts reduce hidden coupling.


Contract Tests Belong at Dependency Boundaries

When one primitive changes, dependent capabilities should not need to know implementation details.

They should rely on contracts.

This is ordinary software architecture applied to agent platforms.


Compatibility Must Be Directional

A capability built against verifier v4 may work with verifier v5.

Verifier v5 may not work with an older capability release that assumes different evidence semantics.

Compatibility is directional.

Step 24 already established this for behavioral releases.

The dependency graph makes the direction explicit across shared primitives.


Shared Primitive Releases Need Their Own Canaries

Do not only canary top-level agent releases.

A central primitive may deserve its own rollout:

primitive shadow
primitive canary
limited downstream cohorts
general rollout

Then top-level capabilities can inherit tested infrastructure rather than all discovering the regression simultaneously.


Dependency-Aware Shadowing

Suppose retriever v9 is being tested.

You can shadow the same production queries through:

retriever v8
retriever v9

then compare downstream verified outcomes.

Do not judge only retrieval similarity.

Ask whether downstream decisions improve.


Measure Primitive Value Downstream

The right question is not:

did retriever recall improve?

It is also:

did verified capability success improve?
did false success change?
did latency change?
did cost change?

A primitive exists to support outcomes.


The Graph Makes Attribution Easier

If one primitive changes and several capabilities improve, that is useful evidence.

If several primitives change simultaneously, attribution becomes harder.

This reinforces Step 24’s rule:

Change one behavioral axis at a time when feasible.


Capability Graphs Help Decompose Platform Cost

You can attribute shared infrastructure cost back to capabilities.

For example:

retriever cost
sandbox cost
verifier cost
browser pool cost

Then estimate:

capability marginal cost
shared platform cost
portfolio carrying cost

This makes Step 32’s portfolio economics more realistic.


Shared Cost Allocation Does Not Need Accounting Perfection

The point is not finance-grade allocation.

The point is to detect obvious architectural distortions.

For example:

rare capability consumes 40% of shared verifier compute

That is strategically relevant.


Graph the Human Cost Too

A capability may consume:

reviewer minutes
incident responder time
manual fallback time
approval queue capacity

These are dependencies and costs.

If several capabilities depend on the same specialist humans, that may justify better automation—or deliberate capacity limits.


Capability Dependencies Change the Portfolio Ranking

Suppose capability A is mediocre in isolation.

But building A requires a verifier primitive that also unlocks B, C, and D.

Then A’s project may have hidden platform option value.

Conversely, capability E may look valuable but require an expensive one-off primitive no other capability uses.

The graph changes the investment decision.


Evaluate Projects as Bundles of Capabilities and Primitives

Instead of asking:

Should we build capability A?

ask:

What primitives does A require?
What else do those primitives unlock?
What new correlated risk do they create?
What lifecycle cost do they add?

That is a better architectural question.


A Simple Portfolio-Leverage View

@dataclass(frozen=True)
class PrimitiveInvestmentCandidate:
    primitive_id: str
    unlocks: tuple[str, ...]
    improves: tuple[str, ...]
    critical_dependents: tuple[str, ...]
    estimated_effort: float
    maintenance_burden: float
    concentration_risk: str
    fallback_quality: str

This is enough to begin structured review.


Avoid a Single Leverage Score

It is tempting to compute:

leverage_score = value / effort

Do not let that erase hard concerns.

A primitive that unlocks many capabilities but creates an unbounded authority bypass should be rejected regardless of score.

Keep separate:

hard constraints
portfolio leverage
reliability risk
engineering cost

Hard Dependency Constraints Come First

Examples:

must preserve tenant isolation
must preserve authorization boundaries
must preserve verifier independence
must preserve auditability
must preserve replay identity

Only after those pass should leverage economics matter.


Build the Graph From Real Evidence

Where do dependency edges come from?

Possible sources:

  • architecture declarations,
  • runtime traces,
  • tool invocation logs,
  • release manifests,
  • verifier manifests,
  • scheduler traces,
  • provenance graphs.

Use both declared and observed dependencies.


Declared and Observed Dependencies Can Disagree

Suppose architecture documentation says:

capability X does not use retrieval

but runtime traces show retrieval calls.

That discrepancy is important.

It may indicate:

  • hidden coupling,
  • implementation drift,
  • undocumented fallback behavior,
  • policy violation.

Track it.


Dependency Drift Is a Real Failure Mode

Over time, capabilities acquire hidden dependencies.

new helper
new cache
new model call
new external API
new feature flag

If the graph is not updated, blast-radius analysis becomes wrong.

So dependency correctness needs monitoring.


Runtime Traces Can Validate the Graph

Compare expected dependencies against observed run dependencies.

expected dependency absent
unexpected dependency present
wrong version used
forbidden dependency used

These are architecture-drift signals.


Add Dependency Invariants

Examples:

production mutation must pass authority gateway
A4+ capability must use approved verifier class
forensic replay must not call live mutation tools
experimental skill store cannot be read by production agent

These are graph-level invariants.

Test them deterministically where possible.


Forbidden Edges Matter as Much as Required Edges

A dependency graph should also represent things that must not happen.

For example:

production_agent
    MUST NOT depend on
experimental_memory_store

or:

candidate_agent
    MUST NOT depend on
promotion_decision_service

Negative architecture constraints are extremely useful.


Example: Capability Acquisition Boundary

From Step 31:

experimental agent
    → sandbox tools
    → experimental memory
    → verifier

but NOT

experimental agent
    → production authority store

That forbidden edge should be testable.


Dependency Graphs Can Enforce Separation of Concerns

The graph can reveal whether your architecture has collapsed boundaries.

For example:

router
    calls verifier
    mutates memory
    changes authority
    edits policy

That component has probably become too powerful.

A graph makes this architectural smell obvious.


Centrality Can Reveal God Components

A node with massive inbound and outbound dependencies may be a legitimate platform core.

Or it may be a god object.

Investigate.

Ask:

is this centrality necessary?
are responsibilities coherent?
can failure be isolated?
can the component be tested independently?

Do not celebrate centrality automatically.


The Engineering Knowledge Graph Pattern

At this stage the dependency architecture starts to resemble a knowledge graph.

Nodes:

capabilities
primitives
policies
verifiers
models
tools
resources
releases

Edges:

DEPENDS_ON
VERIFIED_BY
AUTHORIZED_BY
RUNS_ON
USES
FALLS_BACK_TO
REPLACED_BY
INCOMPATIBLE_WITH

You do not need a graph database to benefit from the conceptual model.

But the graph abstraction becomes increasingly useful as the platform grows.


Query Examples

Useful queries include:

what capabilities depend on verifier X?
what capabilities lose A4 authority if browser pool Y degrades?
what primitives unlock the most currently unsupported demand?
which primitives have no fallback and high SLO exposure?
which competence claims depend on deprecated components?
which experimental capabilities require a primitive not yet production-ready?

These are architectural queries, not model prompts.


Dependency Graphs Improve Roadmap Sequencing

Suppose the roadmap wants:

Capability C1
Capability C2
Capability C3

And the graph says:

C1 → P1, P2
C2 → P1, P3
C3 → P1, P2, P3

Then the sequence may be:

P1
P2
C1
P3
C2
C3

rather than building each capability end to end independently.


But Do Not Build Every Primitive Up Front

Only build enough primitive capability to support validated demand.

This keeps the architecture evidence-driven.


Use Small Interfaces First

A new shared primitive should begin with the narrowest useful contract.

For example:

class SnapshotProvider:
    def capture(self, scope) -> Snapshot: ...

Do not begin with a universal repository/browser/database/world-state abstraction unless the evidence requires it.


Promote Primitives Like Capabilities

A shared primitive can begin experimental.

EXPERIMENTAL
SHADOW
LIMITED
PRODUCTION

Its promotion should be based on downstream evidence.

This mirrors behavioral release engineering.


Primitive Competence Exists Too

A primitive may be reliable only in certain regimes.

For example:

browser state capture
    validated on Chromium desktop flows
    not validated on mobile web

That is a primitive competence envelope.

Do not let downstream capabilities silently extend it.


Capability Competence Is Compositional Only With Evidence

If:

primitive A works
primitive B works
primitive C works

it does not automatically follow that:

A + B + C capability works

Composition creates interaction effects.

End-to-end evidence remains necessary.


This Is Especially Important for Multi-Agent Systems

Suppose:

planner competent
executor competent
critic competent
verifier competent

The composed system may still fail because:

  • information is lost between roles,
  • the router misassigns tasks,
  • the critic overrides correct work,
  • concurrency creates stale state,
  • the verifier observes a different artifact.

Joint competence must be measured.


Dependency Graphs Help Explain Joint Competence Failures

You can inspect:

which edge transferred the wrong state?
which dependency version differed?
which verifier path was skipped?
which fallback activated?

The graph becomes an incident-forensics aid.


Add Fallback Edges Explicitly

A capability might declare:

primary model → fallback model
primary retriever → lexical fallback
browser mutation → proposal-only fallback

These are part of operational behavior.

Record them.


Fallbacks Need Competence Evidence Too

A fallback is not safe merely because it exists.

If fallback behavior has not been validated for the task regime, it should not automatically inherit the primary capability’s authority.

This follows Step 22’s degradation rules.


The Graph Can Identify Unsafe Fallback Chains

Example:

primary verifier unavailable
fallback verifier
fallback model critic

If the final fallback is much weaker, the capability may need to reduce authority.

Graph-aware policy can enforce that.


Avoid Recursive Dependency Loops

Capability graphs can contain cycles.

Some cycles are legitimate.

For example:

monitoring depends on storage
storage monitoring depends on monitoring

But cycles deserve inspection.

In agent systems, dangerous cycles might include:

agent updates verifier
verifier approves agent update

or:

router chooses policy optimizer
policy optimizer changes router

These can collapse independence boundaries.


Detect Cycles Automatically

Run strongly connected component analysis.

Flag cycles involving:

authority
verification
promotion
policy mutation
security boundaries

Those deserve architectural review.


Not Every Cycle Is Wrong

A telemetry loop may be expected.

A self-authorizing loop is not.

Context matters.

The graph should surface cycles, not make the decision for you.


Add Ownership Metadata

Every critical primitive should have an owner.

owner team
on-call group
runbook
SLO
rollback procedure

A central dependency with no clear ownership is operational debt.


Ownership Should Follow Failure Responsibility

If a primitive can break eight capabilities, someone needs authority and responsibility to operate it.

Otherwise incidents bounce between feature teams.


The Graph Can Improve Incident Routing

If an incident affects capabilities A, B, and C and all depend on primitive P, route investigation toward P’s owner first.

This reduces duplicated debugging.


Capability Dependency Graph Metrics

Useful metrics include:

Portfolio leverage

How much validated demand depends on a primitive?

Critical authority concentration

How much high-authority execution depends on it?

Verifier concentration

How much acceptance evidence depends on it?

Fallback coverage

How much downstream capability has a validated alternative?

Dependency churn

How frequently does the primitive change?

Incident contribution

How much reliability-budget burn traces to it?

Change amplification

How many competence/release artifacts require revalidation after change?

Orphaned capability count

How many capabilities depend on deprecated or unsupported primitives?


Track Realized Platform Leverage

A primitive may have been justified because it was expected to unlock many capabilities.

Later, check whether it did.

predicted downstream capabilities
actual production capabilities
actual workload volume
actual reliability impact
actual maintenance cost

This calibrates architecture planning.


Platform Leverage Can Be Negative

A shared primitive might reduce code duplication but create so much operational fragility that its net value is negative.

That is possible.

Examples:

  • universal router becomes a bottleneck,
  • universal memory creates contamination risk,
  • universal verifier creates correlated false PASS,
  • universal retriever harms domain-specific relevance.

Do not assume centralization is good.


Sometimes Split the Primitive

If one component serves incompatible regimes, split it.

For example:

universal retrieval

might become:

repository retrieval
research retrieval
incident retrieval

while sharing only lower-level indexing infrastructure.

The graph helps identify the right boundary.


Sometimes Merge the Primitive

The opposite also happens.

Three capabilities may each implement their own identical:

artifact hashing
state versioning
idempotency

That is a good candidate for consolidation.

The graph shows duplication.


Consolidate Invariants Before Heuristics

A useful rule is:

shared deterministic invariant
    → strong consolidation candidate

shared fuzzy heuristic
    → inspect semantics carefully

This avoids universalizing domain-specific intelligence too early.


The Capability Graph Should Not Become a New God System

The graph exists to represent architecture.

It should not automatically own:

routing
scheduling
authority
release
verification

Those systems can query the graph.

Keep responsibilities separated.


Cache Graph Queries, Not Authority

It may be safe to cache:

downstream dependency list

It may be unsafe to cache:

this action is authorized

because authority can change with state.

Know which graph-derived outputs are stable.


Graph Staleness Is Itself a Risk

If dependency metadata is stale, decisions based on it may be wrong.

Therefore graph updates need provenance and validation.

Useful checks:

runtime dependency not declared
removed dependency still observed
version mismatch
graph release older than behavioral release

Use Runtime Evidence to Repair the Graph

The platform can propose graph corrections from observed traces.

But proposals should not auto-promote blindly.

This follows the same evidence-before-authority rule used throughout the series.


Graph Changes Should Be Reviewed Like Architecture Changes

A new edge can mean:

new coupling
new cost
new blast radius
new authority path
new revalidation obligation

That deserves review.


Example: Coding Agent Platform

Imagine these capabilities:

code explanation
bug localization
patch proposal
patch execution
refactoring
dependency upgrade
migration planning
incident repair

Shared primitives might include:

repository snapshot
symbol graph
search/retrieval
sandbox
patch engine
test runner
static analysis
verifier gateway
provenance
GitHub integration

The graph reveals which primitives unlock proposal capability versus production mutation authority.


Example: Research Agent Platform

Capabilities:

fact lookup
source comparison
literature synthesis
market research
policy analysis
watchlist monitoring

Shared primitives:

web retrieval
source identity
freshness
citation extraction
source authority scoring
snapshot retention
provenance
claim verifier

A citation verifier may be more valuable than another generation model because it raises the usable authority of several downstream capabilities.


Example: Browser Agent Platform

Capabilities:

page inspection
form filling
account updates
checkout assistance
workflow automation

Shared primitives:

browser session
DOM capture
credential isolation
mutation gateway
postcondition verifier
idempotency
approval service

The dependency graph should make read-only inspection much less dependent on mutation authority infrastructure.

That preserves graceful degradation.


Example: DevOps Agent Platform

Capabilities:

log diagnosis
configuration review
deployment proposal
deployment execution
rollback
incident recovery

Shared primitives:

telemetry retrieval
state snapshot
change planner
sandbox/staging
policy engine
approval
fencing
post-deploy verifier
rollback manager

The highest-value primitive may be the post-deploy verifier because it increases safe authority across multiple operations.


Example: Mixture-of-Agents Platform

Capabilities may depend on specialist agents.

coding specialist
research specialist
security specialist
critic
verifier

But shared dependencies may include:

router
context assembler
memory
model provider
scheduler
provenance

If all specialists share the same model family and same context bug, apparent diversity may be much weaker than it looks.

Graph the shared dependencies.


Measure Correlation, Not Just Topology

Two capabilities can share no explicit software dependency yet still fail together because they share:

  • training/model family,
  • prompt template family,
  • data source,
  • organizational process,
  • reviewer group.

Topology is only one form of dependence.


Add Empirical Failure Correlation

From incident data, measure whether capability failures co-occur.

Then compare observed correlation with the structural graph.

Unexpected correlation may reveal hidden shared dependencies.


Hidden Dependency Discovery

For example:

capability A and B fail together

No declared shared dependency exists.

Investigation reveals both use:

same prompt compiler

That missing edge should enter the graph.


Dependency Graphs Improve Experimental Design

When testing a new primitive, select downstream capabilities that exercise different regimes.

For example:

retriever change
    test coding retrieval
    test research retrieval
    test incident retrieval

if all depend on the primitive.

This gives better coverage than testing one happy path.


Use Boundary Cases

For a shared primitive, test near its competence boundary.

Examples:

very large repositories
adversarial web pages
stale external state
partial telemetry
high concurrency

Shared primitives deserve broad boundary testing because errors amplify downstream.


Primitive Acquisition Can Use Step 31

A new shared primitive can itself be developed through sandboxed capability acquisition.

For example:

new semantic verifier

can be developed experimentally, calibrated, benchmarked, shadowed, then promoted.

The same scientific separation applies.


But Primitive Promotion Has Wider Consequences

Promoting a central primitive may implicitly affect many capabilities.

Therefore promotion evidence should include:

primitive-level tests
plus
downstream capability regression tests

This is dependency-aware release engineering.


Dependency-Aware Regression Suites

When a primitive changes, automatically select tests for its downstream capabilities.

changed primitive
graph traversal
impacted capability set
regression suite

That is a very practical use of the graph.


Avoid Running the Entire World Every Time

The graph lets you select impacted tests rather than rerun every benchmark for every change.

This can reduce validation cost substantially.

But retain periodic full-system validation to catch hidden dependencies.


Dependency-Aware Canary Selection

A central primitive should canary across representative downstream cohorts.

Do not choose canaries only from one easy capability.

For example:

retriever v9 canary
    coding cohort
    research cohort
    incident cohort

This tests breadth of downstream effect.


Dependency-Aware Rollback

If a primitive rollback is required, ask:

which downstream releases remain compatible with the rollback version?

A primitive rollback may itself break newer capabilities.

This is why compatibility metadata matters.


Keep Known-Good Dependency Bundles

For important capability sets, store known-good combinations.

bundle_42:
    retriever 8.4
    verifier 3.2
    sandbox 5.1
    policy 12.0

This can simplify rollback during incidents.


Do Not Confuse Bundle Stability With Permanent Freezing

Known-good bundles are rollback anchors.

They are not an excuse to stop evolution.

Use controlled releases.


The Graph Helps Answer “What Should We Standardize?”

A shared primitive is a candidate for standardization when:

semantics are stable
dependencies recur
contracts are clear
failure modes are understood
operational ownership exists

Not merely because several teams wrote similar code.


The Graph Also Helps Answer “What Should Stay Local?”

Keep a mechanism local when:

domain semantics differ strongly
failure modes differ strongly
authority differs strongly
lifecycle differs strongly
shared abstraction would hide important variation

This prevents premature platformization.


Platform Teams Need Evidence Too

A platform primitive should prove that it reduces total system cost or improves reliability.

Measure:

downstream adoption
reduced duplicate implementation
reduced incidents
faster capability acquisition
better verified success
lower cost

Otherwise the platform may become overhead.


Platform Primitives Can Be Retired

If a shared primitive no longer earns its carrying cost, retire it.

For example:

universal critic service

might be removed if deterministic verifiers and specialist checks outperform it.

Shared does not mean permanent.


Retirement Requires Dependency Migration

Before retiring a primitive:

find dependents
identify replacements
validate compatibility
migrate capability by capability
verify outcomes
remove old edge

The graph provides the migration plan.


Capability Graphs and Technical Debt

Technical debt can be represented as dependency risk.

Examples:

unsupported primitive version
no fallback
unclear owner
weak verifier
high concentration
unknown compatibility

These are actionable debt signals.


Dependency Debt Is Often More Important Than Code Debt

A cleanly written shared component can still be dangerous if:

it is undocumented
unversioned
unowned
unverified
highly central

The graph exposes architectural debt that code quality tools may miss.


Add a Dependency Risk Review

For every high-centrality primitive, periodically ask:

what breaks if this fails?
how do we detect semantic degradation?
what fallback exists?
is fallback independently competent?
what is rollback time?
who owns it?
which competence claims depend on it?

This should be a recurring architectural review.


Capability Portfolio + Dependency Graph

Step 32 answered:

which capabilities should we own?

Step 33 answers:

which shared investments support them?

Together:

capability demand
portfolio selection
dependency graph
shared primitive investment
verified capability expansion

Reliability Economics + Dependency Graph

Step 28 asked where the next engineering hour should go.

The graph improves the answer.

A primitive fix may reduce reliability loss across several capabilities at once.

That can produce much higher expected return than a local patch.


Incident Forensics + Dependency Graph

Step 26 looked for the earliest causal divergence.

The graph helps identify plausible shared causes.

If five incidents across different capabilities share one primitive version, that is strong investigation evidence.

Not proof.

But strong evidence.


Drift Detection + Dependency Graph

Step 23 detected behavioral drift.

The graph lets you cluster drift by dependency.

multiple cohorts regress
all share verifier_v7

That is much more actionable than separate alerts.


Competence Envelopes + Dependency Graph

Step 30 defined competence relative to operating conditions.

Shared primitive versions are part of those conditions.

A capability is not simply competent on task class T.

It may be competent on:

T
with verifier V
retriever R
sandbox S
policy P

The graph formalizes those assumptions.


Capability Acquisition + Dependency Graph

Step 31 acquired capabilities experimentally.

Before launching acquisition, query the graph:

what missing primitive is blocking promotion?

Sometimes the best experiment is not teaching the agent a new skill.

It is building a shared verifier or state primitive.


The Architecture Principle

The dependency graph is not merely documentation.

It becomes a shared reasoning substrate for:

roadmap planning
release impact
incident forensics
scheduler admission
backpressure
competence validation
rollback
failure injection
portfolio economics

But keep one rule clear:

The graph informs decisions. It does not replace external evidence.


A Minimal Runtime

You can start with a tiny service.

from collections import defaultdict, deque


class CapabilityDependencyGraph:
    def __init__(self):
        self._deps = defaultdict(set)
        self._reverse = defaultdict(set)

    def add_dependency(self, capability_or_node: str, dependency: str) -> None:
        self._deps[capability_or_node].add(dependency)
        self._reverse[dependency].add(capability_or_node)

    def dependencies_of(self, node: str) -> set[str]:
        return set(self._deps[node])

    def direct_dependents_of(self, node: str) -> set[str]:
        return set(self._reverse[node])

    def affected_by(self, node: str) -> set[str]:
        affected = set()
        queue = deque([node])

        while queue:
            current = queue.popleft()
            for dependent in self._reverse[current]:
                if dependent not in affected:
                    affected.add(dependent)
                    queue.append(dependent)

        return affected

That already enables:

impact analysis
regression selection
blast-radius queries

You can add richer semantics later.


Then Add Policy Metadata

@dataclass(frozen=True)
class DependencyRequirement:
    dependency_id: str
    minimum_version: str | None
    authority_floor: str | None
    required_verifier_class: str | None
    fallback_id: str | None

Then the runtime can answer more meaningful questions.


Keep Graph Evaluation Deterministic

Graph traversal, version compatibility, required-edge validation, and forbidden-edge checks should generally be deterministic software.

Do not use an LLM to answer:

is dependency X required by capability Y?

when the architecture already declares the edge.


Use Models for Explanation, Not Authority

A model may summarize:

why primitive P is high risk

But the authoritative facts should come from:

graph
runtime evidence
SLO data
release metadata

This keeps reasoning inspectable.


Failure Mode: Feature-Count Leverage

A team prioritizes a primitive because it unlocks the largest number of capabilities.

But those capabilities are low-value and rarely used.

Fix:

weight by observed demand and capability importance

Failure Mode: Centrality Worship

A highly central component is assumed to be strategically valuable.

But it is actually a badly designed god service.

Fix:

review semantic cohesion and failure isolation

Failure Mode: Reuse Monoculture

One universal model/retriever/verifier becomes mandatory everywhere.

Fix:

domain-specific policy
independent fallbacks
failure-domain diversity

Failure Mode: Invisible External Dependency

The graph models internal services but ignores the external API every critical capability uses.

Fix:

include external systems and provider failure domains

Failure Mode: Missing Human Dependency

Production authority relies on one small reviewer group, but the architecture does not represent that bottleneck.

Fix:

model human review capacity as a dependency

Failure Mode: Shared Verifier Blindness

Several capabilities share one permissive verifier.

PASS rates remain healthy while quality collapses.

Fix:

central-verifier audits
independent gold cases
diverse mechanisms

Failure Mode: Stale Graph

Runtime behavior changes but architecture metadata does not.

Fix:

compare declared vs observed dependencies
alert on divergence

Failure Mode: Hidden Forbidden Edge

An experimental component gains access to production policy or authority state through a convenience integration.

Fix:

model and test forbidden edges

Failure Mode: Graph-Driven Overengineering

The team builds a universal graph platform before proving any operational need.

Fix:

start with explicit data structures and real queries

Failure Mode: Graph Replaces Verification

The scheduler sees all dependencies healthy and assumes success is likely enough to skip end-to-end verification.

Fix:

graph health never substitutes for outcome verification

Failure Mode: Unvalidated Fallback

A capability falls back to a weaker dependency and retains the same authority.

Fix:

fallback competence must be independently established

Failure Mode: Dependency Change Without Revalidation

A central retriever or verifier changes and downstream competence claims are treated as unchanged.

Fix:

dependency-aware release impact and revalidation

Failure Mode: False Redundancy

Two backup services share the same provider, region, quota, or model family.

Fix:

model failure-domain metadata

Failure Mode: Universal Queue

All capabilities share one queue and one saturated dependency stalls unrelated work.

Fix:

bulkheads and resource-aware scheduling

Failure Mode: Capability Teams Own Shared Risk Separately

Each feature team manages the same central primitive independently.

Fix:

explicit platform ownership and SLOs

What Should You Measure First?

Do not begin with fifty graph metrics.

Start with:

1. downstream production capability count
2. critical-authority dependent count
3. fallback availability
4. verifier role
5. recent incident association
6. dependency churn
7. declared-vs-observed mismatch

That already exposes a lot.


A Useful Review Table

Primitive Unlocks Critical Dependents Fallback Failure Domain Main Risk
repository snapshot 7 4 partial internal storage stale state
verifier gateway 9 6 weak shared service correlated false PASS
sandbox runtime 6 3 none compute cluster capability outage
provenance store 8 2 degraded logs database forensic blindness
browser provider 4 2 secondary provider external workflow outage

The exact numbers are less important than making the architecture discussable.


The Goal Is Not Maximum Reuse

The goal is not:

one primitive for everything

The goal is:

coherent shared primitives
with explicit contracts
bounded failure domains
validated fallbacks
and measurable portfolio leverage

That is a much stronger architecture.


The Goal Is Not Maximum Independence Either

Duplicating every subsystem per capability creates:

higher maintenance
inconsistent safety rules
inconsistent provenance
inconsistent verification
slower capability acquisition

The correct design balances reuse against correlation risk.


A Practical Decision Procedure

When considering a new primitive or consolidation, ask:

1. Which real capabilities need it?
2. Are their semantics actually shared?
3. What verified value does it unlock?
4. What authority paths depend on it?
5. What happens if it fails semantically, not just operationally?
6. What fallback exists?
7. Is that fallback independently competent?
8. Does consolidation create dangerous correlated failure?
9. Can we isolate resources or authority while sharing implementation?
10. How will dependency changes trigger revalidation?

If those answers are weak, do not centralize yet.


The Series So Far

At this point, the advanced-agent architecture has grown from search techniques into a full production engineering discipline.

reasoning techniques
verification
observability
adaptation
budget scheduling
uncertainty decomposition
value of information
speculative concurrency
distributed coordination
platform scheduling
failure containment
drift detection
release engineering
replay/provenance
incident forensics
SLOs/error budgets
reliability prioritization
authority boundaries
competence envelopes
sandboxed capability acquisition
capability portfolio
capability dependency graph

The architecture is increasingly less about making an LLM clever.

It is about building a system that knows:

what it can do
what it should do
what it may do
what evidence supports those claims
what shared mechanisms those claims depend on

The Principle to Keep

The capability dependency graph gives you two views at once.

It shows leverage:

one primitive
many capabilities

And it shows concentration risk:

one primitive fails
many capabilities degrade

You need both.

So the rule is:

Invest in shared primitives when they unlock verified portfolio value, but treat high-centrality dependencies as explicit reliability and governance boundaries.

That is how you get the benefits of a platform without accidentally creating a monoculture.


What Comes Next

Once the capability graph exists, another problem becomes visible.

The platform may know:

which capabilities depend on which primitives

but it still needs to decide:

where should a capability run?
which model/provider/region/tool instance should serve it?
how should the platform place work across heterogeneous resources?

A local model may be cheaper.

A frontier model may be stronger.

A particular verifier may only exist in one environment.

A GPU may be saturated.

A browser provider may be degraded.

A tenant may require data residency.

A task may require specific tooling or authority boundaries.

The next stage is capability-aware placement and heterogeneous execution.

Not merely:

route task to model

but:

task requirements
competence envelope
dependency availability
resource / cost / latency / residency constraints
placement decision
verified execution

That is where a real agent platform starts to behave like an operating system for heterogeneous intelligence.