Skip to content

C4 — Level 1: System context

Labels carry their own truth marker: shipped = implemented and covered by tests today; PLANNED = a designed seam with no implementation, deferred under D-012. The legend below repeats the distinction in prose, because C4Context diagrams cannot style nodes.

C4Context
    title assent — system context (shipped vs PLANNED)

    Person(contributor, "Contributor", "Opens MRs against a self-service config repo")
    Person(platform, "Platform engineer", "Owns the repo; authors and tests policies")

    System(assent, "assent (cmd/assent)", "Deterministic policy-driven auto-merge gate; one static binary, run as a CI job per MR")

    System_Ext(forge, "Forge", "GitLab: shipped adapter (internal/forge/gitlab). GitHub: PLANNED (E10) — no adapter code exists")
    System_Ext(ci, "CI runner", "GitLab CI: shipped path, triggers assent per MR event. GitHub Actions as a forge trigger: PLANNED (E10)")
    System_Ext(idp, "Permission sources", "Shipped builtins: GitLab groups, repo-file, resource-owner. Keycloak / LDAP: no builtin — reachable only via the generic HTTP/exec provider transport")
    System_Ext(facts, "Fact sources", "Site-specific systems answering context questions, via HTTP or digest-pinned exec providers (shipped)")

    Rel(contributor, forge, "opens MR / pushes changes")
    Rel(platform, forge, "maintains repo + policy dir (.assent/)")
    Rel(ci, assent, "runs per MR")
    Rel(assent, forge, "reads diff & metadata; posts threads/comments; approves/denies; merges (SHA-guarded)")
    Rel(assent, idp, "resolves author permissions")
    Rel(assent, facts, "resolves external facts")

Legend

Marker Meaning
no marker Shipped — implemented today; the parenthetical names the real package or binary
PLANNED (E<n>) Planned — designed seam, no code. Deferred under D-012; unlocks when a named consumer commits. E<n> is the deferred epic in the meta-plan

Planned elements on this page: the GitHub forge adapter and the GitHub Actions forge trigger (both E10). Everything else named above exists — see the container diagram for the package-level breakdown.

GitHub Actions appears twice, with different meanings

assent's own repository is built and released on GitHub Actions. That is project infrastructure, not a supported forge path: assent cannot evaluate a GitHub PR, because the GitHub forge adapter (E10) does not exist. The CI runner box above refers to the forge path only.

Key property: assent is stateless per invocation — every run recomputes the decision from (diff, repo snapshot, facts, policy version). No database and no long-lived service today; the serve HTTP API is PLANNED (E12).