Generated from cat-harness/processes/kg/mount-dependency.bpmn by gen-processes-viz.ts — do not edit here. All processes

Remote-mount a dependency

Process_MountDependency · strict · 6 step(s)

Laying a harness — and every instance it needs — down from another repository at a pinned commit, as declared directories, with a lock that says exactly what arrived.

You are in this process whenever a folio or harness needs a layer it does not hold: a downstream folio built on a content layer above this harness, a separated instance whose foundation lives elsewhere. The downstream names the harness, its repository and a 40-character pin as a source.remote instance in its root index.config.json (legacy: remoteMounts on its declaration, never both); everything else is read from the harness’s own declaration at that pin.

Every instance reached ends in one of three states — mounted, missing, could-not-determine — and the third is never reported as the first. The skill is remote-mount.

BPMN diagram: Remote-mount a dependency

How it connects

  • Called by: no call activity names this process
  • Calls: none
  • Presented on: no docs page section shows this diagram

Lanes — who acts

lanerolewhat it does here
Downstream authorauthorA person decides WHICH harness and WHICH pin, and whether to override a default. Nothing below chooses a pin: a branch name is refused, and so is an abbreviated SHA.
Build pipelinebuild-pipelineMechanical from the declaration on: the same declaration mounts the same bytes in every container, and only an override by id changes where or what.

Steps

Every one of the 6 step(s) is documented.

steplaneskill / sub-processwhat it does
Declare the mount: harness, repository, pin
Task_DeclareMount
Downstream authorremote-mount
index-config
An instance { name, source: { remote: { repository, ref } } } in the
downstream’s root index.config.json, written through
writeDeclaredMounts. A folio with no index still reads remoteMounts
on its declaration; both at once is refused. ref is a full
40-character commit. Overrides, if any, are keyed by instance name and
then by directory id — never by path. The index itself is the
index-config skill’s.
Decide first whether you want a remote mount at all: reading another
graph without holding its code is a SUBSCRIPTION, not a mount.
Resolve the closure at the pin
Task_ResolveClosure
Build pipelineremote-mountFetch the pinned tree (shallow, blobless). Read the harness’s declaration
from it; for each needs name, find that instance in the same tree, else
follow a GITLINK at that tree as a pin into its own repository. A need
found in neither is missing; one the downstream already holds is local.
Paths and directories come from mountDefaults unless overridden.
Mount each instance at its declared path
Task_MountInstances
Build pipelineremote-mountSparse checkout of the declaration and the chosen directories, copied to
the mount path (by default the instance’s home path, so relative imports
and sibling discovery hold). Never onto tracked bytes; never onto a
directory no lock says this mount made; never over edits to a previous
mount — those are left untouched and reported.
Write the lock
Task_WriteLock
Build pipelineremote-mountindex.lock.json beside the downstream’s index.config.json (the
legacy <instance>.mount-lock.json is still read, and is renamed
onto the new name when rewritten; both present is an error): the
pins it was written for, each instance’s repository, SHA and how the pin
was found, each directory’s tree digest — and what was NOT mounted, with
why, so an offline check cannot read a gap as clean.
Re-render the agent surface
Task_RenderAgentSurface
Build pipelineremote-mount
agent-memory
When the lock changed, the layers an agent’s skills and memory are
generated from changed with it. mount:remote re-runs the generators
of what an agent actually reads — skill:commands (.claude/commands/)
and agent-memory (.claude/agent-memory/ and the .agents/ copies)
— from the checkout root, and a generator that fails fails the run.
A re-pin commit therefore carries the new layers AND the surface
rendered from them; shipping the first without the second is how
folio-assistant#2526 went red on three agent-memory tests. Owner,
2026-10-10: “it may have new agentic skills to re-render and add.
same for memory.”
Check disk against lock against declaration
Task_CheckAgainstLock
Build pipelineremote-mount
ci-health
mount:remote:check, with no network: the lock’s pins are the
declaration’s, and every locked directory is on disk and hashes to its
digest. Could-not-determine outranks missing, which outranks mounted.

Decisions

Every one of the 1 decision(s) is documented.

decisionwhat decides itbranches
Every instance mounted or local?
GW_State
Read off the check’s aggregate state. skipped and local are answers; missing and could-not-determine are not.yes → The closure is on disk, pinned and locked
no → Reported loudly: missing / could not determine

folio-assistant — code under the Apache License 2.0, documentation under CC BY 3.0. Generated schema and API references are rebuilt from source on every push to main.

deployed dev