CloudCubit LogoCloudCubit
Solutions

We implement the path, not just the slide.

CloudCubit takes a product constraint and turns it into a running system: map the graph, write the contracts, implement the path, debug it with traces, then keep it operable.

Delivery signal

Graph

C4 · flows · contracts

Code

typed paths · tools

Debug

trace · repro · RCA

Operate

SLO · budget · loop

$ graph apply --from constraint.card.yaml

What we implement

Solutions are delivery shapes, not a catalogue of slogans. Each track uses the same implementation loop — the graph and the runtime change, the discipline does not.

Agents · RAG · Evals

AI systems

LLM applications that sit on real data paths: retrieval, tool use, guardrails, and evaluation — not a chat widget bolted onto a form.

  • Agent graphs with explicit tool contracts
  • Chunking, embeddings, and hybrid retrieval
  • Offline evals before a prompt reaches production
Open this track

Web · API · Mobile

Product platforms

Typed frontends and backends that share one contract. The UI, the API, and the mobile client consume the same domain model.

  • Next.js / React surfaces with strict TypeScript
  • NestJS and FastAPI services behind a gateway
  • Flutter or React Native when the product needs a native client
Open this track

Azure · AWS · Postgres

Cloud & data

Environments that can be rebuilt from code, with data stores chosen for the access path — transactional, cache, document, or vector.

  • Terraform / Bicep landing zones
  • PostgreSQL, Redis, Cosmos, and vector indexes
  • Pipelines that keep retrieval stores in sync with source systems
Open this track

Strangle · Integrate · Replace

System modernization

Move a working system in slices. We graph the current estate, put a façade in front of the risky seams, and replace capabilities without a big-bang cutover.

  • Dependency and data-flow maps of the as-is system
  • API façades and event seams around the monolith
  • Rollback paths that stay valid until the old path is gone
Open this track

Eight phases. One join key.

Implementation is a loop, not a waterfall. The same identifiers — service names, trace ids, contract versions — travel from the first diagram through code, debug, and operations.

Phase 02

Graph

Before code, we draw the system. Domain boundaries, request paths, data ownership, and the edges that will later show up as traces.

  • C4 context and container diagrams for the target architecture
  • Sequence diagrams for the critical request and the failure path
  • Data-flow graph: producers, stores, consumers, retention
  • Service contracts: REST, events, and tool schemas for agents
C4 containersData-flow graphOpenAPI / events
graph.containers.ts
export const graph = {
  nodes: ["gateway", "intake", "agent", "rag", "ledger"],
  edges: [
    ["client", "gateway", "https"],
    ["gateway", "intake", "rest"],
    ["intake", "agent", "command"],
    ["agent", "rag", "retrieve"],
    ["agent", "ledger", "tool:write"],
  ],
  ownership: { ledger: "finance", rag: "knowledge" },
};

System graph

If it is not on the graph, it is not in the system.

Every solution starts as a directed graph: who calls whom, which store owns the write, and where the trace has to survive a hop. Code is a projection of this picture. Debug is walking it with a real request.

ClientGatewayAPIAgentWebPostgresRedisVector / RAGQueueTraces
Request pathTool / command pathTrace join

Code is the graph, compiled.

We implement against the diagram. Agent workflows are data — nodes, edges, tools — so a change in routing is a change you can review. Retrieval, writes, and HTTP handlers stay in modules that a trace can name.

Contracts first

OpenAPI, events, and tool JSON Schema exist before the handler. The UI and the agent consume the same types.

One write owner

A store has a single writer. Everyone else goes through a command or a projection. That is what makes debug possible.

Ids survive hops

run_id, trace_id, and idempotency keys are arguments, not afterthoughts. If a write cannot be replayed, it does not ship.

type Tool = {
  name: "ledger.apply" | "rag.search";
  schema: Record<string, unknown>;
  exec: (input: unknown, ctx: SpanCtx) => Promise<unknown>;
};

export function buildGraph(tools: Tool[]) {
  return {
    nodes: ["plan", "retrieve", "act", "commit"],
    edges: [
      ["plan", "retrieve"],
      ["retrieve", "act"],
      ["act", "commit"],
    ],
    tools: Object.fromEntries(tools.map((t) => [t.name, t])),
  };
}

export async function invoke(run: Run, graph = buildGraph(registry)) {
  const span = tracer.startSpan("agent.invoke", { runId: run.id });
  const context = await graph.tools["rag.search"].exec(run.query, span);
  const action = await policy.decide({ run, context });
  return graph.tools["ledger.apply"].exec(action, span);
}

Debug the path, not the symptom.

A failing write is a span, a log line, and a missing key — not a mystery. We keep traces, structured logs, and a replayable payload so the fix is a test, not a hunch.

correlated logs

trace=8f2c1a

  • 12:04:01.102INFOgatewayaccepted POST /v1/intake trace=8f2c1a
  • 12:04:01.118INFOintakecommand enqueued run=inq_19c q=intake.commands
  • 12:04:01.204DEBUGraghybrid retrieve q_tokens=86 hits=8 max_score=0.81
  • 12:04:01.311INFOagenttool.select ledger.apply reason=route_claim
  • 12:04:01.348WARNledgeridempotency miss key=null span=tool.ledger.apply
  • 12:04:01.349ERRORledgerreject write code=IDEMPOTENCY_REQUIRED
  • 12:04:01.352INFOagentretry suppressed policy=fail_closed
  • 12:04:01.360INFOintakerun failed status=422 trace=8f2c1a

Trace waterfall

gateway.http18ms
intake.command12ms
rag.retrieve22ms
agent.invoke62ms
ledger.apply14ms

The error sits on ledger.apply — an idempotency key never left the agent. Fail closed, then add the key to the tool schema.

Repro → test

Capture the payload. Replay it against the failing revision. Write the assertion on the tool schema. Only then change the agent. That is the debug phase.

The loop is the product.

After go-live we do not switch to a different way of working. Telemetry writes the next graph change. The same people who drew the edges read the traces.

  1. 01

    Constraint

    What must never go wrong.

  2. 02

    Graph

    Who owns the write.

  3. 03

    Code

    Types that match the edges.

  4. 04

    Debug

    Trace the failing hop.

  5. 05

    Verify

    Eval, test, load.

  6. 06

    Operate

    Budget, then change the graph.