Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ catalog:
rules:
- allow: [Domain, System, Resource, Component]
# Live-topology samples: per-repo catalog-info (discovered by a provider in
# a real deployment) + the security aspect's graft Template.
# a real deployment) + the security aspect's adoption template.
- type: file
target: ../../examples/mock-org/repos/tracking-api/catalog-info.yaml
rules:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Aspect is a module, practices are institutions; grafts have two doors; standards block by facet
# Aspect is a module, practices are institutions; adoption has two doors; standards block by facet

- Status: accepted
- Date: 2026-07-14
Expand All @@ -16,17 +16,17 @@ ADR 0009's model left three seams, surfaced by using it: "practice" and "aspect"

## Decision Outcome

Chosen, third option. An **aspect is a module** — exactly as in AspectJ, where an aspect is a concrete artifact, not the abstract concern: a versioned repo holding the standard(s), the paved road, the grafts, and the remediation vísar. The **practice is the living institution** around it — people (the gildi is its embodiment: *the gildi runs the practice*), tradition, judgment. The aspect is the book; the practice is the author. One practice, one concern; possibly several **editions/variants** of the module. The three-part split: *crafts are what people do; aspects are what components adopt; standards are what they must then uphold.*
Chosen, third option. An **aspect is a module** — exactly as in AspectJ, where an aspect is a concrete artifact, not the abstract concern: a versioned repo holding the standard(s), the paved road, the adoption templates, and the remediation vísar. The **practice is the living institution** around it — people (the gildi is its embodiment: *the gildi runs the practice*), tradition, judgment. The aspect is the book; the practice is the author. One practice, one concern; possibly several **editions/variants** of the module. The three-part split: *crafts are what people do; aspects are what components adopt; standards are what they must then uphold.*

**Grafts** make aspects applicable: applicators living inside the module, **two front doors reading the same source** — a typed scaffolder `Template` (`spec.type: aspect`, vanilla kind, renders on the Create page) for portal users, and a `SKILL.md` for CLI agents. Agents are first-class practitioners and can pre-flight trials locally before a CR exists. The enrollment annotation is the record of application; hand-enrollment stays legal.
**Adoption** makes aspects applicable: applicators living inside the module, **two front doors reading the same source** — a typed scaffolder `Template` (`spec.type: aspect`, vanilla kind, renders on the Create page) for portal users, and a `SKILL.md` for CLI agents. Agents are first-class practitioners and can pre-flight trials locally before a CR exists. The enrollment annotation is the record of application; hand-enrollment stays legal.

**Standards organize on two orthogonal axes**: **blocks** (tool/sub-concern groups of trials, carrying **facet** applicability — `spec.type` suggests default facets, a `siliconsaga.org/facets` annotation overrides, solving the multi-natured monolith) and **tiers** (the maturity ladder referencing trials across blocks; non-applicable trials skip, never punish). This resolves the design's open ordered-vs-thematic question as "both, different axes," and is the day-job Grid/Block/Check lineage landing intact.

### Consequences

- Good: still **no new custom kinds** — the module is a repo, the practice's catalog face is a `type: practice` Component in the module's own `catalog-info.yaml` (live per-repo topology), and the graft's portal door is the vanilla `Template` kind.
- Good: still **no new custom kinds** — the module is a repo, the practice's catalog face is a `type: practice` Component in the module's own `catalog-info.yaml` (live per-repo topology), and the adoption's portal door is the vanilla `Template` kind.
- Good: every artifact already named "practice" (the Component, its type) was institutional and stays; everything named "aspect" (enrollment annotation, standard's field) was module-ish and stays — the rule was latent in the naming.
- Ravenline demonstrates the whole ladder: `repos/security-aspect/` (blocked standard, two paved-road templates, both grafts), per-repo `catalog-info.yaml` for it and `tracking-api` (with a facets override — the monolith case), and pristine `label-service` as the graft target.
- Graft execution, trial evaluation, and facet resolution remain **designed, not implemented** — the mock Template logs its weave plan instead of opening PRs.
- Ravenline demonstrates the whole ladder: `repos/security-aspect/` (blocked standard, two paved-road templates, both adoption doors), per-repo `catalog-info.yaml` for it and `tracking-api` (with a facets override — the monolith case), and pristine `label-service` as the adoption target.
- Adoption execution, trial evaluation, and facet resolution remain **designed, not implemented** — the mock Template logs its weave plan instead of opening PRs.

See ADR [0009](0009-guildhall-practice-model.md) and the design doc §3.1/§3.6/§3.7.
2 changes: 1 addition & 1 deletion docs/adrs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ annotation. Until then they live here as plain Markdown.
| [0007](0007-cycle-custom-kind.md) | Cycle: a custom catalog kind for bounded groupings |
| [0008](0008-saga-git-backed-kind.md) | Saga: a Git-backed catalog kind for narrated effort records |
| [0009](0009-guildhall-practice-model.md) | Guildhall: the practice model — aspects hold standards, guilds are people, no new kinds |
| [0010](0010-aspect-module-grafts-blocks.md) | Aspect is a module, practices are institutions; grafts have two doors; standards block by facet |
| [0010](0010-aspect-module-adoption-blocks.md) | Aspect is a module, practices are institutions; adoption has two doors; standards block by facet |
12 changes: 6 additions & 6 deletions docs/demo-visir.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ App: `http://localhost:3000` (backend on 7007). Sign in as **Guest**. First boot
- [ ] `ravenline` Group shows the org tree (two departments — `rl-engineering`, `foxholm`) plus two `gildi`-typed Groups
- [ ] `guild-hall` Component (type `hub`) exists, owned by `team-devex`, linking to this vísir
- [ ] `security-practice` Component (type `practice`) shows its links into the aspect repo
- [ ] Create page lists **Apply the Security aspect** (the graft Template)
- [ ] Create page lists **Apply the Security aspect** (the adoption template)
- [ ] `tracking-2026-2` Cycle shows the curated overview card
- [ ] `saga-dependency-scanning-drive` Saga exists (Astrid's mid-run drive report)
- [ ] `make smoke-catalog` passes (your offline proof, and the fallback if the UI misbehaves live)
Expand All @@ -43,16 +43,16 @@ App: `http://localhost:3000` (backend on 7007). Sign in as **Guest**. First boot
- *Catalog → Kind dropdown*: **Cycle** and **Saga** next to Component/Group. Talking point: two custom kinds total; the entire practice layer adds **zero** more — typed Groups, vocabularies, annotations, links.
- *`ravenline` Group → relations graph*: the org tree — two departments, engineering and the acquired **Foxholm** returns line — plus two **guilds** (`spec.type: gildi`) cross-cutting it — one practice-aligned (Security), one role-aligned (Release Captains). A guild is deliberately just a typed Group: membership, rollups, and the graph come free. Point out Dagny: a Foxholm engineer in the security guild — the guild spans departments, and that's the whole point.
- *`team-devex` → `guild-hall`*: the instance you are standing in is itself cataloged (type `hub` — anticipating hub pages: singleton overviews per plugin feature group), owned by the DevEx team, and its vísir is this document. Dogfood moment.
- *`security-practice` Component (type `practice`)*: the **practice** is the institution (the guild runs it); its **aspect** is the module — a repo holding the blocked standard, the paved road, the grafts, and the remediation docs. The entity links go straight into that repo, one click each.
- *Create page → **Apply the Security aspect***: the **graft** — applying a practice is a self-service action, not a wiki page. Run it against `label-service` (the pristine, unenrolled component): the mock edition logs its weave plan — annotation, CI includes, stewardship stubs, PR. Then the CLI beat: the same repo ships `SKILL.md`, the identical graft for agents — *some users never leave their terminal, and neither do their agents.*
- *`security-practice` Component (type `practice`)*: the **practice** is the institution (the guild runs it); its **aspect** is the module — a repo holding the blocked standard, the paved road, the adoption templates, and the remediation docs. The entity links go straight into that repo, one click each.
- *Create page → **Apply the Security aspect***: the **adoption** — applying a practice is a self-service action, not a wiki page. Run it against `label-service` (the pristine, unenrolled component): the mock edition logs its weave plan — annotation, CI includes, stewardship stubs, PR. Then the CLI beat: the same repo ships `SKILL.md`, the identical adoption for agents — *some users never leave their terminal, and neither do their agents.*
- *`tracking-api` Component*: enrollment annotations (`siliconsaga.org/aspects`) — which practices apply to this service. Description carries the demo narrative: silver. If TechDocs generation is available, open its **Docs tab**: the on-call primer and the queue-backlog runbook render as a real doc site (runbooks nest under docs as an interim convention until the parameterized-runbooks plugin exists — say that out loud, it's a roadmap point).
- *`tracking-2026-2` Cycle*: a release as a first-class bounded effort. Then *`dependency-scanning-drive`*: a time-bound push — Soundcheck sells this as "Campaigns"; here it's a Cycle of type drive. **The story beat**: the guild shipped module 1.4; each enrolled component's `aspect-versions` annotation records what it actually adopted; the gap is what the drive closes. Walk it: `shipping-orchestrator` (grafted May — its `graft-record` annotation keeps the PR, the "this happened" evidence), `refund-service` (Foxholm, grafted during onboarding — same standard, same guild, second department), `intake-scanner` and `carrier-gateway` (the two remaining laggards, each bronze for a stated reason).
- *`saga-dependency-scanning-drive`*: **a Saga can narrate a Cycle still in flight** — Astrid's mid-run report tallies the drive (three of five green, twelve days left). Read the shipping-orchestrator paragraph aloud: graft from the Create page, one-line PR, green on the next run — the paved-road pitch as a past event, not a promise.
- *`tracking-2026-2` Cycle*: a release as a first-class bounded effort. Then *`dependency-scanning-drive`*: a time-bound push — Soundcheck sells this as "Campaigns"; here it's a Cycle of type drive. **The story beat**: the guild shipped module 1.4; each enrolled component's `aspect-versions` annotation records what it actually adopted; the gap is what the drive closes. Walk it: `shipping-orchestrator` (adopted May — its `adoption-record` annotation keeps the PR, the "this happened" evidence), `refund-service` (Foxholm, adopted during onboarding — same standard, same guild, second department), `intake-scanner` and `carrier-gateway` (the two remaining laggards, each bronze for a stated reason).
- *`saga-dependency-scanning-drive`*: **a Saga can narrate a Cycle still in flight** — Astrid's mid-run report tallies the drive (three of five green, twelve days left). Read the shipping-orchestrator paragraph aloud: adoption from the Create page, one-line PR, green on the next run — the paved-road pitch as a past event, not a promise.
- *`saga-tracking-2026-2`*: the retrospective as a catalog citizen — authored by a person, linked to everything it touched, body in Git. Open `examples/mock-org/sagas/tracking-2026-2.md` and read two sentences aloud; the May 14th incident sets up the next stop.

**3. Files tour (4 min).** In an editor, `examples/mock-org/`:

- `repos/security-aspect/` (the module): `standard.yaml` — checks grouped in **blocks** by tool/sub-concern, each block scoped by **facets** (a service that's also a queue consumer gets both natures — see tracking-api's facets override), tiers laddering across them; `pipeline-templates/` (the paved road); `template.yaml` + `SKILL.md` (the two graft doors); `docs/`.
- `repos/security-aspect/` (the module): `standard.yaml` — checks grouped in **blocks** by tool/sub-concern, each block scoped by **facets** (a service that's also a queue consumer gets both natures — see tracking-api's facets override), tiers laddering across them; `pipeline-templates/` (the paved road); `template.yaml` + `SKILL.md` (the two adoption doors); `docs/`.
- The loop, told on `carrier-gateway` (bronze in the narrative): failing check → remediation doc → whose entire instruction is the one-line include → next pipeline run reports facts → check flips green. **When the requirement, the tooling, and the measurement share one owner, the cheapest way to comply is the paved road.** Land this sentence.
- `repos/tracking-api/docs/runbooks/queue-backlog.md`: docs teach, **runbooks are followed under pressure** — parameterized placeholders (`{{cluster}}`) filled at read time so every command copy-pastes exactly right. Born from the incident the Saga describes.

Expand Down
6 changes: 3 additions & 3 deletions docs/guildhall-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ graph TD

subgraph "Concern layer"
PRACTICE["Practice (the living institution; Component spec.type:practice)"]
ASPECT["Aspect module (the versioned repo — standard + paved road + grafts)"]
ASPECT["Aspect module (the versioned repo — standard + paved road + adoption templates)"]
end

subgraph "Measurement layer"
Expand Down Expand Up @@ -58,12 +58,12 @@ graph TD
- An **aspect** is supply-side: what a component takes on when it enrolls.
- A **standard** is the bar: a set of checks, organized by tool (blocks) and maturity (tiers).

## Graft — two doors, one module
## Adoption — two doors, one module

```mermaid
flowchart LR
PORTAL["Portal user (Create page)"] -->|"clicks"| TEMPLATE["Template spec.type:aspect (template.yaml)"]
AGENT["Agent / CLI user (terminal)"] -->|"reads"| SKILL_MD["SKILL.md (agent graft)"]
AGENT["Agent / CLI user (terminal)"] -->|"reads"| SKILL_MD["SKILL.md (agent door)"]
TEMPLATE -->|"same steps"| MODULE["Aspect module repo (standard + paved road + remediation docs)"]
SKILL_MD -->|"same steps"| MODULE
MODULE -->|"enrolls"| COMPONENT2["Target Component (annotation added, CI includes adopted, stubs scaffolded)"]
Expand Down
Loading