fifony 0.1.48-next.bfbc1ea → 0.1.48-next.c33c5fb

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 (35) hide show
  1. package/app/dist/service-worker.js +1 -1
  2. package/dist/agent/run-local.js +11 -11
  3. package/dist/{agent-E352B3RG.js → agent-SXSSNBZH.js} +11 -11
  4. package/dist/{analytics-broadcaster-S344UHAX.js → analytics-broadcaster-IXTUZGUL.js} +11 -11
  5. package/dist/{approve-plan.command-Y3NMO6UQ.js → approve-plan.command-OP53B7QE.js} +8 -8
  6. package/dist/{bootstrap-ZQR2XS2X.js → bootstrap-SWWOOGYE.js} +11 -11
  7. package/dist/{chunk-3MCINODI.js → chunk-2NCZAEN7.js} +4 -4
  8. package/dist/{chunk-GHO7EIRU.js → chunk-3CE23MKX.js} +4 -4
  9. package/dist/{chunk-RF366QKS.js → chunk-43PQD3XN.js} +4 -4
  10. package/dist/{chunk-YYCJRMSO.js → chunk-4JFRWK52.js} +6 -5
  11. package/dist/{chunk-PXD2FZ5R.js → chunk-77KTPWXP.js} +2 -2
  12. package/dist/{chunk-QZJ7U74Z.js → chunk-7AZGQCL2.js} +4 -4
  13. package/dist/{chunk-MFISONUO.js → chunk-BDDWYCKY.js} +72 -72
  14. package/dist/{chunk-U27J4TFK.js → chunk-LXTFQJRH.js} +3 -3
  15. package/dist/{chunk-S67ULJ46.js → chunk-S6LBB6CO.js} +2 -2
  16. package/dist/{chunk-4AAYWWX4.js → chunk-SWXQQ5UB.js} +3 -3
  17. package/dist/cli.js +10 -10
  18. package/dist/{create-issue.command-GITDNMED.js → create-issue.command-GYSDX752.js} +11 -11
  19. package/dist/{fsm-agent-S54PD67L.js → fsm-agent-USEQHEXT.js} +11 -11
  20. package/dist/{fsm-issue-J6SAII6X.js → fsm-issue-EO4B3QZF.js} +5 -5
  21. package/dist/{issue-log-broadcaster-WXAN6XYI.js → issue-log-broadcaster-ZBEAGBKS.js} +11 -11
  22. package/dist/{issues-VZNRW3CP.js → issues-QQN6PLJE.js} +4 -4
  23. package/dist/{log-analyzer-GKL45OV7.js → log-analyzer-J6KMCYDA.js} +11 -11
  24. package/dist/mcp/server.js +1 -1
  25. package/dist/{merge-workspace.command-TZQYLE2Z.js → merge-workspace.command-CZJJITOW.js} +11 -11
  26. package/dist/{parallel-executor-ZMFTS4PS.js → parallel-executor-7I6EAOIE.js} +11 -11
  27. package/dist/{queue-workers-U3GBRUWT.js → queue-workers-6CZCZXC6.js} +11 -11
  28. package/dist/{replan-issue.command-YBMKK536.js → replan-issue.command-Q4UFOTUE.js} +8 -8
  29. package/dist/{retry-issue.command-TNW6LS4Q.js → retry-issue.command-X2O5A2N4.js} +8 -8
  30. package/dist/{scheduler-W2RPX7S6.js → scheduler-FD2EQCNG.js} +11 -11
  31. package/dist/{settings-WPDBW6TO.js → settings-NJ4QWYAD.js} +11 -11
  32. package/dist/{settings.resource-PAR7LX4U.js → settings.resource-GTSYBMVW.js} +11 -11
  33. package/dist/{store-U2L3L3DF.js → store-QBKBIGBF.js} +11 -11
  34. package/dist/{workspace-NRG27NFU.js → workspace-HEMUOHRV.js} +4 -4
  35. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- const CACHE_VERSION = "1777403915764";
1
+ const CACHE_VERSION = "1777404799089";
2
2
  const CORE_CACHE = `fifony-core-${CACHE_VERSION}`;
3
3
  const ASSET_CACHE = `fifony-assets-${CACHE_VERSION}`;
4
4
  const FIFONY_NOTIFICATION_MESSAGE_TYPE = "FIFONY_NOTIFICATION";
@@ -31,21 +31,21 @@ import {
31
31
  stopQueueWorkers,
32
32
  syncRuntimeConfigSettings,
33
33
  upsertVariableInVaulter
34
- } from "../chunk-MFISONUO.js";
35
- import "../chunk-U27J4TFK.js";
36
- import "../chunk-3MCINODI.js";
34
+ } from "../chunk-BDDWYCKY.js";
35
+ import "../chunk-LXTFQJRH.js";
36
+ import "../chunk-2NCZAEN7.js";
37
37
  import "../chunk-TX7ISB2L.js";
38
38
  import {
39
39
  initWebPush
40
40
  } from "../chunk-FH7HUPZX.js";
41
- import "../chunk-S67ULJ46.js";
42
- import "../chunk-QZJ7U74Z.js";
43
- import "../chunk-RF366QKS.js";
41
+ import "../chunk-S6LBB6CO.js";
42
+ import "../chunk-7AZGQCL2.js";
43
+ import "../chunk-43PQD3XN.js";
44
44
  import {
45
45
  detectDefaultBranch,
46
46
  getGitRepoStatus,
47
47
  setSkipSource
48
- } from "../chunk-YYCJRMSO.js";
48
+ } from "../chunk-4JFRWK52.js";
49
49
  import {
50
50
  addEvent,
51
51
  applyWorkflowConfig,
@@ -56,12 +56,12 @@ import {
56
56
  hydrate,
57
57
  resolveProjectMetadata,
58
58
  validateConfig
59
- } from "../chunk-4AAYWWX4.js";
59
+ } from "../chunk-SWXQQ5UB.js";
60
60
  import {
61
61
  detectAvailableProviders,
62
62
  getProviderDefaultCommand,
63
63
  resolveDefaultProvider
64
- } from "../chunk-PXD2FZ5R.js";
64
+ } from "../chunk-77KTPWXP.js";
65
65
  import "../chunk-SQ734TQC.js";
66
66
  import {
67
67
  broadcastToWebSocketClients,
@@ -81,7 +81,7 @@ import {
81
81
  getReverseProxyRuntimeSnapshotStatus
82
82
  } from "../chunk-BENC6AV2.js";
83
83
  import "../chunk-3NE23NYW.js";
84
- import "../chunk-GHO7EIRU.js";
84
+ import "../chunk-3CE23MKX.js";
85
85
  import {
86
86
  debugBoot,
87
87
  fail,
@@ -503,7 +503,7 @@ async function main() {
503
503
  hydrate(state.issues);
504
504
  if (!runOnce) {
505
505
  try {
506
- const { bootstrapGlobalChat } = await import("../bootstrap-ZQR2XS2X.js");
506
+ const { bootstrapGlobalChat } = await import("../bootstrap-SWWOOGYE.js");
507
507
  bootstrapGlobalChat(state);
508
508
  } catch (err) {
509
509
  logger.warn({ err }, "[Boot] Failed to schedule global chat bootstrap");
@@ -13,14 +13,14 @@ import {
13
13
  runManagedReviewJob,
14
14
  runPlanningJob,
15
15
  tryParseJsonOutput
16
- } from "./chunk-MFISONUO.js";
17
- import "./chunk-U27J4TFK.js";
18
- import "./chunk-3MCINODI.js";
16
+ } from "./chunk-BDDWYCKY.js";
17
+ import "./chunk-LXTFQJRH.js";
18
+ import "./chunk-2NCZAEN7.js";
19
19
  import "./chunk-TX7ISB2L.js";
20
20
  import "./chunk-FH7HUPZX.js";
21
- import "./chunk-S67ULJ46.js";
22
- import "./chunk-QZJ7U74Z.js";
23
- import "./chunk-RF366QKS.js";
21
+ import "./chunk-S6LBB6CO.js";
22
+ import "./chunk-7AZGQCL2.js";
23
+ import "./chunk-43PQD3XN.js";
24
24
  import {
25
25
  attachToDaemon,
26
26
  buildPrompt,
@@ -39,9 +39,9 @@ import {
39
39
  runHook,
40
40
  shouldSkipMergePath,
41
41
  writeToDaemon
42
- } from "./chunk-YYCJRMSO.js";
43
- import "./chunk-4AAYWWX4.js";
44
- import "./chunk-PXD2FZ5R.js";
42
+ } from "./chunk-4JFRWK52.js";
43
+ import "./chunk-SWXQQ5UB.js";
44
+ import "./chunk-77KTPWXP.js";
45
45
  import "./chunk-SQ734TQC.js";
46
46
  import "./chunk-SLKYFN3Q.js";
47
47
  import "./chunk-4QXECRSB.js";
@@ -59,7 +59,7 @@ import {
59
59
  readDaemonExit,
60
60
  readDaemonPid
61
61
  } from "./chunk-3NE23NYW.js";
62
- import "./chunk-GHO7EIRU.js";
62
+ import "./chunk-3CE23MKX.js";
63
63
  import "./chunk-VBXVP4BX.js";
64
64
  import "./chunk-WZ2BMCEV.js";
65
65
  import "./chunk-PXTIWKLQ.js";
@@ -105,4 +105,4 @@ export {
105
105
  tryParseJsonOutput,
106
106
  writeToDaemon
107
107
  };
108
- //# sourceMappingURL=agent-E352B3RG.js.map
108
+ //# sourceMappingURL=agent-SXSSNBZH.js.map
@@ -1,20 +1,20 @@
1
1
  import {
2
2
  getEcDailyEvents,
3
3
  getEcDailyLines
4
- } from "./chunk-MFISONUO.js";
5
- import "./chunk-U27J4TFK.js";
6
- import "./chunk-3MCINODI.js";
4
+ } from "./chunk-BDDWYCKY.js";
5
+ import "./chunk-LXTFQJRH.js";
6
+ import "./chunk-2NCZAEN7.js";
7
7
  import "./chunk-TX7ISB2L.js";
8
8
  import "./chunk-FH7HUPZX.js";
9
- import "./chunk-S67ULJ46.js";
10
- import "./chunk-QZJ7U74Z.js";
11
- import "./chunk-RF366QKS.js";
12
- import "./chunk-YYCJRMSO.js";
9
+ import "./chunk-S6LBB6CO.js";
10
+ import "./chunk-7AZGQCL2.js";
11
+ import "./chunk-43PQD3XN.js";
12
+ import "./chunk-4JFRWK52.js";
13
13
  import {
14
14
  getAnalytics,
15
15
  getHourlySnapshot
16
- } from "./chunk-4AAYWWX4.js";
17
- import "./chunk-PXD2FZ5R.js";
16
+ } from "./chunk-SWXQQ5UB.js";
17
+ import "./chunk-77KTPWXP.js";
18
18
  import "./chunk-SQ734TQC.js";
19
19
  import {
20
20
  analyticsRoomHasSubscribers,
@@ -30,7 +30,7 @@ import "./chunk-JIEKFAM4.js";
30
30
  import "./chunk-F3V43TLJ.js";
31
31
  import "./chunk-BENC6AV2.js";
32
32
  import "./chunk-3NE23NYW.js";
33
- import "./chunk-GHO7EIRU.js";
33
+ import "./chunk-3CE23MKX.js";
34
34
  import "./chunk-VBXVP4BX.js";
35
35
  import "./chunk-WZ2BMCEV.js";
36
36
  import {
@@ -155,4 +155,4 @@ export {
155
155
  pushLinesAnalytics,
156
156
  pushTokenAnalytics
157
157
  };
158
- //# sourceMappingURL=analytics-broadcaster-S344UHAX.js.map
158
+ //# sourceMappingURL=analytics-broadcaster-IXTUZGUL.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  approvePlanCommand
3
- } from "./chunk-3MCINODI.js";
4
- import "./chunk-QZJ7U74Z.js";
5
- import "./chunk-RF366QKS.js";
6
- import "./chunk-YYCJRMSO.js";
7
- import "./chunk-4AAYWWX4.js";
8
- import "./chunk-PXD2FZ5R.js";
3
+ } from "./chunk-2NCZAEN7.js";
4
+ import "./chunk-7AZGQCL2.js";
5
+ import "./chunk-43PQD3XN.js";
6
+ import "./chunk-4JFRWK52.js";
7
+ import "./chunk-SWXQQ5UB.js";
8
+ import "./chunk-77KTPWXP.js";
9
9
  import "./chunk-SQ734TQC.js";
10
10
  import "./chunk-4QXECRSB.js";
11
11
  import "./chunk-W5IULOWV.js";
12
12
  import "./chunk-JIEKFAM4.js";
13
- import "./chunk-GHO7EIRU.js";
13
+ import "./chunk-3CE23MKX.js";
14
14
  import "./chunk-VBXVP4BX.js";
15
15
  import "./chunk-WZ2BMCEV.js";
16
16
  import "./chunk-PXTIWKLQ.js";
@@ -18,4 +18,4 @@ import "./chunk-Z6ZWNWWR.js";
18
18
  export {
19
19
  approvePlanCommand
20
20
  };
21
- //# sourceMappingURL=approve-plan.command-Y3NMO6UQ.js.map
21
+ //# sourceMappingURL=approve-plan.command-OP53B7QE.js.map
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  buildGlobalChatPrompt,
3
3
  chatWithIssue
4
- } from "./chunk-MFISONUO.js";
5
- import "./chunk-U27J4TFK.js";
6
- import "./chunk-3MCINODI.js";
4
+ } from "./chunk-BDDWYCKY.js";
5
+ import "./chunk-LXTFQJRH.js";
6
+ import "./chunk-2NCZAEN7.js";
7
7
  import {
8
8
  loadCliSession
9
9
  } from "./chunk-TX7ISB2L.js";
10
10
  import "./chunk-FH7HUPZX.js";
11
- import "./chunk-S67ULJ46.js";
12
- import "./chunk-QZJ7U74Z.js";
13
- import "./chunk-RF366QKS.js";
14
- import "./chunk-YYCJRMSO.js";
15
- import "./chunk-4AAYWWX4.js";
11
+ import "./chunk-S6LBB6CO.js";
12
+ import "./chunk-7AZGQCL2.js";
13
+ import "./chunk-43PQD3XN.js";
14
+ import "./chunk-4JFRWK52.js";
15
+ import "./chunk-SWXQQ5UB.js";
16
16
  import {
17
17
  detectAvailableProviders
18
- } from "./chunk-PXD2FZ5R.js";
18
+ } from "./chunk-77KTPWXP.js";
19
19
  import "./chunk-SQ734TQC.js";
20
20
  import "./chunk-SLKYFN3Q.js";
21
21
  import "./chunk-4QXECRSB.js";
@@ -24,7 +24,7 @@ import "./chunk-JIEKFAM4.js";
24
24
  import "./chunk-F3V43TLJ.js";
25
25
  import "./chunk-BENC6AV2.js";
26
26
  import "./chunk-3NE23NYW.js";
27
- import "./chunk-GHO7EIRU.js";
27
+ import "./chunk-3CE23MKX.js";
28
28
  import "./chunk-VBXVP4BX.js";
29
29
  import "./chunk-WZ2BMCEV.js";
30
30
  import {
@@ -79,4 +79,4 @@ function bootstrapGlobalChat(state, options = {}) {
79
79
  export {
80
80
  bootstrapGlobalChat
81
81
  };
82
- //# sourceMappingURL=bootstrap-ZQR2XS2X.js.map
82
+ //# sourceMappingURL=bootstrap-SWWOOGYE.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  transitionIssueCommand
3
- } from "./chunk-QZJ7U74Z.js";
3
+ } from "./chunk-7AZGQCL2.js";
4
4
  import {
5
5
  assertPlanReadyForExecution
6
- } from "./chunk-RF366QKS.js";
6
+ } from "./chunk-43PQD3XN.js";
7
7
  import {
8
8
  ensureGitRepoReadyForWorktrees
9
- } from "./chunk-YYCJRMSO.js";
9
+ } from "./chunk-4JFRWK52.js";
10
10
  import {
11
11
  TARGET_ROOT,
12
12
  init_constants
@@ -34,4 +34,4 @@ async function approvePlanCommand(input, deps) {
34
34
  export {
35
35
  approvePlanCommand
36
36
  };
37
- //# sourceMappingURL=chunk-3MCINODI.js.map
37
+ //# sourceMappingURL=chunk-2NCZAEN7.js.map
@@ -5,7 +5,7 @@ import { TemplateEngine } from "recker";
5
5
  var PROMPT_TEMPLATES = {
6
6
  "agent-provider-base": '{{#if isPlanner}}\nRole: planner.\nAnalyze the issue and prepare an execution plan for the implementation agents.\nDo not claim the issue is complete unless the plan itself is the deliverable.\n{{else}}\n{{#if isReviewer}}\nRole: reviewer.\nInspect the workspace and review the current implementation critically.\nIf rework is required, emit `FIFONY_STATUS=continue` and provide actionable `nextPrompt` feedback.\nEmit `FIFONY_STATUS=done` only when the work is acceptable.\n{{else}}\nRole: executor.\nImplement the required changes in the workspace.\nUse any planner guidance or prior reviewer feedback already persisted in the workspace.\n{{/if}}\n{{/if}}\n\n{{#if hasImpeccableOverlay}}\nImpeccable overlay is active.\nRaise the bar on UI polish, clarity, responsiveness, visual hierarchy, and interaction quality.\n{{#if isReviewer}}\nReview with a stricter frontend and product-quality standard than a normal correctness-only pass.\n{{else}}\nWhen touching frontend work, do not settle for baseline implementation quality.\n{{/if}}\n{{/if}}\n\n{{#if hasFrontendDesignOverlay}}\nFrontend-design overlay is active.\nPrefer stronger hierarchy, spacing, and readability decisions over generic implementation choices.\n{{/if}}\n\n{{#if selectionReason}}\nSelection reason: {{selectionReason}}\n{{/if}}\n{{#if overlays.length}}\nActive overlays:\n{{#each overlays}}\n- {{this}}\n{{/each}}\n{{/if}}\n\n{{#if profileInstructions}}\n## Agent Profile\n{{profileInstructions}}\n{{/if}}\n\n{{#if capabilitiesManifest}}\n{{capabilitiesManifest}}\n{{/if}}\n\n{{#if skillContext}}\n{{skillContext}}\n{{/if}}\n\n{{#if targetPaths.length}}\nTarget paths: {{targetPaths | join ", "}}\n{{/if}}\n\nWorkspace: {{workspacePath}}\n\n{{basePrompt}}\n',
7
7
  // src/agents/prompts/agent-provider-base.stub.md
8
- "agent-turn": 'Continue working on {{issueIdentifier}}.\nTurn {{turnIndex}} of {{maxTurns}}.\n\n{{#if isFinalTurns}}\n\u26A0\uFE0F **Turn budget warning: {{turnsRemaining}} turn(s) remaining.**\nThis is one of your last turns. Prioritize delivering working, testable code over perfection.\nIf the issue cannot be completed in {{turnsRemaining}} turn(s), write a `fifony-result.json` with `"status": "blocked"` and a clear summary of what remains.\n{{/if}}\n{{#if isContextPressure}}\n\u26A0\uFE0F **Context pressure: ~{{contextWindowPct}}% of context window used.**\nAvoid loading large files unnecessarily. Prefer targeted edits over full rewrites. If helpful, write a checkpoint file summarizing progress so far.\n{{/if}}\n\n## Turn Guidance\n\n- Go straight to the point. Try the simplest approach first.\n- If your previous approach failed, diagnose WHY before trying again \u2014 don\'t retry the identical action.\n- If you made partial progress, build on it. If you\'re stuck on the same error, try a fundamentally different strategy.\n- Keep output concise. Lead with what you did and what happened, not reasoning or preamble.\n- Before marking done, verify your changes work: run tests, check the build, inspect output. Report outcomes faithfully.\n\nBase objective:\n{{basePrompt}}\n\nContinuation guidance:\n{{continuation}}\n\nPrevious command output tail:\n```text\n{{outputTail}}\n```\n\nBefore exiting successfully, emit one of the following control markers:\n- `FIFONY_STATUS=continue` if more turns are required.\n- `FIFONY_STATUS=done` if the issue is complete.\n- `FIFONY_STATUS=blocked` if manual intervention is required.\nYou may also write `fifony-result.json` with `{ "status": "...", "summary": "...", "nextPrompt": "..." }`.\n',
8
+ "agent-turn": 'Continue working on {{issueIdentifier}}.\nTurn {{turnIndex}} of {{maxTurns}}.\n\n{{#if isFinalTurns}}\n\u26A0\uFE0F **Turn budget warning: {{turnsRemaining}} turn(s) remaining.**\nThis is one of your last turns. Prioritize delivering working, testable code over perfection.\nIf the issue cannot be completed in {{turnsRemaining}} turn(s), write a `fifony-result.json` with `"status": "blocked"` and a clear summary of what remains.\n{{/if}}\n{{#if isContextPressure}}\n\u26A0\uFE0F **Context pressure: ~{{contextWindowPct}}% of context window used.**\nAvoid loading large files unnecessarily. Prefer targeted edits over full rewrites. If helpful, write a checkpoint file summarizing progress so far.\n{{/if}}\n\n## Turn Guidance\n\n- **Go straight to the point.** Try the simplest approach first.\n- **Diagnose before retrying.** If your previous approach failed, read the error carefully and understand WHY before trying again. Do not retry the identical action.\n- **Pivot on repeated failure.** If you have seen the same error type twice in a row, abandon the current approach entirely and try a fundamentally different strategy. Persistence without diagnosis is not a virtue.\n- **Build on partial progress.** If you made some progress last turn, build on it \u2014 do not restart from scratch.\n- **Keep output concise.** Lead with what you did and what happened, not reasoning or preamble.\n- **Verify before claiming done.** Run tests, check the build, inspect output. Report outcomes faithfully. Never claim "all tests pass" when output shows failures.\n\n## Acceptance Criteria (source of truth)\n\nRead `execution-payload.json` in the workspace. The `acceptanceCriteria` array is the exact checklist the reviewer will grade. Use it to stay on scope and know when you are done \u2014 the criterion `doneWhen` on each plan step is your gate before moving to the next step.\n\nBase objective:\n{{basePrompt}}\n\nContinuation guidance:\n{{continuation}}\n\nPrevious command output tail:\n```text\n{{outputTail}}\n```\n\nBefore exiting successfully, emit one of the following control markers:\n- `FIFONY_STATUS=continue` if more turns are required.\n- `FIFONY_STATUS=done` if the issue is complete.\n- `FIFONY_STATUS=blocked` if manual intervention is required.\nYou may also write `fifony-result.json` with `{ "status": "...", "summary": "...", "nextPrompt": "..." }`.\n',
9
9
  // src/agents/prompts/agent-turn.stub.md
10
10
  "compile-contract-negotiation": 'Negotiate the pre-execution contract for {{issueIdentifier}} before any code is written.\n\nTitle: {{title}}\nDescription: {{description}}\nWorkspace: {{workspacePath}}\n\n# Your Role: Adversarial Contract Negotiator\n\nYou are reviewing the execution contract before implementation begins.\nYour job is to make sure the planner and the executor cannot move the goalposts later.\n\nYou are NOT reviewing code. You are reviewing whether the planned work is concrete, testable, scoped correctly, and hard enough for the later execution/review loop to enforce.\n\nRound {{round}} of {{maxRounds}}.\n\n# Reviewer Routing\n\nProvider: {{reviewerProvider}}{{#if reviewerModel}} / {{reviewerModel}}{{/if}}{{#if reviewerEffort}} / effort {{reviewerEffort}}{{/if}}\n{{#if reviewerSelectionReason}}\nSelection reason: {{reviewerSelectionReason}}\n{{/if}}\n{{#if reviewerOverlays.length}}\nReviewer overlays:\n{{#each reviewerOverlays}}\n- {{value}}\n{{/each}}\n{{/if}}\n\n{{#if reviewProfile}}\n# Review Profile\n\nPrimary profile: **{{reviewProfile.primary}}**\nSeverity bias: {{reviewProfile.severityBias}}\n{{#if reviewProfileSecondary.length}}\nSecondary profiles:\n{{#each reviewProfileSecondary}}\n- {{value}}\n{{/each}}\n{{/if}}\n{{#if reviewProfileRationale.length}}\nWhy this profile was selected:\n{{#each reviewProfileRationale}}\n- {{value}}\n{{/each}}\n{{/if}}\nFocus areas:\n{{#each reviewProfileFocusAreas}}\n- {{value}}\n{{/each}}\nFailure modes to probe aggressively:\n{{#each reviewProfileFailureModes}}\n- {{value}}\n{{/each}}\nEvidence priorities:\n{{#each reviewProfileEvidencePriorities}}\n- {{value}}\n{{/each}}\n{{/if}}\n\n{{#if planPrompt}}\n# Current Plan\n\n{{planPrompt}}\n{{/if}}\n\n{{#if acceptanceCriteria.length}}\n# Acceptance Criteria\n\nReview these as a contract, not as execution results:\n{{#each acceptanceCriteria}}\n- **{{id}}** [{{category}}]{{#if blocking}} blocking{{else}} advisory{{/if}}, weight {{weight}}: {{description}}\n Verify via: {{verificationMethod}}\n Evidence expected: {{evidenceExpected}}\n{{/each}}\n{{/if}}\n\n{{#if executionContract}}\n# Execution Contract\n\nSummary: {{executionContract.summary}}\nCheckpoint policy: {{executionContract.checkpointPolicy}}\n{{#if deliverables.length}}\nDeliverables:\n{{#each deliverables}}\n- {{value}}\n{{/each}}\n{{/if}}\n{{#if requiredChecks.length}}\nRequired checks:\n{{#each requiredChecks}}\n- {{value}}\n{{/each}}\n{{/if}}\n{{#if requiredEvidence.length}}\nRequired evidence:\n{{#each requiredEvidence}}\n- {{value}}\n{{/each}}\n{{/if}}\n{{#if executionContract.focusAreas.length}}\nFocus areas:\n{{#each executionContract.focusAreas}}\n- {{this}}\n{{/each}}\n{{/if}}\n{{/if}}\n\n{{#if currentNegotiationStatus}}\n# Negotiation History\n\nCurrent negotiation status: {{currentNegotiationStatus}}\n{{#if priorNegotiationSummary}}\nPrevious negotiation feedback:\n{{priorNegotiationSummary}}\n{{/if}}\n{{/if}}\n\n# What to critique\n\nLook for:\n- vague or untestable acceptance criteria\n- missing blocking criteria for risky behavior\n- missing validation commands or required evidence\n- focus areas that are too broad or too weak\n- harness mode that is too weak for the risk level\n- execution steps that do not actually line up with the contract\n- contracts that are easy for the executor to game with superficial implementation\n\n# Output decision\n\nUse `approved` only when the contract is specific enough that:\n- an executor can build against it without ambiguity\n- a reviewer can fail it with concrete evidence\n- the harness mode and checkpoint policy match the real risk\n\nUse `revise` whenever any blocking concern remains.\n\nAt the end of your response, you MUST emit a JSON block tagged `contract_decision` in exactly this format:\n\n```json contract_decision\n{\n "status": "approved",\n "summary": "Short summary of the contract quality.",\n "rationale": "Why the contract is or is not execution-ready.",\n "concerns": [\n {\n "id": "NC-1",\n "severity": "blocking",\n "area": "acceptance_criteria",\n "problem": "The current criteria do not prove that the API contract is preserved.",\n "requiredChange": "Add a blocking criterion that requires probing the route and checking status codes and payload shape."\n }\n ]\n}\n```\n\nRules:\n- `status` must be `approved` or `revise`.\n- If any concern has severity `blocking`, `status` MUST be `revise`.\n- `concerns` must be empty when `status` is `approved`.\n- `area` must be one of: `harness_mode`, `steps`, `acceptance_criteria`, `execution_contract`, `validation`, `suggested_paths`.\n- Keep concerns concrete and directly actionable by the planner.\n\nAfter the `contract_decision` block:\n- If `status` is `approved`, emit `FIFONY_STATUS=done`\n- If `status` is `revise`, emit `FIFONY_STATUS=continue` and put the most important contract fixes in `nextPrompt`\n',
11
11
  // src/agents/prompts/compile-contract-negotiation.stub.md
@@ -126,7 +126,7 @@ Before reporting done, verify:
126
126
  // src/agents/prompts/integrations-agency-agents.stub.md
127
127
  "integrations-impeccable": '# Impeccable integration idea\n\nUse impeccable-oriented skills as a frontend review layer around fifony issues.\n\nSuggested pattern:\n\n1. Use `agency-senior-developer` or `codex` as executor.\n2. Route UI-heavy issues to a reviewer prompt that explicitly asks for impeccable-style critique.\n3. Expose the resulting review through the fifony MCP prompts or as a follow-up review issue.\n\nSuggested labels:\n- frontend\n- ui\n- design-system\n\nSuggested reviewer prompt seed:\n"Review this implementation using impeccable standards for frontend quality, polish, hierarchy, spacing, responsiveness, and interaction clarity."\n',
128
128
  // src/agents/prompts/integrations-impeccable.stub.md
129
- "mcp-code-review": "# Code Review for Issue {{issueId}}\n\n## Issue Context\n- **Title**: {{title}}\n- **Description**: {{description}}\n- **State**: {{state}}\n\n## Change Summary\n- **Files Changed**: {{filesChanged}}\n- **Total Additions**: +{{totalAdditions}}\n- **Total Deletions**: -{{totalDeletions}}\n\n### Files\n| Path | Status | Additions | Deletions |\n|------|--------|-----------|-----------|\n{{#each files}}\n| {{path}} | {{status}} | +{{additions}} | -{{deletions}} |\n{{/each}}\n\n## Diff\n```diff\n{{diff}}\n```\n\n## Review Checklist\nPlease review the changes and evaluate:\n1. **Correctness**: Do the changes correctly implement what the issue describes?\n2. **Code Quality**: Is the code clean, readable, and follows project conventions?\n3. **Error Handling**: Are edge cases and errors properly handled?\n4. **Security**: Are there any security concerns (hardcoded secrets, SQL injection, XSS)?\n5. **Performance**: Are there any performance concerns or inefficiencies?\n6. **Tests**: Are changes adequately covered by tests?\n7. **Breaking Changes**: Do any changes break backward compatibility?\n",
129
+ "mcp-code-review": "# Adversarial Code Review \u2014 Issue {{issueId}}\n\n## Issue Context\n- **Title**: {{title}}\n- **Description**: {{description}}\n- **State**: {{state}}\n\n## Change Summary\n- **Files Changed**: {{filesChanged}}\n- **Total Additions**: +{{totalAdditions}}\n- **Total Deletions**: -{{totalDeletions}}\n\n### Files\n| Path | Status | Additions | Deletions |\n|------|--------|-----------|-----------|\n{{#each files}}\n| {{path}} | {{status}} | +{{additions}} | -{{deletions}} |\n{{/each}}\n\n## Diff\n```diff\n{{diff}}\n```\n\n## Your Role: Adversarial Quality Gate\n\nYou are NOT a collaborator \u2014 you are a skeptical evaluator. Your job is to find reasons to FAIL this work, not to be encouraging. Assume the implementation is incomplete until proven otherwise.\n\nVerification means PROVING the code works, not confirming it exists:\n- Read the actual files, trace the code path, do not trust the diff alone.\n- If something looks off, dig in. Never rubber-stamp weak work.\n- Never claim a criterion PASS without concrete evidence of what you observed.\n\n## Review Dimensions\n\nGrade each dimension with **PASS**, **FAIL**, or **SKIP** (only if truly untestable). Provide concrete evidence for every grade.\n\n### 1. Correctness\nDoes the implementation correctly solve what the issue describes?\n- Trace the code path for the primary scenario.\n- Verify edge cases are handled (empty input, boundary values, error states).\n- Check that the change does not silently no-op in a common scenario.\n\n### 2. Regression\nDoes this change break existing behavior anywhere?\n- Inspect callers of modified functions/components.\n- Check for changes in API contracts, return shapes, or event signatures.\n- Look for silent behavioral changes in unchanged code paths.\n\n### 3. Security\nAre there exploitable vulnerabilities introduced?\n- User-controlled input reaching SQL, shell, filesystem, or eval paths.\n- Hardcoded credentials, tokens, or environment URLs.\n- Missing authorization checks on new endpoints or state transitions.\n- XSS vectors in rendered output.\n\n### 4. Test Coverage\nAre new behaviors covered by tests?\n- New logic without a test is a liability.\n- Tests must describe behavior (observable outcomes), not implementation.\n- Verify tests actually run and would fail without the change.\n\n### 5. Code Quality\nIs the code readable and consistent with the codebase?\n- No unnecessary abstractions, helpers, or complexity for one-time use.\n- Names describe intent, not implementation.\n- No dead code, unused imports, or commented-out blocks.\n\n## Verdict\n\nAfter grading all dimensions, emit:\n\n```\nOVERALL: PASS | FAIL\nBLOCKING FINDINGS:\n- [dimension] <concrete issue>\nADVISORY FINDINGS:\n- [dimension] <non-blocking concern>\n```\n\nA single FAIL on Correctness, Regression, or Security is enough to FAIL the whole review.\nTest Coverage and Code Quality findings are advisory unless they represent an obvious gap in a critical path.\n",
130
130
  // src/agents/prompts/mcp-code-review.stub.md
131
131
  "mcp-code-review-empty": "# Code Review for {{issueId}}\n\nNo code changes found for this issue. The workspace may not have been created yet or no modifications were made.\n",
132
132
  // src/agents/prompts/mcp-code-review-empty.stub.md
@@ -182,7 +182,7 @@ Return ONLY the JSON object. No markdown fences, no explanation, no extra text.
182
182
  // src/agents/prompts/project-analysis.stub.md
183
183
  "workflow-default": "You are working on {{issue.identifier}}.\n\nTitle: {{issue.title}}\nDescription:\n{{issue.description}}\n",
184
184
  // src/agents/prompts/workflow-default.stub.md
185
- "workflow-plan-section": '## Execution Plan\n\nComplexity: {{estimatedComplexity}}\nSummary: {{summary}}\n\nSteps:\n{{#each steps}}\n{{step}}. {{action}}{{#if files.length}} (files: {{files | join ", "}}){{/if}}{{#if details}} - {{details}}{{/if}}\n{{/each}}\n\nFollow this plan. Complete each step in order.\n'
185
+ "workflow-plan-section": '## Execution Plan\n\nComplexity: {{estimatedComplexity}}\nSummary: {{summary}}\n\nSteps:\n{{#each steps}}\n{{step}}. {{action}}{{#if files.length}} (files: {{files | join ", "}}){{/if}}{{#if details}} \u2014 {{details}}{{/if}}\n{{#if doneWhen}} \u2713 done when: {{doneWhen}}{{/if}}\n{{/each}}\n\nEach step has a `done when` criterion. Do not advance to the next step until the criterion is met.\nComplete each step in order. The `execution-payload.json` in the workspace contains the full plan with acceptance criteria \u2014 use it as the source of truth.\n'
186
186
  // src/agents/prompts/workflow-plan-section.stub.md
187
187
  };
188
188
 
@@ -206,4 +206,4 @@ async function renderPromptString(template, context = {}) {
206
206
  export {
207
207
  renderPrompt
208
208
  };
209
- //# sourceMappingURL=chunk-GHO7EIRU.js.map
209
+ //# sourceMappingURL=chunk-3CE23MKX.js.map
@@ -2,10 +2,10 @@ import {
2
2
  computeDiffStats,
3
3
  removeTestWorkspace,
4
4
  syncIssueDiffStatsToStore
5
- } from "./chunk-YYCJRMSO.js";
5
+ } from "./chunk-4JFRWK52.js";
6
6
  import {
7
7
  markIssueDirty
8
- } from "./chunk-PXD2FZ5R.js";
8
+ } from "./chunk-77KTPWXP.js";
9
9
  import {
10
10
  computeMetrics
11
11
  } from "./chunk-4QXECRSB.js";
@@ -265,7 +265,7 @@ function emitFsmEvent(issueId, kind, message) {
265
265
  if (kind === "state") {
266
266
  import("./web-push-X2LLMQ4M.js").then(({ sendPushToAll, isWebPushReady, SETTING_ID_PUSH_SUBSCRIPTIONS }) => {
267
267
  if (!isWebPushReady()) return;
268
- import("./settings-WPDBW6TO.js").then(({ persistSetting }) => {
268
+ import("./settings-NJ4QWYAD.js").then(({ persistSetting }) => {
269
269
  sendPushToAll(
270
270
  { title: "fifony", body: message, tag: issueId, url: "/kanban" },
271
271
  async (subs) => {
@@ -850,4 +850,4 @@ export {
850
850
  canTransitionIssue,
851
851
  visualizeStateMachine
852
852
  };
853
- //# sourceMappingURL=chunk-RF366QKS.js.map
853
+ //# sourceMappingURL=chunk-43PQD3XN.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  markIssueDirty,
3
3
  normalizeAgentProvider
4
- } from "./chunk-PXD2FZ5R.js";
4
+ } from "./chunk-77KTPWXP.js";
5
5
  import {
6
6
  init_template_variants,
7
7
  template_variants_exports
@@ -14,7 +14,7 @@ import {
14
14
  } from "./chunk-JIEKFAM4.js";
15
15
  import {
16
16
  renderPrompt
17
- } from "./chunk-GHO7EIRU.js";
17
+ } from "./chunk-3CE23MKX.js";
18
18
  import {
19
19
  appendFileTail,
20
20
  idToSafePath,
@@ -1826,7 +1826,8 @@ async function buildPrompt(issue, _workflowDefinition) {
1826
1826
  step: step.step,
1827
1827
  action: step.action,
1828
1828
  files: step.files ?? [],
1829
- details: step.details ?? ""
1829
+ details: step.details ?? "",
1830
+ doneWhen: step.doneWhen ?? ""
1830
1831
  }))
1831
1832
  });
1832
1833
  return `${rendered}
@@ -2809,7 +2810,7 @@ function parseDiffStats(issue, raw) {
2809
2810
  }
2810
2811
  async function syncIssueDiffStatsToStore(issue) {
2811
2812
  if (!issue?.id) return;
2812
- const { getIssueStateResource } = await import("./store-U2L3L3DF.js");
2813
+ const { getIssueStateResource } = await import("./store-QBKBIGBF.js");
2813
2814
  const issueResource = getIssueStateResource();
2814
2815
  if (!issueResource) return;
2815
2816
  const toNumber = (value) => {
@@ -3119,4 +3120,4 @@ export {
3119
3120
  hydrateIssuePathsFromWorkspace,
3120
3121
  writeVersionedArtifacts
3121
3122
  };
3122
- //# sourceMappingURL=chunk-YYCJRMSO.js.map
3123
+ //# sourceMappingURL=chunk-4JFRWK52.js.map
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-W5IULOWV.js";
6
6
  import {
7
7
  renderPrompt
8
- } from "./chunk-GHO7EIRU.js";
8
+ } from "./chunk-3CE23MKX.js";
9
9
  import {
10
10
  init_helpers,
11
11
  sleep
@@ -1814,4 +1814,4 @@ export {
1814
1814
  getReviewProvider,
1815
1815
  getSessionProvidersForIssue
1816
1816
  };
1817
- //# sourceMappingURL=chunk-PXD2FZ5R.js.map
1817
+ //# sourceMappingURL=chunk-77KTPWXP.js.map
@@ -6,13 +6,13 @@ import {
6
6
  getIssueTransitionHistory,
7
7
  getStateMachineTransitions,
8
8
  visualizeStateMachine
9
- } from "./chunk-RF366QKS.js";
9
+ } from "./chunk-43PQD3XN.js";
10
10
  import {
11
11
  transitionIssue
12
- } from "./chunk-4AAYWWX4.js";
12
+ } from "./chunk-SWXQQ5UB.js";
13
13
  import {
14
14
  markIssueDirty
15
- } from "./chunk-PXD2FZ5R.js";
15
+ } from "./chunk-77KTPWXP.js";
16
16
  import {
17
17
  init_helpers,
18
18
  now
@@ -126,4 +126,4 @@ export {
126
126
  deleteIssueStateMachineResourceState,
127
127
  transitionIssueCommand
128
128
  };
129
- //# sourceMappingURL=chunk-QZJ7U74Z.js.map
129
+ //# sourceMappingURL=chunk-7AZGQCL2.js.map