archik 0.12.35 → 0.12.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,89 @@
1
+ ---
2
+ description: Add or update an actor in the actor index
3
+ argument-hint: <actor id> [— description]
4
+ ---
5
+
6
+ # /archik:actor — author an entry in `*.archik.actors.yaml`
7
+
8
+ The user wants you to add (or update) an actor in the project's actor
9
+ index. Actors are *who* initiates use cases — humans (end users,
10
+ operators, customers) or non-human systems (other services, schedulers,
11
+ external APIs). The user-facing description is:
12
+
13
+ **$ARGUMENTS**
14
+
15
+ This slash command IS the user's confirmation. Skip "want me to add
16
+ this?" and produce the change now.
17
+
18
+ ## Direct-write — not the sidecar workflow
19
+
20
+ Actors live in `.archik/actors.archik.actors.yaml` (one file per
21
+ project, conventionally). Authored with `Write` / `Edit` directly,
22
+ then validated via `npx archik validate`.
23
+
24
+ ## Steps
25
+
26
+ 0. **Frame.** Restate the user's intent in one sentence and ask 1–2
27
+ sharp questions only if any of these are unclear:
28
+ - **Actor kind** — `human` (end user / operator / customer),
29
+ `external-system` (third-party service we don't own),
30
+ `time` (scheduler / cron), or `device` (sensor / hardware)?
31
+ - **Goals** — one short sentence per goal the actor pursues
32
+ against this system. Optional but useful.
33
+
34
+ Skip questions `$ARGUMENTS` already answers.
35
+
36
+ 1. **Ground in current actors:**
37
+ ```
38
+ npx archik q actors
39
+ ```
40
+ If the id already exists, this is an UPDATE — read the existing
41
+ entry's fields and preserve everything the user didn't ask to
42
+ change. Otherwise it's a NEW addition.
43
+
44
+ 2. **Lock in the schema:**
45
+ ```
46
+ npx archik schema actors
47
+ ```
48
+ Required: `id`, `kind`, `description`. Optional: `goals`.
49
+
50
+ 3. **Edit the file.** If `.archik/actors.archik.actors.yaml` doesn't
51
+ exist yet, `Write` a new file with the standard header. If it
52
+ exists, `Edit` to add/update the one actor you're touching — do
53
+ NOT rewrite the whole file unless you're consolidating.
54
+
55
+ ```yaml
56
+ version: "1.0"
57
+ actors:
58
+ - id: <kebab-id>
59
+ kind: human # human | external-system | time | device
60
+ description: One sentence — who they are and why they touch the system.
61
+ goals:
62
+ - "Verb-first short outcome they pursue."
63
+ ```
64
+
65
+ 4. **Validate:**
66
+ ```
67
+ npx archik validate
68
+ ```
69
+ Common failures:
70
+ - Duplicate `id` across actor files
71
+ - Missing `description` (required, non-empty)
72
+ - `kind` not in the allowed enum
73
+
74
+ 5. **Confirm inline.** Print the actor's id, kind, and description.
75
+ Ask: "Looks right? Want me to author a use case (`/archik:usecase`)
76
+ that has this actor as `primaryActor`?"
77
+
78
+ Don't auto-proceed. Inline-review gate.
79
+
80
+ ## Notes
81
+
82
+ - Actors must exist BEFORE any use case can reference them. The
83
+ use case validator rejects dangling `primaryActor` / `secondaryActors`
84
+ references with the actor id named in the error.
85
+ - The `external` node kind in the structural model is for third-party
86
+ systems that participate in the *runtime* graph. The `external-system`
87
+ actor kind is for systems that *initiate* use cases. They overlap
88
+ conceptually but live in different files — actor file for "who acts
89
+ on us", structural file for "what we integrate with".
@@ -0,0 +1,71 @@
1
+ ---
2
+ description: Show alpha state snapshot, or promote one with criteria check
3
+ argument-hint: [show | promote <alpha> <state> | demote <alpha> <state>]
4
+ ---
5
+
6
+ # /archik:alpha — read or move project alphas
7
+
8
+ Alphas (Essence / SEMAT) are the universal progress dials of the
9
+ project. The user wants either a snapshot of all alphas, or a
10
+ deliberate promotion / demotion with the underlying criteria
11
+ verified mechanically. Argument:
12
+
13
+ **$ARGUMENTS**
14
+
15
+ ## Branches
16
+
17
+ ### No args / `show`
18
+
19
+ Run:
20
+ ```
21
+ npx archik alpha show
22
+ ```
23
+
24
+ Read the table. For each alpha:
25
+ - `✓` means the claimed state is satisfied by the current artifacts
26
+ - `?` means the state can't be fully verified (manual review needed)
27
+ - `✗ over-claimed` means the artifacts don't meet the criteria —
28
+ surface this as a blocker
29
+
30
+ Translate the table into a short paragraph: which alphas are honest,
31
+ which are over-claimed, and what one concrete next action would
32
+ unblock the most progress (usually whichever alpha is closest to
33
+ its next state and just needs one more artifact).
34
+
35
+ ### `promote <alpha> <state>`
36
+
37
+ Run the promotion (it runs the criteria check first and refuses if
38
+ the state isn't satisfied):
39
+ ```
40
+ npx archik alpha promote <alpha> <state>
41
+ ```
42
+
43
+ If it succeeds, narrate which evidence satisfied the criteria. If it
44
+ refuses, name the specific criterion that failed and the concrete
45
+ artifact that would satisfy it (e.g. "to promote `requirements` to
46
+ `addressed`, every active slice needs `realization.seqFile` — slice
47
+ X currently has none. Author `.archik/X.archik.seq.yaml` with
48
+ `realizes: { useCase, slice }` and re-run.").
49
+
50
+ ### `demote <alpha> <state>`
51
+
52
+ ```
53
+ npx archik alpha demote <alpha> <state> --note "<reason>"
54
+ ```
55
+
56
+ Demotion is a deliberate admission that the project no longer meets
57
+ a previously-claimed state. Always prompt for the `--note` reason if
58
+ the user didn't supply one — the audit trail matters.
59
+
60
+ ## Notes
61
+
62
+ - Alphas tracked: `stakeholders`, `requirements`, `softwareSystem`,
63
+ `work` (the four Essence alphas most directly evidenced by archik
64
+ artifacts). State ladders match the Essence kernel — see
65
+ `npx archik alpha show --json` for the full enum.
66
+ - The alpha file lives at `.archik/alphas.archik.alphas.yaml` —
67
+ direct-write only via this command (or the underlying CLI). Don't
68
+ edit it by hand; the criteria check is the discipline.
69
+ - Over-claiming is fixed by EITHER advancing artifacts OR demoting
70
+ the state. Whichever is easier given the project's actual
71
+ trajectory. Don't fudge.
@@ -0,0 +1,55 @@
1
+ ---
2
+ description: Show the use case × slice × test × seq × ECB coverage matrix
3
+ argument-hint: [filters — see notes]
4
+ ---
5
+
6
+ # /archik:trace — surface the Jacobson coverage matrix
7
+
8
+ The user wants to see how completely the project's use cases are
9
+ traced — for each slice: are tests declared, is a seq diagram
10
+ realising it, are participants ECB-tagged. Optional filter args:
11
+
12
+ **$ARGUMENTS**
13
+
14
+ ## Steps
15
+
16
+ 1. Run the trace CLI. If `$ARGUMENTS` is empty, full matrix:
17
+ ```
18
+ npx archik trace
19
+ ```
20
+ If the user passed a filter (`use-case=<id>`, `actor=<id>`,
21
+ `status=active|proposed|deprecated`, `coverage=full|partial|none`),
22
+ pass it through as a query flag:
23
+ ```
24
+ npx archik trace --<filter>=<value>
25
+ ```
26
+
27
+ 2. **Read the totals row** at the bottom (`X full, Y partial, Z untraced`)
28
+ and surface it in your reply as the headline answer:
29
+ - **All full** → "✓ Every active slice is fully traced. Ready to ship."
30
+ - **Any partial** → "◐ N partial slices — listed below; each is
31
+ missing tests, a realisation seq, or full ECB tagging."
32
+ - **Any untraced** → "○ N untraced slices — these slices declare
33
+ neither tests nor a seq realisation. Address before milestone close."
34
+
35
+ 3. **For each partial / untraced row**, narrate ONE concrete next
36
+ action — e.g. "`pubmed-abstract-only` has tests but no seq —
37
+ author `.archik/<slice>.archik.seq.yaml` with `realizes:
38
+ { useCase: …, slice: pubmed-abstract-only }`".
39
+ Don't dump raw rows; the user can read those in the CLI output if
40
+ they want. Your job is to translate the matrix into actions.
41
+
42
+ 4. **If everything is full**, also run `npx archik alpha show` and
43
+ call out any alpha that's now eligible for promotion. The trace
44
+ matrix is a major input to `requirements: addressed` and
45
+ `softwareSystem: ready`.
46
+
47
+ ## Notes
48
+
49
+ - The matrix is also visible on screen via the **Use cases** toolbar
50
+ badge (rolled-up, "am I done?" answer) and the dedicated
51
+ `/__archik/usecases` page (per-slice breakdown). Mention this if
52
+ the user wants visual context.
53
+ - The check has CI teeth: `npx archik trace --fail-on partial`
54
+ exits non-zero on any partial; `--fail-on none` exits non-zero on
55
+ untraced only. Suggest the right flag for their CI gate if asked.
@@ -0,0 +1,134 @@
1
+ ---
2
+ description: Author a use case (actors + flows + slices + tests)
3
+ argument-hint: <use case name or id>
4
+ ---
5
+
6
+ # /archik:usecase — author a `*.archik.uc.yaml`
7
+
8
+ The user wants you to author a **use case** that captures user-visible
9
+ behaviour as actors + flows + slices, with each active slice backed by
10
+ test paths on disk. The user-facing description is:
11
+
12
+ **$ARGUMENTS**
13
+
14
+ This slash command IS the user's confirmation. Skip "want me to draft
15
+ this?" and produce a use case file now.
16
+
17
+ ## Direct-write — not the sidecar workflow
18
+
19
+ Use case files are authored with `Write` directly (unlike structural
20
+ sidecars which go through `suggest set`). After writing, validate via
21
+ `npx archik validate`. If validation fails, fix and re-write.
22
+
23
+ ## This is the DESIGN (b) handoff of the engineering loop
24
+
25
+ The skill defines a 5-phase loop: **Discover → Design → Decide → Build
26
+ → Verify**. This command covers Discover (ground in current actors and
27
+ use cases) and the Design (b) Requirements step. The output is a
28
+ reviewable artifact gated by **inline review** (you show the YAML in
29
+ chat, the user confirms) — *not* the canvas gate (that's only for
30
+ structural sidecars).
31
+
32
+ ## Steps
33
+
34
+ 0. **Frame + clarify.** Restate the user's intent in one sentence and
35
+ ask 1–3 sharp clarifying questions if any of these are ambiguous in
36
+ `$ARGUMENTS`:
37
+ - **Primary actor** — who initiates this use case? (Will need to
38
+ resolve in the actor index — check step 1 first.)
39
+ - **Goal** — what does the actor want to accomplish in business
40
+ terms (one sentence, observable outcome)?
41
+ - **Pre / postconditions** — what must be true before/after? (Skip
42
+ if obvious.)
43
+ - **Slice scope** — happy path only, or also one or two alternates
44
+ (e.g. payment-declined, validation-failed, retry)? Each slice =
45
+ one flow subset + one test path.
46
+
47
+ Skip questions `$ARGUMENTS` already answers. **Use judgment.**
48
+
49
+ 1. **Ground in the current models.** Check who the actors are and
50
+ what use cases exist already so you reuse rather than duplicate:
51
+ ```
52
+ npx archik q actors
53
+ npx archik q usecases
54
+ ```
55
+ If the primary actor isn't in the actor index, STOP and tell the
56
+ user — they need `/archik:actor <id>` first (or you offer to run
57
+ it). Use cases without resolving actors fail validation.
58
+
59
+ 2. **Lock in the schema:**
60
+ ```
61
+ npx archik schema uc
62
+ ```
63
+ Required fields: `id`, `name`, `primaryActor`, `goal`, `flows.basic`,
64
+ at least one slice with `id`, `description`, `flows`, `tests`.
65
+ Optional: `secondaryActors`, `preconditions`, `postconditions`,
66
+ alternate flows, slice realization (`seqFile`).
67
+
68
+ 3. **Write the file** to `.archik/usecases/<id>.archik.uc.yaml`. Use
69
+ the `Write` tool — direct-write, no sidecar.
70
+
71
+ **Slice test paths must exist on disk** for `status: active` slices.
72
+ Validator rejects active slices whose test files are missing. If
73
+ the test isn't written yet, mark the slice `status: proposed` —
74
+ you'll flip it to `active` once the test lands in the BUILD phase.
75
+
76
+ ```yaml
77
+ version: "1.0"
78
+ id: <kebab-id>
79
+ name: <Human-readable name>
80
+ primaryActor: <actor-id> # must resolve in actors index
81
+ goal: One sentence describing the observable outcome.
82
+ preconditions: [<…optional…>]
83
+ postconditions: [<…optional…>]
84
+ flows:
85
+ basic:
86
+ steps:
87
+ - "Actor does X."
88
+ - "System does Y."
89
+ - "Actor receives Z."
90
+ alternates:
91
+ - id: <kebab-id>
92
+ branchFrom: basic.<step-number>
93
+ steps: ["…"]
94
+ slices:
95
+ - id: happy
96
+ description: One-line slice summary.
97
+ flows: [basic]
98
+ tests: [<path/to/test/file.spec.ts>] # must exist OR slice must be `status: proposed`
99
+ ```
100
+
101
+ 4. **Validate:**
102
+ ```
103
+ npx archik validate
104
+ ```
105
+ Expect zero errors. If validation fails, the message names the
106
+ field — fix and re-write. Common failures:
107
+ - `primaryActor` doesn't resolve in actors index → ensure the
108
+ actor file has that id
109
+ - `flows.basic` missing → required by schema
110
+ - `branchFrom` references unknown step → `basic.4` requires
111
+ `flows.basic.steps` to have at least 4 entries
112
+ - Slice tests path doesn't exist → either create the test file
113
+ stub or mark the slice `status: proposed`
114
+
115
+ 5. **Show inline + confirm.** Print the file's path and a short
116
+ summary of what it covers (actor / number of flows / slice ids /
117
+ test paths). Ask: "Looks right? Once you confirm, want me to
118
+ stage the structural sidecar (`/archik:suggest`) for the nodes
119
+ this use case implies?"
120
+
121
+ Don't auto-proceed. The user's "looks good" IS the inline-review
122
+ gate.
123
+
124
+ ## Notes
125
+
126
+ - If the use case implies new structural nodes (a new service, a new
127
+ external integration), the next step is `/archik:suggest` — that
128
+ gate is separate.
129
+ - If the slice has non-trivial runtime branching, async fan-out, or
130
+ cross-context interaction, plan for a `*.archik.seq.yaml` next that
131
+ carries `realizes: { useCase: <id>, slice: <id> }` and binds
132
+ participants to the structural nodes.
133
+ - Actor must exist BEFORE the use case file is written. Use cases
134
+ reference `primaryActor` by id; the validator rejects dangling refs.
package/README.md CHANGED
@@ -102,8 +102,36 @@ No `x` / `y` / `width` — layout is computed by [ELK](https://eclipse.dev/elk/)
102
102
  - **27 node kinds** across compute, data, messaging, networking, hexagonal, AI/ML, identity, observability, cloud, UI, and external.
103
103
  - **12 relationships** with distinct visual styling — `http_call`, `invokes`, `reads`, `writes`, `publishes`, `subscribes`, `streams_to`, `routes_to`, `implements`, `depends_on`, `has_a`, `uses`.
104
104
  - **Drag-to-connect, multi-select, undo/redo, compact view, themed (dark / light), notes per node, color overrides on edges.**
105
- - **CI-ready CLI** — `validate`, `render` (headless SVG), `watch`, `check` (drift between YAML and source dirs).
106
- - **AI skill + slash commands** — `archik init` installs both automatically. Seven `/archik:*` commands (`spawn`, `evolve`, `suggest`, `describe`, `dev`, `accept`, `reject`) drive the diagram entirely through the CLI, so Claude never edits YAML by hand.
105
+ - **CI-ready CLI** — `validate`, `render` (headless SVG), `watch`, `drift` (source-tree gaps), `trace` (coverage matrix with `--fail-on partial|none`).
106
+ - **AI skill + slash commands** — `archik init` installs both automatically. Eleven `/archik:*` commands cover the structural surface (`spawn`, `evolve`, `suggest`, `describe`, `dev`, `accept`, `reject`) plus the requirements layer (`actor`, `usecase`, `trace`, `alpha`).
107
+
108
+ ## Beyond the diagram — use cases, traceability, alphas
109
+
110
+ The structural diagram is the start. Above it sits a thin requirements
111
+ layer that closes the Jacobson chain — *who acts → what they want →
112
+ how the system behaves at runtime → which structural nodes participate
113
+ → which tests prove it*. Every link is a YAML cross-reference and the
114
+ validator rejects breaks at every step.
115
+
116
+ | Artifact | File | What it captures |
117
+ | ------------------------------ | ----------------------------------- | ------------------------------------------------------------- |
118
+ | **Actors** | `*.archik.actors.yaml` | Who initiates use cases — humans, external systems, schedulers |
119
+ | **Use cases + slices** | `.archik/usecases/*.archik.uc.yaml` | What each actor wants, with slim slices that name test paths |
120
+ | **Sequence diagrams** | `*.archik.seq.yaml` | How a slice plays out at runtime (ECB-checked when bound to a slice via `realizes`) |
121
+ | **Alphas (Essence / SEMAT)** | `*.archik.alphas.yaml` | Project-wide progress dials with mechanically-verified states |
122
+
123
+ `npx archik trace` prints the coverage matrix (use case × slice × test
124
+ × seq × ECB) so "are we done?" stops being an opinion. The dev canvas
125
+ surfaces the same information visually: the **Use cases** toolbar
126
+ button shows live trace status (`✓ all traced` / `◐ N to finish` /
127
+ `○ N untraced`), and `/__archik/usecases` is a dedicated page with
128
+ master/detail rail, slice cards with clickable test paths, and direct
129
+ links to each realising sequence diagram.
130
+
131
+ The `validate` command enforces the integrity triangle: if a slice
132
+ points at a seq file, the seq must point back; if a seq diagram
133
+ realises a slice, every participant node must list that seq in its
134
+ `seqFiles` array. Orphans get caught at lint time, not in code review.
107
135
 
108
136
  ## For Claude Code & other LLMs
109
137
 
@@ -111,7 +139,9 @@ The whole reason archik uses YAML instead of a binary format: **the file is the
111
139
 
112
140
  The skill enforces a hard rule: **Claude talks to archik only through the `npx archik` CLI** — never `Read`, `Write`, or `Edit` on a YAML directly. Queries go through `npx archik q`, suggestions through `npx archik suggest set`, lifecycle through `npx archik suggest accept | reject`. You own the file; the CLI is the contract.
113
141
 
114
- ### The seven slash commands
142
+ ### The slash commands
143
+
144
+ **Structural diagram (the original surface):**
115
145
 
116
146
  | Command | What it does |
117
147
  | --------------------------- | ----------------------------------------------------------- |
@@ -123,6 +153,15 @@ The skill enforces a hard rule: **Claude talks to archik only through the `npx a
123
153
  | `/archik:accept` | Apply the pending suggestion |
124
154
  | `/archik:reject` | Discard the pending suggestion |
125
155
 
156
+ **Requirements + traceability (the Jacobson layer — see below):**
157
+
158
+ | Command | What it does |
159
+ | ------------------------------------ | --------------------------------------------------------------------------- |
160
+ | `/archik:actor <id>` | Add or update an actor in the actor index |
161
+ | `/archik:usecase <name>` | Author a use case (actors + flows + slices + tests) |
162
+ | `/archik:trace` | Show the use case × slice × test × seq × ECB coverage matrix |
163
+ | `/archik:alpha [show \| promote …]` | Read the project's alpha state, or promote one with a criteria check |
164
+
126
165
  A typical first-day flow:
127
166
 
128
167
  ```
@@ -170,6 +209,24 @@ archik render [path] Render to a self-contained SVG file
170
209
  --theme <name> "dark" (default) or "light"
171
210
  archik watch [path] Re-render to SVG on every file change (Ctrl+C to stop)
172
211
 
212
+ archik trace [path] Use case × slice × test × seq × ECB coverage matrix
213
+ --json structured rows + summary
214
+ --fail-on <level> exit 1 on partial | none (CI gate)
215
+ --use-case <id> filter to one use case
216
+ archik drift [path] Surface gaps where a node's sourcePath or a slice's
217
+ tests path no longer resolves on disk
218
+
219
+ archik alpha [sub] Project-wide alpha state (Essence / SEMAT)
220
+ show snapshot with ✓ / ? / ✗ verification
221
+ promote <a> <s> advance an alpha — runs criteria first
222
+ demote <a> <s> walk back; --note '<reason>' required
223
+
224
+ archik upgrade Pull the latest archik via the project's package manager
225
+ (auto-detects npm / pnpm / yarn / bun from the lockfile)
226
+ then refreshes SKILL.md + slash commands from the new binary
227
+ --skip-install just refresh artifacts; don't reinstall
228
+ --user install to ~/.claude (global skill)
229
+
173
230
  archik suggest [sub] Manage Claude's pending architecture suggestion
174
231
  show summarise the pending sidecar (default; --json supported)
175
232
  set <draft> validate a draft YAML and stage it as the sidecar
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-rose-700:oklch(51.4% .222 16.935);--spacing:.25rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--font-weight-semibold:600;--tracking-tight:-.025em;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-auto{margin-top:auto}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-full{height:100%}.h-screen{height:100vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.flex-1{flex:1}.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-pre-wrap{white-space:pre-wrap}.text-rose-700{color:var(--color-rose-700)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.hover\:no-underline:hover{text-decoration-line:none}}}:root,[data-theme=light]{--archik-canvas:#f8fafc;--archik-panel:#fff;--archik-surface:#f1f5f9;--archik-surface-hover:#e2e8f0;--archik-fg:#0f172a;--archik-fg-dim:#475569;--archik-fg-muted:#94a3b8;--archik-border:#e2e8f0;--archik-border-strong:#cbd5e1;--archik-accent:#2563eb;--archik-accent-bright:#3b82f6;--archik-magenta:#db2777;--archik-success:#10b981;--archik-warning:#d97706;--archik-danger:#e11d48;--archik-node-fill:#fff;--archik-node-fill-tinted:#f1f5f9;--archik-node-fill-frame:#fff;--archik-node-stroke:#0f172a;--archik-node-stroke-soft:#475569;--archik-container-border:#94a3b8;--archik-node-text:#0f172a;--archik-node-text-dim:#475569;--archik-node-caption:#64748b;--archik-node-chrome-dot:#cbd5f5;--archik-edge-filled:#0f172a;--archik-edge-open:#334155;--archik-edge-dim:#64748b;--archik-edge-async:#2563eb;--archik-grid-minor:#e2e8f0;--archik-grid-major:#cbd5e1;--archik-selected:#2563eb;--archik-selected-glow:#2563eb2e;--archik-status-proposed:#6366f1;--archik-status-deprecated:#d97706;--archik-stereotype-boundary:#0d9488;--archik-stereotype-control:#c2410c;--archik-stereotype-entity:#7c3aed;color-scheme:light}[data-theme=dark]{--archik-canvas:#050912;--archik-panel:#0c1426;--archik-surface:#14203a;--archik-surface-hover:#1c2c4d;--archik-fg:#e6edf7;--archik-fg-dim:#8b9bb8;--archik-fg-muted:#5b6a87;--archik-border:#1d2b48;--archik-border-strong:#2c3e63;--archik-accent:#22d3ee;--archik-accent-bright:#67e8f9;--archik-magenta:#f472b6;--archik-success:#34d399;--archik-warning:#fbbf24;--archik-danger:#fb7185;--archik-node-fill:#0c1426;--archik-node-fill-tinted:#142037;--archik-node-fill-frame:#14203a;--archik-node-stroke:#2c3e63;--archik-node-stroke-soft:#1d2b48;--archik-container-border:#3a4f7a;--archik-node-text:#e6edf7;--archik-node-text-dim:#b6c2d8;--archik-node-caption:#67e8f9;--archik-node-chrome-dot:#475878;--archik-edge-filled:#cbd5e1;--archik-edge-open:#94a3b8;--archik-edge-dim:#64748b;--archik-edge-async:#67e8f9;--archik-grid-minor:#0d1830;--archik-grid-major:#182748;--archik-selected:#22d3ee;--archik-selected-glow:#22d3ee47;--archik-status-proposed:#818cf8;--archik-status-deprecated:#fbbf24;--archik-stereotype-boundary:#2dd4bf;--archik-stereotype-control:#fb923c;--archik-stereotype-entity:#a78bfa;color-scheme:dark}html,body,#root{background:var(--archik-canvas);height:100%;color:var(--archik-fg);-webkit-font-smoothing:antialiased;margin:0;font-family:Inter,system-ui,sans-serif}.archik-panel{background:var(--archik-panel);border:1px solid var(--archik-border);border-radius:8px}.archik-input{background:var(--archik-surface);color:var(--archik-fg);border:1px solid var(--archik-border);font:inherit;border-radius:4px;outline:none;padding:4px 8px;font-size:12px;transition:border-color .12s,box-shadow .12s}.archik-input:focus{border-color:var(--archik-accent);box-shadow:0 0 0 3px var(--archik-selected-glow)}.archik-btn{background:var(--archik-surface);color:var(--archik-fg);border:1px solid var(--archik-border);cursor:pointer;border-radius:4px;align-items:center;gap:4px;padding:5px 10px;font-size:12px;font-weight:500;transition:background .12s,border-color .12s,color .12s;display:inline-flex}.archik-btn:hover{background:var(--archik-surface-hover);border-color:var(--archik-border-strong)}.archik-btn:disabled{opacity:.5;cursor:not-allowed}.archik-btn-primary{background:var(--archik-accent);border-color:var(--archik-accent);color:#050912}.archik-btn-primary:hover{background:var(--archik-accent-bright);border-color:var(--archik-accent-bright)}[data-theme=light] .archik-btn-primary{color:#fff}.archik-btn-danger{color:var(--archik-danger);border-color:var(--archik-danger);background:0 0;border-style:dashed}.archik-btn-danger:hover{background:var(--archik-danger);color:#050912;border-style:solid}.archik-pill{letter-spacing:.02em;border:1px solid #0000;border-radius:999px;align-items:center;gap:4px;padding:2px 8px;font-size:11px;display:inline-flex}.archik-pill--info{color:var(--archik-accent);border-color:var(--archik-border-strong);background:var(--archik-accent)}@supports (color:color-mix(in lab,red,red)){.archik-pill--info{background:color-mix(in oklab,var(--archik-accent) 8%,transparent)}}.archik-pill--success{color:var(--archik-success);background:var(--archik-success)}@supports (color:color-mix(in lab,red,red)){.archik-pill--success{background:color-mix(in oklab,var(--archik-success) 12%,transparent)}}.archik-pill--warning{color:var(--archik-warning);background:var(--archik-warning)}@supports (color:color-mix(in lab,red,red)){.archik-pill--warning{background:color-mix(in oklab,var(--archik-warning) 14%,transparent)}}.archik-pill--danger{color:var(--archik-danger);background:var(--archik-danger)}@supports (color:color-mix(in lab,red,red)){.archik-pill--danger{background:color-mix(in oklab,var(--archik-danger) 14%,transparent)}}.archik-label{letter-spacing:.12em;text-transform:uppercase;color:var(--archik-fg-muted);margin-bottom:4px;font-size:10px;display:block}.archik-mono{color:var(--archik-fg);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.archik-divider{border-top:1px solid var(--archik-border)}.archik-grid{background-color:var(--archik-canvas);background-image:radial-gradient(var(--archik-grid-minor) 1px,transparent 1px),radial-gradient(var(--archik-grid-major) 1px,transparent 1px);background-position:0 0,0 0;background-size:20px 20px,100px 100px}.archik-selected-glow{filter:drop-shadow(0 0 6px var(--archik-selected-glow)) drop-shadow(0 0 2px var(--archik-selected-glow));animation:1.8s ease-in-out infinite archikPulse}[data-archik-node-id][data-archik-status=proposed]{opacity:.82}[data-archik-node-id][data-archik-status=proposed] rect,[data-archik-node-id][data-archik-status=proposed] path,[data-archik-node-id][data-archik-status=proposed] ellipse,[data-archik-node-id][data-archik-status=proposed] line{stroke:var(--archik-status-proposed);stroke-dasharray:5 3}[data-archik-node-id][data-archik-status=deprecated]{opacity:.7}[data-archik-node-id][data-archik-status=deprecated] rect,[data-archik-node-id][data-archik-status=deprecated] path,[data-archik-node-id][data-archik-status=deprecated] ellipse,[data-archik-node-id][data-archik-status=deprecated] line{stroke:var(--archik-status-deprecated);stroke-dasharray:2 4}[data-archik-node-id][data-archik-status=deprecated] text{text-decoration:line-through;text-decoration-thickness:1px;-webkit-text-decoration-color:var(--archik-status-deprecated);text-decoration-color:var(--archik-status-deprecated)}.archik-stereotype-band{pointer-events:none}[data-archik-stereotype=boundary] .archik-stereotype-band{fill:var(--archik-stereotype-boundary)}[data-archik-stereotype=control] .archik-stereotype-band{fill:var(--archik-stereotype-control)}[data-archik-stereotype=entity] .archik-stereotype-band{fill:var(--archik-stereotype-entity)}.archik-stereotype-pill{letter-spacing:.08em;border:1px solid #0000;border-radius:10px;align-self:flex-start;align-items:center;padding:3px 10px;font-size:10px;font-weight:700;display:inline-flex}.archik-stereotype-pill[data-stereotype=boundary]{background:var(--archik-stereotype-boundary)}@supports (color:color-mix(in lab,red,red)){.archik-stereotype-pill[data-stereotype=boundary]{background:color-mix(in srgb,var(--archik-stereotype-boundary) 15%,transparent)}}.archik-stereotype-pill[data-stereotype=boundary]{border-color:var(--archik-stereotype-boundary);color:var(--archik-stereotype-boundary)}.archik-stereotype-pill[data-stereotype=control]{background:var(--archik-stereotype-control)}@supports (color:color-mix(in lab,red,red)){.archik-stereotype-pill[data-stereotype=control]{background:color-mix(in srgb,var(--archik-stereotype-control) 15%,transparent)}}.archik-stereotype-pill[data-stereotype=control]{border-color:var(--archik-stereotype-control);color:var(--archik-stereotype-control)}.archik-stereotype-pill[data-stereotype=entity]{background:var(--archik-stereotype-entity)}@supports (color:color-mix(in lab,red,red)){.archik-stereotype-pill[data-stereotype=entity]{background:color-mix(in srgb,var(--archik-stereotype-entity) 15%,transparent)}}.archik-stereotype-pill[data-stereotype=entity]{border-color:var(--archik-stereotype-entity);color:var(--archik-stereotype-entity)}@keyframes archikPulse{0%,to{filter:drop-shadow(0 0 4px var(--archik-selected-glow)) drop-shadow(0 0 1px var(--archik-selected-glow))}50%{filter:drop-shadow(0 0 12px var(--archik-selected-glow)) drop-shadow(0 0 3px var(--archik-selected-glow))}}.archik-modal-overlay{z-index:50;background:var(--archik-canvas);justify-content:center;align-items:center;display:flex;position:fixed;inset:0}@supports (color:color-mix(in lab,red,red)){.archik-modal-overlay{background:color-mix(in oklab,var(--archik-canvas) 70%,transparent)}}.archik-modal-overlay{-webkit-backdrop-filter:blur(4px);animation:.14s ease-out archikFadeIn}.archik-modal{background:var(--archik-panel);border:1px solid var(--archik-border);width:360px;max-width:calc(100vw - 32px);box-shadow:0 12px 40px #00000059,0 0 0 1px var(--archik-border-strong);border-radius:8px;padding:16px;animation:.2s cubic-bezier(.2,.8,.2,1) archikModalIn}.archik-selected-outline{fill:none;stroke:var(--archik-selected);stroke-width:2px;pointer-events:none}@keyframes archikEdgeFlow{0%{stroke-dashoffset:0}to{stroke-dashoffset:calc(-1 * var(--archik-dash-period,8) * 1px)}}.archik-edge-flowing{animation:1.4s linear infinite archikEdgeFlow}@media(prefers-reduced-motion:reduce){.archik-edge-flowing{animation:none}}.archik-popover{background:var(--archik-panel);border:1px solid var(--archik-border-strong);border-radius:6px;flex-direction:column;max-height:min(80vh,600px);padding:4px;animation:.16s cubic-bezier(.2,.8,.2,1) archikModalIn;display:flex;overflow:hidden;box-shadow:0 12px 32px #00000059}.archik-menu-item{width:100%;color:var(--archik-fg);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:4px;align-items:center;gap:8px;padding:6px 10px;font-size:12px;display:flex}.archik-menu-item:hover{background:var(--archik-surface-hover)}.archik-menu-item--danger{color:var(--archik-danger)}@keyframes archikFadeIn{0%{opacity:0}to{opacity:1}}@keyframes archikModalIn{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:none}}.archik-drawer-shell{flex-direction:column;min-width:0;transition:width .22s cubic-bezier(.2,.8,.2,1),opacity .2s,margin-left .22s cubic-bezier(.2,.8,.2,1);display:flex;overflow:hidden}.archik-drawer-shell--open{opacity:1;width:320px;margin-left:16px}.archik-drawer-shell--closed{opacity:0;pointer-events:none;width:0;margin-left:0}.archik-drawer-content{flex-shrink:0;width:320px;height:100%}.archik-drawer-fade{animation:.22s ease-out archikFadeIn}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}