@cat-factory/contracts 0.308.1 → 0.309.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.
@@ -67,6 +67,13 @@ export declare const agentPresentationSchema: v.ObjectSchema<{
67
67
  * builder will SAVE (`purposeAllowsAgentCategory`), so a kind that opts out of a purpose
68
68
  * stays editable in a stored pipeline that already uses it.
69
69
  *
70
+ * `build` and `bugfix` are read as ONE purpose here, one way (`classifierSuits`): naming
71
+ * `build` also offers the kind to every bugfix palette, because the two are the same work and
72
+ * differ only in the task type their pipelines are offered to. So there is deliberately no way
73
+ * to declare "general builds but not defect work": that is not a distinction about the kind's
74
+ * work, which is all this list may express. Naming `bugfix` alone is a claim about the
75
+ * defect-report context specifically and does NOT buy the kind into `build`.
76
+ *
70
77
  * An EMPTY list is refused rather than accepted, because the reader treats "declared nothing"
71
78
  * and "declared an empty list" as the same thing (the category alone decides, so the kind is
72
79
  * offered at every purpose that section admits) and that is the exact inverse of what an author
@@ -76,7 +83,7 @@ export declare const agentPresentationSchema: v.ObjectSchema<{
76
83
  * deliberately reads as no declaration: that one is a retired vocabulary member outliving the
77
84
  * bundle reading it, not a statement someone typed.
78
85
  */
79
- readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
86
+ readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("bugfix" | "build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
80
87
  /**
81
88
  * How specialist this kind is ({@link AGENT_TIERS}). The palette and the model-preset
82
89
  * override list show the selected tier and everything below it, so a kind declared
@@ -141,6 +148,13 @@ export declare const customAgentKindSchema: v.ObjectSchema<{
141
148
  * builder will SAVE (`purposeAllowsAgentCategory`), so a kind that opts out of a purpose
142
149
  * stays editable in a stored pipeline that already uses it.
143
150
  *
151
+ * `build` and `bugfix` are read as ONE purpose here, one way (`classifierSuits`): naming
152
+ * `build` also offers the kind to every bugfix palette, because the two are the same work and
153
+ * differ only in the task type their pipelines are offered to. So there is deliberately no way
154
+ * to declare "general builds but not defect work": that is not a distinction about the kind's
155
+ * work, which is all this list may express. Naming `bugfix` alone is a claim about the
156
+ * defect-report context specifically and does NOT buy the kind into `build`.
157
+ *
144
158
  * An EMPTY list is refused rather than accepted, because the reader treats "declared nothing"
145
159
  * and "declared an empty list" as the same thing (the category alone decides, so the kind is
146
160
  * offered at every purpose that section admits) and that is the exact inverse of what an author
@@ -150,7 +164,7 @@ export declare const customAgentKindSchema: v.ObjectSchema<{
150
164
  * deliberately reads as no declaration: that one is a retired vocabulary member outliving the
151
165
  * bundle reading it, not a statement someone typed.
152
166
  */
153
- readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
167
+ readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("bugfix" | "build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
154
168
  /**
155
169
  * How specialist this kind is ({@link AGENT_TIERS}). The palette and the model-preset
156
170
  * override list show the selected tier and everything below it, so a kind declared
@@ -1 +1 @@
1
- {"version":3,"file":"agent-presentation.d.ts","sourceRoot":"","sources":["../src/agent-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAa5B,0FAA0F;AAC1F,eAAO,MAAM,mBAAmB,qFAO9B,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAIrE;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAErE;AAaD;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,YAAI,OAAO,EAAE,cAAc,EAAE,UAAU,CAAU,CAAA;AACzE,eAAO,MAAM,eAAe,6EAA0B,CAAA;AACtD,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,eAAe,CAAC,CAAA;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAA0B,CAAA;AAE3D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAEhG;AAED,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;IAClC,4CAA4C;;IAE5C,2CAA2C;;IAE3C,uCAAuC;;IAEvC;;;;;OAKG;;IAEH,gGAAgG;;IAEhG;;;;;;;;;;;;;;;;;;OAkBG;;IAEH;;;;;OAKG;;IAEH;;;;;;;;OAQG;;IAEH;;;;;;;;;;;;;OAaG;;aAEH,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE7E;6DAC6D;AAC7D,eAAO,MAAM,qBAAqB;;;QAxEhC,4CAA4C;;QAE5C,2CAA2C;;QAE3C,uCAAuC;;QAEvC;;;;;WAKG;;QAEH,gGAAgG;;QAEhG;;;;;;;;;;;;;;;;;;WAkBG;;QAEH;;;;;WAKG;;QAEH;;;;;;;;WAQG;;QAEH;;;;;;;;;;;;;WAaG;;;IAUH,oEAAoE;;IAEpE;;;;;;;;;;;;;;OAcG;;IAEH;;;;;;;;;;;;;;OAcG;;aAEH,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEzE;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB;;;;;aAKjC,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAA"}
1
+ {"version":3,"file":"agent-presentation.d.ts","sourceRoot":"","sources":["../src/agent-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAa5B,0FAA0F;AAC1F,eAAO,MAAM,mBAAmB,qFAO9B,CAAA;AACF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAIrE;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAErE;AAaD;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,YAAI,OAAO,EAAE,cAAc,EAAE,UAAU,CAAU,CAAA;AACzE,eAAO,MAAM,eAAe,6EAA0B,CAAA;AACtD,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,eAAe,CAAC,CAAA;AAE7D;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAA0B,CAAA;AAE3D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAEhG;AAED,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB;IAClC,4CAA4C;;IAE5C,2CAA2C;;IAE3C,uCAAuC;;IAEvC;;;;;OAKG;;IAEH,gGAAgG;;IAEhG;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;;IAEH;;;;;OAKG;;IAEH;;;;;;;;OAQG;;IAEH;;;;;;;;;;;;;OAaG;;aAEH,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAE7E;6DAC6D;AAC7D,eAAO,MAAM,qBAAqB;;;QA/EhC,4CAA4C;;QAE5C,2CAA2C;;QAE3C,uCAAuC;;QAEvC;;;;;WAKG;;QAEH,gGAAgG;;QAEhG;;;;;;;;;;;;;;;;;;;;;;;;;WAyBG;;QAEH;;;;;WAKG;;QAEH;;;;;;;;WAQG;;QAEH;;;;;;;;;;;;;WAaG;;;IAUH,oEAAoE;;IAEpE;;;;;;;;;;;;;;OAcG;;IAEH;;;;;;;;;;;;;;OAcG;;aAEH,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEzE;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB;;;;;aAKjC,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAA"}
@@ -97,6 +97,13 @@ export const agentPresentationSchema = v.object({
97
97
  * builder will SAVE (`purposeAllowsAgentCategory`), so a kind that opts out of a purpose
98
98
  * stays editable in a stored pipeline that already uses it.
99
99
  *
100
+ * `build` and `bugfix` are read as ONE purpose here, one way (`classifierSuits`): naming
101
+ * `build` also offers the kind to every bugfix palette, because the two are the same work and
102
+ * differ only in the task type their pipelines are offered to. So there is deliberately no way
103
+ * to declare "general builds but not defect work": that is not a distinction about the kind's
104
+ * work, which is all this list may express. Naming `bugfix` alone is a claim about the
105
+ * defect-report context specifically and does NOT buy the kind into `build`.
106
+ *
100
107
  * An EMPTY list is refused rather than accepted, because the reader treats "declared nothing"
101
108
  * and "declared an empty list" as the same thing (the category alone decides, so the kind is
102
109
  * offered at every purpose that section admits) and that is the exact inverse of what an author
@@ -1 +1 @@
1
- {"version":3,"file":"agent-presentation.js","sourceRoot":"","sources":["../src/agent-presentation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-presentation.js","sourceRoot":"","sources":["../src/agent-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,8EAA8E;AAC9E,gFAAgF;AAChF,qFAAqF;AACrF,uFAAuF;AACvF,sFAAsF;AACtF,mFAAmF;AACnF,8EAA8E;AAE9E,0FAA0F;AAC1F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC5C,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;CACR,CAAC,CAAA;AAGF,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAA;AAEpF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACtC,CAAC;AAED,8EAA8E;AAC9E,mFAAmF;AACnF,2EAA2E;AAC3E,mFAAmF;AACnF,sEAAsE;AACtE,EAAE;AACF,oFAAoF;AACpF,mFAAmF;AACnF,6DAA6D;AAC7D,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,CAAU,CAAA;AACzE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAGtD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAc,cAAc,CAAA;AAE3D;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAkC,EAAE,KAAgB;IACrF,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,IAAI,kBAAkB,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACtF,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,4CAA4C;IAC5C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACpE,2CAA2C;IAC3C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1D,uCAAuC;IACvC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1D;;;;;OAKG;IACH,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3E,gGAAgG;IAChG,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IACzC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E;;;;;OAKG;IACH,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC;IACjC;;;;;;;;OAQG;IACH,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAClF;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;CAClC,CAAC,CAAA;AAGF;6DAC6D;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,eAAe;IACrB,YAAY,EAAE,uBAAuB;IACrC,oEAAoE;IACpE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB;;;;;;;;;;;;;;OAcG;IACH,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;CACvD,CAAC,CAAA;AAGF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACpC,CAAC,CAAA"}
@@ -1594,7 +1594,7 @@ export declare const pipelineSchema: v.ObjectSchema<{
1594
1594
  * member it reads. Narrow with `isPipelinePurpose` (or `classifierFor`, which states what an
1595
1595
  * unnameable classifier means) before indexing anything by it.
1596
1596
  */
1597
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
1597
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
1598
1598
  /**
1599
1599
  * When true the pipeline is INTERNAL: the platform starts it by id for a flow of its own, and no
1600
1600
  * user-facing surface offers it. It is filtered out of the workspace snapshot, the pipeline list,
@@ -4,7 +4,12 @@ import * as v from 'valibot';
4
4
  * builder and stamped on every built-in preset, it is the classifier the SPA filters on:
5
5
  *
6
6
  * - `build` produces or changes application code (the default for engineering
7
- * pipelines: full builds, bug fixes, refactors, dependency updates, …).
7
+ * pipelines: full builds, refactors, dependency updates, …).
8
+ * - `bugfix` fixes a REPORTED DEFECT: it ships code exactly as `build` does, and it is
9
+ * built around a report to investigate, triage and reproduce, so it is offered
10
+ * to a `bug` task and withheld from a `feature` one. The two are otherwise the
11
+ * same classifier, which is why the palette and the save gate treat them alike
12
+ * and only `pipelineAllowedForTaskType` tells them apart.
8
13
  * - `document` authors or updates documentation (a PRD/RFC/runbook, business rules, …);
9
14
  * a `document` task offers ONLY these.
10
15
  * - `review` reviews existing code / a pull request and reports findings; writes no code.
@@ -19,8 +24,8 @@ import * as v from 'valibot';
19
24
  * modules both build a `Set` at evaluation time resolves to an empty one on whichever side
20
25
  * loses the race.
21
26
  */
22
- export declare const PIPELINE_PURPOSES: readonly ['build', 'document', 'review', 'research', 'planning'];
23
- export declare const pipelinePurposeSchema: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
27
+ export declare const PIPELINE_PURPOSES: readonly ['build', 'bugfix', 'document', 'review', 'research', 'planning'];
28
+ export declare const pipelinePurposeSchema: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
24
29
  export type PipelinePurpose = v.InferOutput<typeof pipelinePurposeSchema>;
25
30
  /**
26
31
  * Whether a value is a purpose THIS BUILD knows, DERIVED from the picklist for the same reason
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-purpose-vocabulary.d.ts","sourceRoot":"","sources":["../src/pipeline-purpose-vocabulary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,YAAI,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAU,CAAA;AACjG,eAAO,MAAM,qBAAqB,+FAAgC,CAAA;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAIzE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,eAAe,CAEzE"}
1
+ {"version":3,"file":"pipeline-purpose-vocabulary.d.ts","sourceRoot":"","sources":["../src/pipeline-purpose-vocabulary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,iBAAiB,YAC5B,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,CACF,CAAA;AACV,eAAO,MAAM,qBAAqB,yGAAgC,CAAA;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAIzE;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,eAAe,CAEzE"}
@@ -4,7 +4,12 @@ import * as v from 'valibot';
4
4
  * builder and stamped on every built-in preset, it is the classifier the SPA filters on:
5
5
  *
6
6
  * - `build` produces or changes application code (the default for engineering
7
- * pipelines: full builds, bug fixes, refactors, dependency updates, …).
7
+ * pipelines: full builds, refactors, dependency updates, …).
8
+ * - `bugfix` fixes a REPORTED DEFECT: it ships code exactly as `build` does, and it is
9
+ * built around a report to investigate, triage and reproduce, so it is offered
10
+ * to a `bug` task and withheld from a `feature` one. The two are otherwise the
11
+ * same classifier, which is why the palette and the save gate treat them alike
12
+ * and only `pipelineAllowedForTaskType` tells them apart.
8
13
  * - `document` authors or updates documentation (a PRD/RFC/runbook, business rules, …);
9
14
  * a `document` task offers ONLY these.
10
15
  * - `review` reviews existing code / a pull request and reports findings; writes no code.
@@ -19,7 +24,14 @@ import * as v from 'valibot';
19
24
  * modules both build a `Set` at evaluation time resolves to an empty one on whichever side
20
25
  * loses the race.
21
26
  */
22
- export const PIPELINE_PURPOSES = ['build', 'document', 'review', 'research', 'planning'];
27
+ export const PIPELINE_PURPOSES = [
28
+ 'build',
29
+ 'bugfix',
30
+ 'document',
31
+ 'review',
32
+ 'research',
33
+ 'planning',
34
+ ];
23
35
  export const pipelinePurposeSchema = v.picklist(PIPELINE_PURPOSES);
24
36
  const PIPELINE_PURPOSE_SET = new Set(pipelinePurposeSchema.options);
25
37
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-purpose-vocabulary.js","sourceRoot":"","sources":["../src/pipeline-purpose-vocabulary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAU,CAAA;AACjG,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;AAGlE,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAExF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACxC,CAAC"}
1
+ {"version":3,"file":"pipeline-purpose-vocabulary.js","sourceRoot":"","sources":["../src/pipeline-purpose-vocabulary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO;IACP,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,UAAU;IACV,UAAU;CACF,CAAA;AACV,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAA;AAGlE,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAA;AAExF;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACxC,CAAC"}
@@ -16,9 +16,10 @@ import type { BlockLevel, TaskType } from './primitives.js';
16
16
  export * from './pipeline-purpose-vocabulary.js';
17
17
  /**
18
18
  * Whether a pipeline of `purpose` may use an agent kind in `category`: the builder's SAVE
19
- * gate. A `build` pipeline may use anything; every other purpose refuses the Implementation
20
- * (`build`) and Testing (`test`) categories, the two that contradict the classifier outright.
21
- * Uncategorized kinds (no `category`) are always allowed, the caller showing them regardless.
19
+ * gate. A code-shipping pipeline ({@link CODE_SHIPPING_PURPOSES}) may use anything; every other
20
+ * purpose refuses the Implementation (`build`) and Testing (`test`) categories, the two that
21
+ * contradict the classifier outright. Uncategorized kinds (no `category`) are always allowed,
22
+ * the caller showing them regardless.
22
23
  *
23
24
  * For what the palette OFFERS, see {@link purposeSuggestsAgentCategory}: it narrows further,
24
25
  * and the difference is what keeps a stored pipeline editable after this file gets an opinion
@@ -78,6 +79,10 @@ export interface AgentPurposeRelevance {
78
79
  * has to fix it. An AUTHORED empty list never reaches here at all: `agentPresentationSchema`
79
80
  * refuses one at registration, so this reading cannot double as a way of saying "offer me
80
81
  * nowhere", which is what someone typing `purposes: []` means and the opposite of what it does.
82
+ *
83
+ * A declaration is matched through {@link classifierSuits}, so declaring `build` also answers for
84
+ * `bugfix`: the two members are the same work, and without that the new one would silently empty
85
+ * out a bugfix palette.
81
86
  */
82
87
  export declare function purposeSuggestsAgentKind(purpose: Pipeline['purpose'], kind: AgentPurposeRelevance): boolean;
83
88
  /**
@@ -96,8 +101,9 @@ export declare function purposeSuggestsAgentKind(purpose: Pipeline['purpose'], k
96
101
  * {@link pipelineAllowedForTaskType} draws, and for the same reason.
97
102
  *
98
103
  * Unlike the pickers' gate this narrows a list somebody is BROWSING rather than one they are about
99
- * to run from, so it may be exact where that one is permissive: two known purposes never mix, and
100
- * the caller states how many rows the dial is holding back and offers the way out of it.
104
+ * to run from, so it may be exact where that one is permissive: two known purposes mix only where
105
+ * {@link classifierSuits} says they are the same work, and the caller states how many rows the dial
106
+ * is holding back and offers the way out of it.
101
107
  */
102
108
  export declare function pipelineMatchesPurpose(pipeline: Pick<Pipeline, 'purpose'>, purpose: Pipeline['purpose'] | null | undefined): boolean;
103
109
  /**
@@ -107,9 +113,11 @@ export declare function pipelineMatchesPurpose(pipeline: Pick<Pipeline, 'purpose
107
113
  *
108
114
  * - `document` → only `document` pipelines (it authors a document; nothing else applies).
109
115
  * - `review` → only `review` pipelines (it reviews an existing PR and opens none).
110
- * - `feature` / `bug` → everything EXCEPT `document` / `review` / `planning`
111
- * ({@link PROGRAMMATIC_PURPOSES}). These ship code, so offering them a document-authoring or
112
- * PR-review preset was noise in the one picker people use most.
116
+ * - `bug` → everything EXCEPT `document` / `review` / `planning` ({@link BUG_PURPOSES}). It ships
117
+ * code, so offering it a document-authoring or PR-review preset was noise in the one picker
118
+ * people use most.
119
+ * - `feature` → the same, minus `bugfix` ({@link FEATURE_PURPOSES}): a preset that investigates a
120
+ * defect report and reproduces it has neither input on a feature.
113
121
  * - anything else, including a CUSTOM (namespaced) type and an undefined `taskType`, is
114
122
  * unrestricted — a deployment's own task type has no purpose mapping we could infer.
115
123
  *
@@ -121,10 +129,10 @@ export declare function pipelineMatchesPurpose(pipeline: Pick<Pipeline, 'purpose
121
129
  * task is actively wrong — running it would author no document and open a code PR nobody asked
122
130
  * for. A purpose this build cannot name is hidden there: guessing costs more than an absence
123
131
  * the user resolves by picking a preset the build does know.
124
- * - `feature` / `bug` merely EXCLUDE the known purposes that cannot ship code, so an unnameable
125
- * one stays visible. It is not known-wrong for a feature, and hiding it would take a
126
- * deployment's own pipeline out of the picker people use most the moment its classifier
127
- * outlives the bundle reading it, with nothing on screen to explain the absence.
132
+ * - `feature` / `bug` merely EXCLUDE the known purposes that do not fit, so an unnameable one
133
+ * stays visible. It is not known-wrong for a feature, and hiding it would take a deployment's
134
+ * own pipeline out of the picker people use most the moment its classifier outlives the bundle
135
+ * reading it, with nothing on screen to explain the absence.
128
136
  *
129
137
  * Composed with the launch-availability / block-level / visual-frame filters at each picker.
130
138
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-purpose.d.ts","sourceRoot":"","sources":["../src/pipeline-purpose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAmB,MAAM,yBAAyB,CAAA;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,cAAc,kCAAkC,CAAA;AA2DhD;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC5B,QAAQ,EAAE,aAAa,GACtB,OAAO,CAIT;AA8BD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC5B,QAAQ,EAAE,aAAa,GACtB,OAAO,CAIT;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC5B,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAMT;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EACnC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,SAAS,GAC9C,OAAO,CAMT;AAgBD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EACnC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAC7B,OAAO,CAQT;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EACnC,UAAU,EAAE,UAAU,GAAG,SAAS,GACjC,OAAO,CAIT"}
1
+ {"version":3,"file":"pipeline-purpose.d.ts","sourceRoot":"","sources":["../src/pipeline-purpose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAmB,MAAM,yBAAyB,CAAA;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAC1F,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAE3D;;;;;;;;;;GAUG;AACH,cAAc,kCAAkC,CAAA;AA4FhD;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC5B,QAAQ,EAAE,aAAa,GACtB,OAAO,CAIT;AAiCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC5B,QAAQ,EAAE,aAAa,GACtB,OAAO,CAIT;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CACtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC5B,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAOT;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EACnC,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,SAAS,GAC9C,OAAO,CAMT;AA4BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EACnC,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAC7B,OAAO,CAST;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EACnC,UAAU,EAAE,UAAU,GAAG,SAAS,GACjC,OAAO,CAIT"}
@@ -36,6 +36,10 @@ export * from './pipeline-purpose-vocabulary.js';
36
36
  // compatibility (asserted in the tests): the palette may hide what the save gate
37
37
  // tolerates, never the reverse, which would offer a kind that cannot then be saved.
38
38
  //
39
+ // `build` and `bugfix` are ONE classifier to three of those four surfaces: the same work, split
40
+ // only so the pickers can tell them apart. {@link classifierSuits} states that relation once, so a
41
+ // palette and a library looking at the same draft cannot answer it differently.
42
+ //
39
43
  // Every pipeline carries one: `purpose` is mandatory at every write boundary (the entity, the
40
44
  // create request, the seed spec and therefore every `PipelineRegistry` registration), and the row
41
45
  // mapper resolves the pre-mandatory NULLs the back-fill missed. So none of these predicates has an
@@ -44,8 +48,14 @@ export * from './pipeline-purpose-vocabulary.js';
44
48
  // What they DO all take is a value TYPED as a member and only DECLARED to be one. See
45
49
  // {@link classifierFor} for what an unrecognised value means and why they read it default-OPEN.
46
50
  // ---------------------------------------------------------------------------
47
- /** The agent-palette categories hidden from a non-`build` pipeline (writes no code, runs no tests). */
51
+ /** The agent-palette categories hidden from a pipeline that ships no code (runs no tests either). */
48
52
  const NON_BUILD_HIDDEN_CATEGORIES = ['build', 'test'];
53
+ /**
54
+ * The purposes that SHIP CODE, and so have a use for every palette category. `bugfix` is here
55
+ * beside `build` because the two differ only in what they are offered TO ({@link
56
+ * pipelineAllowedForTaskType}): a bug fix designs, implements, tests and merges like any change.
57
+ */
58
+ const CODE_SHIPPING_PURPOSES = ['build', 'bugfix'];
49
59
  /**
50
60
  * The purpose to narrow BY, or `null` for "this build has nothing to narrow by".
51
61
  *
@@ -66,11 +76,33 @@ const NON_BUILD_HIDDEN_CATEGORIES = ['build', 'test'];
66
76
  function classifierFor(purpose) {
67
77
  return purpose && isPipelinePurpose(purpose) ? purpose : null;
68
78
  }
79
+ /**
80
+ * Whether something classified `own` suits a context being judged AT `classifier`: exact match,
81
+ * plus the single relation "`build` satisfies `bugfix`", one way.
82
+ *
83
+ * The two members are the same WORK (a bug fix designs, implements, tests and merges exactly as a
84
+ * build does), and are split only so the pickers can withhold a defect-report preset from a feature
85
+ * task ({@link pipelineAllowedForTaskType}). So anything classified `build` is at home in a bugfix
86
+ * context: every palette kind whose `purposes` list predates the member (the Bug Investigator
87
+ * declares `build`, most absurdly of all), and the whole build ladder in the saved-pipeline library
88
+ * of a bugfix draft, which would otherwise open holding two rows.
89
+ *
90
+ * The reverse does NOT hold: naming `bugfix` claims the defect-report context specifically and says
91
+ * nothing about a general build.
92
+ *
93
+ * ONE definition, read by both surfaces that narrow by purpose ({@link purposeSuggestsAgentKind},
94
+ * {@link pipelineMatchesPurpose}), because the palette and the library answering the same question
95
+ * differently is what a user reads as one of them being broken.
96
+ */
97
+ function classifierSuits(own, classifier) {
98
+ return own === classifier || (classifier === 'bugfix' && own === 'build');
99
+ }
69
100
  /**
70
101
  * Whether a pipeline of `purpose` may use an agent kind in `category`: the builder's SAVE
71
- * gate. A `build` pipeline may use anything; every other purpose refuses the Implementation
72
- * (`build`) and Testing (`test`) categories, the two that contradict the classifier outright.
73
- * Uncategorized kinds (no `category`) are always allowed, the caller showing them regardless.
102
+ * gate. A code-shipping pipeline ({@link CODE_SHIPPING_PURPOSES}) may use anything; every other
103
+ * purpose refuses the Implementation (`build`) and Testing (`test`) categories, the two that
104
+ * contradict the classifier outright. Uncategorized kinds (no `category`) are always allowed,
105
+ * the caller showing them regardless.
74
106
  *
75
107
  * For what the palette OFFERS, see {@link purposeSuggestsAgentCategory}: it narrows further,
76
108
  * and the difference is what keeps a stored pipeline editable after this file gets an opinion
@@ -80,7 +112,7 @@ function classifierFor(purpose) {
80
112
  */
81
113
  export function purposeAllowsAgentCategory(purpose, category) {
82
114
  const classifier = classifierFor(purpose);
83
- if (classifier === null || classifier === 'build')
115
+ if (classifier === null || CODE_SHIPPING_PURPOSES.includes(classifier))
84
116
  return true;
85
117
  return !NON_BUILD_HIDDEN_CATEGORIES.includes(category);
86
118
  }
@@ -94,6 +126,9 @@ export function purposeAllowsAgentCategory(purpose, category) {
94
126
  const PURPOSE_SUGGESTED_CATEGORIES = {
95
127
  // Ships product code: every category is in play.
96
128
  build: { review: true, design: true, build: true, test: true, docs: true, gates: true },
129
+ // Ships product code too, so the same row. What differs is the task type it is offered to,
130
+ // which this table does not decide.
131
+ bugfix: { review: true, design: true, build: true, test: true, docs: true, gates: true },
97
132
  // Authors a document: researched, drafted, reviewed and merged like any change, but
98
133
  // nothing is implemented or tested.
99
134
  document: { review: true, design: true, build: false, test: false, docs: true, gates: true },
@@ -154,6 +189,10 @@ export function purposeSuggestsAgentCategory(purpose, category) {
154
189
  * has to fix it. An AUTHORED empty list never reaches here at all: `agentPresentationSchema`
155
190
  * refuses one at registration, so this reading cannot double as a way of saying "offer me
156
191
  * nowhere", which is what someone typing `purposes: []` means and the opposite of what it does.
192
+ *
193
+ * A declaration is matched through {@link classifierSuits}, so declaring `build` also answers for
194
+ * `bugfix`: the two members are the same work, and without that the new one would silently empty
195
+ * out a bugfix palette.
157
196
  */
158
197
  export function purposeSuggestsAgentKind(purpose, kind) {
159
198
  const classifier = classifierFor(purpose);
@@ -162,7 +201,9 @@ export function purposeSuggestsAgentKind(purpose, kind) {
162
201
  if (kind.category && !purposeSuggestsAgentCategory(purpose, kind.category))
163
202
  return false;
164
203
  const declared = kind.purposes?.filter((p) => isPipelinePurpose(p)) ?? [];
165
- return declared.length === 0 || declared.includes(classifier);
204
+ if (declared.length === 0)
205
+ return true;
206
+ return declared.some((p) => classifierSuits(p, classifier));
166
207
  }
167
208
  /**
168
209
  * Whether `pipeline` belongs in a library being browsed AT `purpose`: the builder's saved-pipeline
@@ -180,8 +221,9 @@ export function purposeSuggestsAgentKind(purpose, kind) {
180
221
  * {@link pipelineAllowedForTaskType} draws, and for the same reason.
181
222
  *
182
223
  * Unlike the pickers' gate this narrows a list somebody is BROWSING rather than one they are about
183
- * to run from, so it may be exact where that one is permissive: two known purposes never mix, and
184
- * the caller states how many rows the dial is holding back and offers the way out of it.
224
+ * to run from, so it may be exact where that one is permissive: two known purposes mix only where
225
+ * {@link classifierSuits} says they are the same work, and the caller states how many rows the dial
226
+ * is holding back and offers the way out of it.
185
227
  */
186
228
  export function pipelineMatchesPurpose(pipeline, purpose) {
187
229
  const classifier = classifierFor(purpose);
@@ -190,21 +232,32 @@ export function pipelineMatchesPurpose(pipeline, purpose) {
190
232
  const own = classifierFor(pipeline.purpose);
191
233
  if (own === null)
192
234
  return true;
193
- return own === classifier;
235
+ return classifierSuits(own, classifier);
194
236
  }
195
237
  /**
196
- * The purposes a PROGRAMMATIC task (`feature` / `bug`) may be offered. It ships code, so a
197
- * `document` or `review` pipeline is meaningless for it — the reverse of the narrowing those task
198
- * types already got. `research` is included because reaching for a spike before committing to an
199
- * approach is a legitimate move on a feature someone has not yet scoped; `planning` is not, being
200
- * initiative-level work that the block-level gate refuses anyway.
238
+ * The purposes a `bug` task may be offered. It ships code, so a `document` or `review` pipeline is
239
+ * meaningless for it — the reverse of the narrowing those task types already got. `research` is
240
+ * included because reaching for a spike before committing to an approach is a legitimate move on
241
+ * work someone has not yet scoped; `planning` is not, being initiative-level work that the
242
+ * block-level gate refuses anyway.
201
243
  *
202
244
  * Applied as a DENY list (everything not named here is hidden) rather than an allow list, which is
203
245
  * the one place this narrowing differs in direction from `document` / `review` — see
204
246
  * {@link pipelineAllowedForTaskType} for why a classifier this build cannot NAME has to stay
205
247
  * visible here.
206
248
  */
207
- const PROGRAMMATIC_PURPOSES = ['build', 'research'];
249
+ const BUG_PURPOSES = ['build', 'bugfix', 'research'];
250
+ /**
251
+ * The purposes a `feature` task may be offered: {@link BUG_PURPOSES} minus `bugfix`.
252
+ *
253
+ * A bugfix preset is built around a DEFECT REPORT — it investigates one against the codebase,
254
+ * triages it with a human for fixability, and writes a failing reproduction test before anything
255
+ * is fixed. On a feature there is no report to investigate and nothing red to make green, so the
256
+ * front half of such a run has no input and the reproduction proof it exists to produce is
257
+ * vacuous. That is a narrowing in the same spirit as the document / review ones, drawn one notch
258
+ * finer because both sides of it ship code.
259
+ */
260
+ const FEATURE_PURPOSES = BUG_PURPOSES.filter((p) => p !== 'bugfix');
208
261
  /**
209
262
  * Whether `pipeline` should be offered when starting a task of `taskType` — the pickers' gate.
210
263
  *
@@ -212,9 +265,11 @@ const PROGRAMMATIC_PURPOSES = ['build', 'research'];
212
265
  *
213
266
  * - `document` → only `document` pipelines (it authors a document; nothing else applies).
214
267
  * - `review` → only `review` pipelines (it reviews an existing PR and opens none).
215
- * - `feature` / `bug` → everything EXCEPT `document` / `review` / `planning`
216
- * ({@link PROGRAMMATIC_PURPOSES}). These ship code, so offering them a document-authoring or
217
- * PR-review preset was noise in the one picker people use most.
268
+ * - `bug` → everything EXCEPT `document` / `review` / `planning` ({@link BUG_PURPOSES}). It ships
269
+ * code, so offering it a document-authoring or PR-review preset was noise in the one picker
270
+ * people use most.
271
+ * - `feature` → the same, minus `bugfix` ({@link FEATURE_PURPOSES}): a preset that investigates a
272
+ * defect report and reproduces it has neither input on a feature.
218
273
  * - anything else, including a CUSTOM (namespaced) type and an undefined `taskType`, is
219
274
  * unrestricted — a deployment's own task type has no purpose mapping we could infer.
220
275
  *
@@ -226,10 +281,10 @@ const PROGRAMMATIC_PURPOSES = ['build', 'research'];
226
281
  * task is actively wrong — running it would author no document and open a code PR nobody asked
227
282
  * for. A purpose this build cannot name is hidden there: guessing costs more than an absence
228
283
  * the user resolves by picking a preset the build does know.
229
- * - `feature` / `bug` merely EXCLUDE the known purposes that cannot ship code, so an unnameable
230
- * one stays visible. It is not known-wrong for a feature, and hiding it would take a
231
- * deployment's own pipeline out of the picker people use most the moment its classifier
232
- * outlives the bundle reading it, with nothing on screen to explain the absence.
284
+ * - `feature` / `bug` merely EXCLUDE the known purposes that do not fit, so an unnameable one
285
+ * stays visible. It is not known-wrong for a feature, and hiding it would take a deployment's
286
+ * own pipeline out of the picker people use most the moment its classifier outlives the bundle
287
+ * reading it, with nothing on screen to explain the absence.
233
288
  *
234
289
  * Composed with the launch-availability / block-level / visual-frame filters at each picker.
235
290
  */
@@ -240,7 +295,8 @@ export function pipelineAllowedForTaskType(pipeline, taskType) {
240
295
  return pipeline.purpose === 'review';
241
296
  if (taskType === 'feature' || taskType === 'bug') {
242
297
  const own = classifierFor(pipeline.purpose);
243
- return own === null || PROGRAMMATIC_PURPOSES.includes(own);
298
+ const offered = taskType === 'bug' ? BUG_PURPOSES : FEATURE_PURPOSES;
299
+ return own === null || offered.includes(own);
244
300
  }
245
301
  return true;
246
302
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-purpose.js","sourceRoot":"","sources":["../src/pipeline-purpose.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline-purpose.js","sourceRoot":"","sources":["../src/pipeline-purpose.ts"],"names":[],"mappings":"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"}
@@ -2885,7 +2885,7 @@ export declare const createPipelineSchema: v.ObjectSchema<{
2885
2885
  * builder's dial defaults to `build`, so a caller who has not thought about it still states the
2886
2886
  * classifier it would have behaved as.
2887
2887
  */
2888
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
2888
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
2889
2889
  }, undefined>;
2890
2890
  export type CreatePipelineInput = v.InferOutput<typeof createPipelineSchema>;
2891
2891
  /**
@@ -2980,7 +2980,7 @@ export declare const updatePipelineSchema: v.ObjectSchema<{
2980
2980
  /** Change how the pipeline may be launched (see {@link createPipelineSchema}). Optional. */
2981
2981
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
2982
2982
  /** Change the pipeline's use-case classifier (see {@link createPipelineSchema}). Optional. */
2983
- readonly purpose: v.OptionalSchema<v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>, undefined>;
2983
+ readonly purpose: v.OptionalSchema<v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>, undefined>;
2984
2984
  }, undefined>;
2985
2985
  export type UpdatePipelineInput = v.InferOutput<typeof updatePipelineSchema>;
2986
2986
  /** Clone any pipeline (built-in or custom) into a new, editable copy. */
@@ -112,7 +112,7 @@ export declare const listPipelinesContract: {
112
112
  readonly version: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
113
113
  readonly public: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
114
114
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
115
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
115
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
116
116
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
117
117
  readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
118
118
  readonly isUnattendedDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -203,7 +203,7 @@ export declare const createPipelineContract: {
203
203
  }, undefined>, undefined>, undefined>, undefined>;
204
204
  readonly labels: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 40, undefined>]>, undefined>, undefined>;
205
205
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
206
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
206
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
207
207
  }, undefined>;
208
208
  readonly responsesByStatusCode: {
209
209
  readonly '4xx': v.ObjectSchema<{
@@ -314,7 +314,7 @@ export declare const createPipelineContract: {
314
314
  readonly version: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
315
315
  readonly public: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
316
316
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
317
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
317
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
318
318
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
319
319
  readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
320
320
  readonly isUnattendedDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -441,7 +441,7 @@ export declare const clonePipelineContract: {
441
441
  readonly version: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
442
442
  readonly public: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
443
443
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
444
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
444
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
445
445
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
446
446
  readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
447
447
  readonly isUnattendedDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -566,7 +566,7 @@ export declare const reseedPipelineContract: {
566
566
  readonly version: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
567
567
  readonly public: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
568
568
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
569
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
569
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
570
570
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
571
571
  readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
572
572
  readonly isUnattendedDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -662,7 +662,7 @@ export declare const updatePipelineContract: {
662
662
  }, undefined>, undefined>, undefined>, undefined>;
663
663
  readonly labels: v.OptionalSchema<v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 40, undefined>]>, undefined>, undefined>;
664
664
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
665
- readonly purpose: v.OptionalSchema<v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>, undefined>;
665
+ readonly purpose: v.OptionalSchema<v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>, undefined>;
666
666
  }, undefined>;
667
667
  readonly responsesByStatusCode: {
668
668
  readonly '4xx': v.ObjectSchema<{
@@ -773,7 +773,7 @@ export declare const updatePipelineContract: {
773
773
  readonly version: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
774
774
  readonly public: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
775
775
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
776
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
776
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
777
777
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
778
778
  readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
779
779
  readonly isUnattendedDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -903,7 +903,7 @@ export declare const organizePipelineContract: {
903
903
  readonly version: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
904
904
  readonly public: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
905
905
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
906
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
906
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
907
907
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
908
908
  readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
909
909
  readonly isUnattendedDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -550,7 +550,7 @@ export declare const createWorkspaceContract: {
550
550
  readonly version: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
551
551
  readonly public: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
552
552
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
553
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
553
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
554
554
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
555
555
  readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
556
556
  readonly isUnattendedDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -3186,7 +3186,7 @@ export declare const createWorkspaceContract: {
3186
3186
  readonly color: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 40, undefined>]>;
3187
3187
  readonly description: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
3188
3188
  readonly category: v.OptionalSchema<v.PicklistSchema<["review", "design", "build", "test", "docs", "gates"], undefined>, undefined>;
3189
- readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
3189
+ readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("bugfix" | "build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
3190
3190
  readonly tier: v.OptionalSchema<v.PicklistSchema<readonly ["basic", "intermediate", "advanced"], undefined>, undefined>;
3191
3191
  readonly resultView: v.OptionalSchema<v.UnionSchema<[v.PicklistSchema<readonly ["outcome", "requirements-review", "clarity-review", "brainstorm", "tester", "human-test", "visual-confirm", "gate", "consensus-session", "generic-structured", "service-spec", "follow-ups", "merger", "initiative-tracker", "initiative-planning", "doc-interview", "fork-decision", "binary-candidates", "judge", "pr-review", "ralph-loop"], undefined>, v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "Consumer id must be <namespace>:<name> (lowercase a-z0-9, dash-separated)">]>], undefined>, undefined>;
3192
3192
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -4096,7 +4096,7 @@ export declare const getWorkspaceContract: {
4096
4096
  readonly version: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
4097
4097
  readonly public: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
4098
4098
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
4099
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
4099
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
4100
4100
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
4101
4101
  readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
4102
4102
  readonly isUnattendedDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -6732,7 +6732,7 @@ export declare const getWorkspaceContract: {
6732
6732
  readonly color: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 40, undefined>]>;
6733
6733
  readonly description: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
6734
6734
  readonly category: v.OptionalSchema<v.PicklistSchema<["review", "design", "build", "test", "docs", "gates"], undefined>, undefined>;
6735
- readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
6735
+ readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("bugfix" | "build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
6736
6736
  readonly tier: v.OptionalSchema<v.PicklistSchema<readonly ["basic", "intermediate", "advanced"], undefined>, undefined>;
6737
6737
  readonly resultView: v.OptionalSchema<v.UnionSchema<[v.PicklistSchema<readonly ["outcome", "requirements-review", "clarity-review", "brainstorm", "tester", "human-test", "visual-confirm", "gate", "consensus-session", "generic-structured", "service-spec", "follow-ups", "merger", "initiative-tracker", "initiative-planning", "doc-interview", "fork-decision", "binary-candidates", "judge", "pr-review", "ralph-loop"], undefined>, v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "Consumer id must be <namespace>:<name> (lowercase a-z0-9, dash-separated)">]>], undefined>, undefined>;
6738
6738
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -488,7 +488,7 @@ export declare const workspaceSnapshotSchema: v.ObjectSchema<{
488
488
  readonly version: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
489
489
  readonly public: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
490
490
  readonly availability: v.OptionalSchema<v.UnionSchema<[v.LiteralSchema<"one-off", undefined>, v.LiteralSchema<"recurring", undefined>, v.LiteralSchema<"both", undefined>], undefined>, undefined>;
491
- readonly purpose: v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>;
491
+ readonly purpose: v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>;
492
492
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
493
493
  readonly isDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
494
494
  readonly isUnattendedDefault: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -3259,7 +3259,7 @@ export declare const workspaceSnapshotSchema: v.ObjectSchema<{
3259
3259
  readonly color: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 40, undefined>]>;
3260
3260
  readonly description: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 500, undefined>]>;
3261
3261
  readonly category: v.OptionalSchema<v.PicklistSchema<["review", "design", "build", "test", "docs", "gates"], undefined>, undefined>;
3262
- readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
3262
+ readonly purposes: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.PicklistSchema<readonly ["build", "bugfix", "document", "review", "research", "planning"], undefined>, undefined>, v.MinLengthAction<("bugfix" | "build" | "document" | "planning" | "research" | "review")[], 1, undefined>]>, undefined>;
3263
3263
  readonly tier: v.OptionalSchema<v.PicklistSchema<readonly ["basic", "intermediate", "advanced"], undefined>, undefined>;
3264
3264
  readonly resultView: v.OptionalSchema<v.UnionSchema<[v.PicklistSchema<readonly ["outcome", "requirements-review", "clarity-review", "brainstorm", "tester", "human-test", "visual-confirm", "gate", "consensus-session", "generic-structured", "service-spec", "follow-ups", "merger", "initiative-tracker", "initiative-planning", "doc-interview", "fork-decision", "binary-candidates", "judge", "pr-review", "ralph-loop"], undefined>, v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "Consumer id must be <namespace>:<name> (lowercase a-z0-9, dash-separated)">]>], undefined>, undefined>;
3265
3265
  readonly internal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
@@ -1,3 +1,4 @@
1
+ import { type RunServiceScope } from './step-conditions.js';
1
2
  import type { Block, Pipeline } from './entities.js';
2
3
  /**
3
4
  * The agent kind that drives a real browser against a running frontend and captures a
@@ -13,8 +14,30 @@ export declare const UI_TESTER_AGENT_KIND = "tester-ui";
13
14
  export declare const VISUAL_CONFIRM_AGENT_KIND = "visual-confirmation";
14
15
  /** The visual step kinds: a pipeline carrying any of these is a "visual" pipeline. */
15
16
  export declare const VISUAL_STEP_KINDS: readonly ["tester-ui", "visual-confirmation"];
16
- /** Whether a pipeline includes any visual step (`tester-ui` / `visual-confirmation`). */
17
+ /**
18
+ * Whether a pipeline includes any visual step (`tester-ui` / `visual-confirmation`) AT ALL,
19
+ * conditional ones included. The question for a caller asking whether the pipeline could ever
20
+ * drive a browser (run start resolves the frontend bindings off it). A caller deciding whether
21
+ * a pipeline may run HERE wants {@link pipelineRunsVisualStep} instead.
22
+ */
17
23
  export declare function pipelineHasVisualStep(pipeline: Pick<Pipeline, 'agentKinds'>): boolean;
24
+ /**
25
+ * Whether a run of `scope` would actually REACH a visual step: the steps that are enabled and
26
+ * whose run condition (`stepOptions[i].condition`) the scope admits. This is the question the
27
+ * frame gate below has to ask, and it is NOT the same as "does the pipeline list one".
28
+ *
29
+ * Since the build ladder carries the CONDITIONAL tester pair, every build preset lists a
30
+ * `tester-ui` scoped to `serviceScope: 'frontend'`. On a backend service that step is skipped
31
+ * before it dispatches, so the pipeline demands no UI and the run starts fine — which is exactly
32
+ * what run admission concludes, filtering the chain through the same two rules before it reaches
33
+ * the frame gate. Asking the coarse question there instead hides every build rung from every
34
+ * picker on every non-frontend service.
35
+ *
36
+ * An UNRESOLVABLE scope (neither half set: a block under no service frame) admits every
37
+ * condition, the fail-safe direction `stepConditionSatisfied` takes throughout: the visual step
38
+ * would run, so the frame gate gets to refuse it rather than a condition quietly excusing it.
39
+ */
40
+ export declare function pipelineRunsVisualStep(pipeline: Pick<Pipeline, 'agentKinds' | 'enabled' | 'stepOptions'>, scope: RunServiceScope): boolean;
18
41
  /**
19
42
  * Whether a visual pipeline may run on a task under `frame`. A visual step needs a UI to
20
43
  * exercise, which exists when the enclosing frame is either:
@@ -1 +1 @@
1
- {"version":3,"file":"visual-pipeline.d.ts","sourceRoot":"","sources":["../src/visual-pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAepD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,cAAc,CAAA;AAE/C;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,wBAAwB,CAAA;AAE9D,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,+CAA6D,CAAA;AAE3F,yFAAyF;AACzF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,OAAO,CAIrF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,GAAG,SAAS,GAAG,IAAI,EACpD,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,gBAAgB,CAAC,EAAE,GAClE,OAAO,CAWT;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,gBAAgB,CAAC,EAAE,GAClE,MAAM,EAAE,CAcV"}
1
+ {"version":3,"file":"visual-pipeline.d.ts","sourceRoot":"","sources":["../src/visual-pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAA0B,MAAM,sBAAsB,CAAA;AACnF,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAoBpD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,cAAc,CAAA;AAE/C;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,wBAAwB,CAAA;AAE9D,sFAAsF;AACtF,eAAO,MAAM,iBAAiB,+CAA6D,CAAA;AAY3F;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,OAAO,CAErF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,aAAa,CAAC,EAClE,KAAK,EAAE,eAAe,GACrB,OAAO,CAOT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,GAAG,SAAS,GAAG,IAAI,EACpD,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,gBAAgB,CAAC,EAAE,GAClE,OAAO,CAWT;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,gBAAgB,CAAC,EAAE,GAClE,MAAM,EAAE,CAcV"}
@@ -1,15 +1,21 @@
1
1
  import { resolveFrontendServePort } from './frontend.js';
2
+ import { stepConditionSatisfied } from './step-conditions.js';
2
3
  // ---------------------------------------------------------------------------
3
4
  // Visual-pipeline gating (shared by the SPA surface + the backend run-start gate).
4
5
  //
5
6
  // A "visual" pipeline exercises a rendered UI — it either drives a real browser
6
7
  // against a running frontend (`tester-ui`) or parks for a human to review the
7
8
  // captured screenshots vs the task's reference designs (`visual-confirmation`).
8
- // Such a pipeline only makes sense where there IS a UI to exercise: a `frontend`
9
+ // Such a step only makes sense where there IS a UI to exercise: a `frontend`
9
10
  // frame (it owns the app under test), or a frame a `frontend` frame links to (the
10
11
  // linked frontend is the UI a change to that service is validated through). The SPA
11
12
  // uses these predicates to surface visual pipelines only where they can run; the
12
13
  // backend gates a run start on the SAME rule so the guarantee holds server-side.
14
+ //
15
+ // What a pipeline LISTS and what a run REACHES are two questions, and the gate wants the
16
+ // second: a visual step scoped to a frontend service (`stepOptions[i].condition`) excuses
17
+ // itself from a backend run before it dispatches, which is what lets one build preset carry
18
+ // both testers. See `pipelineRunsVisualStep`.
13
19
  // ---------------------------------------------------------------------------
14
20
  /**
15
21
  * The agent kind that drives a real browser against a running frontend and captures a
@@ -25,9 +31,44 @@ export const UI_TESTER_AGENT_KIND = 'tester-ui';
25
31
  export const VISUAL_CONFIRM_AGENT_KIND = 'visual-confirmation';
26
32
  /** The visual step kinds: a pipeline carrying any of these is a "visual" pipeline. */
27
33
  export const VISUAL_STEP_KINDS = [UI_TESTER_AGENT_KIND, VISUAL_CONFIRM_AGENT_KIND];
28
- /** Whether a pipeline includes any visual step (`tester-ui` / `visual-confirmation`). */
34
+ /**
35
+ * Whether an agent kind drives a rendered UI. Reads {@link VISUAL_STEP_KINDS} rather than
36
+ * re-spelling the disjunction, so a third visual kind added to that list is seen by both
37
+ * predicates below instead of leaving the frame gate quietly offering a UI-driving pipeline on a
38
+ * frame with no UI.
39
+ */
40
+ function isVisualStepKind(kind) {
41
+ return VISUAL_STEP_KINDS.includes(kind);
42
+ }
43
+ /**
44
+ * Whether a pipeline includes any visual step (`tester-ui` / `visual-confirmation`) AT ALL,
45
+ * conditional ones included. The question for a caller asking whether the pipeline could ever
46
+ * drive a browser (run start resolves the frontend bindings off it). A caller deciding whether
47
+ * a pipeline may run HERE wants {@link pipelineRunsVisualStep} instead.
48
+ */
29
49
  export function pipelineHasVisualStep(pipeline) {
30
- return pipeline.agentKinds.some((kind) => kind === UI_TESTER_AGENT_KIND || kind === VISUAL_CONFIRM_AGENT_KIND);
50
+ return pipeline.agentKinds.some(isVisualStepKind);
51
+ }
52
+ /**
53
+ * Whether a run of `scope` would actually REACH a visual step: the steps that are enabled and
54
+ * whose run condition (`stepOptions[i].condition`) the scope admits. This is the question the
55
+ * frame gate below has to ask, and it is NOT the same as "does the pipeline list one".
56
+ *
57
+ * Since the build ladder carries the CONDITIONAL tester pair, every build preset lists a
58
+ * `tester-ui` scoped to `serviceScope: 'frontend'`. On a backend service that step is skipped
59
+ * before it dispatches, so the pipeline demands no UI and the run starts fine — which is exactly
60
+ * what run admission concludes, filtering the chain through the same two rules before it reaches
61
+ * the frame gate. Asking the coarse question there instead hides every build rung from every
62
+ * picker on every non-frontend service.
63
+ *
64
+ * An UNRESOLVABLE scope (neither half set: a block under no service frame) admits every
65
+ * condition, the fail-safe direction `stepConditionSatisfied` takes throughout: the visual step
66
+ * would run, so the frame gate gets to refuse it rather than a condition quietly excusing it.
67
+ */
68
+ export function pipelineRunsVisualStep(pipeline, scope) {
69
+ return pipeline.agentKinds.some((kind, i) => isVisualStepKind(kind) &&
70
+ pipeline.enabled?.[i] !== false &&
71
+ stepConditionSatisfied(pipeline.stepOptions?.[i]?.condition, scope));
31
72
  }
32
73
  /**
33
74
  * Whether a visual pipeline may run on a task under `frame`. A visual step needs a UI to
@@ -1 +1 @@
1
- {"version":3,"file":"visual-pipeline.js","sourceRoot":"","sources":["../src/visual-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAGxD,8EAA8E;AAC9E,mFAAmF;AACnF,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,iFAAiF;AACjF,kFAAkF;AAClF,oFAAoF;AACpF,iFAAiF;AACjF,iFAAiF;AACjF,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,WAAW,CAAA;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,qBAAqB,CAAA;AAE9D,sFAAsF;AACtF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,oBAAoB,EAAE,yBAAyB,CAAU,CAAA;AAE3F,yFAAyF;AACzF,MAAM,UAAU,qBAAqB,CAAC,QAAsC;IAC1E,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAC7B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,oBAAoB,IAAI,IAAI,KAAK,yBAAyB,CAC9E,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAoD,EACpD,MAAmE;IAEnE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAA;IACxB,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAA;IAC1C,OAAO,MAAM,CAAC,IAAI,CAChB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,KAAK,KAAK,OAAO;QACnB,CAAC,CAAC,IAAI,KAAK,UAAU;QACrB,CAAC,CAAC,CAAC,cAAc,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,CAC5C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,KAAK,CAAC,EAAE,CACpF,CACJ,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,yBAAyB,CACvC,cAAsB,EACtB,MAAmE;IAEnE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;IACjC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,CAAC,cAAc;YAAE,SAAQ;QAC/E,MAAM,YAAY,GAAG,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CACxD,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS;YAC9B,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,cAAc;YAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAChC,CAAA;QACD,IAAI,CAAC,YAAY;YAAE,SAAQ;QAC3B,OAAO,CAAC,GAAG,CAAC,oBAAoB,wBAAwB,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IACzF,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;AAC5B,CAAC"}
1
+ {"version":3,"file":"visual-pipeline.js","sourceRoot":"","sources":["../src/visual-pipeline.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/contracts",
3
- "version": "0.308.1",
3
+ "version": "0.309.0",
4
4
  "description": "Valibot wire contract shared between the Agent Architecture Board frontend and backend.",
5
5
  "repository": {
6
6
  "type": "git",