@zq-silk/yui 2.2.0 → 2.3.0
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.
- package/README.md +4 -2
- package/dist/cli/commandCatalog.js +8 -3
- package/dist/cli/interactionPolicy.js +4 -0
- package/dist/commands/taskCommands.js +5 -7
- package/dist/commands/taskIntegrationCommands.js +5 -16
- package/dist/controlPlaneCli.js +28 -21
- package/dist/controller/clientRuntime.js +3 -2
- package/dist/integration/gitIntegrationService.js +8 -67
- package/dist/job/jobCleanupInspection.js +67 -0
- package/dist/repository/gitWorkspace.js +41 -12
- package/dist/repository/taskWorkspaceCoordinator.js +72 -145
- package/dist/repository/taskWorkspacePreparer.js +39 -43
- package/dist/repository/workspaceCleanupInspection.js +88 -7
- package/dist/resources/resourceRegistrar.js +16 -10
- package/dist/runtime/integrationRuntimeIsolation.js +21 -0
- package/dist/runtime/taskRuntimeIsolation.js +91 -21
- package/dist/task/archiveDiagnostics.js +26 -8
- package/dist/task/archivePreflight.js +26 -9
- package/dist/task/leaderArchive.js +9 -15
- package/dist/web/assets/client/api.js +8 -0
- package/dist/web/assets/client/app.js +10 -6
- package/dist/web/assets/client/components.js +95 -36
- package/dist/web/assets/client/detail.js +110 -64
- package/dist/web/assets/client/dock.js +95 -11
- package/dist/web/assets/client/evidence.js +286 -94
- package/dist/web/assets/client/i18n.js +178 -62
- package/dist/web/assets/client/overview.js +9 -13
- package/dist/web/assets/client/records.js +142 -7
- package/dist/web/assets/client/sections.js +234 -198
- package/dist/web/assets/icons.js +4 -0
- package/dist/web/assets/styles/components.js +64 -17
- package/dist/web/assets/styles/responsive.js +7 -5
- package/dist/web/assets/styles/tokens.js +1 -1
- package/dist/web/assets/styles/views.js +48 -31
- package/dist/web/webServer.js +12 -1
- package/dist/web/webTaskSurface.js +8 -1
- package/docs/observability/README.md +13 -3
- package/docs/observability/README.zh-CN.md +10 -3
- package/docs/release-workflow.md +25 -0
- package/docs/release-workflow.zh-CN.md +19 -0
- package/docs/task-delivery.md +36 -8
- package/docs/task-delivery.zh-CN.md +24 -7
- package/i18n/README.zh-CN.md +3 -2
- package/package.json +1 -1
- package/skills/yui-leader/references/execution.md +2 -1
- package/skills/yui-leader/references/integration.md +20 -0
- package/skills/yui-operator/SKILL.md +4 -0
- package/skills/yui-reviewer/SKILL.md +3 -0
- package/skills/yui-runtime/SKILL.md +4 -0
- package/skills/yui-runtime/references/publication.md +20 -4
- package/skills/yui-worker/SKILL.md +3 -0
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
* COMPONENTS — reusable controls and primitives: buttons, segmented
|
|
3
3
|
* controls, badges, dots, chips, cards, disclosures, key/value lists, empty
|
|
4
4
|
* states, metrics, dialogs and the toast. Colour comes only from tokens.
|
|
5
|
+
*
|
|
6
|
+
* Task and overview surfaces are one reading column of flat panels: a card
|
|
7
|
+
* head (icon tile, title, count, hint, actions) above a hairline, then the
|
|
8
|
+
* body. List cards divide their rows with hairlines instead of nesting boxes.
|
|
5
9
|
*/
|
|
6
10
|
export const COMPONENT_STYLES = `
|
|
7
11
|
/* Tones: one semantic colour per tone, used by dots, badges and signals */
|
|
@@ -57,26 +61,66 @@ code.id{padding:1px 6px;border-radius:var(--r-xs);background:var(--surface-3);co
|
|
|
57
61
|
.mono-line{font-family:var(--font-mono);font-size:var(--fs-2xs);overflow-wrap:anywhere}
|
|
58
62
|
|
|
59
63
|
/* Chip tabs (local filters) */
|
|
60
|
-
.chip-tabs{display:flex;flex-wrap:wrap;gap:6px
|
|
64
|
+
.chip-tabs{display:flex;flex-wrap:wrap;gap:6px}
|
|
61
65
|
.chip-tab{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;border:1px solid var(--line-2);border-radius:var(--r-pill);background:transparent;color:var(--ink-3);font-size:var(--fs-xs);font-weight:500}
|
|
62
66
|
.chip-tab:hover{color:var(--ink);border-color:var(--line-3)}
|
|
63
67
|
.chip-tab[aria-pressed="true"]{background:var(--ink);border-color:var(--ink);color:var(--canvas)}
|
|
64
68
|
.chip-tab[aria-pressed="true"] .count{background:rgba(127,127,127,.25);color:inherit}
|
|
65
69
|
|
|
66
|
-
/* Cards
|
|
67
|
-
|
|
68
|
-
.card
|
|
69
|
-
.card-
|
|
70
|
-
.card-
|
|
71
|
-
.card-
|
|
72
|
-
.card-
|
|
73
|
-
.card-
|
|
74
|
-
.card-
|
|
75
|
-
.card-
|
|
76
|
-
.card-
|
|
77
|
-
.card-
|
|
70
|
+
/* Cards: flat panels. Actions sit beside the heading and wrap below it when
|
|
71
|
+
the column is too narrow for both. */
|
|
72
|
+
.card{display:flex;flex-direction:column;min-width:0;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface)}
|
|
73
|
+
.card-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 16px;padding:12px 16px}
|
|
74
|
+
.card-heading{display:grid;gap:3px;flex:1 1 260px;min-width:0}
|
|
75
|
+
.card-title{display:flex;align-items:center;gap:10px;min-width:0;font-size:var(--fs-md);font-weight:600;color:var(--ink)}
|
|
76
|
+
.card-title>span:not(.card-icon):not(.count){min-width:0;overflow-wrap:anywhere}
|
|
77
|
+
.card-icon{display:grid;place-items:center;width:24px;height:24px;flex:none;border-radius:var(--r-sm);background:var(--surface-3);color:var(--ink-3)}
|
|
78
|
+
.card-icon .icon{width:14px;height:14px}
|
|
79
|
+
.card-hint{color:var(--ink-3);font-size:var(--fs-xs);line-height:1.45}
|
|
80
|
+
.card-heading:has(.card-icon) .card-hint{padding-left:34px}
|
|
81
|
+
.card-actions{display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0}
|
|
82
|
+
.card-actions>.btn-ghost:last-child{margin-right:-8px}
|
|
83
|
+
.card-body{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;padding:14px 16px 16px;min-width:0}
|
|
84
|
+
.card-head+.card-body{border-top:1px solid var(--line)}
|
|
85
|
+
.card-body:empty,.card-body:has(> :only-child:empty){display:none}
|
|
86
|
+
.card-body>.btn-link{justify-self:start}
|
|
87
|
+
.card-stack{display:flex;flex-direction:column;gap:16px;min-width:0}
|
|
78
88
|
.stack{display:grid;gap:10px;min-width:0}
|
|
79
89
|
|
|
90
|
+
/* List cards: one row per record, divided by hairlines */
|
|
91
|
+
.list-card{overflow:hidden}
|
|
92
|
+
.list-card>.card-body{padding:0;gap:0}
|
|
93
|
+
.row-stack{display:grid;grid-template-columns:minmax(0,1fr);min-width:0}
|
|
94
|
+
.row-stack>:is(.work-card,.run-card,.review-card,.record,.role-card,.lazy-row){border:0;border-top:1px solid var(--line);border-radius:0;background:transparent;box-shadow:none}
|
|
95
|
+
.row-stack>:is(.work-card,.run-card,.review-card,.record,.role-card,.lazy-row):first-child,
|
|
96
|
+
.row-stack>.row-label+:is(.work-card,.run-card,.review-card,.record,.lazy-row){border-top:0}
|
|
97
|
+
.row-stack>:is(.run-card,.review-card,.record){padding:12px 16px}
|
|
98
|
+
.row-stack>.run-card[data-status="failed"]{box-shadow:inset 3px 0 0 var(--bad)}
|
|
99
|
+
.row-stack>.empty{margin:14px 16px}
|
|
100
|
+
.row-stack>.note{margin:12px 16px}
|
|
101
|
+
.row-stack>.show-more{margin:6px 16px 14px}
|
|
102
|
+
.row-stack>.row-stack{border-top:1px solid var(--line)}
|
|
103
|
+
.row-stack>.row-label{padding:12px 16px 2px;color:var(--ink-4);font-size:var(--fs-2xs);font-weight:600;letter-spacing:.04em}
|
|
104
|
+
.row-stack>.row-label:only-child{padding-bottom:12px}
|
|
105
|
+
.row-stack.boxed{border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface);overflow:hidden}
|
|
106
|
+
.row-stack.boxed>:is(.record){padding:10px 14px}
|
|
107
|
+
.list-foot{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;min-width:0}
|
|
108
|
+
.list-foot:empty{display:none}
|
|
109
|
+
.row-stack>.list-foot{padding:8px 16px;border-top:1px solid var(--line)}
|
|
110
|
+
.card-body>.list-foot{padding-top:4px;border-top:1px solid var(--line)}
|
|
111
|
+
.list-foot>.faint{margin-right:auto}
|
|
112
|
+
|
|
113
|
+
/* Lazy rows: a list summary that reads its exact record when opened */
|
|
114
|
+
.lazy-row{min-width:0}
|
|
115
|
+
.lazy-head{display:flex;align-items:center;gap:10px;min-width:0;padding:11px 16px;list-style:none;cursor:pointer;font-size:var(--fs-sm)}
|
|
116
|
+
.lazy-head::-webkit-details-marker{display:none}
|
|
117
|
+
.lazy-head:hover .lazy-title{color:var(--ink)}
|
|
118
|
+
.lazy-head:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-line)}
|
|
119
|
+
.lazy-title{flex:1;min-width:0;color:var(--ink-2);font-weight:500;overflow-wrap:anywhere}
|
|
120
|
+
.lazy-body{display:grid;grid-template-columns:minmax(0,1fr);gap:10px;min-width:0;padding:0 16px 14px 40px}
|
|
121
|
+
.lazy-content{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;min-width:0}
|
|
122
|
+
[data-reading="true"]>.record-actions,.record[data-reading="true"]{opacity:.7}
|
|
123
|
+
|
|
80
124
|
/* Disclosure */
|
|
81
125
|
.disclosure{min-width:0;border-top:1px solid var(--line)}
|
|
82
126
|
.disclosure>summary{display:flex;align-items:center;gap:8px;padding:10px 0;list-style:none;cursor:pointer;color:var(--ink-2);font-size:var(--fs-sm);font-weight:500;user-select:none}
|
|
@@ -85,15 +129,18 @@ code.id{padding:1px 6px;border-radius:var(--r-xs);background:var(--surface-3);co
|
|
|
85
129
|
.disclosure-chevron{width:14px;height:14px;color:var(--ink-4);transition:transform var(--t-med) var(--ease)}
|
|
86
130
|
details[open]>summary .disclosure-chevron{transform:rotate(90deg)}
|
|
87
131
|
.disclosure-meta{margin-left:auto;color:var(--ink-4);font-size:var(--fs-xs);font-weight:400}
|
|
88
|
-
.disclosure-body{display:grid;gap:10px;padding:0 0 12px 22px;min-width:0}
|
|
89
|
-
.card-disclosure{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface)
|
|
90
|
-
.card-disclosure>summary{padding:
|
|
91
|
-
.card-disclosure
|
|
132
|
+
.disclosure-body{display:grid;grid-template-columns:minmax(0,1fr);gap:10px;padding:0 0 12px 22px;min-width:0}
|
|
133
|
+
.card-disclosure{border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface)}
|
|
134
|
+
.card-disclosure>summary{gap:10px;padding:12px 16px;border-radius:var(--r-lg);color:var(--ink);font-weight:600;font-size:var(--fs-md)}
|
|
135
|
+
.card-disclosure>summary .disclosure-chevron{box-sizing:content-box;padding:5px;border-radius:var(--r-sm);background:var(--surface-3);color:var(--ink-3)}
|
|
136
|
+
.card-disclosure[open]>summary{border-bottom:1px solid var(--line);border-radius:var(--r-lg) var(--r-lg) 0 0}
|
|
137
|
+
.card-disclosure>.disclosure-body{padding:14px 16px 16px}
|
|
92
138
|
|
|
93
139
|
/* Key/value */
|
|
94
140
|
.kv{display:grid;grid-template-columns:minmax(96px,max-content) minmax(0,1fr);gap:7px 16px;margin:0;font-size:var(--fs-sm)}
|
|
95
141
|
.kv dt{color:var(--ink-3)}
|
|
96
142
|
.kv dd{margin:0;min-width:0;color:var(--ink);overflow-wrap:anywhere}
|
|
143
|
+
.kv dd code.id{white-space:normal;overflow-wrap:anywhere;-webkit-box-decoration-break:clone;box-decoration-break:clone}
|
|
97
144
|
.kv-compact{gap:3px 12px;font-size:var(--fs-xs)}
|
|
98
145
|
|
|
99
146
|
/* Prose */
|
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
export const RESPONSIVE_STYLES = `
|
|
9
9
|
@container sidebar (max-width:299px){
|
|
10
10
|
.foot-btn kbd{display:none}
|
|
11
|
+
.lazy-meta{display:none}
|
|
12
|
+
.lazy-body{padding-left:16px}
|
|
11
13
|
}
|
|
12
14
|
@container sidebar (max-width:259px){
|
|
13
15
|
.foot-btn{gap:0;padding:0 9px}
|
|
@@ -15,12 +17,8 @@ export const RESPONSIVE_STYLES = `
|
|
|
15
17
|
}
|
|
16
18
|
@media(max-width:1200px){
|
|
17
19
|
:root{--sidebar-w:264px}
|
|
18
|
-
.card-grid,.card-columns{grid-template-columns:minmax(0,1fr)}
|
|
19
20
|
.metric-strip{grid-template-columns:repeat(3,minmax(0,1fr))}
|
|
20
21
|
}
|
|
21
|
-
@media(max-width:1040px){
|
|
22
|
-
body.dock-open .overview-layout{grid-template-columns:minmax(0,1fr)}
|
|
23
|
-
}
|
|
24
22
|
@media(max-width:900px){
|
|
25
23
|
.app,body.dock-open .app,body.dock-open.dock-center .app{grid-template-areas:"main";grid-template-columns:minmax(0,1fr)}
|
|
26
24
|
.sidebar{grid-area:main;border-right:0}
|
|
@@ -32,7 +30,6 @@ export const RESPONSIVE_STYLES = `
|
|
|
32
30
|
.dock-divider,.sidebar-divider{display:none}
|
|
33
31
|
.dock{position:fixed;inset:0;z-index:60;padding-top:env(safe-area-inset-top,0px);padding-bottom:env(safe-area-inset-bottom,0px)}
|
|
34
32
|
#dock-swap{display:none}
|
|
35
|
-
.overview-layout{grid-template-columns:minmax(0,1fr)}
|
|
36
33
|
.dock-toggle span{display:none}
|
|
37
34
|
.dock-toggle{width:32px;padding:0}
|
|
38
35
|
}
|
|
@@ -44,8 +41,13 @@ export const RESPONSIVE_STYLES = `
|
|
|
44
41
|
.tab{padding:0 12px}
|
|
45
42
|
.field-row{grid-template-columns:minmax(0,1fr)}
|
|
46
43
|
.work-body{padding-left:16px}
|
|
44
|
+
.card-heading:has(.card-icon) .card-hint{padding-left:0}
|
|
45
|
+
.role-card>:not(.role-head):not(.role-actions){margin-left:0}
|
|
46
|
+
.now-card>.card-body{padding:14px 14px 14px 17px}
|
|
47
47
|
.kv{grid-template-columns:minmax(0,1fr)}
|
|
48
48
|
.kv dt{margin-top:4px}
|
|
49
49
|
.foot-btn kbd{display:none}
|
|
50
|
+
.lazy-meta{display:none}
|
|
51
|
+
.lazy-body{padding-left:16px}
|
|
50
52
|
}
|
|
51
53
|
`;
|
|
@@ -23,7 +23,7 @@ export const TOKEN_STYLES = `
|
|
|
23
23
|
--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:20px;--sp-6:24px;--sp-8:32px;
|
|
24
24
|
--r-xs:5px;--r-sm:7px;--r-md:10px;--r-lg:14px;--r-pill:999px;
|
|
25
25
|
--sidebar-w:clamp(260px,21vw,312px);--dock-w:440px;--dock-min:320px;--divider-w:9px;
|
|
26
|
-
--center-max:
|
|
26
|
+
--center-max:880px;--header-h:56px;
|
|
27
27
|
--t-fast:120ms;--t-med:220ms;--ease:cubic-bezier(.2,.8,.2,1);
|
|
28
28
|
}
|
|
29
29
|
:root,[data-theme="sumi"]{
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* VIEWS — styling for the concrete surfaces: sidebar index, overview, task
|
|
3
|
-
* page (header, tabs,
|
|
3
|
+
* page (header, tabs, panels, records) and the session dock. The overview
|
|
4
|
+
* and every task tab are a single reading column; nothing pairs cards side by
|
|
5
|
+
* side.
|
|
4
6
|
*/
|
|
5
7
|
export const VIEW_STYLES = `
|
|
6
8
|
/* ---------- Sidebar ---------- */
|
|
@@ -75,19 +77,12 @@ export const VIEW_STYLES = `
|
|
|
75
77
|
.page-title{margin-top:6px;font-size:var(--fs-2xl);font-weight:650;letter-spacing:-.025em}
|
|
76
78
|
.page-sub{margin-top:4px;color:var(--ink-3)}
|
|
77
79
|
.page-foot{margin-top:20px;color:var(--ink-4);font-size:var(--fs-xs);text-align:center}
|
|
78
|
-
.section{margin-top:28px;min-width:0}
|
|
79
|
-
.section-title{display:flex;align-items:center;gap:10px;margin-bottom:12px}
|
|
80
|
-
.section-title h2{display:flex;align-items:center;gap:8px;font-size:var(--fs-lg);font-weight:600}
|
|
81
|
-
.section-actions{margin-left:auto}
|
|
82
80
|
.sub-head{display:flex;align-items:center;gap:8px;margin-top:6px;font-size:var(--fs-sm);font-weight:600}
|
|
83
81
|
|
|
84
82
|
/* ---------- Overview ---------- */
|
|
85
|
-
.metric-strip{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin-bottom:
|
|
83
|
+
.metric-strip{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:10px;margin-bottom:16px}
|
|
86
84
|
.metric-strip .metric{padding:14px 16px;border-radius:var(--r-lg)}
|
|
87
85
|
.metric-strip .metric-value{font-size:var(--fs-2xl)}
|
|
88
|
-
.overview-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(300px,380px);gap:14px;align-items:start}
|
|
89
|
-
.overview-col{display:flex;flex-direction:column;gap:14px;min-width:0}
|
|
90
|
-
.overview>.card{margin-bottom:14px}
|
|
91
86
|
.row-list{display:grid;gap:2px;margin:-4px -8px}
|
|
92
87
|
.list-row{display:flex;align-items:center;gap:10px;width:100%;min-height:38px;padding:7px 8px;border:0;border-radius:var(--r-sm);background:transparent;color:var(--ink);text-align:left;font-size:var(--fs-sm)}
|
|
93
88
|
.list-row:hover:not(:disabled){background:var(--surface-3)}
|
|
@@ -125,29 +120,30 @@ export const VIEW_STYLES = `
|
|
|
125
120
|
.tab .icon{color:var(--ink-4)}
|
|
126
121
|
.tab[aria-selected="true"] .icon{color:var(--accent)}
|
|
127
122
|
.tab:focus-visible{box-shadow:inset var(--focus)}
|
|
128
|
-
.tab-
|
|
129
|
-
.tab-panel
|
|
130
|
-
.tab-panel
|
|
123
|
+
.tab .count.tone-warn{background:var(--warn-soft);color:var(--warn)}
|
|
124
|
+
.tab-panel{display:flex;flex-direction:column;gap:16px;padding-top:20px;min-width:0}
|
|
125
|
+
.tab-panel [id^="detail-"]{scroll-margin-top:calc(var(--header-h) + 60px)}
|
|
131
126
|
|
|
132
|
-
/* Now
|
|
133
|
-
.now-card{border-color:var(--line-2);background:linear-gradient(
|
|
127
|
+
/* Now banner: the execution status tone as a left stripe and a soft wash */
|
|
128
|
+
.now-card{border-color:var(--line-2);background:linear-gradient(100deg,var(--tone-soft,transparent),transparent 62%),var(--surface);box-shadow:inset 3px 0 0 var(--tone,var(--line-3))}
|
|
129
|
+
.now-card>.card-body{gap:0;padding:16px 18px 16px 20px}
|
|
134
130
|
.now-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
|
|
135
131
|
.now-owner{color:var(--ink-2);font-size:var(--fs-sm);font-weight:500}
|
|
136
|
-
.now-summary{margin-top:10px;font-size:var(--fs-lg);line-height:1.45;color:var(--ink)}
|
|
132
|
+
.now-summary{margin-top:10px;font-size:var(--fs-lg);font-weight:500;line-height:1.45;color:var(--ink)}
|
|
137
133
|
.now-reason{margin-top:4px;color:var(--ink-3);font-size:var(--fs-sm)}
|
|
138
134
|
.now-note{margin-top:8px;color:var(--ink-3);font-size:var(--fs-sm)}
|
|
139
135
|
.signal-list{list-style:none;display:grid;gap:6px;margin:12px 0 0;padding:0}
|
|
140
136
|
.signal-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 8px;padding:8px 10px;border-radius:var(--r-sm);background:var(--tone-soft);font-size:var(--fs-sm)}
|
|
141
137
|
.signal-row>.icon{align-self:center;color:var(--tone)}
|
|
142
138
|
.signal-kind{color:var(--tone);font-weight:600}
|
|
143
|
-
.next-line{display:flex;flex-wrap:wrap;align-items:center;gap:4px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
139
|
+
.next-line{display:flex;flex-wrap:wrap;align-items:center;gap:4px;margin-top:12px;padding-top:10px;border-top:1px solid var(--line);color:var(--ink-3);font-size:var(--fs-xs)}
|
|
144
140
|
.next-line:empty{display:none}
|
|
145
141
|
.next-line .icon{color:var(--accent)}
|
|
146
142
|
.next-line strong{color:var(--ink)}
|
|
147
143
|
|
|
148
144
|
/* Needs you / input requests */
|
|
149
145
|
.needs-card{border-color:var(--warn);box-shadow:0 0 0 3px var(--warn-soft)}
|
|
150
|
-
.needs-card .card-
|
|
146
|
+
.needs-card .card-icon{background:var(--warn-soft);color:var(--warn)}
|
|
151
147
|
.input-card{display:grid;gap:10px;padding:14px;border:1px solid var(--line-2);border-radius:var(--r-md);background:var(--surface-2)}
|
|
152
148
|
.input-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px;color:var(--ink-3);font-size:var(--fs-xs)}
|
|
153
149
|
.input-kicker{display:inline-flex;align-items:center;gap:5px;color:var(--warn);font-weight:600;text-transform:uppercase;letter-spacing:.06em;font-size:var(--fs-2xs)}
|
|
@@ -163,22 +159,20 @@ export const VIEW_STYLES = `
|
|
|
163
159
|
.input-form{display:flex;gap:8px}
|
|
164
160
|
.input-form input{flex:1}
|
|
165
161
|
|
|
166
|
-
/* Decisions,
|
|
162
|
+
/* Decisions, planning */
|
|
167
163
|
.decision{display:grid;gap:4px;padding-top:10px;border-top:1px solid var(--line)}
|
|
168
164
|
.decision:first-child{padding-top:0;border-top:0}
|
|
169
165
|
.decision-head{display:flex;align-items:center;gap:8px;font-size:var(--fs-sm)}
|
|
170
166
|
.decision-head strong{flex:1;min-width:0;font-weight:600}
|
|
171
|
-
.session-list{list-style:none;display:grid;gap:8px;margin:0;padding:0}
|
|
172
|
-
.session-row{display:grid;gap:3px;padding:9px 11px;border-radius:var(--r-sm);background:var(--surface-2);border:1px solid var(--line)}
|
|
173
|
-
.session-row-head{display:flex;align-items:center;gap:8px;font-size:var(--fs-sm)}
|
|
174
|
-
.session-row p{color:var(--ink-2)}
|
|
175
167
|
.planning-card .kv{font-size:var(--fs-xs)}
|
|
176
168
|
|
|
177
|
-
/* Work items */
|
|
178
|
-
.work-card{
|
|
169
|
+
/* Work items (rows of the Work list card) */
|
|
170
|
+
.work-card{min-width:0}
|
|
179
171
|
.work-head{display:flex;align-items:center;gap:10px;padding:13px 16px;list-style:none}
|
|
180
172
|
summary.work-head{cursor:pointer}
|
|
181
173
|
summary.work-head::-webkit-details-marker{display:none}
|
|
174
|
+
summary.work-head:hover .work-title{color:var(--ink)}
|
|
175
|
+
summary.work-head:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-line)}
|
|
182
176
|
.work-title{flex:1;min-width:0;font-weight:600;font-size:var(--fs-md);overflow-wrap:anywhere}
|
|
183
177
|
.work-body{display:grid;gap:12px;padding:0 16px 16px 34px}
|
|
184
178
|
.work-card.is-settled .work-title{color:var(--ink-2);font-weight:500}
|
|
@@ -190,21 +184,33 @@ summary.work-head::-webkit-details-marker{display:none}
|
|
|
190
184
|
.candidate-seq{font-family:var(--font-mono);color:var(--accent)}
|
|
191
185
|
|
|
192
186
|
/* Records, runs, roles */
|
|
193
|
-
.record,.run-card,.review-card{display:grid;gap:8px;min-width:0;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface)}
|
|
187
|
+
.record,.run-card,.review-card{display:grid;grid-template-columns:minmax(0,1fr);gap:8px;min-width:0;overflow-wrap:anywhere;padding:12px 14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface)}
|
|
194
188
|
.record.is-compact{padding:9px 12px;background:var(--surface-2)}
|
|
195
189
|
.record-head,.run-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;font-size:var(--fs-sm)}
|
|
196
190
|
.record-store{color:var(--ink-3);font-size:var(--fs-2xs);font-weight:600;text-transform:uppercase;letter-spacing:.06em}
|
|
197
191
|
.record-actions{display:flex;gap:8px}
|
|
198
|
-
.
|
|
192
|
+
.record-lead{font-weight:500;overflow-wrap:anywhere}
|
|
193
|
+
.delivery-stack>.sub-head:not(:first-child){margin-top:10px}
|
|
194
|
+
.delivery-project .record-head strong{overflow-wrap:anywhere}
|
|
195
|
+
.check-list{list-style:none;margin:0;padding:0;display:grid;gap:4px;font-size:var(--fs-xs)}
|
|
196
|
+
.check-list li{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:2px 8px;min-width:0}
|
|
197
|
+
.check-details{grid-column:2/-1;white-space:pre-wrap;overflow-wrap:anywhere}
|
|
199
198
|
.run-role{font-weight:600}
|
|
200
|
-
.role-
|
|
201
|
-
.role-card{
|
|
199
|
+
.role-card{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px 12px;align-content:start;min-width:0;padding:14px 16px}
|
|
200
|
+
.role-card>*{grid-column:1/-1;min-width:0}
|
|
201
|
+
.role-card>.role-head{grid-column:1;grid-row:1}
|
|
202
|
+
.role-card>.role-actions{grid-column:2;grid-row:1;align-self:center}
|
|
203
|
+
.role-card>:not(.role-head):not(.role-actions){margin-left:42px}
|
|
202
204
|
.role-head{display:flex;align-items:center;gap:10px}
|
|
203
205
|
.role-title{display:grid;flex:1;min-width:0;line-height:1.3}
|
|
204
206
|
.role-title .faint{font-size:var(--fs-xs)}
|
|
205
207
|
.avatar{display:grid;place-items:center;width:32px;height:32px;flex:none;border-radius:9px;background:var(--surface-3);color:var(--ink-2);font-weight:650;font-size:var(--fs-sm)}
|
|
206
208
|
.role-card .kv{font-size:var(--fs-xs)}
|
|
207
|
-
.role-actions{display:flex;justify-content:flex-end;margin:-
|
|
209
|
+
.role-actions{display:flex;justify-content:flex-end;margin-right:-8px}
|
|
210
|
+
.role-session{display:grid;gap:3px;min-width:0;font-size:var(--fs-sm)}
|
|
211
|
+
.role-session-head{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px}
|
|
212
|
+
.role-session>p{color:var(--ink-2)}
|
|
213
|
+
.card-actions>[data-slot="session-counts"]:empty{display:none}
|
|
208
214
|
|
|
209
215
|
/* History timeline */
|
|
210
216
|
.timeline{list-style:none;margin:0;padding:0;position:relative;display:grid;gap:0}
|
|
@@ -213,13 +219,23 @@ summary.work-head::-webkit-details-marker{display:none}
|
|
|
213
219
|
.timeline-mark{position:relative;z-index:1;display:grid;place-items:center;width:28px;height:28px;border-radius:50%;background:var(--surface-2);border:1px solid var(--line-2);color:var(--ink-3)}
|
|
214
220
|
.kind-decision .timeline-mark{color:var(--ok);border-color:var(--ok-soft);background:var(--ok-soft)}
|
|
215
221
|
.kind-milestone .timeline-mark{color:var(--accent);border-color:var(--accent-soft);background:var(--accent-soft)}
|
|
216
|
-
.timeline-
|
|
222
|
+
.kind-run .timeline-mark{color:var(--info);border-color:var(--info-soft);background:var(--info-soft)}
|
|
223
|
+
.kind-question .timeline-mark{color:var(--warn);border-color:var(--warn-soft);background:var(--warn-soft)}
|
|
224
|
+
.timeline-body{display:grid;grid-template-columns:minmax(0,1fr);gap:6px;min-width:0;padding-top:3px;overflow-wrap:anywhere}
|
|
217
225
|
.timeline-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-size:var(--fs-sm)}
|
|
226
|
+
.timeline-item>.record{align-self:start;padding:4px 0 0;border:0;background:transparent}
|
|
227
|
+
.timeline .lazy-head{align-items:flex-start;padding:2px 0 0;gap:8px}
|
|
228
|
+
.timeline .lazy-head .disclosure-chevron{order:2;margin-top:4px}
|
|
229
|
+
.timeline .lazy-body{padding:10px 0 2px}
|
|
230
|
+
.timeline-summary{flex:1;display:grid;gap:4px;min-width:0}
|
|
231
|
+
.timeline-title,.timeline-preview{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}
|
|
232
|
+
.timeline-preview{margin:0}
|
|
233
|
+
.lazy-row[open] .timeline-preview{display:none}
|
|
218
234
|
.timeline-empty{list-style:none}
|
|
219
235
|
.timeline .show-more{margin-left:40px}
|
|
220
236
|
|
|
221
237
|
/* Evidence */
|
|
222
|
-
.file-list{display:grid;gap:2px}
|
|
238
|
+
.file-list{display:grid;grid-template-columns:minmax(0,1fr);gap:2px}
|
|
223
239
|
.file-list:empty{display:none}
|
|
224
240
|
.file-row{display:flex;align-items:center;gap:8px;min-height:32px;padding:5px 8px;border:0;border-radius:var(--r-sm);background:transparent;text-align:left;font-size:var(--fs-sm);color:var(--ink-2)}
|
|
225
241
|
.file-row:hover{background:var(--surface-3);color:var(--ink)}
|
|
@@ -239,6 +255,7 @@ summary.work-head::-webkit-details-marker{display:none}
|
|
|
239
255
|
.feed:focus-visible{box-shadow:inset var(--focus)}
|
|
240
256
|
.feed>.empty{margin:auto 0}
|
|
241
257
|
.feed-note{color:var(--ink-4);font-size:var(--fs-2xs);text-align:center}
|
|
258
|
+
.feed-older{align-self:center}
|
|
242
259
|
.feed-day{display:flex;align-items:center;gap:10px;color:var(--ink-4);font-size:var(--fs-2xs);font-weight:500}
|
|
243
260
|
.feed-day::before,.feed-day::after{content:"";flex:1;height:1px;background:var(--line)}
|
|
244
261
|
.msg{display:flex;gap:10px;max-width:100%;min-width:0}
|
package/dist/web/webServer.js
CHANGED
|
@@ -194,7 +194,7 @@ async function handleHttpRequest(request, response, store, dependencies, token,
|
|
|
194
194
|
}
|
|
195
195
|
return;
|
|
196
196
|
}
|
|
197
|
-
const surfaceTarget = /^\/api\/tasks\/([^/]+)\/(context|delta|inspect|metadata|messages|control)$/.exec(pathname);
|
|
197
|
+
const surfaceTarget = /^\/api\/tasks\/([^/]+)\/(context|delta|inspect|list|metadata|messages|control)$/.exec(pathname);
|
|
198
198
|
if (surfaceTarget && dependencies.surface) {
|
|
199
199
|
try {
|
|
200
200
|
let taskId;
|
|
@@ -223,6 +223,17 @@ async function handleHttpRequest(request, response, store, dependencies, token,
|
|
|
223
223
|
...(query.has("cursor") ? { cursor: query.get("cursor") } : {})
|
|
224
224
|
});
|
|
225
225
|
}
|
|
226
|
+
else if (method === "GET" && action === "list") {
|
|
227
|
+
const limit = query.get("limit");
|
|
228
|
+
if (limit !== null && !/^\d{1,3}$/u.test(limit))
|
|
229
|
+
throw new WebRequestRejected("Invalid list limit.");
|
|
230
|
+
value = dependencies.surface.list(taskId, {
|
|
231
|
+
store: query.get("store") ?? "",
|
|
232
|
+
...(query.has("status") ? { status: query.get("status") } : {}),
|
|
233
|
+
...(query.has("cursor") ? { cursor: query.get("cursor") } : {}),
|
|
234
|
+
...(limit === null ? {} : { limit: Number(limit) })
|
|
235
|
+
});
|
|
236
|
+
}
|
|
226
237
|
else if (method === "POST" && action === "messages") {
|
|
227
238
|
const body = await readMutationBody(request);
|
|
228
239
|
if (typeof body !== "object" || body === null || Array.isArray(body)
|
|
@@ -3,7 +3,7 @@ import { openTaskArtifactRepository } from "../artifacts/taskArtifactRepository.
|
|
|
3
3
|
import { applyGlobalInputControl } from "../commands/globalRoleCommands.js";
|
|
4
4
|
import { applyTaskInputControl, sendTaskMessageCommand, updateTaskMetadataCommand } from "../commands/taskCommands.js";
|
|
5
5
|
import { runTaskInputCommand } from "../commands/taskInputCommands.js";
|
|
6
|
-
import { inspectTaskContext, readTaskContext, readTaskContextDelta, withContextObservations } from "../context/taskContext.js";
|
|
6
|
+
import { inspectTaskContext, listTaskContext, readTaskContext, readTaskContextDelta, withContextObservations } from "../context/taskContext.js";
|
|
7
7
|
import { BUILTIN_CAPABILITIES } from "../kernel/builtinCapabilities.js";
|
|
8
8
|
import { capabilitySchemaError } from "../kernel/capabilitySchema.js";
|
|
9
9
|
import { recordGlobalInterruptResult, recordGlobalSteerResult } from "../message/globalInterrupt.js";
|
|
@@ -248,6 +248,13 @@ export function createWebTaskSurface(store, options = {}, observations = [], hos
|
|
|
248
248
|
read: async (taskId) => withContextObservations(readTaskContext(store, taskId, environment), observations),
|
|
249
249
|
delta: (taskId, input) => readTaskContextDelta(store, taskId, input, environment),
|
|
250
250
|
inspect: (taskId, input) => inspectTaskContext(store, taskId, input, environment),
|
|
251
|
+
// The same paged family discovery as `task context list`: summaries and
|
|
252
|
+
// exact references, never bodies; continuations keep their filters.
|
|
253
|
+
list: (taskId, input) => listTaskContext(store, taskId, input.store, {
|
|
254
|
+
...(input.status === undefined ? {} : { status: input.status }),
|
|
255
|
+
...(input.cursor === undefined ? {} : { cursor: input.cursor }),
|
|
256
|
+
...(input.limit === undefined ? {} : { limit: input.limit })
|
|
257
|
+
}, environment),
|
|
251
258
|
update: (taskId, input) => {
|
|
252
259
|
const descriptor = BUILTIN_CAPABILITIES.find((entry) => entry.name === "task.update");
|
|
253
260
|
const error = capabilitySchemaError(descriptor.inputSchema, { taskId, patch: input });
|
|
@@ -58,8 +58,16 @@ Session with settled native input is idle rather than a false runtime failure.
|
|
|
58
58
|
|
|
59
59
|
## Web attention and progress
|
|
60
60
|
|
|
61
|
-
Task detail
|
|
62
|
-
and
|
|
61
|
+
Task detail has four tabs. **Overview** shows needs your input, Task progress,
|
|
62
|
+
goal and key Decisions. **Delivery** shows WorkItems, Reviews, Integration and
|
|
63
|
+
remote delivery, files and workspaces; its evidence is read when the tab opens.
|
|
64
|
+
**Runtime** shows Roles with their Session activity, open execution and
|
|
65
|
+
operations, usage and diagnostics. **Records** is a paged timeline of Decisions,
|
|
66
|
+
milestones, executions and questions plus Task facts; finished rows read their
|
|
67
|
+
exact record when opened. Messages live in the Discussion dock, oldest first,
|
|
68
|
+
with earlier ones listed on request.
|
|
69
|
+
|
|
70
|
+
InputRequests retain their original answer controls and
|
|
63
71
|
bounded Context counts; a partial read is not an empty inbox. Technical attention
|
|
64
72
|
names the owner from the existing execution projection. An assigned owner does
|
|
65
73
|
not imply work started, and a diagnostic hint is not new user authorization.
|
|
@@ -81,7 +89,7 @@ Current Decisions show their rationale/source; superseded ones remain in history
|
|
|
81
89
|
Reports and recommendations are not relabelled as user approval. Core Context
|
|
82
90
|
remains readable when its independent observation fails.
|
|
83
91
|
|
|
84
|
-
**
|
|
92
|
+
**Delivery** reads files only on request. A selected commit-pinned
|
|
85
93
|
text survives refresh and newer file listings; switching versions is explicit.
|
|
86
94
|
A missing revision fails visibly, never substitutes HEAD. HTML/scripts stay
|
|
87
95
|
text, never an executing preview. Copying a source sends nothing; discussion
|
|
@@ -100,6 +108,8 @@ All routes use the local Web token and Task boundary.
|
|
|
100
108
|
`GET /api/tasks/<id>/artifacts` lists a fixed repository revision;
|
|
101
109
|
`?path=<relative-path>&commit=<full-commit>` reads its exact text file.
|
|
102
110
|
`GET /api/tasks/<id>/evidence` reads original check/Review/workspace records.
|
|
111
|
+
`GET /api/tasks/<id>/list?store=<family>[&status&cursor&limit]` returns the same
|
|
112
|
+
paged summaries as `task context list`.
|
|
103
113
|
These reads do not start a runtime, fetch a remote, write business state, require
|
|
104
114
|
a migration, or introduce a new persistent protocol.
|
|
105
115
|
|
|
@@ -51,7 +51,12 @@ AgentRun,Role 状态也包含其原生准入/活动;当某个 WorkItem 处
|
|
|
51
51
|
|
|
52
52
|
## Web 用户关注与进展
|
|
53
53
|
|
|
54
|
-
Task
|
|
54
|
+
Task 详情分为四个页签。「概览」展示需要你处理的事项、任务进展、目标和关键决定;
|
|
55
|
+
「交付」展示工作项、评审、集成与远程交付、文件和工作区,打开页签时才读取证据;
|
|
56
|
+
「运行」展示各 Role 及其会话活动、进行中的执行与操作、用量和诊断;
|
|
57
|
+
「记录」是决定、里程碑、执行与问题的分页时间线及任务信息,已结束的条目展开时
|
|
58
|
+
才读取精确记录。消息在讨论侧栏中按时间正序显示,更早的消息按需列出。
|
|
59
|
+
|
|
55
60
|
InputRequest 保留原回答入口和有界 Context 计数;部分读取不等于空待办。
|
|
56
61
|
技术关注从既有执行投影取得负责人;有负责人不代表已开始处理,诊断提示
|
|
57
62
|
也不自动成为新的用户授权。
|
|
@@ -68,7 +73,7 @@ Controller 已负责的有界 Provider 重试显示为等待,不误称停止
|
|
|
68
73
|
ETA 或实质检查点。当前 Decision 展示理由与来源,已替代决定留在历史;
|
|
69
74
|
报告与建议不改称用户批准。独立观察失败时,核心 Context 仍可读取。
|
|
70
75
|
|
|
71
|
-
|
|
76
|
+
「交付」仅按需读文件。固定提交的文本阅读在刷新和读取新列表后仍保留,
|
|
72
77
|
切换版本必须显式选择;固定版本缺失就报错,不回退 HEAD。
|
|
73
78
|
HTML/脚本只作为文本,不执行预览。复制来源不发送内容,讨论仍走原 Message
|
|
74
79
|
表单、显式意图及回执;自动刷新保留未提交输入。
|
|
@@ -83,7 +88,9 @@ skipped/缺失检查不算通过。工作区所有权不证明可清理;既
|
|
|
83
88
|
所有入口沿用本地 Web token 与 Task 边界。
|
|
84
89
|
`GET /api/tasks/<id>/artifacts` 列出固定仓库版本;
|
|
85
90
|
`?path=<relative-path>&commit=<full-commit>` 读取该版本文本;
|
|
86
|
-
`GET /api/tasks/<id>/evidence` 读取原检查/Review
|
|
91
|
+
`GET /api/tasks/<id>/evidence` 读取原检查/Review/工作区记录;
|
|
92
|
+
`GET /api/tasks/<id>/list?store=<family>[&status&cursor&limit]` 返回与
|
|
93
|
+
`task context list` 相同的分页摘要。
|
|
87
94
|
读取不启动运行时、不访问远端、不写业务状态、不引入迁移或新持久协议。
|
|
88
95
|
|
|
89
96
|
## 执行审计
|
package/docs/release-workflow.md
CHANGED
|
@@ -51,6 +51,31 @@ merely to avoid a version decision. Package versions remain distinct from protoc
|
|
|
51
51
|
and persistent-storage contracts: their compatibility checks and required migrations
|
|
52
52
|
are unchanged, and the storage rules below do not authorize a package release.
|
|
53
53
|
|
|
54
|
+
### 2.3.0 compatibility and migration notes
|
|
55
|
+
|
|
56
|
+
This minor release separates Task acceptance and verified remote delivery from
|
|
57
|
+
immutable Integration history and temporary workspace cleanup. Integration
|
|
58
|
+
history remains readable after its workspace is released.
|
|
59
|
+
|
|
60
|
+
Automation that previously treated leftover workspaces as an unconditional
|
|
61
|
+
archive blocker must now inspect business settlement, exact delivery and runtime
|
|
62
|
+
quiescence separately from physical cleanup. Ordinary archive releases safe
|
|
63
|
+
resources child-first and retains dirty, unknown or live resources with their
|
|
64
|
+
ownership and diagnostics. `--force` is separate explicit authority; it neither
|
|
65
|
+
proves delivery or quiescence nor permits discarding retained data.
|
|
66
|
+
|
|
67
|
+
For an ordinary Integration conflict, resolve and stage files in that attempt's
|
|
68
|
+
workspace, then run `yui task integration continue <task>/<integration>`.
|
|
69
|
+
Do not create a replacement attempt or require a manual-resolution decision
|
|
70
|
+
just for a normal Git conflict. Cleanup uses exact ownership and Git
|
|
71
|
+
registrations; missing paths alone do not establish that cleanup is complete.
|
|
72
|
+
|
|
73
|
+
These are behavioral changes under Yui's minor-version convention. There is no
|
|
74
|
+
new persistent schema or storage migration in 2.3.0. Existing Task and
|
|
75
|
+
Integration evidence is preserved. This package release does not itself
|
|
76
|
+
install the global CLI, activate a runtime or restart a Controller. Users
|
|
77
|
+
upgrading from 2.1.0 must also apply the 2.2.0 API guidance below.
|
|
78
|
+
|
|
54
79
|
### 2.2.0 compatibility and migration notes
|
|
55
80
|
|
|
56
81
|
This minor release adds the independent `yui agent` entry, explicit model/tool
|
|
@@ -36,6 +36,25 @@ Agent 选择一个预先声明的计划,设施从持久状态驱动该计划
|
|
|
36
36
|
不能将不兼容冒称为兼容,也不为回避版本选择新增历史兼容机制。包版本与协议、
|
|
37
37
|
持久存储契约仍然独立:兼容性检查和必要迁移要求不变,下文存储规则不授予发版权限。
|
|
38
38
|
|
|
39
|
+
### 2.3.0 兼容性及迁移说明
|
|
40
|
+
|
|
41
|
+
本次 minor 将 Task 验收与已核验的远端交付、不可变 Integration 历史、
|
|
42
|
+
临时工作区清理分开。释放工作区后,Integration 历史仍可读取。
|
|
43
|
+
|
|
44
|
+
此前把残留工作区一律视为归档阻塞的自动化,现在应分别检查业务结算、
|
|
45
|
+
精确交付与运行时静默,以及物理清理结果。普通归档按子资源优先释放安全资源,
|
|
46
|
+
保留脏、未知或仍存活的资源及其所有权、诊断。`--force` 需要单独明确授权;
|
|
47
|
+
它不证明交付或静默,也不允许丢弃被保留的数据。
|
|
48
|
+
|
|
49
|
+
普通 Integration 冲突应在原 attempt 的工作区解决并 stage,然后执行
|
|
50
|
+
`yui task integration continue <task>/<integration>`。不要仅因普通 Git 冲突
|
|
51
|
+
另建 attempt 或要求 manual-resolution 决策。清理依赖精确所有权与 Git 登记;
|
|
52
|
+
路径缺失本身不代表清理完成。
|
|
53
|
+
|
|
54
|
+
这些是 Yui minor 编号约定下的行为变化。2.3.0 没有新的持久 schema 或存储迁移,
|
|
55
|
+
保留现有 Task 与 Integration 证据。发布包本身不会安装全局 CLI、激活运行时
|
|
56
|
+
或重启 Controller。从 2.1.0 升级的用户还需遵循下文 2.2.0 API 指引。
|
|
57
|
+
|
|
39
58
|
### 2.2.0 兼容性及迁移说明
|
|
40
59
|
|
|
41
60
|
本 minor 增加独立 `yui agent` 入口、显式模型/工具配置、持久本地会话、上下文压缩、
|
package/docs/task-delivery.md
CHANGED
|
@@ -305,17 +305,21 @@ yui task archive <task> (--integrated|--abandon) --force
|
|
|
305
305
|
|
|
306
306
|
### Ordinary archive
|
|
307
307
|
|
|
308
|
-
Active work and inputs must be settled, and
|
|
309
|
-
|
|
308
|
+
Active work and inputs must be settled, and execution proven stopped.
|
|
309
|
+
WorkItem results must be integrated or deliberately abandoned;
|
|
310
310
|
Review, Lane and Integration resources must be settled. With `--integrated`,
|
|
311
311
|
each Project requiring code delivery needs a merged, verified Publication
|
|
312
312
|
covering its accepted head, either exactly or through valid explicit candidate
|
|
313
313
|
adoption. `--abandon` records deliberate non-delivery,
|
|
314
314
|
not verified merge.
|
|
315
315
|
|
|
316
|
-
Missing/stale coverage
|
|
317
|
-
|
|
316
|
+
Missing/stale coverage or unresolved execution prevents ordinary archive.
|
|
317
|
+
Dirty or otherwise unsafe temporary resources are retained after the logical
|
|
318
|
+
archive commit; they do not require force merely to archive. No implicit reset
|
|
318
319
|
or force deletion occurs.
|
|
320
|
+
For `--abandon`, a clean Task-main at its exact recorded Project baseline can
|
|
321
|
+
be released without a Publication. New unverified commits remain protected.
|
|
322
|
+
Pending or running Reviews are unsettled business, not just retained directories.
|
|
319
323
|
|
|
320
324
|
### Explicit force archive
|
|
321
325
|
|
|
@@ -345,11 +349,22 @@ current ownership, not a second cleanup queue.
|
|
|
345
349
|
An archive result with `archived=true` proves archival, not that cleanup fully
|
|
346
350
|
succeeded. Even `cleanupFinished` means the foreground pass finished, not that
|
|
347
351
|
every resource was removed. Repeating archive reports current facts and does
|
|
348
|
-
not replay cleanup. After inspection, use
|
|
349
|
-
|
|
352
|
+
not replay cleanup. After inspection, use `yui task archive-cleanup <task>` to
|
|
353
|
+
retry safe exact-owner cleanup. `allResourcesReleased` reports the current pass
|
|
354
|
+
and remaining ownership separately from historical warnings; no background retry or broader deletion authority
|
|
350
355
|
is implied. Both archive paths preserve Task history and recovery information.
|
|
351
356
|
Archived Tasks cannot reopen.
|
|
352
357
|
|
|
358
|
+
Interrupted runtime cleanup may leave an adjacent `.cleanup-*` directory.
|
|
359
|
+
Retries inspect these claims as well as the original path: only an exact Owner
|
|
360
|
+
marker and no live process references permit deletion. Missing or mismatched
|
|
361
|
+
markers remain retained with their path for explicit diagnosis; absence of the
|
|
362
|
+
original directory alone never proves release. Unresolved claims also prevent
|
|
363
|
+
reactivating the same runtime. Executed-Job physical checks use that same claim
|
|
364
|
+
inventory before ordinary archive commits; acknowledgement does not bypass a
|
|
365
|
+
live or unverified renamed runtime. This uses the existing resource owner and receipt,
|
|
366
|
+
not a second cleanup queue.
|
|
367
|
+
|
|
353
368
|
Resource GC is a separate, opt-in quarantine path. A runtime subtree moves once:
|
|
354
369
|
the parent receipt owns recovery of its contents, and redundant child registry
|
|
355
370
|
entries are removed in the same registry transaction. Independently owned Git
|
|
@@ -411,8 +426,21 @@ Preflight is an observation, not a removal permit. Cleanup reloads the same
|
|
|
411
426
|
checks and Git verifies ownership/dirt again at removal. A Task-main clone's
|
|
412
427
|
dependent registrations are expected before child cleanup and must be absent
|
|
413
428
|
before clone removal. Archive preserves new dirt even in a failed Integration
|
|
414
|
-
workspace;
|
|
415
|
-
|
|
429
|
+
workspace; explicit Integration cleanup also preserves dirt and durable logs.
|
|
430
|
+
An acknowledged unknown Job result remains unknown: cleanup additionally needs
|
|
431
|
+
fresh evidence that its exact runner generation and physical path references
|
|
432
|
+
are absent. Successful, failed, timed-out and cancelled executed Jobs need the
|
|
433
|
+
same physical evidence; a terminal result does not prove surviving children
|
|
434
|
+
stopped. Only Jobs cancelled/rejected before any execution effect bypass it.
|
|
435
|
+
Cleanup first checks Job results and exact runner exit, then stops only settled,
|
|
436
|
+
exactly owned Roles. It repeats full path-reference checks after that stop and
|
|
437
|
+
before deleting any child workspace or committing ordinary archive. An idle
|
|
438
|
+
reusable Role sharing the workspace is not itself a reason to skip its normal
|
|
439
|
+
stop; surviving or unverified references still prevent release.
|
|
440
|
+
Integration resource preflight also checks runtime ownership and cleanup claims
|
|
441
|
+
with the deletion inspector. Unverified physical material is retained without
|
|
442
|
+
turning it into a new ordinary-archive business gate.
|
|
443
|
+
A finished cleanup means the foreground
|
|
416
444
|
attempt ended, not that every resource was released. Current retained references
|
|
417
445
|
and exact physical runtime evidence remain separate from historical diagnostics.
|
|
418
446
|
|