@cat-factory/app 0.180.0 → 0.182.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.
@@ -439,16 +439,17 @@ export const SYSTEM_AGENT_META: Record<string, AgentArchetype> = {
439
439
  description:
440
440
  'Provisions the ephemeral environment the tester and human-test gate run against (kubernetes / custom services); a no-op for docker-compose / infraless.',
441
441
  },
442
- // The Initiative Planning pipeline's two steps. Only runnable on an initiative
442
+ // The Initiative Planning pipeline's steps. Only runnable on an initiative
443
443
  // block (pl_initiative — enforced by the engine), so they are display-metadata
444
- // system kinds, never palette archetypes.
444
+ // system kinds, never palette archetypes. The analyst runs FIRST, ahead of the
445
+ // interviewer, so the interview covers only what the code cannot answer.
445
446
  'initiative-interviewer': {
446
447
  kind: 'initiative-interviewer',
447
448
  label: 'Initiative Interviewer',
448
449
  icon: 'i-lucide-messages-square',
449
450
  color: '#818cf8',
450
451
  description:
451
- 'Interviews you on the goals, scope and constraints of the initiative, then synthesizes the agreed brief the analyst and planner build on.',
452
+ 'Interviews you on the goals, scope and constraints the codebase cannot answer, then synthesizes the agreed brief the planner builds on.',
452
453
  // Opens the dedicated planning Q&A window (answer / continue / proceed) while parked.
453
454
  resultView: 'initiative-planning',
454
455
  },
@@ -458,7 +459,7 @@ export const SYSTEM_AGENT_META: Record<string, AgentArchetype> = {
458
459
  icon: 'i-lucide-microscope',
459
460
  color: '#818cf8',
460
461
  description:
461
- 'Explores the codebase and writes an analysis (architecture, touch points, risks) that grounds the plan. Makes no changes.',
462
+ 'Explores the codebase first and writes an analysis (architecture, touch points, risks) that grounds both the interview and the plan. Makes no changes.',
462
463
  resultView: 'initiative-tracker',
463
464
  },
464
465
  'initiative-planner': {
@@ -1,5 +1,11 @@
1
1
  import { describe, it, expect } from 'vitest'
2
- import { interviewGatePhase } from './interviewGate'
2
+ import {
3
+ DOC_INTERVIEWER_KIND,
4
+ INITIATIVE_INTERVIEWER_KIND,
5
+ interviewGatePhase,
6
+ interviewStepReached,
7
+ } from './interviewGate'
8
+ import type { ExecutionInstance } from '~/types/domain'
3
9
 
4
10
  // `interviewGatePhase` is what stops continue/proceed reading as no-ops in BOTH interview windows
5
11
  // (initiative planning, document interview): the resume is asynchronous — the HTTP call only wakes
@@ -7,45 +13,114 @@ import { interviewGatePhase } from './interviewGate'
7
13
  // what distinguishes "parked, waiting on you" from "a pass is running", a distinction the entity
8
14
  // alone cannot make.
9
15
 
16
+ /** The interview step has been reached — the default for every case not about the split below. */
17
+ const REACHED = true
18
+
10
19
  describe('interviewGatePhase', () => {
11
20
  it('is awaiting while the run is parked on the human', () => {
12
- expect(interviewGatePhase('awaiting', 'blocked')).toBe('awaiting')
21
+ expect(interviewGatePhase('awaiting', 'blocked', REACHED)).toBe('awaiting')
13
22
  })
14
23
 
15
24
  it('is working once the resumed run is running again, even though the entity still says awaiting', () => {
16
25
  // The exact regression: continue/proceed leave the entity's status untouched until the pass
17
26
  // finishes, so an entity-only reading renders the same questions and looks like a dead button.
18
- expect(interviewGatePhase('awaiting', 'running')).toBe('working')
27
+ expect(interviewGatePhase('awaiting', 'running', REACHED)).toBe('working')
19
28
  })
20
29
 
21
30
  it('is working for the FIRST pass, before any question exists', () => {
22
- expect(interviewGatePhase(undefined, 'running')).toBe('working')
31
+ expect(interviewGatePhase(undefined, 'running', REACHED)).toBe('working')
23
32
  })
24
33
 
25
34
  it('is failed when the run stopped before the interview settled', () => {
26
35
  // Must not stay `working`: a pass that dies would otherwise spin forever.
27
- expect(interviewGatePhase('awaiting', 'failed')).toBe('failed')
28
- expect(interviewGatePhase(undefined, 'failed')).toBe('failed')
36
+ expect(interviewGatePhase('awaiting', 'failed', REACHED)).toBe('failed')
37
+ expect(interviewGatePhase(undefined, 'failed', REACHED)).toBe('failed')
29
38
  })
30
39
 
31
40
  it('is converged once the interview settled, whatever the run went on to do', () => {
32
41
  // `converged` outranks `failed`: a later step's failure belongs to that step, not the
33
42
  // interview, and the block's own failure surface reports it.
34
- expect(interviewGatePhase('done', 'running')).toBe('converged')
35
- expect(interviewGatePhase('done', 'failed')).toBe('converged')
36
- expect(interviewGatePhase('done', undefined)).toBe('converged')
43
+ expect(interviewGatePhase('done', 'running', REACHED)).toBe('converged')
44
+ expect(interviewGatePhase('done', 'failed', REACHED)).toBe('converged')
45
+ expect(interviewGatePhase('done', undefined, REACHED)).toBe('converged')
37
46
  })
38
47
 
39
48
  it('is idle when the interview never ran', () => {
40
- expect(interviewGatePhase(undefined, undefined)).toBe('idle')
49
+ expect(interviewGatePhase(undefined, undefined, REACHED)).toBe('idle')
41
50
  })
42
51
 
43
52
  it('degrades to the entity-only reading when the run is not cached', () => {
44
53
  // A window opened before the execution snapshot lands must show the questions, never a spinner.
45
- expect(interviewGatePhase('awaiting', undefined)).toBe('awaiting')
54
+ expect(interviewGatePhase('awaiting', undefined, REACHED)).toBe('awaiting')
46
55
  })
47
56
 
48
57
  it('keeps a paused run answerable', () => {
49
- expect(interviewGatePhase('awaiting', 'paused')).toBe('awaiting')
58
+ expect(interviewGatePhase('awaiting', 'paused', REACHED)).toBe('awaiting')
59
+ })
60
+ })
61
+
62
+ // Neither interview leads its pipeline — initiative planning explores the codebase first, the
63
+ // document pipeline researches and outlines first — and that lead-in is minutes of container work.
64
+ // Reported as `working` it claims an interviewer is chewing on answers the human was never asked
65
+ // for; these pin the split.
66
+ describe('interviewGatePhase — before the interview step is reached', () => {
67
+ it('is preparing while an EARLIER step is running', () => {
68
+ expect(interviewGatePhase(undefined, 'running', false)).toBe('preparing')
69
+ })
70
+
71
+ it('does not offer a stale previous round to answer during the lead-in', () => {
72
+ // On a re-plan the entity still carries the last run's questions until the gate's
73
+ // `resetForFreshRun` fires, which is now AFTER the lead-in. Reading those as `awaiting` would
74
+ // invite the human to answer a round about to be discarded.
75
+ expect(interviewGatePhase('awaiting', 'running', false)).toBe('preparing')
76
+ })
77
+
78
+ it('still reports a settled or failed run over the lead-in', () => {
79
+ expect(interviewGatePhase('done', 'running', false)).toBe('converged')
80
+ expect(interviewGatePhase(undefined, 'failed', false)).toBe('failed')
81
+ })
82
+
83
+ it('is unchanged when the run is not running at all', () => {
84
+ expect(interviewGatePhase('awaiting', 'blocked', false)).toBe('awaiting')
85
+ expect(interviewGatePhase(undefined, undefined, false)).toBe('idle')
86
+ })
87
+ })
88
+
89
+ const run = (kinds: string[], currentStep: number) =>
90
+ ({ steps: kinds.map((agentKind) => ({ agentKind })), currentStep }) as Pick<
91
+ ExecutionInstance,
92
+ 'steps' | 'currentStep'
93
+ >
94
+
95
+ describe('interviewStepReached', () => {
96
+ const PLANNING = ['initiative-analyst', INITIATIVE_INTERVIEWER_KIND, 'initiative-planner']
97
+
98
+ it('is false while an earlier step is current', () => {
99
+ expect(interviewStepReached(run(PLANNING, 0), INITIATIVE_INTERVIEWER_KIND)).toBe(false)
100
+ })
101
+
102
+ it('is true from the interview step onward', () => {
103
+ expect(interviewStepReached(run(PLANNING, 1), INITIATIVE_INTERVIEWER_KIND)).toBe(true)
104
+ expect(interviewStepReached(run(PLANNING, 2), INITIATIVE_INTERVIEWER_KIND)).toBe(true)
105
+ })
106
+
107
+ it('degrades to true when the run is not cached yet', () => {
108
+ // Over-reporting "still preparing" would leave a genuinely parked interview looking dormant,
109
+ // which is worse than generic copy — so an unknown run keeps the pre-existing reading.
110
+ // Both spellings of "no run": `useResultViewRunMeta` resolves to null, a store lookup to
111
+ // undefined, and the two windows use one each.
112
+ expect(interviewStepReached(undefined, INITIATIVE_INTERVIEWER_KIND)).toBe(true)
113
+ expect(interviewStepReached(null, INITIATIVE_INTERVIEWER_KIND)).toBe(true)
114
+ })
115
+
116
+ it('degrades to true for a chain carrying no such step', () => {
117
+ expect(
118
+ interviewStepReached(run(['doc-researcher', 'doc-writer'], 0), DOC_INTERVIEWER_KIND),
119
+ ).toBe(true)
120
+ })
121
+
122
+ it('locates the document interviewer behind its own lead-in', () => {
123
+ const authoring = run(['doc-researcher', 'doc-outliner', DOC_INTERVIEWER_KIND], 1)
124
+ expect(interviewStepReached(authoring, DOC_INTERVIEWER_KIND)).toBe(false)
50
125
  })
51
126
  })
@@ -12,15 +12,57 @@ import type { ExecutionInstance } from '~/types/domain'
12
12
  * disagree about whether there is anything to answer.
13
13
  *
14
14
  * - `idle` — the interview has not run yet (nothing to answer, nothing in flight).
15
+ * - `preparing` — the run is working on an EARLIER step; the interview has not begun.
15
16
  * - `working` — an interviewer pass is running; the human waits.
16
17
  * - `awaiting` — the run is parked on the human's answers.
17
18
  * - `converged` — the interview settled; the run moved on.
18
19
  * - `failed` — the run stopped before the interview settled.
19
20
  */
20
- export type InterviewGatePhase = 'idle' | 'working' | 'awaiting' | 'converged' | 'failed'
21
+ export type InterviewGatePhase =
22
+ | 'idle'
23
+ | 'preparing'
24
+ | 'working'
25
+ | 'awaiting'
26
+ | 'converged'
27
+ | 'failed'
21
28
 
22
29
  /**
23
- * Resolve the phase from the interview entity's status AND its run's status.
30
+ * The agent kind of each gate's own step, which is what {@link interviewStepReached} locates in the
31
+ * run's chain. Kept here beside the phase they feed rather than inline at each window, so the two
32
+ * surfaces can't drift onto different spellings of the same step.
33
+ */
34
+ export const INITIATIVE_INTERVIEWER_KIND = 'initiative-interviewer'
35
+ export const DOC_INTERVIEWER_KIND = 'doc-interviewer'
36
+
37
+ /**
38
+ * Whether the run has REACHED the interview gate's own step — i.e. whether a running run is
39
+ * running the interviewer, or something ahead of it.
40
+ *
41
+ * Neither gate leads its pipeline: `pl_initiative` explores the codebase first, and the document
42
+ * pipeline researches and outlines first. Without this the whole of that lead-in reads as
43
+ * `working`, so the window claims an interviewer pass is chewing on answers the human has not
44
+ * given yet — for however long a container step takes.
45
+ *
46
+ * Degrades to `true` (today's reading, no `preparing` claim) when the run is not cached yet or the
47
+ * chain carries no such step: a phase that over-reports "we are still preparing" would leave a
48
+ * genuinely-parked interview looking dormant, which is worse than the copy being generic.
49
+ *
50
+ * Takes `null` as well as `undefined` because the two window seams spell "no run" differently —
51
+ * `useResultViewRunMeta` resolves to `null`, a store lookup to `undefined` — and both mean the same
52
+ * thing here.
53
+ */
54
+ export function interviewStepReached(
55
+ run: Pick<ExecutionInstance, 'steps' | 'currentStep'> | null | undefined,
56
+ agentKind: string,
57
+ ): boolean {
58
+ if (!run) return true
59
+ const index = run.steps.findIndex((step) => step.agentKind === agentKind)
60
+ return index < 0 || index <= run.currentStep
61
+ }
62
+
63
+ /**
64
+ * Resolve the phase from the interview entity's status, its run's status, and whether the run has
65
+ * reached the interview step ({@link interviewStepReached}).
24
66
  *
25
67
  * The RUN status is load-bearing, not redundant. Continue/proceed are ASYNC by design: the HTTP
26
68
  * call only records the intent on the parked step and wakes the durable driver, which then runs
@@ -35,17 +77,27 @@ export type InterviewGatePhase = 'idle' | 'working' | 'awaiting' | 'converged' |
35
77
  * says so instead of spinning forever. An unknown run (no instance cached yet) degrades to the
36
78
  * entity-only reading, never to a spinner.
37
79
  *
80
+ * `stepReached` splits that running window in two, because "a pass is in flight" and "your turn is
81
+ * still coming" are different things to be told and the difference is minutes long. It is a
82
+ * REQUIRED argument rather than an optional one: a caller that omitted it would silently get the
83
+ * misleading half, which is the bug this exists to fix.
84
+ *
38
85
  * `converged` wins over `failed` on purpose: once the interview settled, a later failure belongs
39
- * to the step that failed (the analyst/planner, the writer), and the block's own failure surface
40
- * reports it — the interview window claiming the interview broke would be wrong.
86
+ * to the step that failed (the planner, the writer), and the block's own failure surface reports
87
+ * it — the interview window claiming the interview broke would be wrong.
41
88
  */
42
89
  export function interviewGatePhase(
43
90
  status: 'awaiting' | 'done' | undefined,
44
91
  runStatus: ExecutionInstance['status'] | undefined,
92
+ stepReached: boolean,
45
93
  ): InterviewGatePhase {
46
94
  if (status === 'done') return 'converged'
47
95
  if (runStatus === 'failed') return 'failed'
48
- if (runStatus === 'running') return 'working'
96
+ // Before `status === 'awaiting'`: on a re-plan the entity still carries the PREVIOUS run's
97
+ // questions until the gate's `resetForFreshRun` fires, which now happens after the lead-in
98
+ // steps. Reading those as "awaiting your answers" would invite a human to answer a round that
99
+ // is about to be discarded.
100
+ if (runStatus === 'running') return stepReached ? 'working' : 'preparing'
49
101
  if (status === 'awaiting') return 'awaiting'
50
102
  return 'idle'
51
103
  }
@@ -3336,10 +3336,12 @@
3336
3336
  "taskDocs": {
3337
3337
  "heading": "Kontextdokumente",
3338
3338
  "hint": "Dokumente, die dieser Aufgabe als Kontext angehängt sind. Ihr Inhalt wird den Agents gegeben, die an der Aufgabe arbeiten.",
3339
+ "hintInitiative": "Dokumente, die dieser Initiative als Kontext angehängt sind. Ihr Inhalt wird den Planungsagenten gegeben, die den Plan entwerfen.",
3339
3340
  "attach": "Anhängen",
3340
3341
  "connectSource": "Quelle verbinden",
3341
3342
  "connectSourceNamed": "{source} verbinden",
3342
3343
  "empty": "Hängen Sie eine Anforderung, ein RFC oder ein PRD an, damit Agents es beim Umsetzen dieser Aufgabe sehen.",
3344
+ "emptyInitiative": "Hängen Sie eine Anforderung, ein RFC oder ein PRD an, damit die Planungsagenten es beim Entwerfen dieser Initiative lesen.",
3343
3345
  "attached": "Dokument angehängt"
3344
3346
  },
3345
3347
  "templates": {
@@ -3382,11 +3384,13 @@
3382
3384
  "contextIssues": {
3383
3385
  "title": "Kontext-Issues",
3384
3386
  "hint": "Tracker-Issues, die dieser Aufgabe als Kontext angehängt sind. Ihr Inhalt wird den Agents gegeben, die an der Aufgabe arbeiten.",
3387
+ "hintInitiative": "Tracker-Issues, die dieser Initiative als Kontext angehängt sind. Ihr Inhalt wird den Planungsagenten gegeben, die den Plan entwerfen.",
3385
3388
  "attach": "Anhängen",
3386
3389
  "connectSource": "Quelle verbinden",
3387
3390
  "connectSourceNamed": "{source} verbinden",
3388
3391
  "attached": "Issue angehängt",
3389
- "emptyHint": "Hängen Sie ein Jira-Issue an, damit Agents seine Beschreibung und Kommentare beim Umsetzen dieser Aufgabe sehen."
3392
+ "emptyHint": "Hängen Sie ein Jira-Issue an, damit Agents seine Beschreibung und Kommentare beim Umsetzen dieser Aufgabe sehen.",
3393
+ "emptyHintInitiative": "Hängen Sie ein Jira-Issue an, damit die Planungsagenten seine Beschreibung und Kommentare beim Entwerfen dieser Initiative sehen."
3390
3394
  },
3391
3395
  "import": {
3392
3396
  "titleCreate": "Aufgabe aus Issue erstellen",
@@ -4290,9 +4294,11 @@
4290
4294
  "intro": "Der Planer grenzt diese Initiative ein. Beantworten Sie seine Fragen, um Ziel und Einschränkungen zu formen, und senden Sie sie dann ab. Sie können ihn auch mit dem, was er bereits hat, jetzt planen lassen.",
4291
4295
  "empty": "Keine Initiative für diesen Block gefunden.",
4292
4296
  "converged": "Keine Fragen ausstehend. Der Planer hat, was er braucht, und entwirft den Plan.",
4293
- "idle": "Die Planung wurde noch nicht gestartet. Führen Sie die Planung von der Initiative aus, um das Interview zu beginnen.",
4297
+ "idle": "Die Planung wurde noch nicht gestartet. Führen Sie die Planung von der Initiative aus: Zuerst wird die Codebasis analysiert, danach werden Sie befragt.",
4294
4298
  "working": "Der Planer verarbeitet Ihre Antworten",
4295
4299
  "workingHint": "Das dauert einen Moment. Rückfragen erscheinen hier, sobald er fertig ist, oder er beginnt mit dem Entwurf des Plans, wenn ihm die Angaben genügen.",
4300
+ "preparing": "Die Codebasis wird vor dem Interview analysiert",
4301
+ "preparingHint": "Die Planung liest zuerst das Repository, damit Sie nicht nach dem gefragt werden, was der Code beantworten kann. Fragen erscheinen hier, sobald das erledigt ist.",
4296
4302
  "failed": "Der Planungslauf wurde abgebrochen",
4297
4303
  "failedHint": "Er endete, bevor der Planer antworten konnte. Ihre Antworten sind gespeichert; führen Sie die Planung von der Initiative aus erneut aus.",
4298
4304
  "answerPlaceholder": "Ihre Antwort",
@@ -4643,6 +4649,8 @@
4643
4649
  "converged": "Es stehen keine Fragen aus. Der Interviewer hat, was er braucht, und das Dokument wird entworfen.",
4644
4650
  "working": "Der Interviewer verarbeitet deine Antworten",
4645
4651
  "workingHint": "Das dauert einen Moment. Nachfragen erscheinen hier, sobald er fertig ist, oder der Entwurf beginnt, wenn ihm die Angaben genügen.",
4652
+ "preparing": "Das Dokument wird vor dem Interview recherchiert",
4653
+ "preparingHint": "Der Lauf sammelt zuerst Hintergrundwissen und entwirft eine Gliederung. Fragen erscheinen hier, sobald das erledigt ist.",
4646
4654
  "failed": "Der Dokumentenlauf wurde abgebrochen",
4647
4655
  "failedHint": "Er endete, bevor der Interviewer antworten konnte. Deine Antworten sind gespeichert; führe die Dokumentaufgabe erneut aus.",
4648
4656
  "answerPlaceholder": "Deine Antwort",
@@ -3678,6 +3678,8 @@
3678
3678
  "converged": "No questions are pending. The interviewer has what it needs and the document is being drafted.",
3679
3679
  "working": "The interviewer is working on your answers",
3680
3680
  "workingHint": "This takes a moment. Follow-up questions appear here when it is done, or drafting starts if it has enough.",
3681
+ "preparing": "Researching the document before the interview",
3682
+ "preparingHint": "The run gathers background and drafts an outline first. Questions appear here once that is done.",
3681
3683
  "failed": "The document run stopped",
3682
3684
  "failedHint": "It ended before the interviewer could answer. Your answers are saved; re-run the document task to try again.",
3683
3685
  "answerPlaceholder": "Your answer",
@@ -3756,10 +3758,12 @@
3756
3758
  "taskDocs": {
3757
3759
  "heading": "Context documents",
3758
3760
  "hint": "Documents attached to this task as context. Their content is given to the agents that work on the task.",
3761
+ "hintInitiative": "Documents attached to this initiative as context. Their content is given to the planning agents that shape it.",
3759
3762
  "attach": "Attach",
3760
3763
  "connectSource": "Connect a source",
3761
3764
  "connectSourceNamed": "Connect {source}",
3762
3765
  "empty": "Attach a requirement, RFC or PRD so agents see it while implementing this task.",
3766
+ "emptyInitiative": "Attach a requirement, RFC or PRD so the planning agents read it while shaping this initiative.",
3763
3767
  "attached": "Document attached"
3764
3768
  },
3765
3769
  "templates": {
@@ -3802,11 +3806,13 @@
3802
3806
  "contextIssues": {
3803
3807
  "title": "Context issues",
3804
3808
  "hint": "Tracker issues attached to this task as context. Their content is given to the agents that work on the task.",
3809
+ "hintInitiative": "Tracker issues attached to this initiative as context. Their content is given to the planning agents that shape it.",
3805
3810
  "attach": "Attach",
3806
3811
  "connectSource": "Connect a source",
3807
3812
  "connectSourceNamed": "Connect {source}",
3808
3813
  "attached": "Issue attached",
3809
- "emptyHint": "Attach a Jira issue so agents see its description and comments while implementing this task."
3814
+ "emptyHint": "Attach a Jira issue so agents see its description and comments while implementing this task.",
3815
+ "emptyHintInitiative": "Attach a Jira issue so the planning agents see its description and comments while shaping this initiative."
3810
3816
  },
3811
3817
  "import": {
3812
3818
  "titleCreate": "Create task from issue",
@@ -5465,9 +5471,11 @@
5465
5471
  "intro": "The planner is scoping this initiative. Answer its questions to shape the goal and constraints, then submit them. You can also have it plan now with what it already has.",
5466
5472
  "empty": "No initiative found for this block.",
5467
5473
  "converged": "No questions are pending. The planner has what it needs and is drafting the plan.",
5468
- "idle": "Planning has not started yet. Run planning from the initiative to begin the interview.",
5474
+ "idle": "Planning has not started yet. Run planning from the initiative: it analyzes the codebase first, then interviews you.",
5469
5475
  "working": "The planner is working on your answers",
5470
5476
  "workingHint": "This takes a moment. Follow-up questions appear here when it is done, or it starts drafting the plan if it has enough.",
5477
+ "preparing": "Exploring the codebase before the interview",
5478
+ "preparingHint": "Planning reads the repository first, so you are not asked what the code can answer. Questions appear here once that is done.",
5471
5479
  "failed": "The planning run stopped",
5472
5480
  "failedHint": "It ended before the planner could answer. Your answers are saved; re-run planning from the initiative to try again.",
5473
5481
  "answerPlaceholder": "Your answer",
@@ -3570,6 +3570,8 @@
3570
3570
  "converged": "No hay preguntas pendientes. El entrevistador tiene lo que necesita y el documento se está redactando.",
3571
3571
  "working": "El entrevistador está procesando tus respuestas",
3572
3572
  "workingHint": "Esto tarda un momento. Las preguntas de seguimiento aparecerán aquí cuando termine, o empezará la redacción si ya tiene suficiente.",
3573
+ "preparing": "Investigando el documento antes de la entrevista",
3574
+ "preparingHint": "La ejecución primero reúne el contexto y esboza un esquema. Las preguntas aparecerán aquí cuando termine.",
3573
3575
  "failed": "La ejecución del documento se detuvo",
3574
3576
  "failedHint": "Terminó antes de que el entrevistador pudiera responder. Tus respuestas están guardadas; vuelve a ejecutar la tarea del documento.",
3575
3577
  "answerPlaceholder": "Tu respuesta",
@@ -3648,10 +3650,12 @@
3648
3650
  "taskDocs": {
3649
3651
  "heading": "Documentos de contexto",
3650
3652
  "hint": "Documentos adjuntos a esta tarea como contexto. Su contenido se entrega a los agentes que trabajan en la tarea.",
3653
+ "hintInitiative": "Documentos adjuntos a esta iniciativa como contexto. Su contenido se entrega a los agentes de planificación que redactan el plan.",
3651
3654
  "attach": "Adjuntar",
3652
3655
  "connectSource": "Conectar una fuente",
3653
3656
  "connectSourceNamed": "Conectar {source}",
3654
3657
  "empty": "Adjunta un requisito, RFC o PRD para que los agentes lo vean mientras implementan esta tarea.",
3658
+ "emptyInitiative": "Adjunta un requisito, RFC o PRD para que los agentes de planificación lo lean al redactar esta iniciativa.",
3655
3659
  "attached": "Documento adjuntado"
3656
3660
  },
3657
3661
  "templates": {
@@ -3694,11 +3698,13 @@
3694
3698
  "contextIssues": {
3695
3699
  "title": "Incidencias de contexto",
3696
3700
  "hint": "Incidencias del tracker adjuntas a esta tarea como contexto. Su contenido se entrega a los agentes que trabajan en la tarea.",
3701
+ "hintInitiative": "Incidencias del tracker adjuntas a esta iniciativa como contexto. Su contenido se entrega a los agentes de planificación que redactan el plan.",
3697
3702
  "attach": "Adjuntar",
3698
3703
  "connectSource": "Conectar una fuente",
3699
3704
  "connectSourceNamed": "Conectar {source}",
3700
3705
  "attached": "Incidencia adjuntada",
3701
- "emptyHint": "Adjunta una incidencia de Jira para que los agentes vean su descripción y comentarios al implementar esta tarea."
3706
+ "emptyHint": "Adjunta una incidencia de Jira para que los agentes vean su descripción y comentarios al implementar esta tarea.",
3707
+ "emptyHintInitiative": "Adjunta una incidencia de Jira para que los agentes de planificación vean su descripción y comentarios al redactar esta iniciativa."
3702
3708
  },
3703
3709
  "import": {
3704
3710
  "titleCreate": "Crear tarea desde incidencia",
@@ -5300,9 +5306,11 @@
5300
5306
  "intro": "El planificador esta acotando esta iniciativa. Responde sus preguntas para definir el objetivo y las restricciones, y luego envialas. Tambien puedes pedirle que planifique ahora con lo que ya tiene.",
5301
5307
  "empty": "No se encontro ninguna iniciativa para este bloque.",
5302
5308
  "converged": "No hay preguntas pendientes. El planificador tiene lo que necesita y esta redactando el plan.",
5303
- "idle": "La planificacion aun no ha comenzado. Ejecuta la planificacion desde la iniciativa para iniciar la entrevista.",
5309
+ "idle": "La planificacion aun no ha comenzado. Ejecuta la planificacion desde la iniciativa: primero analiza el codigo y despues te entrevista.",
5304
5310
  "working": "El planificador esta procesando tus respuestas",
5305
5311
  "workingHint": "Esto tarda un momento. Las preguntas de seguimiento apareceran aqui cuando termine, o empezara a redactar el plan si ya tiene suficiente.",
5312
+ "preparing": "Explorando el codigo antes de la entrevista",
5313
+ "preparingHint": "La planificacion lee primero el repositorio para no preguntarte lo que el codigo ya responde. Las preguntas apareceran aqui cuando termine.",
5306
5314
  "failed": "La ejecucion de planificacion se detuvo",
5307
5315
  "failedHint": "Termino antes de que el planificador pudiera responder. Tus respuestas estan guardadas; vuelve a ejecutar la planificacion desde la iniciativa.",
5308
5316
  "answerPlaceholder": "Tu respuesta",
@@ -3570,6 +3570,8 @@
3570
3570
  "converged": "Aucune question en attente. L'intervieweur a ce qu'il lui faut et le document est en cours de rédaction.",
3571
3571
  "working": "L'intervieweur traite vos réponses",
3572
3572
  "workingHint": "Cela prend un instant. Les questions complémentaires apparaîtront ici une fois terminé, ou la rédaction commencera s'il en a assez.",
3573
+ "preparing": "Recherche sur le document avant l'entretien",
3574
+ "preparingHint": "L'exécution rassemble d'abord le contexte et ébauche un plan. Les questions apparaîtront ici une fois terminé.",
3573
3575
  "failed": "L'exécution du document s'est arrêtée",
3574
3576
  "failedHint": "Elle s'est terminée avant que l'intervieweur puisse répondre. Vos réponses sont enregistrées ; relancez la tâche du document.",
3575
3577
  "answerPlaceholder": "Votre réponse",
@@ -3648,10 +3650,12 @@
3648
3650
  "taskDocs": {
3649
3651
  "heading": "Documents de contexte",
3650
3652
  "hint": "Documents joints à cette tâche comme contexte. Leur contenu est fourni aux agents qui travaillent sur la tâche.",
3653
+ "hintInitiative": "Documents joints à cette initiative comme contexte. Leur contenu est fourni aux agents de planification qui rédigent le plan.",
3651
3654
  "attach": "Joindre",
3652
3655
  "connectSource": "Connecter une source",
3653
3656
  "connectSourceNamed": "Connecter {source}",
3654
3657
  "empty": "Joignez une exigence, un RFC ou un PRD pour que les agents le voient pendant l'implémentation de cette tâche.",
3658
+ "emptyInitiative": "Joignez une exigence, une RFC ou un PRD pour que les agents de planification le lisent en rédigeant cette initiative.",
3655
3659
  "attached": "Document joint"
3656
3660
  },
3657
3661
  "templates": {
@@ -3694,11 +3698,13 @@
3694
3698
  "contextIssues": {
3695
3699
  "title": "Tickets de contexte",
3696
3700
  "hint": "Tickets du tracker joints à cette tâche comme contexte. Leur contenu est fourni aux agents qui travaillent sur la tâche.",
3701
+ "hintInitiative": "Tickets du tracker joints à cette initiative comme contexte. Leur contenu est fourni aux agents de planification qui rédigent le plan.",
3697
3702
  "attach": "Joindre",
3698
3703
  "connectSource": "Connecter une source",
3699
3704
  "connectSourceNamed": "Connecter {source}",
3700
3705
  "attached": "Ticket joint",
3701
- "emptyHint": "Joignez un ticket Jira pour que les agents voient sa description et ses commentaires lors de l'implémentation de cette tâche."
3706
+ "emptyHint": "Joignez un ticket Jira pour que les agents voient sa description et ses commentaires lors de l'implémentation de cette tâche.",
3707
+ "emptyHintInitiative": "Joignez un ticket Jira pour que les agents de planification voient sa description et ses commentaires en rédigeant cette initiative."
3702
3708
  },
3703
3709
  "import": {
3704
3710
  "titleCreate": "Créer une tâche à partir d'un ticket",
@@ -5300,9 +5306,11 @@
5300
5306
  "intro": "Le planificateur cadre cette initiative. Repondez a ses questions pour definir l'objectif et les contraintes, puis envoyez-les. Vous pouvez aussi lui demander de planifier maintenant avec ce qu'il a deja.",
5301
5307
  "empty": "Aucune initiative trouvee pour ce bloc.",
5302
5308
  "converged": "Aucune question en attente. Le planificateur dispose de ce qu'il faut et redige le plan.",
5303
- "idle": "La planification n'a pas encore demarre. Lancez la planification depuis l'initiative pour commencer l'entretien.",
5309
+ "idle": "La planification n'a pas encore demarre. Lancez la planification depuis l'initiative : elle analyse d'abord le code, puis vous interroge.",
5304
5310
  "working": "Le planificateur traite vos reponses",
5305
5311
  "workingHint": "Cela prend un instant. Les questions complementaires apparaitront ici une fois termine, ou il commencera a rediger le plan s'il en a assez.",
5312
+ "preparing": "Exploration du code avant l'entretien",
5313
+ "preparingHint": "La planification lit d'abord le depot afin de ne pas vous demander ce que le code peut repondre. Les questions apparaitront ici une fois termine.",
5306
5314
  "failed": "L'execution de planification s'est arretee",
5307
5315
  "failedHint": "Elle s'est terminee avant que le planificateur puisse repondre. Vos reponses sont enregistrees ; relancez la planification depuis l'initiative.",
5308
5316
  "answerPlaceholder": "Votre reponse",
@@ -3581,6 +3581,8 @@
3581
3581
  "converged": "אין שאלות ממתינות. למראיין יש את מה שהוא צריך והמסמך בכתיבה.",
3582
3582
  "working": "המראיין מעבד את התשובות שלך",
3583
3583
  "workingHint": "זה לוקח רגע. שאלות המשך יופיעו כאן בסיום, או שתתחיל כתיבת הטיוטה אם יש לו מספיק מידע.",
3584
+ "preparing": "המסמך נחקר לפני הראיון",
3585
+ "preparingHint": "ההרצה אוספת תחילה רקע ומכינה מתאר. שאלות יופיעו כאן בסיום.",
3584
3586
  "failed": "הרצת המסמך נעצרה",
3585
3587
  "failedHint": "היא הסתיימה לפני שהמראיין הספיק להשיב. התשובות שלך נשמרו; הריצו מחדש את משימת המסמך.",
3586
3588
  "answerPlaceholder": "התשובה שלך",
@@ -3659,10 +3661,12 @@
3659
3661
  "taskDocs": {
3660
3662
  "heading": "מסמכי הקשר",
3661
3663
  "hint": "מסמכים המצורפים למשימה זו כהקשר. תוכנם נמסר לסוכנים שעובדים על המשימה.",
3664
+ "hintInitiative": "מסמכים המצורפים ליוזמה זו כהקשר. תוכנם נמסר לסוכני התכנון שמגבשים את התוכנית.",
3662
3665
  "attach": "צרף",
3663
3666
  "connectSource": "חבר מקור",
3664
3667
  "connectSourceNamed": "חבר את {source}",
3665
3668
  "empty": "צרף דרישה, RFC או PRD כדי שהסוכנים יראו אותם בעת מימוש משימה זו.",
3669
+ "emptyInitiative": "צרף דרישה, RFC או PRD כדי שסוכני התכנון יקראו אותם בעת גיבוש יוזמה זו.",
3666
3670
  "attached": "המסמך צורף"
3667
3671
  },
3668
3672
  "templates": {
@@ -3705,11 +3709,13 @@
3705
3709
  "contextIssues": {
3706
3710
  "title": "ניושני הקשר",
3707
3711
  "hint": "כרטיסי ה-tracker המצורפים למשימה זו כהקשר. תוכנם נמסר לסוכנים שעובדים על המשימה.",
3712
+ "hintInitiative": "כרטיסי ה-tracker המצורפים ליוזמה זו כהקשר. תוכנם נמסר לסוכני התכנון שמגבשים את התוכנית.",
3708
3713
  "attach": "צרף",
3709
3714
  "connectSource": "חבר מקור",
3710
3715
  "connectSourceNamed": "חבר את {source}",
3711
3716
  "attached": "הניושן צורף",
3712
- "emptyHint": "צרף ניושן Jira כדי שסוכנים יראו את התיאור וההערות שלו בעת מימוש משימה זו."
3717
+ "emptyHint": "צרף ניושן Jira כדי שסוכנים יראו את התיאור וההערות שלו בעת מימוש משימה זו.",
3718
+ "emptyHintInitiative": "צרף ניושן Jira כדי שסוכני התכנון יראו את התיאור וההערות שלו בעת גיבוש יוזמה זו."
3713
3719
  },
3714
3720
  "import": {
3715
3721
  "titleCreate": "צור משימה מניושן",
@@ -5311,9 +5317,11 @@
5311
5317
  "intro": "המתכנן ממקד את היוזמה. ענה על שאלותיו כדי לעצב את המטרה והאילוצים, ואז שלח את התשובות. אפשר גם לבקש ממנו לתכנן עכשיו עם מה שכבר יש לו.",
5312
5318
  "empty": "לא נמצאה יוזמה עבור בלוק זה.",
5313
5319
  "converged": "אין שאלות ממתינות. למתכנן יש את מה שנדרש והוא מנסח את התוכנית.",
5314
- "idle": "התכנון עדיין לא התחיל. הרץ תכנון מהיוזמה כדי להתחיל את הראיון.",
5320
+ "idle": "התכנון עדיין לא התחיל. הרץ תכנון מהיוזמה: תחילה הוא מנתח את בסיס הקוד ולאחר מכן מראיין אותך.",
5315
5321
  "working": "המתכנן מעבד את התשובות שלך",
5316
5322
  "workingHint": "זה לוקח רגע. שאלות המשך יופיעו כאן בסיום, או שהוא יתחיל לנסח את התוכנית אם יש לו מספיק מידע.",
5323
+ "preparing": "בסיס הקוד נסרק לפני הראיון",
5324
+ "preparingHint": "התכנון קורא תחילה את המאגר כדי שלא תישאל על מה שהקוד יכול לענות. השאלות יופיעו כאן בסיום.",
5317
5325
  "failed": "הרצת התכנון נעצרה",
5318
5326
  "failedHint": "היא הסתיימה לפני שהמתכנן הספיק להשיב. התשובות שלך נשמרו; הרץ תכנון מחדש מהיוזמה.",
5319
5327
  "answerPlaceholder": "התשובה שלך",
@@ -3336,10 +3336,12 @@
3336
3336
  "taskDocs": {
3337
3337
  "heading": "Documenti di contesto",
3338
3338
  "hint": "Documenti allegati a questa attività come contesto. Il loro contenuto viene fornito agli agenti che lavorano sull'attività.",
3339
+ "hintInitiative": "Documenti allegati a questa iniziativa come contesto. Il loro contenuto viene fornito agli agenti di pianificazione che redigono il piano.",
3339
3340
  "attach": "Allega",
3340
3341
  "connectSource": "Collega una fonte",
3341
3342
  "connectSourceNamed": "Collega {source}",
3342
3343
  "empty": "Allega un requisito, un RFC o un PRD così gli agenti lo vedono durante l'implementazione di questa attività.",
3344
+ "emptyInitiative": "Allega un requisito, un RFC o un PRD così gli agenti di pianificazione lo leggono mentre redigono questa iniziativa.",
3343
3345
  "attached": "Documento allegato"
3344
3346
  },
3345
3347
  "templates": {
@@ -3382,11 +3384,13 @@
3382
3384
  "contextIssues": {
3383
3385
  "title": "Issue di contesto",
3384
3386
  "hint": "Issue del tracker allegate a questa attività come contesto. Il loro contenuto viene fornito agli agenti che lavorano sull'attività.",
3387
+ "hintInitiative": "Issue del tracker allegate a questa iniziativa come contesto. Il loro contenuto viene fornito agli agenti di pianificazione che redigono il piano.",
3385
3388
  "attach": "Allega",
3386
3389
  "connectSource": "Collega una fonte",
3387
3390
  "connectSourceNamed": "Collega {source}",
3388
3391
  "attached": "Issue allegata",
3389
- "emptyHint": "Allega una issue Jira così gli agenti vedono la sua descrizione e i commenti durante l'implementazione di questa attività."
3392
+ "emptyHint": "Allega una issue Jira così gli agenti vedono la sua descrizione e i commenti durante l'implementazione di questa attività.",
3393
+ "emptyHintInitiative": "Allega una issue Jira così gli agenti di pianificazione vedono la sua descrizione e i commenti mentre redigono questa iniziativa."
3390
3394
  },
3391
3395
  "import": {
3392
3396
  "titleCreate": "Crea attività da una issue",
@@ -4290,9 +4294,11 @@
4290
4294
  "intro": "Il pianificatore sta definendo l'ambito di questa iniziativa. Rispondi alle sue domande per dare forma all'obiettivo e ai vincoli, poi invia le risposte. Puoi anche chiedergli di pianificare subito con quello che ha gia.",
4291
4295
  "empty": "Nessuna iniziativa trovata per questo blocco.",
4292
4296
  "converged": "Nessuna domanda in sospeso. Il pianificatore ha cio che gli serve e sta redigendo il piano.",
4293
- "idle": "La pianificazione non e ancora iniziata. Esegui la pianificazione dall'iniziativa per avviare l'intervista.",
4297
+ "idle": "La pianificazione non e ancora iniziata. Esegui la pianificazione dall'iniziativa: prima analizza il codice, poi ti intervista.",
4294
4298
  "working": "Il pianificatore sta elaborando le tue risposte",
4295
4299
  "workingHint": "Richiede qualche istante. Le domande di follow-up compariranno qui al termine, oppure iniziera a redigere il piano se ha abbastanza informazioni.",
4300
+ "preparing": "Esplorazione del codice prima dell'intervista",
4301
+ "preparingHint": "La pianificazione legge prima il repository, cosi non ti viene chiesto cio che il codice puo rispondere. Le domande compariranno qui al termine.",
4296
4302
  "failed": "L'esecuzione della pianificazione si e interrotta",
4297
4303
  "failedHint": "Si e conclusa prima che il pianificatore potesse rispondere. Le tue risposte sono salvate; riesegui la pianificazione dall'iniziativa.",
4298
4304
  "answerPlaceholder": "La tua risposta",
@@ -4643,6 +4649,8 @@
4643
4649
  "converged": "Nessuna domanda in sospeso. L'intervistatore ha ciò che gli serve e il documento è in fase di redazione.",
4644
4650
  "working": "L'intervistatore sta elaborando le tue risposte",
4645
4651
  "workingHint": "Richiede qualche istante. Le domande di follow-up compariranno qui al termine, oppure inizierà la stesura se ha abbastanza informazioni.",
4652
+ "preparing": "Ricerca sul documento prima dell'intervista",
4653
+ "preparingHint": "L'esecuzione raccoglie prima il contesto e abbozza una scaletta. Le domande compariranno qui al termine.",
4646
4654
  "failed": "L'esecuzione del documento si è interrotta",
4647
4655
  "failedHint": "Si è conclusa prima che l'intervistatore potesse rispondere. Le tue risposte sono salvate; riesegui l'attività del documento.",
4648
4656
  "answerPlaceholder": "La tua risposta",
@@ -3582,6 +3582,8 @@
3582
3582
  "converged": "保留中の質問はありません。インタビュアーは必要な情報を得ており、ドキュメントを下書き中です。",
3583
3583
  "working": "インタビュアーが回答を処理しています",
3584
3584
  "workingHint": "少し時間がかかります。完了すると追加の質問がここに表示されます。情報が十分な場合は下書きの作成を開始します。",
3585
+ "preparing": "インタビューの前に資料を調査しています",
3586
+ "preparingHint": "実行はまず背景情報を集めてアウトラインを作成します。完了すると質問がここに表示されます。",
3585
3587
  "failed": "ドキュメントの実行が停止しました",
3586
3588
  "failedHint": "インタビュアーが応答する前に終了しました。回答は保存されています。ドキュメントのタスクを再実行してください。",
3587
3589
  "answerPlaceholder": "回答",
@@ -3660,10 +3662,12 @@
3660
3662
  "taskDocs": {
3661
3663
  "heading": "コンテキストドキュメント",
3662
3664
  "hint": "このタスクにコンテキストとして添付されたドキュメント。その内容はタスクに取り組むエージェントに渡されます。",
3665
+ "hintInitiative": "このイニシアチブにコンテキストとして添付されたドキュメント。その内容は計画を作成する計画エージェントに渡されます。",
3663
3666
  "attach": "添付",
3664
3667
  "connectSource": "ソースを接続",
3665
3668
  "connectSourceNamed": "{source} を接続",
3666
3669
  "empty": "要件、RFC、PRD を添付すると、このタスクの実装中にエージェントが参照できます。",
3670
+ "emptyInitiative": "要件、RFC、PRD を添付すると、このイニシアチブの計画作成中に計画エージェントが参照できます。",
3667
3671
  "attached": "ドキュメントを添付しました"
3668
3672
  },
3669
3673
  "templates": {
@@ -3706,11 +3710,13 @@
3706
3710
  "contextIssues": {
3707
3711
  "title": "コンテキスト課題",
3708
3712
  "hint": "このタスクにコンテキストとして添付されたトラッカーの課題。その内容はタスクに取り組むエージェントに渡されます。",
3713
+ "hintInitiative": "このイニシアチブにコンテキストとして添付されたトラッカーの課題。その内容は計画を作成する計画エージェントに渡されます。",
3709
3714
  "attach": "添付",
3710
3715
  "connectSource": "ソースを接続",
3711
3716
  "connectSourceNamed": "{source} を接続",
3712
3717
  "attached": "課題を添付しました",
3713
- "emptyHint": "Jira 課題を添付すると、このタスクの実装中にエージェントがその説明とコメントを参照できます。"
3718
+ "emptyHint": "Jira 課題を添付すると、このタスクの実装中にエージェントがその説明とコメントを参照できます。",
3719
+ "emptyHintInitiative": "Jira 課題を添付すると、このイニシアチブの計画作成中に計画エージェントがその説明とコメントを参照できます。"
3714
3720
  },
3715
3721
  "import": {
3716
3722
  "titleCreate": "課題からタスクを作成",
@@ -5312,9 +5318,11 @@
5312
5318
  "intro": "プランナーがこのイニシアチブの範囲を検討しています。質問に答えて目標と制約を形にし、回答を送信してください。現状の情報のまま計画を作成させることもできます。",
5313
5319
  "empty": "このブロックのイニシアチブが見つかりません。",
5314
5320
  "converged": "保留中の質問はありません。プランナーは必要な情報を得て計画を作成しています。",
5315
- "idle": "計画はまだ開始されていません。イニシアチブから計画を実行するとインタビューが始まります。",
5321
+ "idle": "計画はまだ開始されていません。イニシアチブから計画を実行すると、まずコードベースを分析し、その後にインタビューが行われます。",
5316
5322
  "working": "プランナーが回答を処理しています",
5317
5323
  "workingHint": "少し時間がかかります。完了すると追加の質問がここに表示されます。情報が十分な場合は計画の作成を開始します。",
5324
+ "preparing": "インタビューの前にコードベースを分析しています",
5325
+ "preparingHint": "計画はまずリポジトリを読み取るため、コードから分かることは質問されません。完了すると質問がここに表示されます。",
5318
5326
  "failed": "計画の実行が停止しました",
5319
5327
  "failedHint": "プランナーが応答する前に終了しました。回答は保存されています。イニシアチブから計画を再実行してください。",
5320
5328
  "answerPlaceholder": "回答",