@jterrats/open-orchestra 1.1.1 → 1.1.2

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.
Files changed (50) hide show
  1. package/AGENTS.md +29 -5
  2. package/CLAUDE.md +22 -4
  3. package/dist/chat-api-service.js +3 -0
  4. package/dist/chat-api-service.js.map +1 -1
  5. package/dist/cli.js +7 -1
  6. package/dist/cli.js.map +1 -1
  7. package/dist/command-manifest.d.ts +3 -0
  8. package/dist/command-manifest.js +84 -0
  9. package/dist/command-manifest.js.map +1 -1
  10. package/dist/command-routes.js +4 -1
  11. package/dist/command-routes.js.map +1 -1
  12. package/dist/phase-playbooks.js +6 -0
  13. package/dist/phase-playbooks.js.map +1 -1
  14. package/dist/real-evidence-gates.d.ts +23 -0
  15. package/dist/real-evidence-gates.js +182 -0
  16. package/dist/real-evidence-gates.js.map +1 -0
  17. package/dist/release-commands.d.ts +3 -0
  18. package/dist/release-commands.js +85 -0
  19. package/dist/release-commands.js.map +1 -1
  20. package/dist/release-inclusion.d.ts +115 -0
  21. package/dist/release-inclusion.js +378 -0
  22. package/dist/release-inclusion.js.map +1 -0
  23. package/dist/runtime-child-prompt.js +5 -2
  24. package/dist/runtime-child-prompt.js.map +1 -1
  25. package/dist/runtime-execution-renderer.js +3 -3
  26. package/dist/runtime-execution-renderer.js.map +1 -1
  27. package/dist/runtime-execution.js +6 -2
  28. package/dist/runtime-execution.js.map +1 -1
  29. package/dist/runtime-parent-actions.js +37 -6
  30. package/dist/runtime-parent-actions.js.map +1 -1
  31. package/dist/types/runtime.d.ts +5 -2
  32. package/dist/types/workflow-run.d.ts +2 -0
  33. package/dist/web-api.js +226 -1
  34. package/dist/web-api.js.map +1 -1
  35. package/dist/web-chat-routes.js +11 -0
  36. package/dist/web-chat-routes.js.map +1 -1
  37. package/dist/web-console/assets/index--_RLc7Zp.js +11 -0
  38. package/dist/web-console/assets/index-Cxo3REa4.css +1 -0
  39. package/dist/web-console/index.html +2 -2
  40. package/dist/workflow-gates.js +49 -3
  41. package/dist/workflow-gates.js.map +1 -1
  42. package/dist/workflow-handoff-contract.js +30 -2
  43. package/dist/workflow-handoff-contract.js.map +1 -1
  44. package/dist/workflow-run-commands.js +11 -1
  45. package/dist/workflow-run-commands.js.map +1 -1
  46. package/docs/release-inclusion-manifest.md +142 -0
  47. package/docs/runtime-adapters.md +8 -4
  48. package/package.json +1 -1
  49. package/dist/web-console/assets/index-CJup1cIA.css +0 -1
  50. package/dist/web-console/assets/index-CVDOfipu.js +0 -11
@@ -0,0 +1,142 @@
1
+ # Release Inclusion Manifest
2
+
3
+ Open Orchestra stays trunk-based, but release tags use an explicit release
4
+ inclusion manifest to decide which completed work belongs to a version bump.
5
+
6
+ ## Location
7
+
8
+ The canonical manifest path is:
9
+
10
+ ```text
11
+ .agent-workflow/releases/release-inclusion.json
12
+ ```
13
+
14
+ The manifest is workflow-local state. It is intended to be reviewed with the
15
+ release evidence for a candidate version, not bundled into the published npm
16
+ package as product behavior.
17
+
18
+ ## Schema
19
+
20
+ `schemaVersion` is currently `1`. Each item must declare:
21
+
22
+ - `state`: one of `included`, `excluded`, `deferred`, `blocked`, or
23
+ `already_released`.
24
+ - `taskId`: the Orchestra or GitHub-backed task id.
25
+ - `issueUrl`: the HTTPS issue URL for traceability.
26
+ - `commitReference`: a commit SHA or `start..end` SHA range.
27
+ - `versionTarget`: the semver version the item is evaluated against.
28
+ - `releaseNote`: a category and release-note text.
29
+ - `evidence`: one or more command, file, report, screenshot, trace, or video
30
+ references.
31
+ - `review`: status and reviewer roles or names.
32
+ - `risk`: risk status, rationale, and accepted-by marker when accepted.
33
+ - `rollback`: rollback note.
34
+ - `owner`: owner role and optional owner name.
35
+
36
+ ## Manual Editing
37
+
38
+ Keep manual edits deterministic:
39
+
40
+ - Sort items by `versionTarget`, then state, then `taskId`.
41
+ - Keep all text concise and reviewable in diffs.
42
+ - Prefer stable artifact paths or event ids for evidence references.
43
+ - Do not paste secrets, raw provider prompts, or full sensitive transcripts.
44
+ - Update `schemaVersion` only through a migration story.
45
+
46
+ ## CLI Workflow
47
+
48
+ Validate and inspect candidate scope for a version:
49
+
50
+ ```sh
51
+ orchestra release inclusion --version 1.1.3
52
+ orchestra release inclusion --version 1.1.3 --json
53
+ ```
54
+
55
+ Generate release notes from `included` items only:
56
+
57
+ ```sh
58
+ orchestra release notes --version 1.1.3
59
+ ```
60
+
61
+ Check tag readiness without creating a tag:
62
+
63
+ ```sh
64
+ orchestra release readiness --version 1.1.3
65
+ ```
66
+
67
+ The readiness gate only evaluates `included` items for the requested version.
68
+ Items marked `excluded`, `deferred`, `blocked`, or `already_released` remain
69
+ visible in the candidate report but are non-release scope for notes and tag
70
+ preparation.
71
+
72
+ ## GitHub and CI Sync
73
+
74
+ The manifest is the source of truth. GitHub labels, issue comments, project
75
+ fields, and CI artifacts are mirrors that help reviewers find state without
76
+ making GitHub required for local release work.
77
+
78
+ Recommended GitHub metadata mapping:
79
+
80
+ | Manifest state | Optional GitHub label | Release behavior |
81
+ | --- | --- | --- |
82
+ | `included` | `release:included` | Eligible for release notes and tag readiness. |
83
+ | `excluded` | `release:excluded` | Reported separately and omitted from notes. |
84
+ | `deferred` | `release:deferred` | Omitted until a later manifest update. |
85
+ | `blocked` | `release:blocked` | Omitted and should keep release review blocked. |
86
+ | `already_released` | `release:already-released` | Omitted from the next bump/tag scope. |
87
+
88
+ CI runs release inclusion validation in non-publishing mode. When a manifest is
89
+ present, CI should build the package, run `orchestra release inclusion
90
+ --version <package.json version> --json`, and upload the JSON report as a
91
+ review artifact. This check must not create tags or publish packages.
92
+
93
+ Manual fallback:
94
+
95
+ - If GitHub metadata is unavailable, reviewers use the manifest and CLI report.
96
+ - If CI cannot access secrets, run the same CLI commands locally and attach the
97
+ JSON output as release evidence.
98
+ - If GitHub labels drift from the manifest, update labels/comments to match the
99
+ manifest rather than editing the manifest to match labels.
100
+
101
+ ## Example
102
+
103
+ ```json
104
+ {
105
+ "schemaVersion": 1,
106
+ "versionTarget": "1.1.3",
107
+ "items": [
108
+ {
109
+ "state": "included",
110
+ "taskId": "GH-530",
111
+ "issueUrl": "https://github.com/jterrats/open-orchestra/issues/530",
112
+ "commitReference": "82ec5df",
113
+ "versionTarget": "1.1.3",
114
+ "releaseNote": {
115
+ "category": "internal",
116
+ "text": "Define release inclusion manifest schema."
117
+ },
118
+ "evidence": [
119
+ {
120
+ "type": "command",
121
+ "summary": "Release inclusion schema tests passed.",
122
+ "reference": "node --test test/release-inclusion.test.js"
123
+ }
124
+ ],
125
+ "review": {
126
+ "status": "approved",
127
+ "reviewers": ["qa", "release_manager"]
128
+ },
129
+ "risk": {
130
+ "status": "not_required",
131
+ "rationale": "Schema-only change with no release publishing behavior."
132
+ },
133
+ "rollback": {
134
+ "note": "Revert schema and docs commit before candidate generation."
135
+ },
136
+ "owner": {
137
+ "role": "release_manager"
138
+ }
139
+ }
140
+ ]
141
+ }
142
+ ```
@@ -501,8 +501,11 @@ agent path and records that choice in phase provenance.
501
501
 
502
502
  When no task or role executor is configured and the default executor is
503
503
  `generic-runtime`, `auto` and strict `subagents` mode infer the active runtime
504
- from `.agent-workflow/active-runtime.json`, then from `OPEN_ORCHESTRA_ACTIVE_RUNTIME`
505
- as a final fallback for non-hook environments (CI, scripts).
504
+ from `OPEN_ORCHESTRA_ACTIVE_RUNTIME`, then from
505
+ `.agent-workflow/active-runtime.json`. The environment value accepts either the
506
+ runtime target (`claude`, `codex`, `cursor`) or the executor id
507
+ (`claude-cli`, `codex-cli`, `cursor-cli`) and wins over a stale or mismatched
508
+ persisted record so a parent runtime can correct cross-project/session drift.
506
509
 
507
510
  `.agent-workflow/active-runtime.json` is the truthful signal of which AI runtime
508
511
  is currently driving the conversation. It is written by the active runtime's
@@ -515,8 +518,9 @@ pattern that must run at session start. Each hook overwrites the file with its
515
518
  own runtime id, so "last writer wins" matches "current parent runtime".
516
519
 
517
520
  The persisted record has a 24h TTL. Records older than that are ignored and
518
- inference falls through to the next signal. Codex maps to `codex-cli`, Claude
519
- maps to `claude-cli`, Cursor maps to `cursor-cli`, Windsurf maps to
521
+ inference falls through to the default when no environment override is present.
522
+ Codex maps to `codex-cli`, Claude maps to `claude-cli`, Cursor maps to
523
+ `cursor-cli`, Windsurf maps to
520
524
  `windsurf-agent`, and VS Code maps to `vscode-agent`.
521
525
 
522
526
  Explicit selections always take precedence in this order: `--runtime` flag,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jterrats/open-orchestra",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "type": "module",
5
5
  "workspaces": [
6
6
  "extensions/vscode-open-orchestra",
@@ -1 +0,0 @@
1
- :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f6f7f9;--panel:#fff;--ink:#17202a;--muted:#5f6b7a;--line:#d8dee6;--accent:#146c94;--ok:#137a44;--warn:#a35f00;--focus:#146c9440}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#111418;--panel:#1a2027;--ink:#edf1f5;--muted:#aab5c2;--line:#313b46;--accent:#6fb6d8;--ok:#68d391;--warn:#f0b45b;--focus:#6fb6d852}}*{box-sizing:border-box}html,body{max-width:100%;overflow-x:hidden}body{background:var(--bg);min-width:320px;color:var(--ink);margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;line-height:1.45}a,code,pre,span,strong{overflow-wrap:anywhere}button,input,select,textarea{font:inherit}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,a:focus-visible{outline:3px solid var(--focus);outline-offset:-2px}.app-shell{grid-template-rows:auto 1fr;min-height:100vh;display:grid}.topbar{border-bottom:1px solid var(--line);background:var(--panel)}.topbar-inner,main{width:min(1180px,100%);margin:0 auto;padding:16px}.brand-row{justify-content:space-between;align-items:center;gap:12px;display:flex}.brand h1{letter-spacing:0;margin:0;font-size:1.15rem;font-weight:750}.brand p,.guide-card p,.empty-state p{color:var(--muted);margin:2px 0 0;font-size:.92rem}.refresh-button,.text-button{border:1px solid var(--accent);background:var(--accent);color:#fff;cursor:pointer;border-radius:6px;min-height:38px;padding:0 12px}.text-button.secondary{border-color:var(--line);background:var(--panel);color:var(--ink)}.text-button:disabled{cursor:not-allowed;opacity:.55}main{gap:16px;display:grid}.section-nav{z-index:5;background:color-mix(in srgb, var(--bg) 94%, transparent);gap:8px;padding:8px 0;display:flex;position:sticky;top:0;overflow-x:auto}.section-tab{border:1px solid var(--line);background:var(--panel);min-width:0;color:var(--ink);text-align:left;cursor:pointer;border-radius:8px;flex:0 0 170px;gap:2px;padding:10px 12px;display:grid}.section-tab.active{border-color:color-mix(in srgb, var(--accent) 56%, var(--line));background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.section-tab strong{font-size:.9rem}.section-tab span,.section-heading p,.muted-copy{color:var(--muted);font-size:.84rem}.console-section,.overview-layout,.overview-column,.operations-layout,.section-column,.settings-layout,.tasks-layout{gap:12px;display:grid}.section-column{align-content:start}.section-column>*{align-self:start;width:100%}.section-heading{gap:2px;display:grid}.section-heading h2,.section-heading p{margin:0}.section-heading h2{font-size:1.08rem}.status-line{color:var(--muted);flex-wrap:wrap;align-items:center;gap:8px;font-size:.92rem;display:flex}.pill,.tag{border:1px solid var(--line);color:var(--muted);border-radius:999px;align-items:center;display:inline-flex}.pill{background:var(--panel);min-height:28px;padding:0 10px}.tag{padding:2px 8px;font-size:.78rem}.pill.ok,.tag.ok{color:var(--ok);border-color:#137a4459}.pill.warn,.tag.warn{color:var(--warn);border-color:#a35f0059}.pill.accent,.tag.accent{border-color:color-mix(in srgb, var(--accent) 35%, var(--line));color:var(--accent)}.grid,.guide-grid{grid-template-columns:1fr;align-items:start;gap:12px;display:grid}.grid>*,.guide-grid>*,.control-row>*,.metric-grid>*,.chart-grid>*{min-width:0}.panel,.guide-card,.subpanel{border:1px solid var(--line);background:var(--panel);border-radius:8px;min-width:0;padding:14px}.panel h2,.guide-card h2,.subpanel h3{letter-spacing:0;margin:0 0 10px;font-size:1rem}.subpanel{margin-top:12px}.warning-panel{border-color:color-mix(in srgb, var(--warn) 45%, var(--line));margin-bottom:12px}.compact-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.compact-list li{gap:3px;display:grid}.compact-list span{color:var(--muted);overflow-wrap:anywhere}.metric-grid,.chart-grid,.control-row{grid-template-columns:1fr;gap:10px;display:grid}.control-row.compact{grid-template-columns:minmax(140px,1fr) auto;align-items:end;margin-top:8px}.chart-grid{margin-top:12px}.cost-detail-grid{grid-template-columns:1fr;gap:10px;display:grid}.compact-subpanel{min-height:0;margin-top:12px}.compact-chart-grid .chart-card{min-height:0}.compact-chart-grid .chart-frame{min-height:90px}.compact-chart-grid .chart-frame canvas{height:90px}.settings-layout #cost-view .metric strong{overflow-wrap:anywhere;font-size:1.2rem}.chart-card,.metric,.list-item{border:1px solid var(--line);border-radius:6px;padding:10px}.chart-card{min-height:180px}.chart-card h3{letter-spacing:0;margin:0 0 8px;font-size:.9rem}.chart-frame{min-height:130px;position:relative}.chart-frame canvas{width:100%;height:130px}.metric{min-height:76px}.metric strong{font-size:1.45rem;line-height:1.1;display:block}.metric span,.list-item span{color:var(--muted);margin-top:4px;font-size:.85rem;display:block}.step-list,.command-list,.list,.detail-grid,.delivery-grid,.release-check-list,.release-detail-grid{gap:8px;display:grid}.step-list,.release-check-list,.list{margin:0;padding:0;list-style:none}.step-list{margin-top:12px}.step-list li{grid-template-columns:28px 1fr;align-items:start;gap:8px;display:grid}.step-list b{background:color-mix(in srgb, var(--accent) 18%, var(--panel));width:28px;height:28px;color:var(--accent);border-radius:999px;justify-content:center;align-items:center;font-size:.84rem;display:inline-flex}.command-chip{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));color:var(--ink);white-space:normal;word-break:break-word;border-radius:6px;padding:9px 10px;font:.84rem/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;display:block}.command-disclosure{margin-top:10px}.command-disclosure summary{cursor:pointer;color:var(--accent);font-size:.9rem;font-weight:650}.command-disclosure .command-list{margin-top:8px}.detail-disclosure summary{cursor:pointer;color:var(--ink);font-weight:700}.detail-disclosure>.list,.detail-disclosure>.preview,.detail-disclosure>.markdown-summary,.detail-disclosure>.text-button{margin-top:10px}.markdown-summary{border:1px solid var(--line);background:#fff;border-radius:8px;gap:8px;max-height:320px;padding:12px;display:grid;overflow:auto}.markdown-summary h4,.markdown-summary p,.markdown-summary ul{margin:0}.markdown-summary h4{font-size:.95rem}.markdown-summary ul{padding-left:18px}.markdown-summary code{overflow-wrap:anywhere;border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));border-radius:6px;padding:8px;display:block}.preview{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));max-height:220px;color:var(--ink);white-space:pre-wrap;border-radius:6px;padding:10px;font:.82rem/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:auto}.field{gap:4px;display:grid}.field span{color:var(--muted);font-size:.82rem}.field-label{align-items:center;gap:6px;display:inline-flex}.help-tooltip{border:1px solid var(--line);width:18px;height:18px;color:var(--ink);cursor:help;background:#fff;border-radius:50%;place-items:center;font-size:.72rem;font-weight:700;line-height:1;display:inline-grid;position:relative}.tooltip-bubble{z-index:20;color:#f8fafc;text-align:left;white-space:normal;background:#0f172a;border:1px solid #0f172a;border-radius:8px;width:min(260px,72vw);padding:8px 10px;font-size:.78rem;font-weight:500;line-height:1.4;display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);box-shadow:0 14px 36px #0f172a52}.field .tooltip-bubble{color:#f8fafc;font-size:.78rem}.tooltip-bubble:after{content:"";background:#0f172a;border-bottom:1px solid #0f172a;border-right:1px solid #0f172a;width:10px;height:10px;position:absolute;top:100%;left:50%;transform:translate(-50%,-5px)rotate(45deg)}.help-tooltip:hover .tooltip-bubble,.help-tooltip:focus .tooltip-bubble,.help-tooltip:focus-within .tooltip-bubble{display:block}.field input,.field select,.field textarea{border:1px solid var(--line);background:var(--panel);width:100%;min-width:0;color:var(--ink);border-radius:6px}.field input,.field select{min-height:38px;padding:0 10px}.field textarea{resize:vertical;min-height:120px;padding:10px}.workspace-selector{gap:10px;margin-bottom:12px;display:grid}.workspace-selector-actions{flex-wrap:wrap;gap:8px;display:flex}.inline-error{color:var(--warn);margin:8px 0 0;font-size:.85rem}.inline-status,.muted-copy{color:var(--muted);margin:8px 0 0;font-size:.85rem}.tag-row{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.repair-row{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.check-field{color:var(--muted);align-items:center;gap:6px;font-size:.85rem;display:inline-flex}.task-filters{grid-template-columns:1fr;gap:8px;display:grid}.task-filters>*{min-width:0}.task-internals-toggle{margin-top:10px}.artifact-list{color:var(--muted);margin:8px 0 0;padding-left:18px;font-size:.84rem}.review-copy{color:var(--muted);margin:8px 0 0;font-size:.86rem}.phase-timeline{gap:6px;margin:10px 0 0;padding:0;list-style:none;display:grid}.gate-history{border-top:1px solid var(--line);gap:6px;margin-top:10px;padding-top:8px;font-size:.84rem;display:grid}.gate-history>strong{font-size:.86rem}.gate-history ul{gap:6px;margin:0;padding:0;list-style:none;display:grid}.gate-history li{color:var(--muted);grid-template-columns:minmax(80px,1fr) minmax(72px,.7fr) minmax(88px,.8fr) minmax(120px,1.4fr);gap:8px;display:grid}.phase-timeline li{border-top:1px solid var(--line);grid-template-columns:minmax(56px,.7fr) minmax(110px,1fr) minmax(88px,.8fr) minmax(72px,.8fr);align-items:center;gap:8px;padding-top:6px;font-size:.83rem;display:grid}.phase-timeline span,.phase-timeline time{color:var(--muted)}.detail-block{border-top:1px solid var(--line);padding-top:10px}.detail-block h3{letter-spacing:0;margin:0 0 6px;font-size:.9rem}.detail-block ul{color:var(--muted);margin:0;padding-left:18px}.empty-state{border:1px dashed var(--line);background:color-mix(in srgb, var(--panel) 85%, var(--bg));border-radius:8px;padding:18px}.empty-state strong{margin-bottom:4px;display:block}.artifact-canvas{margin:18px 0}.chat-layout{gap:12px;display:grid}.chat-controls-panel,.chat-thread-panel,.chat-timeline-panel{align-content:start}.chat-scope-copy,.chat-composer-actions{flex-wrap:wrap;gap:8px;display:flex}.chat-thread-list,.chat-message-list{gap:10px;margin:0;padding:0;list-style:none;display:grid}.chat-thread-list{max-height:560px;overflow:auto}.chat-thread-button{border:1px solid var(--line);background:var(--panel);width:100%;min-height:72px;color:var(--ink);text-align:left;border-radius:6px;gap:4px;padding:10px;display:grid}.chat-thread-button.selected{border-color:color-mix(in srgb, var(--accent) 55%, var(--line));background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.chat-thread-button span,.chat-thread-button small{color:var(--muted)}.chat-message-card{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 88%, var(--bg));border-radius:6px;gap:10px;padding:12px;display:grid}.chat-message-card.tone-ok{border-color:#137a4459}.chat-message-card.tone-warn{border-color:#a35f0059}.chat-message-card.tone-accent{border-color:color-mix(in srgb, var(--accent) 40%, var(--line))}.chat-message-header{flex-wrap:wrap;justify-content:space-between;align-items:start;gap:10px;display:flex}.chat-message-heading{gap:6px;display:grid}.chat-message-content{gap:8px;display:grid}.chat-message-content h3,.chat-message-content p,.chat-message-content ul,.chat-message-content pre{margin:0}.chat-message-content ul{padding-left:18px}.chat-message-content pre{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 80%, var(--bg));white-space:pre-wrap;border-radius:6px;padding:10px;font:.82rem/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:auto}.chat-event-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0;display:grid}.chat-event-grid div{min-width:0}.chat-event-grid dt{color:var(--muted);font-size:.8rem}.chat-event-grid dd{margin:2px 0 0}.chat-event-wide{grid-column:1/-1}.chat-composer{border-top:1px solid var(--line);gap:10px;margin-top:12px;padding-top:12px;display:grid}.panel-heading{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.compact-heading{align-items:center;margin-bottom:12px}.compact-heading h2{margin-bottom:0}.event-list-panel .list{gap:12px}.release-events-grid{align-items:stretch}.release-events-grid .event-list-panel{grid-template-rows:auto 1fr auto;display:grid}.release-events-grid .event-list-panel .list{align-content:start}.workflow-control-row{align-items:end}.workflow-rationale-row{grid-template-columns:1fr}.workflow-rationale-row .field{width:100%}.event-list-panel .list-item{padding:12px}.event-list-panel .list-item strong{line-height:1.3}.event-list-panel .list-item span{margin-top:6px;line-height:1.45}.list-count{color:var(--muted);white-space:nowrap;font-size:.82rem}.pagination-controls{color:var(--muted);grid-template-columns:minmax(92px,auto) 1fr minmax(72px,auto);align-items:center;gap:8px;margin-top:12px;font-size:.85rem;display:grid}.pagination-controls span{text-align:center}.release-check-list{gap:6px;margin-top:12px}.release-summary-card{align-content:start}.release-summary-metrics{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}.release-summary-metrics .metric{min-height:58px;padding:8px}.release-summary-metrics .metric strong{font-size:1.1rem}.release-check-row{border:1px solid var(--line);border-radius:6px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;display:grid}.release-check-row strong,.release-check-row span{display:block}.release-check-row strong{line-height:1.25}.release-check-row div>span{color:var(--muted);margin-top:2px;font-size:.82rem}.compact-role-list{max-height:320px;margin-top:10px;overflow:auto}.playwright-plan-list,#qa-automation-planner .subpanel{margin-top:14px}.artifact-layout{gap:16px;min-height:420px;display:grid}.artifact-actions{flex-wrap:wrap;justify-content:flex-start;gap:8px;display:flex}.artifact-actions .disabled{pointer-events:none;opacity:.55}.artifact-index{align-content:start;gap:8px;max-height:520px;display:grid;overflow:auto}.artifact-group{gap:6px;display:grid}.artifact-group header{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 84%, var(--bg));border-radius:6px;flex-wrap:wrap;align-items:center;gap:6px;padding:6px 8px;font-size:.8rem;display:flex}.artifact-group header span{color:var(--muted)}.artifact-group ul{gap:8px;margin:0;padding:0;list-style:none;display:grid}.artifact-index button{text-align:left;border:1px solid var(--line);width:100%;min-height:58px;color:var(--text);background:#fff;gap:4px;display:grid}.artifact-index button.selected{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, #fff)}.artifact-index span,.artifact-preview pre{overflow-wrap:anywhere}.artifact-preview{border:1px solid var(--line);background:#fff;border-radius:8px;min-height:420px;overflow:hidden}.artifact-preview.error,.artifact-preview.source,.artifact-preview.state,.artifact-preview.unsupported{padding:16px;overflow:auto}.artifact-preview.unsupported{border-color:color-mix(in srgb, var(--warn) 48%, var(--line))}.artifact-preview pre{white-space:pre-wrap;margin:0}.artifact-preview.media{place-items:center;padding:12px;display:grid}.artifact-preview img{max-width:100%;max-height:520px}.canvas-toolbar{border-bottom:1px solid var(--line);flex-wrap:wrap;gap:8px;padding:10px;display:flex}.canvas-frame{cursor:grab;height:460px;overflow:hidden}.canvas-frame svg{background:#f8fafc;width:100%;height:100%}.canvas-frame line{stroke:#64748b;stroke-width:2px}.canvas-frame marker path{fill:#64748b}.canvas-node{cursor:move}.canvas-node rect{stroke:#334155;stroke-width:1.4px}.canvas-node text{fill:#111827;pointer-events:none;font-size:13px}.erd-preview{padding:14px;overflow:auto}.erd-heading{flex-wrap:wrap;justify-content:space-between;gap:8px;margin-bottom:12px;display:flex}.erd-heading span,.erd-table span,.erd-table small,.erd-relationships small{color:var(--muted)}.erd-layout,.erd-tables{gap:12px;display:grid}.erd-table{border:1px solid var(--line);border-radius:6px;overflow:hidden}.erd-table h3,.erd-relationships h3{background:color-mix(in srgb, var(--accent) 8%, var(--panel));margin:0;padding:8px 10px;font-size:.9rem}.erd-table ul,.erd-relationships ul{gap:0;margin:0;padding:0;list-style:none;display:grid}.erd-table li,.erd-relationships li{border-top:1px solid var(--line);grid-template-columns:minmax(120px,1fr) minmax(80px,.7fr) auto;align-items:center;gap:8px;padding:8px 10px;font-size:.84rem;display:grid}.erd-table em{border:1px solid var(--line);color:var(--accent);border-radius:999px;justify-self:start;padding:1px 7px;font-size:.74rem;font-style:normal}.erd-relationships{border:1px solid var(--line);border-radius:6px;overflow:hidden}.erd-relationships li{grid-template-columns:minmax(120px,1fr) auto minmax(120px,1fr)}.inline-success{color:#166534;font-weight:600}@media (width>=760px){.topbar-inner,main{padding:20px 24px}.grid{grid-template-columns:minmax(0,1.5fr) minmax(300px,.9fr)}.section-nav{grid-template-columns:repeat(8,minmax(0,1fr));display:grid;overflow-x:visible}.section-tab{flex-basis:auto}.guide-grid,.overview-layout,.operations-layout,.settings-layout{grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr)}.tasks-layout{grid-template-columns:minmax(0,1.2fr) minmax(320px,.8fr)}.chat-layout{grid-template-columns:minmax(260px,.8fr) minmax(280px,.9fr) minmax(0,1.4fr);align-items:start}.tasks-layout .panel:first-child{grid-row:span 2}.workflow-rationale-row .field{grid-column:1/-1;max-width:none}.cost-detail-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.metric-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.chart-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.control-row{grid-template-columns:repeat(4,minmax(0,1fr));align-items:end}.task-filters{grid-template-columns:minmax(220px,1fr) minmax(140px,.45fr) minmax(140px,.45fr);align-items:end}.artifact-layout{grid-template-columns:minmax(220px,320px) 1fr}.erd-layout{grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}}