Discussion & Analysis · Working Document

The Project Graph

What if Context Graph didn't just index an agentic project, but ran its methodology — tracking every decision and its reasoning, holding the current state, keeping specialised agents in sync, and refusing the moves that break the process?

● Open discussion — leanings recorded, questions unresolved
decisions worth remembering distinct agent roles CG as gatekeeper reuse, don't rebuild methodology as data
The gap

The problem: agentic projects forget the why

A multi-agent development setup produces a mountain of artifacts — PRDs, change requests, tasks, architecture docs, changelogs, commits. Most tooling captures what exists. Almost none captures why each step was taken — and that is exactly the memory a team of agents needs to stay coherent.

Three failure modes fall out of that gap, and every one of them is a lost-context problem:

Rebuilding what exists. A developer agent writes a new API because it never learned one already covers the case. Duplication, drift, wasted turns.
Drift between roles. Manager, architect, developer, and integrator sync through shared files (changelogs, task lists). Files go stale; an agent reads yesterday's truth.
Amnesia about decisions. "Why did we choose Postgres over Mongo here?" The rationale lived in a discussion that no artifact preserved. The next agent re-litigates it.
The scarce resource isn't the code or the task list. It's the reasoning — and the reasoning is precisely what a normal knowledge graph, and a pile of shared files, throw away.
The reframing

Actor, not index

Context Graph's whole thesis is the fourth element: every edge carries a RelationContextwho decided, why, via which channel, under which policy, valid until when. So the thing you called most important — the reason behind each step — isn't a feature to bolt on. It's the native unit of storage.

That flips the ambition. Not "an index of progress and code" but a decision-and-state substrate your agents read from and write to — one that can also act: define the methodology, hold current state, surface precedent, and refuse illegal moves.

CG as index (passive)CG as actor (this proposal)
RoleA queryable mirror of files & codeSource of truth for decisions & state
WritesSynced after the factAgents change state through CG
MethodologyLives in prompts & humansEncoded as ontology + rules + actions
On a bad moveRecords itFlags or blocks it, with the reason
◆ The working thesis
Git stays the source of truth for code. Context Graph becomes the source of truth for decisions, relationships, and state — and, through the rules gate and the action layer, an actor that shapes how the agents behave rather than merely recording what they did.

What CG is not — and what it sits on

A crowded adjacent category is the structural code graph — tools like CodeGraph that index symbols, calls, and imports with tree-sitter to make an agent's reading of a codebase cheaper (real, measurable token savings). CG is not that, and shouldn't try to be. The distinction is sharp — it's recoverable vs irrecoverable information:

Structural graph — recoverable. A deterministic projection of the code. Delete it, re-run tree-sitter, get it back byte-for-byte. A cache. Never truly lost.
Context Graph — irrecoverable. Why Postgres over Mongo, who approved the exception, which API was deprecated on purpose. The AST holds none of it. Once the discussion scrolls off, it's gone. The scarce layer.

Two more axes: CG is active (it gates, flags, records) where a code graph is descriptive (a map you read); and CG is generic (sales, compliance, agentic dev — code is one config) where a code graph is code-only. So the two stack: a structural index is the ideal feeder for CG's API/Module objects — giving the "don't rebuild that API" check a complete, exact inventory to govern against.

◆ Positioning, one line
A structural code graph makes an agent's reading of the code cheaper. Context Graph makes a team of agents' decisions coherent and governed. Same neighbourhood, different floor — and CG rides above the structural one, it doesn't replace it.
The concrete setup we're mapping

Grounding: an existing AI dev team

This isn't hypothetical. The analysis maps onto a working methodology — dsivov/ai_development_team — so every proposal below has something real to answer to. (The setup evolves; treat it as the reference for principles, not a frozen spec.)

In the current setupWhat it is
Six rolesManager · Architect · Developer · Integrator · DevOp · Production Engineer — each with distinct permissions and roles/<role>/CLAUDE.md instructions.
Hand-offMarkdown queue/*.md for inter-agent messaging, plus TASKS.md, CHANGELOG.md, CHANGEREQUESTS.md.
Enforcement (already exists)hooks/role_enforcer.py validates operations via PreToolUse hooks; git branch-level restrictions enforce role boundaries.
Lifecycleinit → manager tasks → architect decomposition → developer impl → integrator test/commit → production-engineer release.
Multi-project · skillsprojects/<name>/ isolation; each role has ~3 skills that auto-activate by context.
◆ Two things this pins down
(1) The role list is already six, not four, and it changes over time — proof that roles are preset data, never core code (§ staying generic). (2) Role enforcement already exists in the harness. So CG doesn't introduce access control — it moves the state-changing slice of it into a shared, auditable place. More on that in the RBAC gap.
What the graph contains

The project ontology

The ontology layer already lets us declare a typed schema per workspace. A project graph is just the right object and link types for software delivery:

Discussion Decision (ADR) Feature / PRD Task Commit Module API / Interface produces motivates requires closed_by touches exposes delivers_to reuses
Objects are typed nodes; links are the relationships. Every link edge carries a RelationContext — the who/why/when of that connection.
Object typesLink types (each edge → an rc)
Discussion, Decision, Feature, ChangeRequest, Task, Module, API, Commit, Skill, Role Discussion —produces→ Decision, Decision —motivates→ Feature/Task, Feature —requires→ Task, Task —closed_by→ Commit, Module —exposes→ API, Task —reuses→ API, CR —supersedes→ Decision, Role —owns→ Module, Skill —applies_to→ Module

Typed properties matter here too: a Decision has status (enum: proposed · accepted · superseded), an API has a signature and stability, a Task has state. Those typed values are what the rules gate and precedent search reason over.

◆ See it drawn
The validated ontology, an example flow, and the onboarding pipeline are visualised in the companion Onboarding, Flow & Data walkthrough. Source: presets/agentic-dev/ontology.json.
Going deeper (your open question)

What's worth remembering

You leaned toward "decisions worth remembering," not every keystroke — but weren't sure where the line falls. Here's a proposal for a principled line, and it comes straight out of CG's own design.

A RelationContext has content only if it can name a rationale and (usually) an actor — CG even has an is_empty() check for exactly this. So use that as the filter:

If you can't say who did it and why, it's telemetry — not memory. Capture the event as a graph edge only when it carries a decision.
EventCapture?Why
Architecture / tech choice, API contract, a rejected optionyes — node+rcPure decision, with rationale. The crown jewels.
State transition (task → in-progress → done; feature → accepted)yes — edge+rcA decision with an actor and a reason ("moved to done: tests pass, integrator signed off").
Artifact created (PRD, architecture doc, discussion)node, ingestedNode for the artifact; its content is extracted via ingestion, its decisions emitted.
Commitedge, thin rcEvidence, not rationale — Task —closed_by→ Commit. The why lives on the decision it implements.
File save, lint run, every keystrokenoTelemetry. Empty rc. Belongs in logs, not the graph.
Two capture paths, matched to the event
Ingestion (ainsert) for prose artifacts — point CG at the discussion HTML or the architecture doc and let extraction pull entities + decisions out. Runtime emission (emit_decision_trace) for structured moments — an agent finishing a task calls it directly with a clean, typed RelationContext. The methodology decides which events get the structured path.
Current lean: "decisions & state transitions," filtered by the can-you-name-the-why test — but this is still open; we may want commits captured richer if git-blame-style provenance proves useful.
Your decision: distinct

Roles as first-class identities

The roles are distinct, each with its own skills and sessions. The exact set is preset data, not core code — the current setup has six (manager, architect, developer, integrator, devop, production-engineer), and it will keep changing. Whatever the list, being distinct has three clean consequences in the graph:

Provenance of behaviour. approved_by / approved_via on every decision records which agent made it. "Why is this API shaped this way? — the architect decided it in session 42." Debuggable agents.
Skills as edges. Role —has_skill→ Skill —applies_to→ Module. Ask CG "what does the developer need to touch the billing module?" and it answers from the graph, not a static prompt.
Sessions as provenance. A session is a provenance source; all decisions in it share a thread, so you can replay "what did the integrator conclude this session?"
◆ The honest catch — CG-side RBAC isn't built yet
Distinct roles naturally want "the architect may ApproveArchitecture; the developer may not." The harness already enforces roles for local tool/git use (role_enforcer.py + branch rules); what CG lacks is the shared, auditable layer for project-state actions — object-level access control, the next P3 item. The design, and the two-layer split, are worked out in Closing the gaps · Gap 1.
Your decision: enforcement

Methodology as data

You chose the actor / enforcement model — CG shapes agent behaviour, not just records it. The way that becomes real: encode the methodology in the three layers we already have, so the process is data, not prose in a system prompt.

Methodology as…LayerExample
What states & objects are legalOntologyA Task may be proposed|active|done; a Decision may be superseded.
What transitions & moves are allowedRules"No Task without a linked Feature." "Flag an API that duplicates an existing one."
What an agent may actually doActionsProposeAPI, CreateTask, ApproveArchitecture, MergeIntegration.

Together those three are a state machine over the project graph: agents advance the project only through governed actions, and the pre-emit gate refuses illegal moves — surfacing the reason. That is the "actor" in concrete terms.

# methodology rule: a new API that looks like an existing one gets flagged, not built
rule "reuse before you build"  priority 20
when
    sim(relation_type, "CREATE_API") > 0.4
    and similar(decision_trace, "EXISTING_CAPABILITY", 0.55)
then
    flag("A similar capability already exists — cite it or justify the new API")
end
Current lean: advise and enforce — hard-block the structural rules (no orphan tasks), flag the judgement calls (possible duplicate). Exact split is open.
End to end

Worked example: "don't rebuild that API"

The single use case that ties every layer together — a developer agent about to build something that already exists:

developer agentProposeAPI(refund) rules gatesim() vs existing APIs+ precedent search FLAG: "PaymentService.refund()already exists — reuse or justify" PASS: genuinely newaudit edge: Role —created→ API
The proposal is judged before code is written. A duplicate is flagged with the precedent cited; a genuinely new API is recorded, attributed to the role that made it.
  1. Developer agent, before coding, invokes ProposeAPI(name, description, module).
  2. The gate runs sim() over the descriptions of existing API objects and does a precedent search over past decisions.
  3. Duplicate?FLAG with the match cited. The agent reads the reason and reuses instead.
  4. Novel?PASS; an audit edge records the new API, attributed to the role and session.
  5. Either way the reasoning is now in the graph — the next agent inherits it for free.

This is ontology (API objects) + rules (the duplicate check) + actions (governed ProposeAPI) + precedent search, composed.

Keeping agents in sync

The sync bus: CG replaces shared files

Today the four roles coordinate through shared files — changelogs, task lists, architecture docs — which go stale the moment they're written. Replace the file hand-off with a live query against CG over the MCP server: each agent reads current state on demand and writes decisions back.

Read the picture, at the right altitude. local mode for a single module's detail; global/mix for the whole-project map; CGR3 for multi-hop questions ("what depends on the auth module, and who approved the last change to it?").
Write decisions back. Each role emits its conclusions as it works, so the next agent — in a different session — sees today's truth, not yesterday's changelog. No merge conflicts on a markdown file.
MCP is the wire
The roles already have a channel: the MCP server exposes CG as tools. Manager, architect, developer, and integrator each get the query + emit + (governed) action tools their skills need — a shared, decision-aware working memory instead of a shared folder.
The entry point

Onboarding & the playbook

How does an agent know how to use CG — the config, the flow, its own permissions? A setup wizard tailors and initialises the project; each agent then gets an operating manual. But "manual" splits into two things that must be handled differently.

Two kinds of "knowing CG"

Generic CG usage — how to call CG at all: the MCP tools, what emit/query/an action mean. Identical for every project. Lives in the agent's system prompt / a "working-with-CG" skill / the self-describing MCP schemas. Never regenerated per project.
Project-specific config — this project's ontology, roles, actions, lifecycle, and what the gate flags. This is the playbook — a projection of the installed config, scoped to a role. Generated at onboarding and kept current.
◆ The trap — a generated playbook file drifts
A static playbook.md the agent reads forever is just queue/*.md again: tweak a rule and it's stale. So the project half is delivered both ways — a bootstrap snapshot to seed the session, plus a live, role-scoped manifest the agent re-fetches so it never acts on yesterday's config.

The tailored wizard flow

① Describe projectname · repo · roles · workspace ② NL authors draftOntologyAuthor + RuleAuthor ③ Review & installpreset → CG ④ Workspace liveontology·rules·actions·roles Each agent gets — per role ① a CLAUDE.md snapshot (bootstrap) + ② a live manifest, re-fetched per session — never drifts
Tailored, not templated. The wizard interviews the user, the NL authors we already ship draft a project-specific ontology + rules for review, then install — so onboarding generates your methodology rather than copying a fixed template.

The manifest — an agent's operating context

One generic, role-scoped call returns everything an agent needs to act; it re-fetches it when the config version bumps.

GET /workspace/manifest?role=developer  →
{
  "workspace": "acme_app", "role": "developer",
  "skills": ["clean-code", "debugging", "impl-patterns"],
  "object_types": ["Feature", "Task", "Module", "API", "Commit"],
  "actions": [ {"name":"ProposeAPI", "params":[…], "effect":"…"}, {"name":"AdvanceTask", …} ],
  "guardrails": [ "new API — confirm reuse (FLAG)", "deprecation needs a linked decision" ],
  "lifecycle": { "Task": "proposed → active → done | blocked" },
  "mcp": { "url": "…", "tools": ["query", "emit", "invoke"] }
}

The endpoints stay generic — POST /presets/{name}/install, GET /workspace/manifest?role=, and a POST /onboard that runs install and returns {workspace, per-role manifests, mcp, installed}. The wizard is orchestration on top; core never learns "manager" or "Task".

How it lands in the current setup
roles/<role>/CLAUDE.md stays — but slimmed to generic CG usage + "fetch your manifest at session start." The project specifics come from the live manifest, not baked into the file; role_enforcer.py keeps gating local tools; the manifest tells the agent what CG itself will and won't allow.
✓ Settled
Tailored — the wizard uses the NL authors to generate a project-specific config for review, not a fixed template. · Both deliveries — a bootstrap CLAUDE.md snapshot and a live role-scoped manifest the agent re-fetches (the snapshot bootstraps; the manifest is the source of truth).
Honesty check

Ready vs missing

What this use case can stand on today, and what it's waiting on — mapped to the real state of the codebase.

CapabilityStatusNote
Typed project schemareadyOntology layer — declare the object/link types above.
Decision + reasoning capturereadyRelationContext + emit_decision_trace + ingestion.
Reuse / precedent searchreadyfind_precedents + sim() in a rule.
Methodology enforcementreadyRules gate (advise/flag/block) + governed actions.
Whole-picture & per-module viewsreadyQuery modes + CGR3; workspace isolation per project.
Agent sync channelreadyMCP server exposes CG to each role.
Per-role permissions (who may do what)shipped ✓Object-level RBAC — opt-in, deny-by-default, gates /actions/invoke (403). Gap 1.
Task lifecycle as a real workflowshipped ✓Declarative state machines; transition actions checked + applied on the node (illegal → 409). Gap 2.
Deterministic inference (entailment)gap"A depends on B, B exposes X…" is LLM synthesis today, not derivation.
Auto code/API extractionfeed from belowCG won't parse the repo — by design. Feed API/Module objects from a deterministic structural index (tree-sitter / CodeGraph-style), and reserve LLM extraction for the decisions.
The read — updated
Every load-bearing capability is now here. The two former "next P3" items (per-role RBAC, the lifecycle layer) that this use case forced are both shipped — so the whole chain RBAC → lifecycle → rules gate → side effect runs end-to-end, and a role-scoped manifest advertises exactly the actions a role may invoke.
Working the gaps, one at a time

Closing the gaps

A running analysis of the missing pieces this use case needs, settled one at a time. Each is a design sketch and a recommendation, not a committed build.

Gap 1 — Object-level RBAC shipped ✓

✓ Built
Shipped as context_graph/rbac/ + /rbac, gating /actions/invoke (403). Opt-in & deny-by-default; wildcard grants; principal from the JWT. The design below is what got built; only ReBAC (relationship-derived grants) remains deferred — parsed & stored, enforcement is the next increment.

Your two firm choices — distinct roles and enforcement — both point straight at role-gated actions: "the architect may ApproveArchitecture; the developer may not." That is the sharpest gap, because the tempting shortcut is actively unsafe.

What's missing today. Access control stops at the workspace boundary (authenticate in auth.py, then you get the whole tenant). Inside a workspace there is no principal who can do some things and not others. Three pieces are absent:

  • a principal within the workspace — the four roles as distinct, authenticated identities;
  • permissions bound to objects/actions — role → which verbs, on which object types or actions;
  • an enforcement point that runs before a state change.

Two layers, not one — CG complements the harness

Crucially, the current setup already enforces roles — in the agent harness (role_enforcer.py PreToolUse hooks + git branch rules). CG must not try to replace that. The clean division of labour:

LayerGovernsWhereExample
Harness hooks (exists today)local tool use — file edits, git, branchesper-agent, PreToolUse"developer can't push to main"
CG RBAC (proposed)project-state actions on the shared graphserver-side, /actions/invoke"only the manager may create a CR"

So CG doesn't introduce access control from scratch — it moves the state-changing slice of it out of each agent's scattered hook config into one shared, auditable place. The reframing: not "close a security hole" but "centralize and audit what's already enforced per-agent." (The trap below still applies to that CG-side layer.)

◆ The trap — don't fake RBAC with rules
Approximating it with a rule that checks approved_by is a security hole. (1) It's spoofableapproved_by is data the caller supplies; a developer agent can invoke a merge claiming approved_by: "integrator" and sail through. (2) It conflates two concerns — rules answer "is this decision allowed by policy?"; access control answers "is this principal allowed to attempt it at all?" RBAC that trusts a client-supplied field — or a LIGHTRAG-ROLE header — is theater. The principal must bind to the authenticated identity (a role claim on the JWT / account), never to something the agent sets in its own request.

The minimal design — a fourth policy layer

The shape is already familiar: a per-workspace policy next to rules / ontology / actions, enforced at the chokepoint the action layer already gives us.

principalrole from token RBAC check ★deny-by-default → 403 rules gatepolicy → FLAG/REJECT side effect + audit edge
RBAC is a new first stage — "may this principal even attempt it?" — before the rules gate ever asks "is the decision allowed?". Two separate questions, two separate layers.
PieceWhere
Role policy — role → grants (verb × object_type / action)context_graph/rbac/ — per-workspace JSON, versioned (same store pattern)
Principal resolution — the role claimauth.py — from the JWT / account, not a header
Enforcement — the checkA pre-gate stage in /actions/invoke: resolve → RBAC → rules gate → side effect
Default postureTwo-level — opt-in (no policy = permissive), then deny-by-default within a policy; wildcard grants keep it terse

Opt-in by default — it scales to zero

The requirement that CG stay simple for single-agent projects (including CG's own development) is met by the same pattern every other layer uses: absent means permissive. No rules → no gate; no ontology → no validation; and now no RBAC policy → allow everything. RBAC exists only where a workspace installs a policy.

Single agent = zero config. One agent does everything, exactly as today — no roles, no principals, no claims. Deployment is unchanged: RBAC is invisible until a workspace opts in.
Two-level posture, no theater. Presence is opt-in (scales to zero), but once a policy exists it is deny-by-default — a real control. Wildcard grants keep it ergonomic: the central role is one line, manager: *; you enumerate only the restricted roles.
The central role stays a config, not a concept
A hub coordinator — your manager — is just a role with a broad/wildcard grant plus the coordination actions (create CR, assign work). Core never learns the word "manager"; a different preset's hub might be "incident commander." And CG-as-substrate shrinks that role: the store does the state-sync, so the manager stops shuttling changelogs and is left with the coordination decisions — which CG governs and audits.

Deployment stays identical — no external authorization service, no Zanzibar to stand up. RBAC is one more per-workspace JSON policy on the existing store; ReBAC reuses the graph. Single binary, same as today.

The CG-native upgrade — permissions from the graph (ReBAC)

Static role → actions works, but the project graph already encodes ownership: Role —owns→ Module —exposes→ API. So a grant can be relationship-derived — "a role may modify the APIs of modules it owns" — resolved by a graph query at check time. That is ReBAC (relationship-based, à la Google Zanzibar), and CG is unusually well-placed for it because the relationships are already first-class. Permissions then evolve with the project instead of living in a separate static table.

◆ Recommendation
Pull it forward (option c), in two steps. Ship static role→action RBAC first — small, mirrors code we already have, and it closes the spoofing hole that blocks your distinct-roles setup. Then layer ReBAC on top as the differentiated version once ownership edges are populated. Do not ship the rules-based approximation, even as a stopgap — it advertises a control that isn't there.
✓ Settled (this thread)
Default posture — no policy = fully permissive; single-agent projects are zero-config. · Single-agent shape — run with no RBAC by default; an optional one-line admin: * policy is offered for those who want a uniform audit trail. · Principal grain (lean) — role = principal (one credential per role); account → role stays an optional refinement for per-individual audit.
Still open
Scope — gate writes/invokes only to start, or also reads (a developer can't even see the manager's strategic decisions)? Read-filtering is much costlier — lean: defer it.
ReBAC appetite — is "permissions derived from ownership edges" the target, or is static role→action enough for your methodology?

Gap 2 — Workflow orchestration shipped ✓

✓ Built
The lifecycle layer shipped as context_graph/lifecycle/ + /lifecycle: declarative state machines per object type, a transition action checked (legal move? role allowed?) and applied to the object's node, illegal jumps → 409. The planner was not built, by design. Cross-object requires guards are parsed & stored, enforcement deferred.

"Workflow orchestration" is really two gaps, and conflating them is how a project builds the wrong, enormous thing:

(A) A declarative lifecycle — a state machine over an object type. Task: proposed → active → done | blocked; the setup's macro pipeline (init → tasks → decomposition → impl → test/commit → release). Legal transitions, guards, entry conditions.
(B) A dynamic plannergenerate the steps to reach a goal by traversing the graph. The "30 seconds vs 6 hours" P3 item.
◆ Decision — build (A), skip (B)
Build the generic lifecycle layer. Don't build the planner: your agents already plan (the manager decomposes; the architect designs). A CG planner would fight the agents' planning and be domain-specific — failing the "stays generic" test. CG's job is to hold the state machine and the guards; the agents plan over them. The lifecycle expresses both levels the setup already has: a macro phase lifecycle and per-object status (Task, Feature).

What the lifecycle layer is

Mostly composable from what exists, plus one new declarative primitive:

PieceLayer
State values (Task.state)Ontology enum — ready
Transitions (AdvanceTask(to:"done"))Actionsready
Guards / entry conditionsRulesready, but hand-written & scattered today
New: a named state machine — legal transitions auto-derived, current state + history first-classcontext_graph/lifecycle/to build

A transition becomes one guarded action: AdvanceTask(to:"done")RBAC (may this role?) → lifecycle check (is active→done legal?) → rules gate (policy: passing commit + integrator sign-off?) → apply + audit edge (who moved it, why, evidence). The richer part is cross-object entry conditions — "a Feature can't enter in_progress until an accepted Decision motivates it" — a guard expressed as a graph query. That is what makes CG's version beat a standalone FSM library.

✓ Settled
Build A, skip B. · Lifecycle expresses both macro-phase and per-object state machines. · Enforcement advisory-by-default in CG, hard where it's a true invariant — the harness already hard-gates the git/branch side, so CG leans to FLAG-and-explain except for genuine invariants (no illegal state jumps). · Depends on RBAC (role-gated transitions) → confirms the sequence: RBAC, then lifecycle.
◆ Scope discipline
Keep it a thin declarative FSM + guards. The moment it grows timers, parallel branches, and compensation logic, it's a BPMN engine — a multi-year tar pit. The value is governance, not general workflow.
Where we are

Open questions & decision log

Decided (this session)

QuestionLean
Granularitytentative "decisions & state transitions," via the can-you-name-the-why filter. Revisit commit richness.
Rolesdecided distinct identities, each with own skills + sessions.
Enforcementdecided actor / enforcement model — CG shapes behaviour (advise + block).

Still open — for the next round

Q1 · Source of truth
Confirm the hybrid: git owns code, CG owns decisions/state. Or does CG own more (e.g. task assignment, sprint state) — becoming the project's operational DB?
Q2 · The RBAC gap — resolved
Option (c): pull a generic RBAC layer forward — static role→action first, ReBAC later — opt-in and permissive by default so single-agent stays zero-config. The rules-based approximation (b) is rejected as spoofable theater. Full design in Closing the gaps · Gap 1; only read-scope and ReBAC appetite remain open.
Q3 · Enforcement split
Which methodology rules are hard REJECT vs soft FLAG? Getting this wrong makes CG either a nag or a roadblock. Draft the first rule set together?
Q4 · Bootstrapping
How does an existing project get into the graph? Backfill from git history + docs via ingestion, or start fresh and only capture forward from adoption?
Q5 · The methodology pipeline — resolved
Yes — modelled as the macro-phase lifecycle in Gap 2: a stage's entry condition is a cross-object guard ("design can't start until architecture decisions exist"), advisory by default and hard for true invariants.
◆ Suggested next step
Pick one thread to make concrete: draft the project ontology (the exact object/link types + properties), or draft the first methodology rule set (the 5–10 rules that encode your process). Either gives us something runnable to react to. Related reading: Ontology · Rules · Actions · The Fourth Element.
↑ Top