@cat-factory/contracts 0.242.0 → 0.244.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/dist/merge.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as v from 'valibot';
2
2
  import { stepGatingSchema } from './consensus.js';
3
- import { changeClassSchema, RULEABLE_CHANGE_CLASSES } from './mergeTrackRecord.js';
3
+ import { changeClassSchema, RULEABLE_CHANGE_CLASSES, } from './mergeTrackRecord.js';
4
4
  import { DEFAULT_JUDGE_MAX_BOUNCES, DEFAULT_JUDGE_MIN_SCORE } from './judge.js';
5
5
  import { WORKSPACE_ROLES, workspaceRoleSchema } from './workspace-members.js';
6
6
  // ---------------------------------------------------------------------------
@@ -101,6 +101,40 @@ v.strictObject(Object.fromEntries(WORKSPACE_ROLES.map((r) => [r, mergeClassRules
101
101
  * cannot start runs at all (`viewer`, which holds no `runs.execute`) may be listed without effect.
102
102
  */
103
103
  export const dryRunRolesSchema = v.array(workspaceRoleSchema);
104
+ /** A picklist over the classes a rule (or an allowlist entry) may be authored for. */
105
+ const ruleableChangeClassSchema = v.picklist(RULEABLE_CHANGE_CLASSES);
106
+ /**
107
+ * The change classes a preset will LAND at all for a given role: a partial map from
108
+ * {@link workspaceRoleSchema} to the list of classes that role's runs may submit.
109
+ *
110
+ * This is the third role-scoped setting, and it answers a question neither of its siblings can.
111
+ * `classRulesByRole` with `never` routes a class to a human, but the human it routes to may be
112
+ * the initiator themselves: the review card carries a merge button and the RBAC write floor is
113
+ * `member`, so a member's run can raise its own card and land on the next tap. `dryRunRoles`
114
+ * closes that by refusing both exits, but only for EVERY class at once. Between them sits the
115
+ * thing a workspace most often wants to say: a product manager may land copy and dependency
116
+ * bumps on this service, and may not land source, however good the scores look.
117
+ *
118
+ * Three readings define it, and each is deliberate:
119
+ *
120
+ * - **An ALLOWLIST, never a denylist.** A class nobody thought about is OUTSIDE the list, so a
121
+ * class added to the vocabulary in a later release is refused for a scoped role rather than
122
+ * silently landed by it. Same safety property as {@link narrowMergeClassRule}: authoring one
123
+ * can subtract capability, never add it.
124
+ * - **Absent means UNRESTRICTED, not empty.** Silence is not an empty allowlist, exactly as an
125
+ * absent class is not a `thresholds` rule in {@link classRulesByRoleSchema}. Only a role
126
+ * somebody wrote an entry for is scoped, so `{}` is the identity the wire contract says it is
127
+ * (and an EMPTY array is a real, different policy: that role lands nothing).
128
+ * - **`unknown` is INERT.** An unreadable diff must not hold back a run that would otherwise
129
+ * have landed, the same reading `resolveMergeClassRule` takes: a VCS outage cannot change
130
+ * policy. This is the OPPOSITE direction from the first reading, and deliberately so: a class
131
+ * we have never heard of is a policy gap, while a class we could not READ is an outage, and
132
+ * only one of those is evidence about the change.
133
+ */
134
+ export const submissionClassesByRoleSchema = v.partial(
135
+ // STRICT for the same reason both rule maps are: a caller who thinks they authored an
136
+ // allowlist must not be told it worked when the role name was a typo.
137
+ v.strictObject(Object.fromEntries(WORKSPACE_ROLES.map((r) => [r, v.array(ruleableChangeClassSchema)]))));
104
138
  /**
105
139
  * How much review a rule DEMANDS, higher is stricter. The ordering is the point of the scale:
106
140
  * `always` merges with nothing consulted, `thresholds` merges only within the score ceilings, and
@@ -134,6 +168,64 @@ const MERGE_CLASS_RULE_STRICTNESS = {
134
168
  export function narrowMergeClassRule(base, role) {
135
169
  return MERGE_CLASS_RULE_STRICTNESS[role] > MERGE_CLASS_RULE_STRICTNESS[base] ? role : base;
136
170
  }
171
+ /**
172
+ * Whether `next` demands LESS review than `held`, over the same ordering
173
+ * {@link narrowMergeClassRule} composes on. Derived from that one function rather than from a
174
+ * second read of the strictness table, so the rules can never be ordered one way for narrowing
175
+ * and another way for the comparison that refuses a relaxation.
176
+ */
177
+ export function mergeClassRuleRelaxes(held, next) {
178
+ return next !== held && narrowMergeClassRule(next, held) === held;
179
+ }
180
+ /**
181
+ * The rule a preset applies to a given change class: the explicit entry when there is one, else
182
+ * `thresholds` (so an empty/absent rule map behaves exactly as it did before per-class rules).
183
+ *
184
+ * `unknown` ALWAYS resolves to `thresholds` — no rule may match it. This is the invariant that
185
+ * keeps a classification failure inert: a transient VCS outage falls back to the score
186
+ * comparison instead of silently adopting a widened (or tightened) policy.
187
+ */
188
+ export function resolveMergeClassRule(rules, changeClass) {
189
+ if (changeClass === 'unknown')
190
+ return 'thresholds';
191
+ return rules?.[changeClass] ?? 'thresholds';
192
+ }
193
+ /**
194
+ * Resolve the per-class rule that governs one run: the preset's base rule for the run's change
195
+ * class, narrowed by the entry (if any) its initiator's ROLE carries.
196
+ *
197
+ * Two absences pass straight through to the base rule, deliberately and for the same reason:
198
+ * an unattributed run (no pinned role — a schedule fire, a public-API start, auth-disabled dev)
199
+ * and a role with no authored entry. Neither is evidence about how much review the work needs,
200
+ * and inventing a tier for the first would either hand it the preset's widest rules or sandbox
201
+ * every scheduled run in the deployment the day someone first authors a role entry.
202
+ *
203
+ * `unknown` remains inert through both layers: {@link resolveMergeClassRule} already forces it to
204
+ * `thresholds`, and narrowing `thresholds` by a rule authored for some OTHER class cannot reach
205
+ * it, so a diff we could not read still falls back to the score comparison whoever started it.
206
+ *
207
+ * It lives here rather than in kernel for the reason {@link narrowMergeClassRule} does, and it
208
+ * moved here the day the SPA acquired a second question that needs the same answer: which presets
209
+ * a task may be re-pointed at (`refuseRiskPolicySelection`). The picker has to agree with the
210
+ * engine about what a role's entry actually costs that role, and a rule the SPA cannot import is
211
+ * a rule the SPA reimplements.
212
+ */
213
+ export function resolveRoleScopedMergeClassRule(input) {
214
+ const base = resolveMergeClassRule(input.rules, input.changeClass);
215
+ if (!input.role || input.changeClass === 'unknown') {
216
+ return { base, effective: base, narrowedByRole: false };
217
+ }
218
+ // Read the role's entry as an OPTIONAL lookup, NOT through `resolveMergeClassRule`. That helper
219
+ // substitutes `thresholds` for an absent class, which is right when it IS the policy and wrong
220
+ // here: a role that authored nothing has said nothing, and folding its silence in as
221
+ // `thresholds` would narrow every `always` in the base map the moment a preset gained its first
222
+ // role entry — for the roles that entry is not even about. Absent is not a rule.
223
+ const roleRule = input.byRole?.[input.role]?.[input.changeClass];
224
+ if (!roleRule)
225
+ return { base, effective: base, narrowedByRole: false };
226
+ const effective = narrowMergeClassRule(base, roleRule);
227
+ return { base, effective, narrowedByRole: effective !== base };
228
+ }
137
229
  /**
138
230
  * Whether a preset's {@link dryRunRolesSchema} sandboxes a run started under `role`.
139
231
  *
@@ -146,6 +238,42 @@ export function narrowMergeClassRule(base, role) {
146
238
  export function dryRunForcedForRole(dryRunRoles, role) {
147
239
  return !!role && !!dryRunRoles?.includes(role);
148
240
  }
241
+ /**
242
+ * The allowlist that governs one run, or `undefined` when nothing does.
243
+ *
244
+ * Kept apart from {@link submissionAllowedForRole} because the two questions differ: "is this run
245
+ * scoped at all" decides whether the merge path owes a classification (one VCS call), and only
246
+ * then does "may it land THIS class" have anything to compare. Reading the boolean first and the
247
+ * verdict second is what keeps an unscoped preset paying for neither.
248
+ */
249
+ export function submissionAllowlistForRole(byRole, role) {
250
+ // A run with no pinned role matches no entry, exactly as `dryRunForcedForRole` reads one: a
251
+ // schedule fire / public-API start / auth-disabled dev is not a tier, and treating it as one
252
+ // would scope every unattributed run in a deployment the day somebody first scopes a role.
253
+ if (!role)
254
+ return undefined;
255
+ return byRole?.[role];
256
+ }
257
+ /**
258
+ * Whether a preset lets a run started by `role` LAND a change of `changeClass`.
259
+ *
260
+ * Every absence answers `true`, and each for its own reason: no pinned role matches no entry, a
261
+ * role with no authored entry is unrestricted, and an `unknown` class is an unreadable diff
262
+ * rather than evidence about the change. Only a role that HAS an allowlist, on a diff that
263
+ * classified, can be refused, and then the list is exhaustive, so a class outside it is refused
264
+ * whether the operator excluded it on purpose or the vocabulary gained it after they wrote the
265
+ * policy.
266
+ *
267
+ * It lives in contracts, beside the map it reads, because the SPA has to state the same verdict:
268
+ * a merge control that offered to land a change the engine will refuse would be advertising a
269
+ * capability the person does not have.
270
+ */
271
+ export function submissionAllowedForRole(byRole, role, changeClass) {
272
+ if (changeClass === 'unknown')
273
+ return true;
274
+ const allowed = submissionAllowlistForRole(byRole, role);
275
+ return !allowed || allowed.includes(changeClass);
276
+ }
149
277
  export const mergeAssessmentSchema = v.object({
150
278
  /** How intricate the change is (size, coupling, subtlety). */
151
279
  complexity: v.pipe(v.number(), v.minValue(0), v.maxValue(1)),
@@ -262,6 +390,14 @@ export const riskPolicySchema = v.object({
262
390
  * and the PR opens, but nothing merges. Empty on the built-ins.
263
391
  */
264
392
  dryRunRoles: dryRunRolesSchema,
393
+ /**
394
+ * Per-ROLE allowlist of the change classes this preset will land at all
395
+ * ({@link submissionClassesByRoleSchema}). Orthogonal to `classRulesByRole`, and both apply: a
396
+ * class may be `always` under the role's class rules and still outside its allowlist, and the
397
+ * allowlist wins, because it bars landing rather than deciding how much review landing takes.
398
+ * A role with no entry is unrestricted, so `{}` is the identity. Empty on the built-ins.
399
+ */
400
+ submissionClassesByRole: submissionClassesByRoleSchema,
265
401
  /** The workspace's fallback preset, used by tasks that pick none. Exactly one is true. */
266
402
  isDefault: v.boolean(),
267
403
  /**
@@ -307,6 +443,8 @@ export const createRiskPolicySchema = v.object({
307
443
  classRulesByRole: v.optional(classRulesByRoleSchema, {}),
308
444
  /** Roles whose runs are forced into dry-run mode; absent ⇒ nobody is sandboxed. */
309
445
  dryRunRoles: v.optional(dryRunRolesSchema, []),
446
+ /** Per-role allowlist of landable change classes; absent ⇒ every role is unrestricted. */
447
+ submissionClassesByRole: v.optional(submissionClassesByRoleSchema, {}),
310
448
  /** Make this the workspace default (demotes the previous default). */
311
449
  isDefault: v.optional(v.boolean(), false),
312
450
  });
@@ -333,6 +471,8 @@ export const updateRiskPolicySchema = v.object({
333
471
  classRulesByRole: v.optional(classRulesByRoleSchema),
334
472
  /** Replaces the whole list, so un-sandboxing a role is a plain omission. */
335
473
  dryRunRoles: v.optional(dryRunRolesSchema),
474
+ /** Replaces the whole map, so un-scoping a role is a plain omission (never an empty array). */
475
+ submissionClassesByRole: v.optional(submissionClassesByRoleSchema),
336
476
  isDefault: v.optional(v.boolean()),
337
477
  });
338
478
  /** Parse-or-throw an assessment payload an agent returned (the engine validates it). */
@@ -378,6 +518,17 @@ export const mergeDecisionThresholdsSchema = v.object({
378
518
  * someone else".
379
519
  */
380
520
  roleRule: v.optional(mergeClassRuleSchema),
521
+ /**
522
+ * The change classes the initiator's role may land at all, recorded whenever that role carried
523
+ * a submission allowlist, not only when the allowlist is what held the PR back.
524
+ *
525
+ * Present-means-scoped is the useful reading here (the opposite of `roleRule` above, which is
526
+ * recorded only when it changed the outcome): an allowlist that PERMITTED this class is the
527
+ * fact that explains why an otherwise identical PR on another class will not land, and a
528
+ * banner that mentioned the scope only on the refusal would make the permission look like an
529
+ * absence of policy.
530
+ */
531
+ submissionClasses: v.optional(v.array(ruleableChangeClassSchema)),
381
532
  });
382
533
  export const mergeDecisionSchema = v.object({
383
534
  /** What the engine did: merged the PR for real, or left it open for a human. */
@@ -405,6 +556,12 @@ export const mergeDecisionSchema = v.object({
405
556
  * `class_requires_review` because the two need opposite fixes: one is a policy about the
406
557
  * KIND of change (edit the class rule), the other about WHO started it (a teammate on a
407
558
  * higher tier can merge this PR as it stands).
559
+ * - `submission_not_allowed`: review; the initiator's role carries a submission allowlist and
560
+ * this run's change class is outside it, so the platform will not land the work whatever the
561
+ * scores or the class rules say. Kept apart from `role_requires_review` because the remedies
562
+ * differ in kind: that one is satisfied by ANY reviewer merging the PR through this
563
+ * platform, while this one refuses the platform merge path outright (the PR is still a real
564
+ * PR, and someone with write access on the host can merge it there).
408
565
  * - `dry_run`: review; the run was a DRY RUN, so no outcome of the assessment could have
409
566
  * merged it. The master switch above every other reason, including `auto_merge_disabled`:
410
567
  * a preset that would otherwise auto-merge must not report a dry run's PR as "held back by
@@ -421,6 +578,7 @@ export const mergeDecisionSchema = v.object({
421
578
  'class_auto_merge',
422
579
  'class_requires_review',
423
580
  'role_requires_review',
581
+ 'submission_not_allowed',
424
582
  'dry_run',
425
583
  ]),
426
584
  /** The merger's assessment (absent only when it produced no parseable one). */
package/dist/merge.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"merge.js","sourceRoot":"","sources":["../src/merge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../src/merge.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@ import * as v from 'valibot';
7
7
  * route behind it is exactly the "refusal advertising a capability we do not have" defect that set
8
8
  * builds. Add a member only together with its routes.
9
9
  */
10
- export declare const publicDecisionKindSchema: v.PicklistSchema<["requirements-review", "fork", "judge", "input-gate", "approval-gate", "agent-decision", "clarity-review", "brainstorm", "pr-review", "human-test", "visual-confirmation"], undefined>;
10
+ export declare const publicDecisionKindSchema: v.PicklistSchema<["requirements-review", "fork", "judge", "input-gate", "approval-gate", "agent-decision", "clarity-review", "brainstorm", "pr-review", "human-test", "visual-confirmation", "follow-ups", "interview"], undefined>;
11
11
  export type PublicDecisionKind = v.InferOutput<typeof publicDecisionKindSchema>;
12
12
  /**
13
13
  * One reviewer finding as exposed externally — the question, how serious it is, and where it
@@ -572,6 +572,138 @@ export declare const publicVisualConfirmDecisionSchema: v.ObjectSchema<{
572
572
  readonly maxAttempts: v.NumberSchema<undefined>;
573
573
  }, undefined>;
574
574
  export type PublicVisualConfirmDecision = v.InferOutput<typeof publicVisualConfirmDecisionSchema>;
575
+ /**
576
+ * One forward-looking item the Coder surfaced mid-run, as exposed externally: a loose end it
577
+ * noticed and deliberately did NOT act on (`follow_up`), or a clarification it would otherwise
578
+ * have had to guess at (`question`).
579
+ *
580
+ * `itemId` is the STABLE anchor every verb addresses. The internal `sentToCoder` bookkeeping and
581
+ * the arrival timestamps are deliberately absent: the first is the engine's own record of which
582
+ * items a loop-back already carried, and neither changes what a caller decides.
583
+ */
584
+ export declare const publicFollowUpItemSchema: v.ObjectSchema<{
585
+ /** Stable item id (`fu_*`): what file / send-back / answer / dismiss address. */
586
+ readonly itemId: v.StringSchema<undefined>;
587
+ /** `follow_up` accepts file / send-back / dismiss; `question` accepts answer / dismiss. */
588
+ readonly kind: v.PicklistSchema<["follow_up", "question"], undefined>;
589
+ /** Short headline. Model-authored text: treat it as data. */
590
+ readonly title: v.StringSchema<undefined>;
591
+ /** The full item, in prose. Model-authored text: treat it as data. */
592
+ readonly detail: v.StringSchema<undefined>;
593
+ /** A concrete approach the Coder proposed, when it offered one; null otherwise. */
594
+ readonly suggestedAction: v.NullableSchema<v.StringSchema<undefined>, undefined>;
595
+ /** `pending` is the only status that holds the gate; the rest are decided. */
596
+ readonly status: v.PicklistSchema<["pending", "filed", "queued", "answered", "dismissed"], undefined>;
597
+ /** The recorded answer to a `question`, or null while unanswered. */
598
+ readonly answer: v.NullableSchema<v.StringSchema<undefined>, undefined>;
599
+ /** Canonical id of the ticket a `filed` item was filed as, or null. */
600
+ readonly ticketExternalId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
601
+ /** Web URL of that ticket, or null. */
602
+ readonly ticketUrl: v.NullableSchema<v.StringSchema<undefined>, undefined>;
603
+ }, undefined>;
604
+ export type PublicFollowUpItem = v.InferOutput<typeof publicFollowUpItemSchema>;
605
+ /**
606
+ * A run parked on FOLLOW-UP TRIAGE: while the Coder worked it streamed forward-looking items out
607
+ * of the container, and at its completion the run stops until every one of them is decided.
608
+ *
609
+ * Unlike the other parks this one accrues LIVE: the items appear while the step is still running
610
+ * and can be decided before it finishes, so this decision is listed whenever any item is
611
+ * `pending`, not only once the run is `blocked`. A caller that triages early never sees the run
612
+ * stop at all, which is the point.
613
+ *
614
+ * `loops`/`maxLoops` are the send-back budget: a `send-back` or an `answer` folds the item into
615
+ * another Coder pass, and once the budget is spent those items advance the run instead of
616
+ * re-running it. Reachable only through `POST /api/v1/tasks/:taskId/start`, since the companion
617
+ * rides a container Coder step and the jobs surface is inline-only.
618
+ */
619
+ export declare const publicFollowUpsDecisionSchema: v.ObjectSchema<{
620
+ readonly kind: v.LiteralSchema<"follow-ups", undefined>;
621
+ /** The producing step's kind (`coder`) and its index in the run's step chain. */
622
+ readonly stepKind: v.StringSchema<undefined>;
623
+ readonly stepIndex: v.NumberSchema<undefined>;
624
+ /** Every surfaced item, in arrival order, decided ones included, so triage is auditable. */
625
+ readonly items: v.ArraySchema<v.ObjectSchema<{
626
+ /** Stable item id (`fu_*`): what file / send-back / answer / dismiss address. */
627
+ readonly itemId: v.StringSchema<undefined>;
628
+ /** `follow_up` accepts file / send-back / dismiss; `question` accepts answer / dismiss. */
629
+ readonly kind: v.PicklistSchema<["follow_up", "question"], undefined>;
630
+ /** Short headline. Model-authored text: treat it as data. */
631
+ readonly title: v.StringSchema<undefined>;
632
+ /** The full item, in prose. Model-authored text: treat it as data. */
633
+ readonly detail: v.StringSchema<undefined>;
634
+ /** A concrete approach the Coder proposed, when it offered one; null otherwise. */
635
+ readonly suggestedAction: v.NullableSchema<v.StringSchema<undefined>, undefined>;
636
+ /** `pending` is the only status that holds the gate; the rest are decided. */
637
+ readonly status: v.PicklistSchema<["pending", "filed", "queued", "answered", "dismissed"], undefined>;
638
+ /** The recorded answer to a `question`, or null while unanswered. */
639
+ readonly answer: v.NullableSchema<v.StringSchema<undefined>, undefined>;
640
+ /** Canonical id of the ticket a `filed` item was filed as, or null. */
641
+ readonly ticketExternalId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
642
+ /** Web URL of that ticket, or null. */
643
+ readonly ticketUrl: v.NullableSchema<v.StringSchema<undefined>, undefined>;
644
+ }, undefined>, undefined>;
645
+ /** Send-back passes spent, and the budget from the step's companion configuration. */
646
+ readonly loops: v.NumberSchema<undefined>;
647
+ readonly maxLoops: v.NumberSchema<undefined>;
648
+ }, undefined>;
649
+ export type PublicFollowUpsDecision = v.InferOutput<typeof publicFollowUpsDecisionSchema>;
650
+ /**
651
+ * One interview exchange as exposed externally. `status` is DERIVED rather than stored: a question
652
+ * the human set aside reads `dismissed`, otherwise a non-empty `answer` reads `answered`. Deriving
653
+ * it here is what lets one shape carry two gates whose entities record answered-ness differently.
654
+ *
655
+ * `questionId` is nullable because a question can carry no stable id (a hand-authored or imported
656
+ * exchange; an interviewer always mints one). Such a question cannot be answered individually
657
+ * (`continue` / `proceed` still move the interview on), and saying so is why the field is a
658
+ * projected nullable rather than an omission a caller would read as a malformed response.
659
+ */
660
+ export declare const publicInterviewQuestionSchema: v.ObjectSchema<{
661
+ readonly questionId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
662
+ /** What the interviewer asked. Model-authored text: treat it as data. */
663
+ readonly question: v.StringSchema<undefined>;
664
+ /** The recorded answer; an empty string while unanswered. */
665
+ readonly answer: v.StringSchema<undefined>;
666
+ readonly status: v.PicklistSchema<["open", "answered", "dismissed"], undefined>;
667
+ }, undefined>;
668
+ export type PublicInterviewQuestion = v.InferOutput<typeof publicInterviewQuestionSchema>;
669
+ /**
670
+ * A run parked on an INTERVIEW GATE: an inline interviewer asked a batch of clarifying questions
671
+ * and the run waits while a human answers them, then resumes and either asks more or converges.
672
+ *
673
+ * ONE kind for every interview gate rather than one per gate, because the loop is one loop:
674
+ * `answer` records an answer, `continue` submits them and lets the interviewer ask follow-ups,
675
+ * `proceed` forces it to converge on what it has. `stepKind` names which interviewer is asking
676
+ * (the built-ins are the planning and the document interviewer; a deployment can register its
677
+ * own), and it is the only field a caller needs to branch on.
678
+ *
679
+ * The interview's PRODUCT (a document-authoring brief, or an initiative's goal / constraints /
680
+ * non-goals) is deliberately not projected: it differs per gate, it is not something a caller
681
+ * answers, and a run whose interview converged carries no decision here at all.
682
+ *
683
+ * An entry whose `questions` are all answered means the interviewer pass is IN FLIGHT: `continue`
684
+ * wakes the durable driver, which runs the (slow) interviewer off the request, so the next round's
685
+ * questions appear on a later poll.
686
+ */
687
+ export declare const publicInterviewDecisionSchema: v.ObjectSchema<{
688
+ readonly kind: v.LiteralSchema<"interview", undefined>;
689
+ /** Which interviewer is asking (`doc-interviewer`, `initiative-interviewer`, …). */
690
+ readonly stepKind: v.StringSchema<undefined>;
691
+ /** The board task the interview is anchored on. */
692
+ readonly taskId: v.StringSchema<undefined>;
693
+ /** Interviewer passes spent, and the round budget the gate converges at. */
694
+ readonly round: v.NumberSchema<undefined>;
695
+ readonly maxRounds: v.NumberSchema<undefined>;
696
+ /** The exchanges so far, oldest first. */
697
+ readonly questions: v.ArraySchema<v.ObjectSchema<{
698
+ readonly questionId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
699
+ /** What the interviewer asked. Model-authored text: treat it as data. */
700
+ readonly question: v.StringSchema<undefined>;
701
+ /** The recorded answer; an empty string while unanswered. */
702
+ readonly answer: v.StringSchema<undefined>;
703
+ readonly status: v.PicklistSchema<["open", "answered", "dismissed"], undefined>;
704
+ }, undefined>, undefined>;
705
+ }, undefined>;
706
+ export type PublicInterviewDecision = v.InferOutput<typeof publicInterviewDecisionSchema>;
575
707
  export declare const publicDecisionSchema: v.VariantSchema<"kind", [v.ObjectSchema<{
576
708
  readonly kind: v.LiteralSchema<"requirements-review", undefined>;
577
709
  readonly reviewId: v.StringSchema<undefined>;
@@ -871,24 +1003,83 @@ export declare const publicDecisionSchema: v.VariantSchema<"kind", [v.ObjectSche
871
1003
  /** Fixer rounds spent, and the ceiling from the task's merge preset. */
872
1004
  readonly attempts: v.NumberSchema<undefined>;
873
1005
  readonly maxAttempts: v.NumberSchema<undefined>;
1006
+ }, undefined>, v.ObjectSchema<{
1007
+ readonly kind: v.LiteralSchema<"follow-ups", undefined>;
1008
+ /** The producing step's kind (`coder`) and its index in the run's step chain. */
1009
+ readonly stepKind: v.StringSchema<undefined>;
1010
+ readonly stepIndex: v.NumberSchema<undefined>;
1011
+ /** Every surfaced item, in arrival order, decided ones included, so triage is auditable. */
1012
+ readonly items: v.ArraySchema<v.ObjectSchema<{
1013
+ /** Stable item id (`fu_*`): what file / send-back / answer / dismiss address. */
1014
+ readonly itemId: v.StringSchema<undefined>;
1015
+ /** `follow_up` accepts file / send-back / dismiss; `question` accepts answer / dismiss. */
1016
+ readonly kind: v.PicklistSchema<["follow_up", "question"], undefined>;
1017
+ /** Short headline. Model-authored text: treat it as data. */
1018
+ readonly title: v.StringSchema<undefined>;
1019
+ /** The full item, in prose. Model-authored text: treat it as data. */
1020
+ readonly detail: v.StringSchema<undefined>;
1021
+ /** A concrete approach the Coder proposed, when it offered one; null otherwise. */
1022
+ readonly suggestedAction: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1023
+ /** `pending` is the only status that holds the gate; the rest are decided. */
1024
+ readonly status: v.PicklistSchema<["pending", "filed", "queued", "answered", "dismissed"], undefined>;
1025
+ /** The recorded answer to a `question`, or null while unanswered. */
1026
+ readonly answer: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1027
+ /** Canonical id of the ticket a `filed` item was filed as, or null. */
1028
+ readonly ticketExternalId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1029
+ /** Web URL of that ticket, or null. */
1030
+ readonly ticketUrl: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1031
+ }, undefined>, undefined>;
1032
+ /** Send-back passes spent, and the budget from the step's companion configuration. */
1033
+ readonly loops: v.NumberSchema<undefined>;
1034
+ readonly maxLoops: v.NumberSchema<undefined>;
1035
+ }, undefined>, v.ObjectSchema<{
1036
+ readonly kind: v.LiteralSchema<"interview", undefined>;
1037
+ /** Which interviewer is asking (`doc-interviewer`, `initiative-interviewer`, …). */
1038
+ readonly stepKind: v.StringSchema<undefined>;
1039
+ /** The board task the interview is anchored on. */
1040
+ readonly taskId: v.StringSchema<undefined>;
1041
+ /** Interviewer passes spent, and the round budget the gate converges at. */
1042
+ readonly round: v.NumberSchema<undefined>;
1043
+ readonly maxRounds: v.NumberSchema<undefined>;
1044
+ /** The exchanges so far, oldest first. */
1045
+ readonly questions: v.ArraySchema<v.ObjectSchema<{
1046
+ readonly questionId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1047
+ /** What the interviewer asked. Model-authored text: treat it as data. */
1048
+ readonly question: v.StringSchema<undefined>;
1049
+ /** The recorded answer; an empty string while unanswered. */
1050
+ readonly answer: v.StringSchema<undefined>;
1051
+ readonly status: v.PicklistSchema<["open", "answered", "dismissed"], undefined>;
1052
+ }, undefined>, undefined>;
874
1053
  }, undefined>], undefined>;
875
1054
  export type PublicDecision = v.InferOutput<typeof publicDecisionSchema>;
876
1055
  /**
877
- * A run's currently-parked decisions. `parked` is the single flag a caller polls or reacts to:
878
- * true when the run is `blocked` awaiting one of the decisions listed. An empty list with
879
- * `parked: false` is the ordinary case for a run that is simply still working.
1056
+ * What a run is currently asking a human, and whether it has STOPPED to ask. The two are related
1057
+ * but not the same question, and a caller that treats `parked` as a gate on reading `decisions`
1058
+ * gets the common case right and the useful case wrong:
880
1059
  *
881
- * `parked: true` with an EMPTY list is the deliberately loud case: the run is waiting on a
882
- * surface this projection does not model, and the honest report of that is an empty list rather
883
- * than a silent `parked: false`. The one park that is still expected to produce it is
884
- * `human-review`, whose answer is a person approving the PR on the VCS host, not an API call.
1060
+ * - `parked: true`, non-empty list: the ordinary park. The run is `blocked` and will not move
1061
+ * until one of these is answered.
1062
+ * - `parked: false`, non-empty list: the run is still working and asking anyway. Today only
1063
+ * `follow-ups` does this: the Coder streams its items mid-run and they can be decided before it
1064
+ * finishes, so an integration that polls `decisions` regardless of `parked` never sees the run
1065
+ * stop at all. One that reads `decisions` only when `parked` is true still works, it just waits.
1066
+ * - `parked: true`, EMPTY list: the deliberately loud case. The run is waiting on a surface this
1067
+ * projection does not model, and an empty list is the honest report of that rather than a silent
1068
+ * `parked: false`. Two parks are still expected to produce it: `human-review`, whose answer is a
1069
+ * person approving the PR on the VCS host rather than an API call; and an unbounded human-wait
1070
+ * GATE a deployment registered itself, which this projection has no way to read and whose answer
1071
+ * lives wherever that deployment put it.
1072
+ * - `parked: false`, empty list: the run is simply still working.
885
1073
  */
886
1074
  export declare const publicDecisionListSchema: v.ObjectSchema<{
887
1075
  readonly runId: v.StringSchema<undefined>;
888
1076
  readonly taskId: v.StringSchema<undefined>;
889
1077
  /** The run's raw status — `blocked` is the parked state. */
890
1078
  readonly status: v.PicklistSchema<["running", "blocked", "paused", "done", "failed"], undefined>;
891
- /** Whether the run is currently parked awaiting a human decision. */
1079
+ /**
1080
+ * Whether the run has STOPPED awaiting a human decision (`status === 'blocked'`). Not a
1081
+ * precondition for `decisions` being non-empty: see the note above.
1082
+ */
892
1083
  readonly parked: v.BooleanSchema<undefined>;
893
1084
  readonly decisions: v.ArraySchema<v.VariantSchema<"kind", [v.ObjectSchema<{
894
1085
  readonly kind: v.LiteralSchema<"requirements-review", undefined>;
@@ -1189,6 +1380,53 @@ export declare const publicDecisionListSchema: v.ObjectSchema<{
1189
1380
  /** Fixer rounds spent, and the ceiling from the task's merge preset. */
1190
1381
  readonly attempts: v.NumberSchema<undefined>;
1191
1382
  readonly maxAttempts: v.NumberSchema<undefined>;
1383
+ }, undefined>, v.ObjectSchema<{
1384
+ readonly kind: v.LiteralSchema<"follow-ups", undefined>;
1385
+ /** The producing step's kind (`coder`) and its index in the run's step chain. */
1386
+ readonly stepKind: v.StringSchema<undefined>;
1387
+ readonly stepIndex: v.NumberSchema<undefined>;
1388
+ /** Every surfaced item, in arrival order, decided ones included, so triage is auditable. */
1389
+ readonly items: v.ArraySchema<v.ObjectSchema<{
1390
+ /** Stable item id (`fu_*`): what file / send-back / answer / dismiss address. */
1391
+ readonly itemId: v.StringSchema<undefined>;
1392
+ /** `follow_up` accepts file / send-back / dismiss; `question` accepts answer / dismiss. */
1393
+ readonly kind: v.PicklistSchema<["follow_up", "question"], undefined>;
1394
+ /** Short headline. Model-authored text: treat it as data. */
1395
+ readonly title: v.StringSchema<undefined>;
1396
+ /** The full item, in prose. Model-authored text: treat it as data. */
1397
+ readonly detail: v.StringSchema<undefined>;
1398
+ /** A concrete approach the Coder proposed, when it offered one; null otherwise. */
1399
+ readonly suggestedAction: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1400
+ /** `pending` is the only status that holds the gate; the rest are decided. */
1401
+ readonly status: v.PicklistSchema<["pending", "filed", "queued", "answered", "dismissed"], undefined>;
1402
+ /** The recorded answer to a `question`, or null while unanswered. */
1403
+ readonly answer: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1404
+ /** Canonical id of the ticket a `filed` item was filed as, or null. */
1405
+ readonly ticketExternalId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1406
+ /** Web URL of that ticket, or null. */
1407
+ readonly ticketUrl: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1408
+ }, undefined>, undefined>;
1409
+ /** Send-back passes spent, and the budget from the step's companion configuration. */
1410
+ readonly loops: v.NumberSchema<undefined>;
1411
+ readonly maxLoops: v.NumberSchema<undefined>;
1412
+ }, undefined>, v.ObjectSchema<{
1413
+ readonly kind: v.LiteralSchema<"interview", undefined>;
1414
+ /** Which interviewer is asking (`doc-interviewer`, `initiative-interviewer`, …). */
1415
+ readonly stepKind: v.StringSchema<undefined>;
1416
+ /** The board task the interview is anchored on. */
1417
+ readonly taskId: v.StringSchema<undefined>;
1418
+ /** Interviewer passes spent, and the round budget the gate converges at. */
1419
+ readonly round: v.NumberSchema<undefined>;
1420
+ readonly maxRounds: v.NumberSchema<undefined>;
1421
+ /** The exchanges so far, oldest first. */
1422
+ readonly questions: v.ArraySchema<v.ObjectSchema<{
1423
+ readonly questionId: v.NullableSchema<v.StringSchema<undefined>, undefined>;
1424
+ /** What the interviewer asked. Model-authored text: treat it as data. */
1425
+ readonly question: v.StringSchema<undefined>;
1426
+ /** The recorded answer; an empty string while unanswered. */
1427
+ readonly answer: v.StringSchema<undefined>;
1428
+ readonly status: v.PicklistSchema<["open", "answered", "dismissed"], undefined>;
1429
+ }, undefined>, undefined>;
1192
1430
  }, undefined>], undefined>, undefined>;
1193
1431
  }, undefined>;
1194
1432
  export type PublicDecisionList = v.InferOutput<typeof publicDecisionListSchema>;
@@ -1349,4 +1587,39 @@ export declare const publicRequestGateFixSchema: v.ObjectSchema<{
1349
1587
  readonly findings: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 10000, undefined>]>;
1350
1588
  }, undefined>;
1351
1589
  export type PublicRequestGateFixInput = v.InferOutput<typeof publicRequestGateFixSchema>;
1590
+ /**
1591
+ * Answer one `question` item the Coder surfaced. Identical to the SPA's
1592
+ * {@link answerFollowUpSchema} and aliased rather than re-declared, on the same grounds as the
1593
+ * judge and input-gate bodies: both surfaces drive the SAME service method, so there is nothing
1594
+ * to narrow, and a structurally identical twin would be a second published type in four SDKs
1595
+ * meaning exactly what the first one means.
1596
+ */
1597
+ export declare const publicAnswerFollowUpSchema: v.ObjectSchema<{
1598
+ readonly answer: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 4000, undefined>]>;
1599
+ }, undefined>;
1600
+ export type PublicAnswerFollowUpInput = v.InferOutput<typeof publicAnswerFollowUpSchema>;
1601
+ /**
1602
+ * Answer one interview question. Declared fresh rather than aliased, unlike the bodies above: two
1603
+ * gates ride this route (the planning and the document interviewer) and each declares its own
1604
+ * internal body, so aliasing either one would privilege that gate's bounds on a surface serving
1605
+ * both, and a bound that is right for one and wrong for the other refuses valid input.
1606
+ *
1607
+ * The numbers are therefore taken from what the two gates STORE rather than from what either one
1608
+ * accepts: an exchange lives in `initiativeQaSchema` / `docInterviewQaSchema`, both of which cap an
1609
+ * id at 80 and an answer at 2000, so a question this surface can name is a question these bounds
1610
+ * can address. They are stated as literals rather than derived from those constants because this
1611
+ * is a published contract: deriving it would let an internal cap SHRINK the public bound silently,
1612
+ * which is the one direction `/api/v1` may not move. `publicAnswerInterviewBounds` in
1613
+ * `public-decisions.test.ts` asserts the relation instead, so a gate that widens its own storage
1614
+ * fails a test here rather than refusing valid input in production.
1615
+ *
1616
+ * An EMPTY `answer` is accepted, because both services accept it: it clears an answer recorded by
1617
+ * mistake, where a minimum length would leave a caller no way to undo one.
1618
+ */
1619
+ export declare const publicAnswerInterviewSchema: v.ObjectSchema<{
1620
+ /** The `questionId` from the decision's `questions`. */
1621
+ readonly questionId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 80, undefined>]>;
1622
+ readonly answer: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
1623
+ }, undefined>;
1624
+ export type PublicAnswerInterviewInput = v.InferOutput<typeof publicAnswerInterviewSchema>;
1352
1625
  //# sourceMappingURL=public-decisions.d.ts.map