@cat-factory/app 0.215.1 → 0.216.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.
Files changed (38) hide show
  1. package/README.md +109 -1
  2. package/app/components/bootstrap/BootstrapModal.vue +65 -44
  3. package/app/components/github/AddServiceFromRepoModal.vue +49 -27
  4. package/app/components/github/GitHubOnboarding.vue +4 -23
  5. package/app/components/github/GitHubPanel.vue +10 -34
  6. package/app/components/inputGate/InputGateNotice.vue +176 -0
  7. package/app/components/panels/AgentStepDetail.vue +27 -3
  8. package/app/components/panels/inspector/TaskExecution.vue +32 -3
  9. package/app/components/pipeline/PipelineProgress.vue +1 -1
  10. package/app/components/settings/WorkspaceSettingsPanel.vue +34 -1
  11. package/app/components/vcs/VcsConnectSurfaces.vue +58 -0
  12. package/app/composables/api/inputGate.ts +25 -0
  13. package/app/composables/useApi.ts +2 -0
  14. package/app/composables/usePipelineErrorToast.ts +8 -0
  15. package/app/stores/github/vcsConnect.ts +62 -0
  16. package/app/stores/github.spec.ts +31 -0
  17. package/app/stores/github.ts +5 -26
  18. package/app/stores/inputGate.ts +58 -0
  19. package/app/stores/ui/resultViews.ts +9 -1
  20. package/app/stores/workspaceSettings.ts +1 -0
  21. package/app/types/domain.ts +1 -0
  22. package/app/utils/inputGate.spec.ts +52 -0
  23. package/app/utils/inputGate.ts +44 -0
  24. package/app/utils/pipelineRender.spec.ts +47 -9
  25. package/app/utils/pipelineRender.ts +23 -2
  26. package/app/utils/vcs.spec.ts +101 -0
  27. package/app/utils/vcs.ts +63 -1
  28. package/i18n/locales/de.json +76 -17
  29. package/i18n/locales/en.json +76 -17
  30. package/i18n/locales/es.json +76 -17
  31. package/i18n/locales/fr.json +76 -17
  32. package/i18n/locales/he.json +76 -17
  33. package/i18n/locales/it.json +76 -17
  34. package/i18n/locales/ja.json +76 -17
  35. package/i18n/locales/pl.json +76 -17
  36. package/i18n/locales/tr.json +76 -17
  37. package/i18n/locales/uk.json +76 -17
  38. package/package.json +2 -2
@@ -949,6 +949,16 @@
949
949
  "saveFailed": "Einstellungen konnten nicht gespeichert werden",
950
950
  "budgetSaved": "Budget gespeichert",
951
951
  "budgetSaveFailed": "Budget konnte nicht gespeichert werden"
952
+ },
953
+ "inputGate": {
954
+ "heading": "Eingabeprüfung vor dem Start eines Laufs",
955
+ "body": "Prüft den Wortlaut einer Aufgabe, bevor der erste Agentenschritt startet, damit eine unbearbeitbare Aufgabe ohne Verbrauch stoppt. Standard hält den Lauf an bei leerer oder Platzhalter-Beschreibung, einem Fehler ohne Reproduktionskontext oder einer Review-Aufgabe ohne Pull Request.",
956
+ "mode": "Modus",
957
+ "modes": {
958
+ "standard": "Standard (bei blockierender Lücke anhalten)",
959
+ "advisory": "Hinweis (erfassen, nie anhalten)",
960
+ "off": "Aus (Prüfung überspringen)"
961
+ }
952
962
  }
953
963
  },
954
964
  "localModelEndpoints": {
@@ -3133,18 +3143,13 @@
3133
3143
  },
3134
3144
  "addService": {
3135
3145
  "title": "Einen Service aus einem Repository hinzufügen",
3136
- "intro": "Wählen Sie ein bestehendes GitHub-Repository, um es als Board-Service hinzuzufügen. Kein Bootstrapping: Das Repo wird unverändert mit einem neuen Service-Frame verknüpft, und Aufgaben, die Sie darauf ausführen, zielen auf dieses Repo.",
3137
- "connectFirst": "Verbinden Sie diesen Workspace zuerst mit GitHub. Verknüpfen Sie eine Installation, auf der die App bereits ist, oder installieren Sie sie.",
3138
3146
  "repository": "Repository",
3139
- "repositoryHint": "Repositorys, auf die die GitHub App zugreifen kann. Ihres nicht dabei? Gewähren Sie der App unten Zugriff und aktualisieren Sie dann.",
3140
3147
  "repoType": "Repository-Typ",
3141
3148
  "repoTypeHint": "Was dieses Repo ist: ein Backend-Service, eine Frontend-App, eine gemeinsame Bibliothek oder ein Dokumenten-Repository (nur Docs/Spikes).",
3142
- "noReposAvailable": "Noch keine Repositorys verfügbar. Gewähren Sie der App unten Zugriff auf eines und aktualisieren Sie dann.",
3143
3149
  "searchPlaceholder": "Repositorys nach Eigentümer oder Name durchsuchen…",
3144
3150
  "searchMinChars": "Geben Sie mindestens {min} Zeichen ein, um zu suchen. | Geben Sie mindestens {min} Zeichen ein, um zu suchen.",
3145
3151
  "noMatches": "Keine Repositorys für {query} gefunden.",
3146
3152
  "clearSelection": "Auswahl aufheben",
3147
- "showingCount": "{shown} von {total} Repositorys werden angezeigt.",
3148
3153
  "repoLabel": {
3149
3154
  "private": " (privat)",
3150
3155
  "monorepo": " · Monorepo",
@@ -3161,7 +3166,6 @@
3161
3166
  "addedConfigure": "{title} hinzugefügt, konfigurieren Sie es",
3162
3167
  "grantAccess": "Der App Zugriff auf ein Repo gewähren",
3163
3168
  "grantAccessTitle": "Öffnen Sie die Installationseinstellungen der App, um ihr Zugriff auf ein Repository zu gewähren",
3164
- "refreshList": "Liste aktualisieren",
3165
3169
  "done": "Fertig",
3166
3170
  "donePendingHint": "Füge zuerst die ausgewählten Services hinzu oder hebe die Auswahl auf – sonst werden diese Auswahlen verworfen.",
3167
3171
  "add": "Service hinzufügen",
@@ -4215,13 +4219,6 @@
4215
4219
  "tooLong": "Darf höchstens 100 Zeichen lang sein."
4216
4220
  }
4217
4221
  },
4218
- "intro": {
4219
- "canCreate": "Erstellen Sie ein leeres GitHub-Repository und lassen Sie es dann von einem Bootstrapper-Agenten in einem Sandbox-Container befüllen — entweder durch Anpassen einer Ihrer Referenzarchitekturen oder von Grund auf nach einem freien Prompt. cat-factory pusht den initialen Commit in dieses Repo; für dieses Konto kann es das Repository auch für Sie erstellen.",
4220
- "manual": "Erstellen Sie ein leeres GitHub-Repository und lassen Sie es dann von einem Bootstrapper-Agenten in einem Sandbox-Container befüllen — entweder durch Anpassen einer Ihrer Referenzarchitekturen oder von Grund auf nach einem freien Prompt. cat-factory pusht den initialen Commit in dieses Repo; Sie erstellen das Repository (ein Klick unten), sodass keine Repo-Erstellungsberechtigung nötig ist."
4221
- },
4222
- "github": {
4223
- "prompt": "Verbinden Sie diesen Workspace mit GitHub, bevor Sie bootstrappen; ein Lauf pusht in ein Repository. Verknüpfen Sie eine Installation, auf der die App bereits ist, oder installieren Sie sie."
4224
- },
4225
4222
  "section": {
4226
4223
  "newRepo": "Neues Repository"
4227
4224
  },
@@ -4250,9 +4247,7 @@
4250
4247
  },
4251
4248
  "createRepo": {
4252
4249
  "now": "Repository erstellen",
4253
- "onGitHub": "Auf GitHub erstellen",
4254
- "titleNow": "Das Repository jetzt erstellen",
4255
- "titleGitHub": "GitHubs Seite für neue Repositorys vorausgefüllt öffnen"
4250
+ "titleNow": "Das Repository jetzt erstellen"
4256
4251
  },
4257
4252
  "grantAccess": {
4258
4253
  "label": "Der App Zugriff auf dieses Repo gewähren",
@@ -4294,7 +4289,6 @@
4294
4289
  "title": "Referenzarchitekturen",
4295
4290
  "add": "Hinzufügen",
4296
4291
  "pickRepo": {
4297
- "label": "Ein bestehendes GitHub-Repo wählen",
4298
4292
  "description": "Wählen Sie ein Repo, auf das Sie Zugriff haben, um Owner und Name auszufüllen, oder geben Sie sie unten manuell ein.",
4299
4293
  "placeholder": "owner/name"
4300
4294
  },
@@ -5158,6 +5152,8 @@
5158
5152
  "binary_output_service_invalid": "Dienst für Binärausgaben nicht auflösbar",
5159
5153
  "binary_output_generator_invalid": "Generator für Binärausgaben nicht auflösbar",
5160
5154
  "foundational_service_not_inherited": "Dieses Board hat den Dienst registriert",
5155
+ "input_gate_not_parked": "Nichts zu beantworten",
5156
+ "input_gate_parked": "Über die Eingabeprüfung der Aufgabe beantworten",
5161
5157
  "ticket_already_linked": "Dieses Ticket hat bereits eine Aufgabe",
5162
5158
  "dry_run_not_mergeable": "Probelauf kann nicht zusammengeführt werden"
5163
5159
  },
@@ -5192,6 +5188,8 @@
5192
5188
  "binary_output_service_invalid": "Ein Schritt, der Binärausgaben erzeugt, wählt einen Basisdienst aus, den der Katalog dieses Workspace nicht auflösen kann: Die ID ist unbekannt, oder der gewählte Speicherdienst trägt nicht die Fähigkeit asset-storage. Korrigieren Sie die Auswahl des Schritts oder registrieren Sie den Dienst und starten Sie erneut.",
5193
5189
  "binary_output_generator_invalid": "Ein Schritt, der Binärausgaben erzeugt, wählt eine generative Integration aus, die diese Installation nicht registriert, oder keine der gewählten Integrationen erzeugt einen Inhaltstyp, den der Schritt liefern muss. Generative Integrationen werden im Code der Installation registriert, nicht in diesem Workspace: registrieren Sie sie oder korrigieren Sie die Auswahl des Schritts und starten Sie erneut.",
5194
5190
  "foundational_service_not_inherited": "Abwählen gilt für einen vom Konto geerbten Dienst. Diese ID ist von diesem Board registriert, es gibt also nichts abzuwählen - lösche stattdessen den eigenen Eintrag des Boards.",
5191
+ "input_gate_not_parked": "Dieser Lauf wartet nicht mehr auf seine Eingabeprüfung. Möglicherweise hat sie jemand schon beantwortet oder der Lauf ist weitergelaufen.",
5192
+ "input_gate_parked": "Dieser Lauf wartet auf seine Eingabeprüfung, die über die Freigabe nicht beantwortet werden kann. Nutzen Sie den Hinweis am Lauf: Aufgabe ergänzen und erneut prüfen, oder trotzdem ausführen.",
5195
5193
  "ticket_already_linked": "Ein Ticket kann nur eine Aufgabe stützen. Es erneut zu verknüpfen würde der bestehenden Aufgabe genau den Kontext entziehen, mit dem sie angelegt wurde. Öffne stattdessen diese Aufgabe oder hebe die Verknüpfung des Tickets zuerst auf.",
5196
5194
  "dry_run_not_mergeable": "Dieser Pull Request stammt aus einem Probelauf und kann hier nicht zusammengeführt werden. Starte die Aufgabe erneut als echten Lauf, um einen Pull Request zu erzeugen, den dieser Arbeitsbereich zusammenführt."
5197
5195
  },
@@ -5430,6 +5428,51 @@
5430
5428
  "fail": "Lauf fehlgeschlagen"
5431
5429
  }
5432
5430
  },
5431
+ "inputGate": {
5432
+ "blockedTitle": "Diese Aufgabe braucht mehr Details, bevor sie laufen kann",
5433
+ "blockedBody": "Der Lauf wurde vor dem ersten Agentenschritt gestoppt, es wurde also nichts verbraucht. Ergänze das Fehlende an der Aufgabe und prüfe erneut.",
5434
+ "waivedTitle": "Trotz unvollständiger Aufgabe gestartet",
5435
+ "waivedBody": "Jemand hat entschieden, diese Aufgabe mit den unten offenen Lücken auszuführen. Sie bleiben als Teil der Laufhistorie erhalten.",
5436
+ "advisoryTitle": "Einige Lücken wurden notiert, der Lauf lief weiter",
5437
+ "advisoryBody": "Die Eingabeprüfung der Aufgabe hat diese Punkte beim Start gefunden. Keiner davon stoppt die Arbeit, daher wurde nichts angehalten. Wer sie ergänzt, erleichtert den nächsten Lauf.",
5438
+ "severity": {
5439
+ "blocking": "Blockierend",
5440
+ "advisory": "Hinweis"
5441
+ },
5442
+ "recheck": "Aufgabe erneut prüfen",
5443
+ "proceed": "Trotzdem ausführen",
5444
+ "recheckHint": "Die erneute Prüfung liest die Aufgabe im aktuellen Stand, bearbeite sie also zuerst.",
5445
+ "issue": {
5446
+ "description_missing": {
5447
+ "title": "Keine Beschreibung",
5448
+ "hint": "Der Titel benennt die Aufgabe, die Beschreibung ist die Arbeitsgrundlage des Agenten. Schreibe, was sich ändern soll und warum."
5449
+ },
5450
+ "description_placeholder": {
5451
+ "title": "Platzhalter-Beschreibung",
5452
+ "hint": "Die Beschreibung ist ein Platzhalter (\"TBD\", \"n/a\", \"fix it\") statt einer Beschreibung der Arbeit."
5453
+ },
5454
+ "description_thin": {
5455
+ "title": "Sehr kurze Beschreibung",
5456
+ "hint": "Wenige Worte legen selten fest, was \"fertig\" heißt. Mehr Details hier sparen später eine Rückfragerunde."
5457
+ },
5458
+ "reproduction_missing": {
5459
+ "title": "Kein Reproduktionskontext",
5460
+ "hint": "Ein Fehler ohne Schritte, ohne Soll-Ist-Vergleich und ohne Stacktrace lässt den Behebenden nicht erkennen, wann er behoben ist."
5461
+ },
5462
+ "review_target_missing": {
5463
+ "title": "Kein Pull Request zum Prüfen",
5464
+ "hint": "Eine Review-Aufgabe braucht die Nummer oder URL des Pull Requests, den sie lesen soll."
5465
+ },
5466
+ "success_criteria_missing": {
5467
+ "title": "Keine Erfolgskriterien",
5468
+ "hint": "Nenne die Frage, die der Spike beantwortet, oder wie ein gutes Ergebnis aussieht, damit die Zeitbox ein Ziel hat."
5469
+ },
5470
+ "unknown": {
5471
+ "title": "Unbekannter Befund",
5472
+ "hint": "Dieser Lauf hat eine Prüfung erfasst, die diese Version nicht mehr kennt. Sieh die Aufgabe von Hand durch, bevor du fortfährst."
5473
+ }
5474
+ }
5475
+ },
5433
5476
  "consensus": {
5434
5477
  "titlePrefix": "Konsens",
5435
5478
  "participantCount": "keine Teilnehmer | ein Teilnehmer | {count} Teilnehmer",
@@ -6371,6 +6414,22 @@
6371
6414
  "titleAny": "cat-factory mit Ihren Repositorys verbinden",
6372
6415
  "intro": "cat-factory funktioniert, indem es Pull Requests in Ihren Repositorys öffnet. Verbinden Sie Ihren Repository-Anbieter, um fortzufahren."
6373
6416
  },
6417
+ "addService": {
6418
+ "intro": "Wählen Sie ein bestehendes {provider}-Repository, um es als Board-Service hinzuzufügen. Kein Bootstrapping: Das Repo wird unverändert mit einem neuen Service-Frame verknüpft, und Aufgaben, die Sie darauf ausführen, zielen auf dieses Repo.",
6419
+ "introAny": "Wählen Sie ein bestehendes Repository, um es als Board-Service hinzuzufügen. Kein Bootstrapping: Das Repo wird unverändert mit einem neuen Service-Frame verknüpft, und Aufgaben, die Sie darauf ausführen, zielen auf dieses Repo.",
6420
+ "connectFirst": "Verbinden Sie diesen Workspace zuerst mit einem Repository-Host, und wählen Sie dann ein Repository zum Hinzufügen aus.",
6421
+ "repositoryHintApp": "Repositorys, auf die die GitHub App zugreifen kann. Ihres nicht dabei? Gewähren Sie der App unten Zugriff und suchen Sie dann erneut.",
6422
+ "repositoryHintToken": "Repositorys, die Ihr {provider}-Token erreichen kann. Ihres nicht dabei? Prüfen Sie den Geltungsbereich des Tokens und Ihren Zugriff auf das Projekt, und suchen Sie dann erneut."
6423
+ },
6424
+ "bootstrap": {
6425
+ "connectPrompt": "Verbinden Sie diesen Workspace mit einem Repository-Host, bevor Sie bootstrappen; ein Lauf pusht in ein Repository.",
6426
+ "createRepoOn": "Auf {provider} erstellen",
6427
+ "createRepoTitle": "Seite für neue Repositorys bei {provider} öffnen",
6428
+ "introCanCreate": "Erstellen Sie ein leeres {provider}-Repository und lassen Sie es dann von einem Bootstrapper-Agenten in einem Sandbox-Container befüllen, entweder durch Anpassen einer Ihrer Referenzarchitekturen oder von Grund auf nach einem freien Prompt. cat-factory pusht den initialen Commit in dieses Repo; für dieses Konto kann es das Repository auch für Sie erstellen.",
6429
+ "introManual": "Erstellen Sie ein leeres {provider}-Repository und lassen Sie es dann von einem Bootstrapper-Agenten in einem Sandbox-Container befüllen, entweder durch Anpassen einer Ihrer Referenzarchitekturen oder von Grund auf nach einem freien Prompt. cat-factory pusht den initialen Commit in dieses Repo; Sie erstellen das Repository (ein Klick unten), sodass keine Repo-Erstellungsberechtigung nötig ist.",
6430
+ "introManualAny": "Erstellen Sie ein leeres Repository bei Ihrem Repository-Host und lassen Sie es dann von einem Bootstrapper-Agenten in einem Sandbox-Container befüllen, entweder durch Anpassen einer Ihrer Referenzarchitekturen oder von Grund auf nach einem freien Prompt. cat-factory pusht den initialen Commit in dieses Repo; Sie erstellen das Repository selbst, sodass keine Repo-Erstellungsberechtigung nötig ist.",
6431
+ "archPickRepo": "Ein bestehendes {provider}-Repo wählen"
6432
+ },
6374
6433
  "branchProtection": {
6375
6434
  "heading": "Schutz des Standard-Branch",
6376
6435
  "body": "Agenten-Ausführungen pushen mit einem Zugang, der in jedes abgedeckte Repository schreiben darf. Nichts hier kann verhindern, dass eine kompromittierte Ausführung direkt auf einen Standard-Branch pusht oder ihren eigenen Pull Request über die API des Hosts merged — beides deckt nur der Branch-Schutz beim Host ab, und den richtest du selbst ein. Diese Prüfung zeigt, ob er vorhanden ist.",
@@ -623,6 +623,8 @@
623
623
  "binary_output_service_invalid": "Binary output service can't be resolved",
624
624
  "binary_output_generator_invalid": "Binary output generator can't be resolved",
625
625
  "foundational_service_not_inherited": "This board registered that service",
626
+ "input_gate_not_parked": "Nothing to answer",
627
+ "input_gate_parked": "Answer it in the task's input check",
626
628
  "ticket_already_linked": "This issue already has a task",
627
629
  "dry_run_not_mergeable": "Dry run cannot be merged"
628
630
  },
@@ -660,6 +662,8 @@
660
662
  "binary_output_service_invalid": "A step that generates binary outputs selects a foundational service this workspace's catalog can't resolve: the id is unknown, or the chosen storage service doesn't carry the asset-storage capability. Fix the step's selection or register the service, then start again.",
661
663
  "binary_output_generator_invalid": "A step that generates binary outputs selects a generative integration this deployment doesn't register, or none of the selected integrations produces a content type the step must deliver. Generative integrations are registered in the deployment's code, not in this workspace: register it or fix the step's selection, then start again.",
662
664
  "foundational_service_not_inherited": "Opting out applies to a service inherited from the account. This id is registered by this board, so there is nothing to opt out of - delete the board's own entry instead.",
665
+ "input_gate_not_parked": "This run is not waiting on its input check any more. Someone may have answered it already, or the run has moved on.",
666
+ "input_gate_parked": "This run is parked on its input check, which the approval rail cannot answer. Use the notice on the run: fix the task and re-check, or run it anyway.",
663
667
  "ticket_already_linked": "An issue can back only one task, so linking it again would strip the existing task of the context it was created with. Open that task instead, or unlink the issue first.",
664
668
  "dry_run_not_mergeable": "This pull request came from a dry run, so it can't be merged from here. Start the task again as a live run to produce a pull request this workspace will merge."
665
669
  },
@@ -3398,6 +3402,16 @@
3398
3402
  "saveFailed": "Could not save settings",
3399
3403
  "budgetSaved": "Budget saved",
3400
3404
  "budgetSaveFailed": "Could not save budget"
3405
+ },
3406
+ "inputGate": {
3407
+ "heading": "Input check before a run starts",
3408
+ "body": "Check a task's own wording before the first agent step is dispatched, so a task nobody could act on stops without spending anything. Standard parks the run on an empty or placeholder description, a bug with no reproduction context, or a review task naming no pull request.",
3409
+ "mode": "Mode",
3410
+ "modes": {
3411
+ "standard": "Standard (park on a blocking gap)",
3412
+ "advisory": "Advisory (record, never park)",
3413
+ "off": "Off (skip the check)"
3414
+ }
3401
3415
  }
3402
3416
  },
3403
3417
  "localModelEndpoints": {
@@ -3890,13 +3904,9 @@
3890
3904
  },
3891
3905
  "addService": {
3892
3906
  "title": "Add a service from a repository",
3893
- "intro": "Pick an existing GitHub repository to add as a board service. No bootstrapping: the repo is linked to a new service frame as-is, and tasks you run on it target that repo.",
3894
- "connectFirst": "Connect this workspace to GitHub first. Link an installation the App is already on, or install it.",
3895
3907
  "repository": "Repository",
3896
- "repositoryHint": "Repositories the GitHub App can access. Don't see yours? Grant the App access below, then refresh.",
3897
3908
  "repoType": "Repository type",
3898
3909
  "repoTypeHint": "What this repo is: a backend service, a frontend app, a shared library, or a document repository (docs/spikes only).",
3899
- "noReposAvailable": "No repositories available yet. Grant the App access to one below, then refresh.",
3900
3910
  "searchPlaceholder": "Search repositories by owner or name…",
3901
3911
  "searchMinChars": "Type at least {min} character to search. | Type at least {min} characters to search.",
3902
3912
  "@searchMinChars": {
@@ -3904,7 +3914,6 @@
3904
3914
  },
3905
3915
  "noMatches": "No repositories found for {query}.",
3906
3916
  "clearSelection": "Clear selection",
3907
- "showingCount": "Showing {shown} of {total} repositories.",
3908
3917
  "repoLabel": {
3909
3918
  "private": " (private)",
3910
3919
  "monorepo": " · monorepo",
@@ -3924,7 +3933,6 @@
3924
3933
  "addedConfigure": "{title} added, configure it",
3925
3934
  "grantAccess": "Grant the App access to a repo",
3926
3935
  "grantAccessTitle": "Open the App's installation settings to grant it access to a repository",
3927
- "refreshList": "Refresh list",
3928
3936
  "done": "Done",
3929
3937
  "donePendingHint": "Add your selected services first, or clear the selection — otherwise those picks are discarded.",
3930
3938
  "add": "Add service",
@@ -4754,6 +4762,51 @@
4754
4762
  "fail": "Failed the run"
4755
4763
  }
4756
4764
  },
4765
+ "inputGate": {
4766
+ "blockedTitle": "This task needs more detail before it can run",
4767
+ "blockedBody": "The run stopped before its first agent step, so nothing has been spent. Fill in what is missing on the task, then re-check.",
4768
+ "waivedTitle": "Started despite an incomplete task",
4769
+ "waivedBody": "Someone chose to run this task with the gaps below still open. They are kept here as part of the run's record.",
4770
+ "advisoryTitle": "Some gaps were noted, and the run continued",
4771
+ "advisoryBody": "The task's input check found these while starting the run. None of them stops the work, so nothing was parked; filling them in makes the next run easier to get right.",
4772
+ "severity": {
4773
+ "blocking": "Blocking",
4774
+ "advisory": "Advisory"
4775
+ },
4776
+ "recheck": "Re-check the task",
4777
+ "proceed": "Run anyway",
4778
+ "recheckHint": "Re-check reads the task as it stands now, so edit it first.",
4779
+ "issue": {
4780
+ "description_missing": {
4781
+ "title": "No description",
4782
+ "hint": "The title names the task; the description is what an agent works from. Say what should change and why."
4783
+ },
4784
+ "description_placeholder": {
4785
+ "title": "Placeholder description",
4786
+ "hint": "The description is a stand-in (\"TBD\", \"n/a\", \"fix it\") rather than a statement of the work."
4787
+ },
4788
+ "description_thin": {
4789
+ "title": "Very short description",
4790
+ "hint": "A few words rarely pin down what \"done\" means. More detail here saves a round of questions later."
4791
+ },
4792
+ "reproduction_missing": {
4793
+ "title": "No reproduction context",
4794
+ "hint": "A bug with no steps, no observed-versus-expected and no stack trace gives its fixer no way to tell when it is fixed."
4795
+ },
4796
+ "review_target_missing": {
4797
+ "title": "No pull request to review",
4798
+ "hint": "A review task needs the number or URL of the pull request it should read."
4799
+ },
4800
+ "success_criteria_missing": {
4801
+ "title": "No success criteria",
4802
+ "hint": "State the question the spike answers, or what a good outcome looks like, so the timebox has a target."
4803
+ },
4804
+ "unknown": {
4805
+ "title": "Unrecognised finding",
4806
+ "hint": "This run recorded a check this version no longer knows about. Review the task by hand before continuing."
4807
+ }
4808
+ }
4809
+ },
4757
4810
  "requirements": {
4758
4811
  "title": "Requirements review",
4759
4812
  "iteration": "Iteration {current} / {max}",
@@ -5974,13 +6027,6 @@
5974
6027
  "tooLong": "Must be 100 characters or fewer."
5975
6028
  }
5976
6029
  },
5977
- "intro": {
5978
- "canCreate": "Create an empty GitHub repository, then let a bootstrapper agent populate it in a sandbox container, either by adapting one of your reference architectures or from scratch following a freeform prompt. cat-factory pushes the initial commit into that repo; for this account it can create the repository for you too.",
5979
- "manual": "Create an empty GitHub repository, then let a bootstrapper agent populate it in a sandbox container, either by adapting one of your reference architectures or from scratch following a freeform prompt. cat-factory pushes the initial commit into that repo; you create the repository (one click below), so it needs no repo-creation permission."
5980
- },
5981
- "github": {
5982
- "prompt": "Connect this workspace to GitHub before bootstrapping; a run pushes into a repository. Link an installation the App is already on, or install it."
5983
- },
5984
6030
  "section": {
5985
6031
  "newRepo": "New repository"
5986
6032
  },
@@ -6009,9 +6055,7 @@
6009
6055
  },
6010
6056
  "createRepo": {
6011
6057
  "now": "Create repository",
6012
- "onGitHub": "Create on GitHub",
6013
- "titleNow": "Create the repository now",
6014
- "titleGitHub": "Open GitHub's new-repository page, prefilled"
6058
+ "titleNow": "Create the repository now"
6015
6059
  },
6016
6060
  "grantAccess": {
6017
6061
  "label": "Grant the App access to this repo",
@@ -6053,7 +6097,6 @@
6053
6097
  "title": "Reference architectures",
6054
6098
  "add": "Add",
6055
6099
  "pickRepo": {
6056
- "label": "Pick an existing GitHub repo",
6057
6100
  "description": "Choose a repo you can access to fill in its owner and name, or enter them manually below.",
6058
6101
  "placeholder": "owner/name"
6059
6102
  },
@@ -6581,6 +6624,22 @@
6581
6624
  "titleAny": "Connect cat-factory to your repositories",
6582
6625
  "intro": "cat-factory works by opening pull requests on your repositories. Connect your repository host to continue."
6583
6626
  },
6627
+ "addService": {
6628
+ "intro": "Pick an existing {provider} repository to add as a board service. No bootstrapping: the repo is linked to a new service frame as-is, and tasks you run on it target that repo.",
6629
+ "introAny": "Pick an existing repository to add as a board service. No bootstrapping: the repo is linked to a new service frame as-is, and tasks you run on it target that repo.",
6630
+ "connectFirst": "Connect this workspace to a repository host first, then pick a repository to add.",
6631
+ "repositoryHintApp": "Repositories the GitHub App can access. Don't see yours? Grant the App access below, then search again.",
6632
+ "repositoryHintToken": "Repositories your {provider} token can reach. Don't see yours? Check the token's scope and your access to the project, then search again."
6633
+ },
6634
+ "bootstrap": {
6635
+ "connectPrompt": "Connect this workspace to a repository host before bootstrapping; a run pushes into a repository.",
6636
+ "createRepoOn": "Create on {provider}",
6637
+ "createRepoTitle": "Open {provider}'s new-repository page",
6638
+ "introCanCreate": "Create an empty {provider} repository, then let a bootstrapper agent populate it in a sandbox container, either by adapting one of your reference architectures or from scratch following a freeform prompt. cat-factory pushes the initial commit into that repo; for this account it can create the repository for you too.",
6639
+ "introManual": "Create an empty {provider} repository, then let a bootstrapper agent populate it in a sandbox container, either by adapting one of your reference architectures or from scratch following a freeform prompt. cat-factory pushes the initial commit into that repo; you create the repository (one click below), so it needs no repo-creation permission.",
6640
+ "introManualAny": "Create an empty repository on your repository host, then let a bootstrapper agent populate it in a sandbox container, either by adapting one of your reference architectures or from scratch following a freeform prompt. cat-factory pushes the initial commit into that repo; you create the repository yourself, so it needs no repo-creation permission.",
6641
+ "archPickRepo": "Pick an existing {provider} repo"
6642
+ },
6584
6643
  "branchProtection": {
6585
6644
  "heading": "Default-branch protection",
6586
6645
  "body": "Agent runs push with a credential that can write to every repository it covers. Nothing here can stop a compromised run pushing straight to a default branch, or merging its own pull request through the host's API — branch protection on the host is what covers both, and it is yours to configure. This checks whether it is in place.",
@@ -566,6 +566,8 @@
566
566
  "binary_output_service_invalid": "No se puede resolver el servicio de salidas binarias",
567
567
  "binary_output_generator_invalid": "No se puede resolver el generador de salidas binarias",
568
568
  "foundational_service_not_inherited": "Este tablero registró ese servicio",
569
+ "input_gate_not_parked": "Nada que responder",
570
+ "input_gate_parked": "Respóndelo en la comprobación de entrada de la tarea",
569
571
  "ticket_already_linked": "Esta incidencia ya tiene una tarea",
570
572
  "dry_run_not_mergeable": "Una ejecución de prueba no se puede fusionar"
571
573
  },
@@ -600,6 +602,8 @@
600
602
  "binary_output_service_invalid": "Un paso que genera salidas binarias selecciona un servicio fundacional que el catálogo de este espacio de trabajo no puede resolver: el identificador es desconocido, o el servicio de almacenamiento elegido no tiene la capacidad asset-storage. Corrige la selección del paso o registra el servicio y vuelve a iniciarlo.",
601
603
  "binary_output_generator_invalid": "Un paso que genera salidas binarias selecciona una integración generativa que esta instalación no registra, o ninguna de las integraciones seleccionadas produce un tipo de contenido que el paso debe entregar. Las integraciones generativas se registran en el código de la instalación, no en este espacio de trabajo: regístrala o corrige la selección del paso y vuelve a iniciar.",
602
604
  "foundational_service_not_inherited": "La exclusión se aplica a un servicio heredado de la cuenta. Este id está registrado por este tablero, así que no hay nada que excluir: elimina la entrada propia del tablero.",
605
+ "input_gate_not_parked": "Esta ejecución ya no espera su comprobación de entrada. Puede que alguien la haya respondido o que la ejecución haya avanzado.",
606
+ "input_gate_parked": "Esta ejecución está detenida en su comprobación de entrada, que la vía de aprobación no puede resolver. Usa el aviso de la ejecución: corrige la tarea y vuelve a comprobar, o ejecútala de todos modos.",
603
607
  "ticket_already_linked": "Una incidencia solo puede respaldar una tarea, así que volver a vincularla dejaría a la tarea existente sin el contexto con el que se creó. Abre esa tarea o desvincula antes la incidencia.",
604
608
  "dry_run_not_mergeable": "Esta pull request proviene de una ejecución de prueba, así que no se puede fusionar desde aquí. Vuelve a iniciar la tarea como ejecución real para producir una pull request que este espacio de trabajo sí fusionará."
605
609
  },
@@ -3159,6 +3163,16 @@
3159
3163
  "saveFailed": "No se pudo guardar la configuración",
3160
3164
  "budgetSaved": "Presupuesto guardado",
3161
3165
  "budgetSaveFailed": "No se pudo guardar el presupuesto"
3166
+ },
3167
+ "inputGate": {
3168
+ "heading": "Comprobación de entrada antes de iniciar una ejecución",
3169
+ "body": "Revisa la redacción de la tarea antes de lanzar el primer paso del agente, para que una tarea inabordable se detenga sin gastar nada. Estándar detiene la ejecución ante una descripción vacía o de relleno, un error sin contexto de reproducción, o una tarea de revisión sin pull request.",
3170
+ "mode": "Modo",
3171
+ "modes": {
3172
+ "standard": "Estándar (detener ante una carencia bloqueante)",
3173
+ "advisory": "Aviso (registrar, nunca detener)",
3174
+ "off": "Desactivado (omitir la comprobación)"
3175
+ }
3162
3176
  }
3163
3177
  },
3164
3178
  "localModelEndpoints": {
@@ -3774,16 +3788,11 @@
3774
3788
  },
3775
3789
  "addService": {
3776
3790
  "title": "Añadir un servicio desde un repositorio",
3777
- "intro": "Elige un repositorio de GitHub existente para añadirlo como servicio del tablero. Sin arranque inicial: el repositorio se vincula tal cual a un nuevo marco de servicio, y las tareas que ejecutes en él apuntan a ese repositorio.",
3778
- "connectFirst": "Conecta primero este espacio de trabajo con GitHub. Vincula una instalación en la que la App ya esté, o instálala.",
3779
3791
  "repository": "Repositorio",
3780
- "repositoryHint": "Repositorios a los que la GitHub App puede acceder. ¿No ves el tuyo? Concede acceso a la App abajo y luego actualiza.",
3781
- "noReposAvailable": "Aún no hay repositorios disponibles. Concede acceso a la App a uno abajo y luego actualiza.",
3782
3792
  "searchPlaceholder": "Busca repositorios por propietario o nombre…",
3783
3793
  "searchMinChars": "Escribe al menos {min} carácter para buscar. | Escribe al menos {min} caracteres para buscar.",
3784
3794
  "noMatches": "No se encontraron repositorios para {query}.",
3785
3795
  "clearSelection": "Borrar selección",
3786
- "showingCount": "Mostrando {shown} de {total} repositorios.",
3787
3796
  "repoLabel": {
3788
3797
  "private": " (privado)",
3789
3798
  "monorepo": " · monorepo",
@@ -3800,7 +3809,6 @@
3800
3809
  "addedConfigure": "{title} añadido, configúralo",
3801
3810
  "grantAccess": "Conceder a la App acceso a un repositorio",
3802
3811
  "grantAccessTitle": "Abrir la configuración de instalación de la App para concederle acceso a un repositorio",
3803
- "refreshList": "Actualizar lista",
3804
3812
  "done": "Listo",
3805
3813
  "donePendingHint": "Añade primero los servicios seleccionados o borra la selección; de lo contrario, esas elecciones se descartan.",
3806
3814
  "add": "Añadir servicio",
@@ -4549,6 +4557,51 @@
4549
4557
  "fail": "Ejecución fallida"
4550
4558
  }
4551
4559
  },
4560
+ "inputGate": {
4561
+ "blockedTitle": "Esta tarea necesita más detalle antes de ejecutarse",
4562
+ "blockedBody": "La ejecución se detuvo antes del primer paso del agente, así que no se ha gastado nada. Completa lo que falta en la tarea y vuelve a comprobar.",
4563
+ "waivedTitle": "Iniciada pese a una tarea incompleta",
4564
+ "waivedBody": "Alguien decidió ejecutar esta tarea con las carencias de abajo aún abiertas. Se conservan como parte del historial de la ejecución.",
4565
+ "advisoryTitle": "Se anotaron algunas carencias y la ejecución continuó",
4566
+ "advisoryBody": "La comprobación de entrada de la tarea encontró esto al iniciar la ejecución. Nada de ello detiene el trabajo, así que no se detuvo nada; completarlo facilita acertar en la próxima ejecución.",
4567
+ "severity": {
4568
+ "blocking": "Bloqueante",
4569
+ "advisory": "Aviso"
4570
+ },
4571
+ "recheck": "Volver a comprobar",
4572
+ "proceed": "Ejecutar igualmente",
4573
+ "recheckHint": "La comprobación lee la tarea tal como está ahora, así que edítala primero.",
4574
+ "issue": {
4575
+ "description_missing": {
4576
+ "title": "Sin descripción",
4577
+ "hint": "El título nombra la tarea; la descripción es con lo que trabaja un agente. Di qué debe cambiar y por qué."
4578
+ },
4579
+ "description_placeholder": {
4580
+ "title": "Descripción de relleno",
4581
+ "hint": "La descripción es un marcador (\"TBD\", \"n/a\", \"arreglarlo\") en vez de una descripción del trabajo."
4582
+ },
4583
+ "description_thin": {
4584
+ "title": "Descripción muy breve",
4585
+ "hint": "Unas pocas palabras rara vez definen qué significa \"terminado\". Más detalle aquí ahorra una ronda de preguntas después."
4586
+ },
4587
+ "reproduction_missing": {
4588
+ "title": "Sin contexto de reproducción",
4589
+ "hint": "Un error sin pasos, sin observado frente a esperado y sin traza no permite saber cuándo queda corregido."
4590
+ },
4591
+ "review_target_missing": {
4592
+ "title": "Sin pull request que revisar",
4593
+ "hint": "Una tarea de revisión necesita el número o la URL del pull request que debe leer."
4594
+ },
4595
+ "success_criteria_missing": {
4596
+ "title": "Sin criterios de éxito",
4597
+ "hint": "Indica la pregunta que responde el spike, o cómo sería un buen resultado, para que el tiempo acotado tenga un objetivo."
4598
+ },
4599
+ "unknown": {
4600
+ "title": "Hallazgo no reconocido",
4601
+ "hint": "Esta ejecución registró una comprobación que esta versión ya no conoce. Revisa la tarea a mano antes de continuar."
4602
+ }
4603
+ }
4604
+ },
4552
4605
  "requirements": {
4553
4606
  "title": "Revisión de requisitos",
4554
4607
  "iteration": "Iteración {current} / {max}",
@@ -5710,13 +5763,6 @@
5710
5763
  "tooLong": "Debe tener 100 caracteres o menos."
5711
5764
  }
5712
5765
  },
5713
- "intro": {
5714
- "canCreate": "Crea un repositorio de GitHub vacío y deja que un agente inicializador lo poble en un contenedor de pruebas, ya sea adaptando una de tus arquitecturas de referencia o desde cero siguiendo un prompt libre. cat-factory envía el commit inicial a ese repositorio; en esta cuenta también puede crear el repositorio por ti.",
5715
- "manual": "Crea un repositorio de GitHub vacío y deja que un agente inicializador lo poble en un contenedor de pruebas, ya sea adaptando una de tus arquitecturas de referencia o desde cero siguiendo un prompt libre. cat-factory envía el commit inicial a ese repositorio; tú creas el repositorio (con un clic más abajo), por lo que no necesita permiso para crear repositorios."
5716
- },
5717
- "github": {
5718
- "prompt": "Conecta este espacio de trabajo a GitHub antes de inicializar; una ejecución hace push a un repositorio. Vincula una instalación en la que la App ya esté, o instálala."
5719
- },
5720
5766
  "section": {
5721
5767
  "newRepo": "Nuevo repositorio"
5722
5768
  },
@@ -5745,9 +5791,7 @@
5745
5791
  },
5746
5792
  "createRepo": {
5747
5793
  "now": "Crear repositorio",
5748
- "onGitHub": "Crear en GitHub",
5749
- "titleNow": "Crear el repositorio ahora",
5750
- "titleGitHub": "Abrir la página de nuevo repositorio de GitHub, rellenada"
5794
+ "titleNow": "Crear el repositorio ahora"
5751
5795
  },
5752
5796
  "grantAccess": {
5753
5797
  "label": "Conceder a la App acceso a este repositorio",
@@ -5785,7 +5829,6 @@
5785
5829
  "title": "Arquitecturas de referencia",
5786
5830
  "add": "Añadir",
5787
5831
  "pickRepo": {
5788
- "label": "Elige un repositorio de GitHub existente",
5789
5832
  "description": "Elige un repositorio al que tengas acceso para rellenar su propietario y nombre, o introdúcelos manualmente abajo.",
5790
5833
  "placeholder": "owner/name"
5791
5834
  },
@@ -6359,6 +6402,22 @@
6359
6402
  "titleAny": "Conecta cat-factory con tus repositorios",
6360
6403
  "intro": "cat-factory funciona abriendo solicitudes de incorporación de cambios en tus repositorios. Conecta tu proveedor de repositorios para continuar."
6361
6404
  },
6405
+ "addService": {
6406
+ "intro": "Elige un repositorio de {provider} existente para añadirlo como servicio del tablero. Sin arranque inicial: el repositorio se vincula tal cual a un nuevo marco de servicio, y las tareas que ejecutes en él apuntan a ese repositorio.",
6407
+ "introAny": "Elige un repositorio existente para añadirlo como servicio del tablero. Sin arranque inicial: el repositorio se vincula tal cual a un nuevo marco de servicio, y las tareas que ejecutes en él apuntan a ese repositorio.",
6408
+ "connectFirst": "Conecta primero este espacio de trabajo con un host de repositorios y luego elige un repositorio para añadir.",
6409
+ "repositoryHintApp": "Repositorios a los que la GitHub App puede acceder. ¿No ves el tuyo? Concede acceso a la App abajo y vuelve a buscar.",
6410
+ "repositoryHintToken": "Repositorios a los que puede acceder tu token de {provider}. ¿No ves el tuyo? Comprueba el alcance del token y tu acceso al proyecto, y vuelve a buscar."
6411
+ },
6412
+ "bootstrap": {
6413
+ "connectPrompt": "Conecta este espacio de trabajo con un host de repositorios antes de inicializar; una ejecución hace push a un repositorio.",
6414
+ "createRepoOn": "Crear en {provider}",
6415
+ "createRepoTitle": "Abrir la página de nuevo repositorio de {provider}",
6416
+ "introCanCreate": "Crea un repositorio de {provider} vacío y deja que un agente inicializador lo pueble en un contenedor de pruebas, ya sea adaptando una de tus arquitecturas de referencia o desde cero siguiendo un prompt libre. cat-factory envía el commit inicial a ese repositorio; en esta cuenta también puede crear el repositorio por ti.",
6417
+ "introManual": "Crea un repositorio de {provider} vacío y deja que un agente inicializador lo pueble en un contenedor de pruebas, ya sea adaptando una de tus arquitecturas de referencia o desde cero siguiendo un prompt libre. cat-factory envía el commit inicial a ese repositorio; tú creas el repositorio (con un clic más abajo), por lo que no necesita permiso para crear repositorios.",
6418
+ "introManualAny": "Crea un repositorio vacío en tu host de repositorios y deja que un agente inicializador lo pueble en un contenedor de pruebas, ya sea adaptando una de tus arquitecturas de referencia o desde cero siguiendo un prompt libre. cat-factory envía el commit inicial a ese repositorio; tú creas el repositorio por tu cuenta, por lo que no necesita permiso para crear repositorios.",
6419
+ "archPickRepo": "Elige un repositorio de {provider} existente"
6420
+ },
6362
6421
  "branchProtection": {
6363
6422
  "heading": "Protección de la rama predeterminada",
6364
6423
  "body": "Las ejecuciones de agentes hacen push con una credencial que puede escribir en todos los repositorios que cubre. Nada de lo que hay aquí impide que una ejecución comprometida haga push directamente a una rama predeterminada, ni que fusione su propia solicitud de incorporación mediante la API del host: solo la protección de ramas en el host cubre ambos casos, y la configuras tú. Esta comprobación indica si está activa.",