Use cases
Use cases
Section titled “Use cases”The project moves in vertical slices. Every use case reaches all the way to Python, and is considered closed when it answers every guarantee on its questionnaire.
How to read it. Each section records a decision at the moment it was taken. The argument is the point — code moved on, the reasoning did not — so what a section says is what was true when it closed, with three exceptions written down once here rather than patched into every section that predates them:
workers={"gpu-box": Worker.at(…)}inGraph.forwardand inTrainerbecamebroker=Broker.embedded({…})in CU28. The shape of what is handed over is the same; what it resolves to is no longer a connection.- the crate called
transportmoved out tosoma-fabric/wire, unchanged, after CU27. Paths in the questionnaires point at where the tests are today. Transition,AwaitandDriver— a node that suspends and something that serves what it asked for — were removed after CU18. A node is a function. Sections written before that still show them; After CU18 says why they went.
What each slice settled
Section titled “What each slice settled”| what it settled | ||
|---|---|---|
| CU1 | creating a graph | topology only, and errors at insertion rather than in a validate() |
| CU2 | executing one | the engine is Rust, Value has a closed set of variants |
| CU3 | the shape of it | Plan is an enum, and compile is the step between structure and engine |
| CU4 | fans both ways | aggregation is a node reading a map; there is no Aggregator trait |
| CU5 | the DSL | >> and | in both languages, and somatize is the verb |
| CU6 & CU7 | one contract | one Node with one forward, in both languages |
| CU8 | Opaque | a value that only exists in this process, asked for by hand |
| CU9 | waves | one thread per branch, decomposed as a tree and not flattened |
| CU10 | the device | Placement is a fact of its own; the plan says when, not where |
| CU11 | training | outside the graph, and the three levels the rest rests on |
| CU12 | a worker | Plan::Remote, the Transport hole, and what does not travel |
| CU13 | the cache | a Merkle key over the recipe, and the Keeper hole |
| CU14 | training the far half | a trainer travels and stands beside the node |
| after | Opaque on the wire | a codec in front of it, measured at 9–15× |
| after | every=N | a group of steps is one update |
| CU15 | federated | export is weights node by node, fedavg is a function, a round is a for |
| CU16 | the grain of an item | an item’s name is its content; micro-batches are level 2 |
| CU17 | level 3 | Partition, Pruner, Sampler — pure, and no callback crosses |
| CU18 | a study in a folder | a trial is a number, claim settles it, the state is the queue |
| after | a node is a function | Transition and Driver had no tenant and went |
| CU19 | a graph drawn | observability is three things, and this is the first |
| after | a bucket | the second Store, and claim is a conditional PUT |
| CU20 | the record | the Watcher hole; facts meet in the record, not in Rust |
| after | a run drawn | one drawing function, live and read back |
| CU21 | the diagnosis | an opinion about the record, reproducible without training again |
| CU22 | before a step | a probe is one recorded forward; what separates is a runaway |
| after | a block is a box | repeats, lanes, and an arrow that left the drawing |
| CU23 | the fleet | no registry; the record turned the other way up |
| CU24 | the data | a source is a node, and it is handed a coordinate |
| CU25 | not running what nobody needs | names are knowable before anything runs |
| CU26 | what an edit did | two sets of names, and findings rather than buckets |
| CU27 | what a node was built with | the declaration goes in the key |
| after | the wire leaves | transport → soma-fabric/wire, and why |
| CU28 | a broker | which broker is a URL; ask eagerly, connect lazily |
| CU29 | provenance | what cannot be recovered is written down when it is known |