@cat-factory/app 0.20.0 → 0.22.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.
@@ -59,8 +59,11 @@ export type BlockType =
59
59
  * - `module` a sub-frame inside a service; created when a task assigned to a
60
60
  * not-yet-existing module is implemented (tasks can also be dragged in)
61
61
  * - `task` a draggable unit of work living inside a service or a module
62
+ * - `epic` a NON-structural grouping node: it groups tasks (which keep their own
63
+ * service/module parent) via their `epicId`, and is drawn linked to them.
64
+ * Never a container — nothing is reparented into an epic.
62
65
  */
63
- export type BlockLevel = 'frame' | 'module' | 'task'
66
+ export type BlockLevel = 'frame' | 'module' | 'task' | 'epic'
64
67
 
65
68
  /**
66
69
  * The kind of work a task represents, chosen at creation. Drives the card's badge/icon
@@ -109,6 +112,16 @@ export interface Block {
109
112
  level: BlockLevel
110
113
  /** parent container: service or module for a task, service for a module. */
111
114
  parentId: string | null
115
+ /**
116
+ * task-only: membership link to an `epic`-level block, independent of `parentId`.
117
+ * Set when the task belongs to an epic (drawn linked to it); absent/null otherwise.
118
+ */
119
+ epicId?: string | null
120
+ /**
121
+ * task-only: when this task merges, automatically start the tasks that depend on it
122
+ * (and whose other dependencies are also done). Off/absent ⇒ dependents wait.
123
+ */
124
+ autoStartDependents?: boolean
112
125
  /** task-only: 0..1 confidence produced when the pipeline finishes. */
113
126
  confidence?: number
114
127
  /** task-only: the task-estimator's triage (complexity/risk/impact); absent until it runs. */
@@ -283,6 +296,10 @@ export type AgentKind =
283
296
  // read-only `bug-investigator` container agent enriches it into a prose report.
284
297
  | 'clarity-review'
285
298
  | 'bug-investigator'
299
+ // The human-testing gate: spins up an ephemeral environment and PARKS for a person to
300
+ // validate the change in a live URL, dispatching the Tester's `fixer` (from findings) or
301
+ // the `conflict-resolver` (on a conflicting pull-main) on demand. Opens its own window.
302
+ | 'human-test'
286
303
 
287
304
  /** A draggable agent definition shown in the agent palette. */
288
305
  /** Palette grouping for the agent archetypes (collapsible sections in the builder). */
@@ -333,6 +333,12 @@ export interface PipelineStep {
333
333
  * on non-gate steps. Mirrors `gateStepStateSchema`.
334
334
  */
335
335
  gate?: GateStepState | null
336
+ /**
337
+ * Live state of a `human-test` gate (ephemeral env + human validation loop): the phase,
338
+ * the live environment, the fix/pull-main round history, and any degraded-mode reason.
339
+ * Absent on non-human-test steps. Mirrors `humanTestStepStateSchema`.
340
+ */
341
+ humanTest?: HumanTestStepState | null
336
342
  }
337
343
 
338
344
  /** One failing CI check the gate's precheck saw (mirrors `gateFailingCheckSchema`). */
@@ -387,6 +393,53 @@ export interface TesterStepState {
387
393
  lastReport?: TestReport | null
388
394
  }
389
395
 
396
+ /** The lifecycle status of an ephemeral environment (mirrors `environmentStatusSchema`). */
397
+ export type HumanTestEnvironmentStatus =
398
+ | 'provisioning'
399
+ | 'ready'
400
+ | 'failed'
401
+ | 'expired'
402
+ | 'tearing_down'
403
+ | 'torn_down'
404
+
405
+ /** The compact env view a `human-test` gate carries (mirrors `humanTestEnvironmentSchema`). */
406
+ export interface HumanTestEnvironment {
407
+ id: string
408
+ url: string | null
409
+ status: HumanTestEnvironmentStatus
410
+ expiresAt?: number | null
411
+ }
412
+
413
+ /** One fix / pull-main round on a `human-test` gate (mirrors `humanTestRoundSchema`). */
414
+ export interface HumanTestRound {
415
+ kind: 'fix' | 'pull-main'
416
+ /** The human's findings (fix), or a one-line note (pull-main). */
417
+ findings: string
418
+ /** The helper container kind this round dispatched (`fixer` / `conflict-resolver`). */
419
+ helperKind: string
420
+ jobId?: string | null
421
+ /** How the helper ended once its job settled; absent while in flight. */
422
+ outcome?: 'completed' | 'failed' | null
423
+ /** epoch ms the round opened */
424
+ at: number
425
+ }
426
+
427
+ /** Live state of a `human-test` gate (mirrors `humanTestStepStateSchema`). */
428
+ export interface HumanTestStepState {
429
+ phase: 'provisioning' | 'awaiting_human' | 'fixing' | 'resolving_conflicts' | 'passed'
430
+ /** the live ephemeral environment (null in degraded manual mode / after destroy) */
431
+ environment?: HumanTestEnvironment | null
432
+ /** why no env was auto-provisioned (degraded manual mode), for the window to explain */
433
+ degradedReason?: string | null
434
+ /** how many helper (fixer / conflict-resolver) attempts have been dispatched so far */
435
+ attempts: number
436
+ /** ceiling on helper attempts (from the task's merge preset) */
437
+ maxAttempts: number
438
+ headSha?: string | null
439
+ /** append-only history of fix / pull-main rounds */
440
+ rounds?: HumanTestRound[]
441
+ }
442
+
390
443
  /** A pipeline instance running against one block. */
391
444
  export interface ExecutionInstance {
392
445
  id: string
@@ -14,6 +14,7 @@ export type NotificationType =
14
14
  | 'clarity_review'
15
15
  | 'release_regression'
16
16
  | 'decision_required'
17
+ | 'human_test_ready'
17
18
  export type NotificationStatus = 'open' | 'acted' | 'dismissed'
18
19
 
19
20
  /** The on-call agent's recommendation on a `release_regression`. */
@@ -29,6 +29,7 @@ const AGENT_KINDS: AgentKind[] = [
29
29
  'mocker',
30
30
  'business-documenter',
31
31
  'business-reviewer',
32
+ 'human-test',
32
33
  ]
33
34
  const BLOCK_TYPES: BlockType[] = [
34
35
  'frontend',
@@ -131,6 +131,18 @@ export const AGENT_ARCHETYPES: AgentArchetype[] = [
131
131
  description:
132
132
  "Turns scenarios into runnable tests — Playwright for frontend, the project's own framework for backend; adds only new ones.",
133
133
  },
134
+ {
135
+ kind: 'human-test',
136
+ label: 'Human Testing',
137
+ icon: 'i-lucide-user-check',
138
+ color: '#f59e0b',
139
+ category: 'test',
140
+ description:
141
+ 'Spins up an ephemeral environment and pauses for a person to validate the change in a live URL — request a fix from findings, pull main + redeploy, or recreate/destroy the env — before the pipeline continues.',
142
+ // Opens the dedicated human-testing window (env URL + confirm / request-fix / pull-main /
143
+ // recreate / destroy) instead of the generic prose step-detail panel.
144
+ resultView: 'human-test',
145
+ },
134
146
  {
135
147
  kind: 'documenter',
136
148
  label: 'Documenter',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.20.0",
3
+ "version": "0.22.0",
4
4
  "description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
5
5
  "repository": {
6
6
  "type": "git",