diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1594aa0..3d489a7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,53 @@
# playground-design-system — CHANGELOG
+## 0.6.0 — 2026-05-15
+
+### Added — Project-view archetype (Tier 4)
+
+Generic "project as artifact-collection" archetype for plugins where a project owns 0-N read-only report artifacts grouped by category. Default view is an aggregated dashboard; clicking a sidebar item swaps the main panel to the per-artifact render. Edit-mode is paste-import only (no inline editor).
+
+- **New file `components-tier4-project-view.css`** — 11 sections covering:
+ - `.project-view` + `.project-view__layout` (grid: nav 280px + main 1fr, responsive collapse at 1280 / 960px)
+ - `.project-view__header` (CSS Grid with eyebrow/title/lede/verdict/key-stats/actions areas)
+ - `.verdict-pill` (small pill variant — companion to existing `.verdict-pill-lg` in tier2)
+ - `.project-view__nav` + `.project-view__nav-search` (sticky sidebar with search)
+ - `.artifact-list` + `__group` / `__group-label` / `__group-count` / `__group-items` / `__item` / `__item-marker` / `__item-body` / `__item-name` / `__item-meta` (grouped, severity-coded sidebar)
+ - `.artifact-status[data-severity]` (mini-pill: positive | medium | critical)
+ - `.project-view__main` (main column container)
+ - `.project-overview` + `__intro` / `__verdict-grid` / `__verdict-tile[data-severity]` / `__section` / `__top-risks` / `__next-actions` / `__missing-reports` (aggregated dashboard)
+ - `.project-view__artifact` + `__artifact-header` / `__artifact-title` / `__artifact-meta` / `__artifact-actions` / `__artifact-body` (single-rapport viewer wrapper)
+ - `.empty-artifact-prompt` + `__icon` / `__title` / `__text` / `__actions` (empty-state)
+ - `.import-modal` + `__backdrop` / `__panel` / `__head` / `__title` / `__close` / `__form` / `__detect` / `__preview` / `__preview-label` / `__footer` (overlay modal for paste-import)
+
+- **6 new tokens in `tokens.css`:**
+ - `--project-view-nav-width: 280px` — sidebar width at full layout
+ - `--project-view-collapse-bp: 960px` — doc-only token referenced by responsive breakpoints
+ - `--artifact-list-item-pad-y: var(--space-2)` — sidebar row vertical padding
+ - `--artifact-list-item-pad-x: var(--space-3)` — sidebar row horizontal padding
+ - `--artifact-marker-size: 14px` — sidebar status marker diameter
+ - `--artifact-marker-border: 1.5px` — sidebar status marker border thickness
+
+### Påvirkning
+
+Endringen er **additiv**: ny komponent-fil + 6 nye tokens, ingen eksisterende selectors eller verdier endres. Plugin-konsumenter (`ms-ai-architect`, `llm-security`, `okr`, `config-audit`, `voyage`) får silent drift mot ny source-commit, men kan re-sync på eget tempo. Bare `ms-ai-architect` og `llm-security` re-syncer i samme commit som denne DS-bumpen (forberedelse til koordinert v1.15.0 / v7.7.0-release etter ~8 sesjoner med JS-implementasjon).
+
+Førsteadoptere: `ms-ai-architect` v1.15.0 (17 artefakter, 5 kategorier) + `llm-security` v7.7.0 (≥18 artefakter, 6 kategorier). State-driven visibility håndteres i plugin-JS, ikke i denne CSS-en — kun aktiv state rendres per pass.
+
+### Plugins som må laste den nye filen
+
+Etter `` til `components-tier3-supplement.css`, legg til:
+
+```html
+
+```
+
+### For å adoptere v0.6.0
+
+```bash
+node scripts/sync-design-system.mjs
+# --force hvis drift detected
+```
+
## 0.5.0 — 2026-05-10
### Added
diff --git a/components-tier4-project-view.css b/components-tier4-project-view.css
new file mode 100644
index 0000000..3db37b8
--- /dev/null
+++ b/components-tier4-project-view.css
@@ -0,0 +1,665 @@
+/* =============================================================================
+ Playground Design System — components-tier4-project-view.css
+ v0.6.0 — Tier 4 project-view archetype
+ ============================================================================
+
+ Generic "project as artifact-collection" archetype. Default-view is an
+ aggregated overview dashboard; clicking a sidebar item swaps main to a
+ per-artifact render. Tracks 0-N read-only artifacts; edit-mode is paste-
+ import only (markdown from terminal → parser → store).
+
+ First adopters: ms-ai-architect v1.15.0 (17 artifacts, 5 categories) +
+ llm-security v7.7.0 (≥18 artifacts, 6 categories). Each plugin injects a
+ PROJECT_VIEW_CONFIG object that maps commands → renderers, categories,
+ verdict-aggregators, missing-report heuristics.
+
+ The CSS in this file is plugin-agnostic. Plugin-specific shape (category
+ names, artifact ordering, custom severity-mappings) lives in JS config.
+
+ State-driven visibility is NOT handled here — production playgrounds emit
+ only the active state (overview | artifact | empty | import) per render
+ pass. The mockup uses body[data-state="..."] for prototyping; production
+ renders one branch at a time.
+ ============================================================================= */
+
+
+/* === 1. Project-view top-level layout ===================================== */
+
+.project-view {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-6);
+}
+
+.project-view__layout {
+ display: grid;
+ grid-template-columns: var(--project-view-nav-width) 1fr;
+ gap: var(--space-6);
+ align-items: start;
+}
+
+@media (max-width: 1279px) {
+ .project-view__layout { grid-template-columns: 240px 1fr; }
+}
+
+@media (max-width: 959px) {
+ .project-view__layout { grid-template-columns: 1fr; }
+}
+
+
+/* === 2. Project-view header =============================================== */
+
+.project-view__header {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-md);
+ padding: var(--space-5) var(--space-6);
+ display: grid;
+ grid-template-columns: 1fr auto;
+ grid-template-areas:
+ "title verdict"
+ "title keystats"
+ "actions actions";
+ gap: var(--space-4) var(--space-6);
+ align-items: start;
+}
+
+.project-view__title-block { grid-area: title; }
+.project-view__verdict { grid-area: verdict; justify-self: end; }
+.project-view__key-stats { grid-area: keystats; justify-self: end; }
+.project-view__actions { grid-area: actions; display: flex; gap: var(--space-2); justify-content: flex-end; }
+
+.project-view__eyebrow {
+ font-size: 11px;
+ text-transform: uppercase;
+ letter-spacing: 0.08em;
+ color: var(--color-text-tertiary);
+ font-weight: var(--font-weight-semibold);
+ margin: 0 0 var(--space-2) 0;
+}
+
+.project-view__title {
+ font-size: var(--font-size-2xl);
+ font-weight: var(--font-weight-bold);
+ color: var(--color-text-primary);
+ margin: 0 0 var(--space-2) 0;
+}
+
+.project-view__lede {
+ color: var(--color-text-secondary);
+ margin: 0;
+ max-width: 60ch;
+}
+
+.project-view__key-stats {
+ display: flex;
+ gap: var(--space-5);
+}
+
+.project-view__key-stat-label {
+ font-size: 10px;
+ text-transform: uppercase;
+ color: var(--color-text-tertiary);
+ letter-spacing: 0.06em;
+}
+
+.project-view__key-stat-value {
+ font-size: var(--font-size-lg);
+ font-weight: var(--font-weight-semibold);
+ font-variant-numeric: tabular-nums;
+}
+
+
+/* === 3. Verdict-pill (small) ==============================================
+ Companion to .verdict-pill-lg (Tier 2). Inline-flex pill used in project
+ header + sidebar status badges. The larger -lg variant lives in
+ components-tier2.css; both share the same severity-band semantics. */
+
+.verdict-pill {
+ display: inline-flex;
+ align-items: center;
+ gap: var(--space-1);
+ padding: 4px 12px;
+ border-radius: 999px;
+ font-weight: var(--font-weight-semibold);
+ font-size: var(--font-size-sm);
+}
+
+.verdict-pill--positive { background: var(--color-state-success); color: #fff; }
+.verdict-pill--medium { background: var(--color-severity-medium); color: var(--color-severity-medium-on); }
+.verdict-pill--critical { background: var(--color-severity-critical); color: #fff; }
+.verdict-pill--in-progress {
+ background: var(--color-bg-soft);
+ color: var(--color-text-secondary);
+ border: 1px dashed var(--color-border-moderate);
+}
+
+
+/* === 4. Sidebar nav ======================================================= */
+
+.project-view__nav {
+ position: sticky;
+ top: var(--space-6);
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-md);
+ padding: var(--space-4);
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-3);
+}
+
+.project-view__nav-search input {
+ width: 100%;
+ box-sizing: border-box;
+ padding: 6px 10px;
+ font-size: var(--font-size-sm);
+ background: var(--color-bg);
+ color: var(--color-text-primary);
+ border: 1px solid var(--color-border-moderate);
+ border-radius: var(--radius-sm);
+}
+
+
+/* === 5. Artifact-list ===================================================== */
+
+.artifact-list {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.artifact-list__group {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-1);
+}
+
+.artifact-list__group-label {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-size: 10px;
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+ color: var(--color-text-tertiary);
+ font-weight: var(--font-weight-semibold);
+ padding: 0 var(--space-2);
+}
+
+.artifact-list__group-count {
+ background: var(--color-bg-soft);
+ color: var(--color-text-tertiary);
+ font-family: var(--font-family-mono);
+ font-size: 10px;
+ padding: 1px 6px;
+ border-radius: 999px;
+}
+
+.artifact-list__group-items {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.artifact-list__item {
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ align-items: center;
+ gap: var(--space-2);
+ padding: var(--artifact-list-item-pad-y) var(--artifact-list-item-pad-x);
+ border-radius: var(--radius-sm);
+ cursor: pointer;
+ background: transparent;
+ border: 1px solid transparent;
+ transition: background 120ms ease, border-color 120ms ease;
+}
+
+.artifact-list__item:hover { background: var(--color-bg-soft); }
+
+.artifact-list__item[data-state="active"] {
+ background: var(--color-bg-soft);
+ border-color: var(--color-primary-500);
+ box-shadow: inset 3px 0 0 var(--color-primary-500);
+ padding-left: calc(var(--artifact-list-item-pad-x) - 3px);
+}
+
+.artifact-list__item-marker {
+ width: var(--artifact-marker-size);
+ height: var(--artifact-marker-size);
+ border-radius: 50%;
+ border: var(--artifact-marker-border) solid var(--color-border-moderate);
+ background: transparent;
+ flex-shrink: 0;
+}
+
+.artifact-list__item[data-state="filled"][data-severity="positive"] .artifact-list__item-marker {
+ background: var(--color-state-success);
+ border-color: var(--color-state-success);
+}
+.artifact-list__item[data-state="filled"][data-severity="medium"] .artifact-list__item-marker {
+ background: var(--color-severity-medium);
+ border-color: var(--color-severity-medium);
+}
+.artifact-list__item[data-state="filled"][data-severity="critical"] .artifact-list__item-marker {
+ background: var(--color-severity-critical);
+ border-color: var(--color-severity-critical);
+}
+
+.artifact-list__item-body { min-width: 0; }
+
+.artifact-list__item-name {
+ font-size: var(--font-size-sm);
+ font-weight: var(--font-weight-medium);
+ color: var(--color-text-primary);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.artifact-list__item[data-state="empty"] .artifact-list__item-name {
+ color: var(--color-text-tertiary);
+ font-weight: var(--font-weight-regular);
+}
+
+.artifact-list__item-meta {
+ font-size: 11px;
+ color: var(--color-text-tertiary);
+}
+
+
+/* === 6. Artifact-status (mini pill in sidebar) =========================== */
+
+.artifact-status {
+ font-family: var(--font-family-mono);
+ font-size: 10px;
+ font-weight: var(--font-weight-semibold);
+ padding: 1px 5px;
+ border-radius: var(--radius-sm);
+ letter-spacing: 0.04em;
+}
+
+.artifact-status[data-severity="positive"] { background: var(--color-severity-low-soft); color: var(--color-severity-low-on); }
+.artifact-status[data-severity="medium"] { background: var(--color-severity-medium-soft); color: var(--color-severity-medium-on); }
+.artifact-status[data-severity="critical"] { background: var(--color-severity-critical-soft); color: var(--color-severity-critical-on); }
+
+
+/* === 7. Project-view main panel ========================================== */
+
+.project-view__main {
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-5);
+}
+
+
+/* === 8. Project-overview (default dashboard) ============================= */
+
+.project-overview {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-6);
+}
+
+.project-overview__intro {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-md);
+ padding: var(--space-5);
+}
+
+.project-overview__intro h2 {
+ font-size: var(--font-size-lg);
+ margin: 0 0 var(--space-2) 0;
+}
+
+.project-overview__intro p {
+ color: var(--color-text-secondary);
+ margin: 0;
+}
+
+.project-overview__verdict-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
+ gap: var(--space-3);
+}
+
+.project-overview__verdict-tile {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-subtle);
+ border-left: 4px solid var(--color-border-moderate);
+ border-radius: var(--radius-md);
+ padding: var(--space-4);
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-1);
+}
+
+.project-overview__verdict-tile[data-severity="positive"] { border-left-color: var(--color-state-success); }
+.project-overview__verdict-tile[data-severity="medium"] { border-left-color: var(--color-severity-medium); }
+.project-overview__verdict-tile[data-severity="critical"] { border-left-color: var(--color-severity-critical); }
+.project-overview__verdict-tile[data-severity="empty"] { border-left-style: dashed; }
+
+.project-overview__verdict-tile-label {
+ font-size: 11px;
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+ color: var(--color-text-tertiary);
+ font-weight: var(--font-weight-semibold);
+}
+
+.project-overview__verdict-tile-value {
+ font-size: var(--font-size-lg);
+ font-weight: var(--font-weight-semibold);
+}
+
+.project-overview__verdict-tile-meta {
+ font-size: var(--font-size-xs);
+ color: var(--color-text-secondary);
+}
+
+.project-overview__section h3 {
+ font-size: 12px;
+ text-transform: uppercase;
+ letter-spacing: 0.08em;
+ color: var(--color-text-tertiary);
+ font-weight: var(--font-weight-semibold);
+ margin: 0 0 var(--space-3) 0;
+}
+
+.project-overview__top-risks,
+.project-overview__next-actions {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-md);
+ padding: var(--space-5);
+}
+
+.project-overview__top-risks ol,
+.project-overview__next-actions ol {
+ list-style: none;
+ counter-reset: rank;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+}
+
+.project-overview__top-risks li,
+.project-overview__next-actions li {
+ counter-increment: rank;
+ display: grid;
+ grid-template-columns: auto 1fr auto;
+ align-items: center;
+ gap: var(--space-3);
+ padding: var(--space-2) var(--space-3);
+ border-radius: var(--radius-sm);
+ background: var(--color-bg-soft);
+}
+
+.project-overview__top-risks li::before,
+.project-overview__next-actions li::before {
+ content: counter(rank);
+ font-family: var(--font-family-mono);
+ font-weight: var(--font-weight-bold);
+ color: var(--color-text-tertiary);
+ font-size: var(--font-size-sm);
+ min-width: 20px;
+}
+
+.project-overview__missing-reports {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-md);
+ padding: var(--space-5);
+}
+
+.project-overview__missing-reports ul {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-2);
+}
+
+.project-overview__missing-reports li {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-3);
+ padding: var(--space-2) var(--space-3);
+ background: var(--color-bg-soft);
+ border-radius: var(--radius-sm);
+ border-left: 3px dashed var(--color-border-moderate);
+}
+
+
+/* === 9. Artifact-view (one report rendered) ============================== */
+
+.project-view__artifact {
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-md);
+ padding: var(--space-6);
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-5);
+}
+
+.project-view__artifact-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: start;
+ gap: var(--space-4);
+ padding-bottom: var(--space-4);
+ border-bottom: 1px solid var(--color-border-subtle);
+}
+
+.project-view__artifact-title {
+ font-size: var(--font-size-xl);
+ margin: 0 0 var(--space-1) 0;
+}
+
+.project-view__artifact-meta {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-tertiary);
+ margin: 0;
+}
+
+.project-view__artifact-actions {
+ display: flex;
+ gap: var(--space-2);
+ flex-shrink: 0;
+}
+
+.project-view__artifact-body {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-5);
+}
+
+
+/* === 10. Empty-artifact-prompt (no report imported yet) ================== */
+
+.empty-artifact-prompt {
+ background: var(--color-surface);
+ border: 2px dashed var(--color-border-moderate);
+ border-radius: var(--radius-md);
+ padding: var(--space-8);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-3);
+ text-align: center;
+}
+
+.empty-artifact-prompt__icon {
+ font-size: 48px;
+ opacity: 0.5;
+}
+
+.empty-artifact-prompt__title {
+ font-size: var(--font-size-lg);
+ margin: 0;
+}
+
+.empty-artifact-prompt__text {
+ color: var(--color-text-secondary);
+ margin: 0;
+ max-width: 50ch;
+}
+
+.empty-artifact-prompt__actions {
+ display: flex;
+ gap: var(--space-2);
+ margin-top: var(--space-2);
+}
+
+
+/* === 11. Import-modal (overlay) ========================================== */
+
+.import-modal {
+ position: fixed;
+ inset: 0;
+ z-index: 200;
+ display: none;
+}
+
+.import-modal[data-open="true"] {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.import-modal__backdrop {
+ position: absolute;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.55);
+}
+
+.import-modal__panel {
+ position: relative;
+ width: min(720px, 92vw);
+ max-height: 90vh;
+ overflow: auto;
+ background: var(--color-surface);
+ border: 1px solid var(--color-border-strong);
+ border-radius: var(--radius-md);
+ box-shadow: var(--shadow-lg);
+ display: flex;
+ flex-direction: column;
+}
+
+.import-modal__head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--space-3);
+ padding: var(--space-4) var(--space-5);
+ border-bottom: 1px solid var(--color-border-subtle);
+}
+
+.import-modal__title {
+ margin: 0;
+ font-size: var(--font-size-lg);
+ font-weight: var(--font-weight-semibold);
+}
+
+.import-modal__close {
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ padding: 4px 10px;
+ color: var(--color-text-tertiary);
+ font-size: 20px;
+ line-height: 1;
+ border-radius: var(--radius-sm);
+}
+
+.import-modal__close:hover {
+ background: var(--color-bg-soft);
+ color: var(--color-text-primary);
+}
+
+.import-modal__form {
+ padding: var(--space-5);
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-4);
+}
+
+.import-modal__form .field {
+ display: flex;
+ flex-direction: column;
+ gap: var(--space-1);
+}
+
+.import-modal__form label {
+ font-size: var(--font-size-sm);
+ font-weight: var(--font-weight-semibold);
+ color: var(--color-text-secondary);
+}
+
+.import-modal__form select,
+.import-modal__form textarea {
+ width: 100%;
+ box-sizing: border-box;
+ padding: var(--space-2) var(--space-3);
+ background: var(--color-bg);
+ color: var(--color-text-primary);
+ border: 1px solid var(--color-border-moderate);
+ border-radius: var(--radius-sm);
+ font-family: var(--font-family-mono);
+ font-size: var(--font-size-sm);
+}
+
+.import-modal__form textarea {
+ resize: vertical;
+ min-height: 180px;
+}
+
+.import-modal__detect {
+ display: flex;
+ align-items: center;
+ gap: var(--space-2);
+ padding: var(--space-2) var(--space-3);
+ border-radius: var(--radius-sm);
+ background: var(--color-severity-low-soft);
+ color: var(--color-severity-low-on);
+ font-size: var(--font-size-sm);
+}
+
+.import-modal__preview {
+ border: 1px solid var(--color-border-subtle);
+ border-radius: var(--radius-sm);
+ padding: var(--space-3);
+ background: var(--color-bg);
+ max-height: 200px;
+ overflow: auto;
+}
+
+.import-modal__preview-label {
+ font-size: 11px;
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+ color: var(--color-text-tertiary);
+ margin-bottom: var(--space-2);
+}
+
+.import-modal__footer {
+ display: flex;
+ justify-content: flex-end;
+ gap: var(--space-2);
+ padding: var(--space-3) var(--space-5);
+ border-top: 1px solid var(--color-border-subtle);
+ background: var(--color-bg-soft);
+}
diff --git a/tokens.css b/tokens.css
index 95ef620..1686a5c 100644
--- a/tokens.css
+++ b/tokens.css
@@ -142,6 +142,14 @@
--container-default: 1080px;
--container-wide: 1280px;
--sidebar-width: 280px;
+
+ /* ---------- Project-view (Tier 4 — v0.6.0) --------------------------- */
+ --project-view-nav-width: 280px;
+ --project-view-collapse-bp: 960px; /* doc-only — referenced by media queries */
+ --artifact-list-item-pad-y: var(--space-2);
+ --artifact-list-item-pad-x: var(--space-3);
+ --artifact-marker-size: 14px;
+ --artifact-marker-border: 1.5px;
}
:root { color-scheme: light; }