@exaudeus/workrail 3.74.1 → 3.74.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application/services/workflow-interpreter.js +22 -0
- package/dist/console-ui/assets/{index-BmDxs-a5.js → index-ByqIsoyt.js} +1 -1
- package/dist/console-ui/index.html +1 -1
- package/dist/daemon/session-scope.d.ts +7 -1
- package/dist/daemon/workflow-runner.d.ts +11 -4
- package/dist/daemon/workflow-runner.js +92 -66
- package/dist/manifest.json +13 -13
- package/dist/v2/durable-core/domain/context-template-resolver.js +34 -9
- package/docs/ideas/backlog.md +227 -27
- package/package.json +1 -1
- package/workflows/routines/tension-driven-design.json +26 -15
- package/workflows/wr.discovery.json +153 -16
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "wr.discovery",
|
|
3
3
|
"name": "Discovery Workflow",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.3.0",
|
|
5
5
|
"metricsProfile": "research",
|
|
6
6
|
"validatedAgainstSpecVersion": 3,
|
|
7
7
|
"description": "Use this to explore and think through a problem end-to-end. Moves between landscape exploration, problem framing, candidate generation, adversarial challenge, and uncertainty resolution.",
|
|
@@ -20,6 +20,74 @@
|
|
|
20
20
|
"wr.features.capabilities",
|
|
21
21
|
"wr.features.subagent_guidance"
|
|
22
22
|
],
|
|
23
|
+
"assessments": [
|
|
24
|
+
{
|
|
25
|
+
"id": "framing-rigor-gate",
|
|
26
|
+
"purpose": "The problem frame is specific enough to constrain candidate generation -- grounded with a concrete falsification condition and independent of the proposed solution.",
|
|
27
|
+
"dimensions": [
|
|
28
|
+
{
|
|
29
|
+
"id": "framing_specificity",
|
|
30
|
+
"purpose": "A specific falsification condition is named: one concrete thing that, if discovered true, would change the path or direction. Generic caveats do not count.",
|
|
31
|
+
"levels": [
|
|
32
|
+
"vague",
|
|
33
|
+
"specific"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "framing_independence",
|
|
38
|
+
"purpose": "The problem statement is independent of the proposed solution -- it does not embed the solution in its framing.",
|
|
39
|
+
"levels": [
|
|
40
|
+
"solution_embedded",
|
|
41
|
+
"problem_shaped"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "candidate-quality-gate",
|
|
48
|
+
"purpose": "Candidates are genuinely distinct in how they resolve the identified tensions, and at least one decision criterion is quality-aspirational rather than a constraint-satisfaction threshold.",
|
|
49
|
+
"dimensions": [
|
|
50
|
+
{
|
|
51
|
+
"id": "candidate_distinctness",
|
|
52
|
+
"purpose": "Each candidate resolves the identified tensions differently. At least one resolves a tension no other candidate addresses. Variants with different labels on the same approach do not count.",
|
|
53
|
+
"levels": [
|
|
54
|
+
"shallow",
|
|
55
|
+
"distinct"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "quality_criterion_present",
|
|
60
|
+
"purpose": "At least one decision criterion is derived from idealEndState (quality-aspirational), not just from constraints. Constraint-satisfaction criteria alone allow the most conservative candidate to win by default.",
|
|
61
|
+
"levels": [
|
|
62
|
+
"absent",
|
|
63
|
+
"present"
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "recommendation-confidence-gate",
|
|
70
|
+
"purpose": "The final recommendation is anchored to the ideal end state and has explicitly named residual risks -- not just a stated confidence band.",
|
|
71
|
+
"dimensions": [
|
|
72
|
+
{
|
|
73
|
+
"id": "ideal_state_comparison",
|
|
74
|
+
"purpose": "The selected direction was explicitly compared to idealEndState. Any gap between the recommendation and the ideal is named as an accepted limitation with a concrete reason, not left implicit.",
|
|
75
|
+
"levels": [
|
|
76
|
+
"uncompared",
|
|
77
|
+
"compared"
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "residual_risks_named",
|
|
82
|
+
"purpose": "Residual risks are specific -- each names what concretely would invalidate the recommendation. Generic caveats ('complexity', 'maintenance burden') without specifics do not count.",
|
|
83
|
+
"levels": [
|
|
84
|
+
"generic",
|
|
85
|
+
"specific"
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
],
|
|
23
91
|
"preconditions": [
|
|
24
92
|
"I can tell you what problem, opportunity, or decision I want help thinking through.",
|
|
25
93
|
"You can keep durable state in `output.notesMarkdown` and `continue_workflow` context keys.",
|
|
@@ -78,13 +146,15 @@
|
|
|
78
146
|
"Challenge exactly 3 key assumptions embedded in the stated goal. For each assumption: state the assumption clearly, explain why it might be wrong, and identify what evidence would confirm or refute it. Record these as `challengedAssumptions`.",
|
|
79
147
|
"Define what success looks like before any candidates are generated. Success criteria must be concrete and observable -- not 'the problem is solved' but 'we can measure X, users do Y, the system behaves Z'. Record these as `successCriteria`.",
|
|
80
148
|
"Record a one-sentence `reframedProblem` that captures the real underlying problem, stripped of any solution bias from the original goal.",
|
|
81
|
-
"
|
|
149
|
+
"Record `idealEndState`: one paragraph describing what the best possible solution would look like if effort and scope were no constraint. This is not a candidate -- it is a quality ceiling that candidate generation will calibrate against. If you are uncertain, write the most ambitious version you can justify.",
|
|
150
|
+
"Set these keys in the next `continue_workflow` call's `context` object: `goalType`, `reframedProblem`, `challengedAssumptions`, `successCriteria`, `goalWasSolutionStatement`, `idealEndState`."
|
|
82
151
|
],
|
|
83
152
|
"verify": [
|
|
84
153
|
"Each of the 3 challenged assumptions is specific enough that someone could disagree with the challenge.",
|
|
85
154
|
"The success criteria would let a skeptic determine whether the work actually succeeded.",
|
|
86
155
|
"If the goal was a solution-statement, the underlying problem is stated independently of the proposed solution.",
|
|
87
|
-
"The reframed problem is meaningfully different from the original goal wording, or you have explicitly noted why the original framing was already problem-shaped."
|
|
156
|
+
"The reframed problem is meaningfully different from the original goal wording, or you have explicitly noted why the original framing was already problem-shaped.",
|
|
157
|
+
"`idealEndState` describes the best achievable outcome, not the most defensible one. If they are the same, say so explicitly."
|
|
88
158
|
]
|
|
89
159
|
},
|
|
90
160
|
"requireConfirmation": false
|
|
@@ -109,14 +179,18 @@
|
|
|
109
179
|
"Capture: `problemStatement`, `desiredOutcome`, `coreConstraints`, `antiGoals`, `primaryUncertainty`, `knownApproaches`, `importantStakeholders`, `rigorMode`, `automationLevel`, `pathRecommendation`, `pathRationale`, `designDocPath`.",
|
|
110
180
|
"If `goalWasSolutionStatement = true`, set `problemStatement` from `reframedProblem` rather than from the stated goal. Record the original stated goal as `statedGoal` in the design doc so the distinction is visible.",
|
|
111
181
|
"Choose `landscape_first` when my dominant need is understanding the current landscape or comparing options. Choose `full_spectrum` when both landscape grounding and reframing are needed. Choose `design_first` when the dominant risk is solving the wrong problem or shaping the wrong concept. If `goalWasSolutionStatement = true`, bias toward `design_first` unless the stated solution is clearly the correct framing.",
|
|
182
|
+
"Set `rigorMode` to exactly one of: `QUICK`, `STANDARD`, `THOROUGH`. This is NOT the same as `pathRecommendation` -- do not use path names as rigor values. For architectural or system design problems, default to `THOROUGH`. For one-off decisions or well-bounded comparisons, use `STANDARD`. Use `QUICK` only when speed is explicitly more important than depth.",
|
|
183
|
+
"Set `solutionAmbitiousness` to exactly one of: `minimal_viable` (smallest thing that satisfies the criteria), `best_fit` (right solution for the stated constraints), `ideal_architecture` (best solution achievable, constraints relaxed). For architectural and system design problems, default to `ideal_architecture` unless the user has explicitly constrained scope. Record this in the design doc.",
|
|
112
184
|
"Create or update `designDocPath` with sections for Context / Ask, Path Recommendation, Constraints / Anti-goals, Landscape Packet, Problem Frame Packet, Candidate Directions, Challenge Notes, Resolution Notes, Decision Log, and Final Summary.",
|
|
113
|
-
"Set these keys in the next `continue_workflow` call's `context` object: `problemStatement`, `desiredOutcome`, `coreConstraints`, `antiGoals`, `primaryUncertainty`, `knownApproaches`, `importantStakeholders`, `rigorMode`, `automationLevel`, `pathRecommendation`, `pathRationale`, `designDocPath`.",
|
|
185
|
+
"Set these keys in the next `continue_workflow` call's `context` object: `problemStatement`, `desiredOutcome`, `coreConstraints`, `antiGoals`, `primaryUncertainty`, `knownApproaches`, `importantStakeholders`, `rigorMode`, `automationLevel`, `pathRecommendation`, `pathRationale`, `designDocPath`, `solutionAmbitiousness`.",
|
|
114
186
|
"Also set `goal` in the context object: one sentence describing what you are trying to accomplish. This populates the session title in the Workspace console immediately."
|
|
115
187
|
],
|
|
116
188
|
"verify": [
|
|
117
189
|
"The chosen path is justified against the other two, not just named.",
|
|
118
190
|
"If `goalWasSolutionStatement = true`, the `problemStatement` reflects the reframed problem, not the stated solution.",
|
|
119
|
-
"The design doc exists and the path recommendation is recorded there."
|
|
191
|
+
"The design doc exists and the path recommendation is recorded there.",
|
|
192
|
+
"`rigorMode` is exactly one of QUICK, STANDARD, THOROUGH -- not a path name or free-form string.",
|
|
193
|
+
"`solutionAmbitiousness` is set and recorded in the design doc. For architectural problems, `ideal_architecture` is the default unless scope was explicitly constrained."
|
|
120
194
|
]
|
|
121
195
|
},
|
|
122
196
|
"requireConfirmation": {
|
|
@@ -302,6 +376,9 @@
|
|
|
302
376
|
{
|
|
303
377
|
"id": "phase-1e-frame-full",
|
|
304
378
|
"title": "Phase 1e: Problem Frame and Stakeholders (Full-spectrum)",
|
|
379
|
+
"assessmentRefs": [
|
|
380
|
+
"framing-rigor-gate"
|
|
381
|
+
],
|
|
305
382
|
"runCondition": {
|
|
306
383
|
"var": "pathRecommendation",
|
|
307
384
|
"equals": "full_spectrum"
|
|
@@ -323,11 +400,15 @@
|
|
|
323
400
|
"If `delegationAvailable = true`, decide whether parallel stakeholder lenses would actually sharpen the result. If yes, run them in parallel. If not, keep going yourself. In either case, you must synthesize the result yourself.",
|
|
324
401
|
"Update `designDocPath` using `problemFrameTemplate`.",
|
|
325
402
|
"Before finishing, name ONE specific concrete condition that would make the current framing wrong -- not a generic caveat, but a specific thing that if discovered to be true would change the path or direction. Record this as `primaryFramingRisk` in the design doc.",
|
|
326
|
-
"
|
|
403
|
+
"Capture the tensions as a structured list -- not just a count. Record `identifiedTensions` as an array of one-sentence tension descriptions (e.g. 'completeness vs token budget', 'typed contracts vs evolving interfaces'). This is the list that will be passed verbatim to candidate generation executors.",
|
|
404
|
+
"Record `philosophySources` as a list of file paths or Memory entry names that encode the dev's philosophy (e.g. 'CLAUDE.md', 'AGENTS.md', '.cursor/rules/'). If none exist, record an empty list.",
|
|
405
|
+
"Set these keys in the next `continue_workflow` call's `context` object: `problemFrame`, `primaryUsers`, `tensionCount`, `successCriteriaCount`, `framingRiskCount`, `needsChallenge`, `retriageNeeded`, `identifiedTensions`, `philosophySources`."
|
|
327
406
|
],
|
|
328
407
|
"verify": [
|
|
329
408
|
"The framing names what could still be wrong -- specifically, not generically.",
|
|
330
|
-
"The frame is strong enough to influence candidate generation and later selection."
|
|
409
|
+
"The frame is strong enough to influence candidate generation and later selection.",
|
|
410
|
+
"`identifiedTensions` is a structured list of named tensions, not just a count.",
|
|
411
|
+
"`philosophySources` is recorded -- empty list is acceptable if none exist."
|
|
331
412
|
]
|
|
332
413
|
},
|
|
333
414
|
"functionReferences": [
|
|
@@ -338,6 +419,9 @@
|
|
|
338
419
|
{
|
|
339
420
|
"id": "phase-1f-frame-design",
|
|
340
421
|
"title": "Phase 1f: Problem Frame and Stakeholders (Design-first)",
|
|
422
|
+
"assessmentRefs": [
|
|
423
|
+
"framing-rigor-gate"
|
|
424
|
+
],
|
|
341
425
|
"runCondition": {
|
|
342
426
|
"var": "pathRecommendation",
|
|
343
427
|
"equals": "design_first"
|
|
@@ -359,11 +443,15 @@
|
|
|
359
443
|
"If `delegationAvailable = true`, decide whether parallel stakeholder lenses would actually sharpen the result. If yes, run them in parallel. If not, keep going yourself. In either case, you must synthesize the result yourself.",
|
|
360
444
|
"Update `designDocPath` using `problemFrameTemplate`.",
|
|
361
445
|
"Before finishing, name ONE specific concrete condition that would make the current framing wrong -- not a generic caveat, but a specific thing that if discovered to be true would change the path or direction. Record this as `primaryFramingRisk` in the design doc.",
|
|
362
|
-
"
|
|
446
|
+
"Capture the tensions as a structured list -- not just a count. Record `identifiedTensions` as an array of one-sentence tension descriptions (e.g. 'completeness vs token budget', 'typed contracts vs evolving interfaces'). This is the list that will be passed verbatim to candidate generation executors.",
|
|
447
|
+
"Record `philosophySources` as a list of file paths or Memory entry names that encode the dev's philosophy (e.g. 'CLAUDE.md', 'AGENTS.md', '.cursor/rules/'). If none exist, record an empty list.",
|
|
448
|
+
"Set these keys in the next `continue_workflow` call's `context` object: `problemFrame`, `primaryUsers`, `tensionCount`, `successCriteriaCount`, `framingRiskCount`, `needsChallenge`, `retriageNeeded`, `identifiedTensions`, `philosophySources`."
|
|
363
449
|
],
|
|
364
450
|
"verify": [
|
|
365
451
|
"The framing names what could still be wrong -- specifically, not generically.",
|
|
366
|
-
"The framing depth is strong enough to justify a design-first path."
|
|
452
|
+
"The framing depth is strong enough to justify a design-first path.",
|
|
453
|
+
"`identifiedTensions` is a structured list of named tensions, not just a count.",
|
|
454
|
+
"`philosophySources` is recorded -- empty list is acceptable if none exist."
|
|
367
455
|
]
|
|
368
456
|
},
|
|
369
457
|
"functionReferences": [
|
|
@@ -438,13 +526,17 @@
|
|
|
438
526
|
"State what kind of uncertainty remains: recommendation uncertainty, research uncertainty, or prototype-learning uncertainty."
|
|
439
527
|
],
|
|
440
528
|
"procedure": [
|
|
441
|
-
"Produce a concise synthesis of the opportunity, the 3-5 criteria the final direction must satisfy, the strongest framing risk, and the current best explanation of what success looks like.",
|
|
529
|
+
"Produce a concise synthesis of the opportunity, the 3-5 criteria the final direction must satisfy, the strongest framing risk, and the current best explanation of what success looks like. Also surface which of the `challengedAssumptions` from phase-0a are still unresolved -- any candidate that silently bets on a challenged assumption must name it as a risk.",
|
|
530
|
+
"When generating `decisionCriteria`: criteria that come from constraints and anti-goals are necessary but not sufficient. They are compatibility thresholds -- every viable candidate will satisfy them. At least one criterion must be quality-aspirational: derived from `idealEndState`, not from constraints. Quality-aspirational criteria ask 'which candidate is best?' not 'which candidates pass?'. Good examples: 'which requires the fewest changes to add a new phase?', 'which would a senior engineer be proudest of in two years?', 'which best reflects the architecture we want to be running against in 12 months?'. If `solutionAmbitiousness = 'ideal_architecture'`, this quality-aspirational criterion is mandatory -- not optional.",
|
|
442
531
|
"Set `candidateCountTarget` adaptively: QUICK = 2-3, STANDARD = 3-4, THOROUGH = 4-5.",
|
|
532
|
+
"If a `visionDocPath` exists in context or is discoverable in the workspace (e.g. `docs/vision.md`), read it now. Then answer: (1) How does solving this problem serve the overarching vision? If it doesn't serve the vision, say so explicitly -- that is important signal. (2) Which vision goals does this design need to leave room for, even if it doesn't implement them yet? Name at least one seam or constraint the design must honor for the vision to remain achievable. (3) Does any candidate direction foreclose a vision goal that matters? If yes, name it. Add at least one vision-alignment criterion to `decisionCriteria`. If no vision doc exists, use your best understanding of the project's direction from context.",
|
|
443
533
|
"Set these keys in the next `continue_workflow` call's `context` object: `decisionCriteria`, `riskiestAssumption`, `candidateCountTarget`, `needsPrototype`, `needsFurtherResearch`, `pathReady`."
|
|
444
534
|
],
|
|
445
535
|
"verify": [
|
|
446
536
|
"You can explain why this is the right path and what a good answer must satisfy.",
|
|
447
|
-
"Remaining uncertainty is categorized explicitly instead of left fuzzy."
|
|
537
|
+
"Remaining uncertainty is categorized explicitly instead of left fuzzy.",
|
|
538
|
+
"At least one `decisionCriterion` is quality-aspirational (derived from `idealEndState`), not just a compatibility threshold from constraints. If `solutionAmbitiousness = 'ideal_architecture'`, this is not optional.",
|
|
539
|
+
"At least one `decisionCriterion` is vision-aligned -- it tests whether the direction serves the project's overarching goals, not just the immediate problem."
|
|
448
540
|
]
|
|
449
541
|
},
|
|
450
542
|
"promptFragments": [
|
|
@@ -491,6 +583,22 @@
|
|
|
491
583
|
"equals": "design_first"
|
|
492
584
|
},
|
|
493
585
|
"text": "Because this is a `design_first` pass, keep the criteria anchored in framing quality, tension resolution, and learning value, not just comparison of known approaches."
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"id": "p2-ideal-architecture-criteria",
|
|
589
|
+
"when": {
|
|
590
|
+
"var": "solutionAmbitiousness",
|
|
591
|
+
"equals": "ideal_architecture"
|
|
592
|
+
},
|
|
593
|
+
"text": "Because `solutionAmbitiousness = 'ideal_architecture'`: the decision criteria must include at least one that directly tests against `idealEndState`. Constraint-satisfaction criteria alone will cause the most conservative candidate to win by default -- every viable option satisfies them. The quality-aspirational criterion is what makes the ambitious candidate compete on its own terms rather than just surviving a challenge."
|
|
594
|
+
},
|
|
595
|
+
{
|
|
596
|
+
"id": "p2-vision-alignment",
|
|
597
|
+
"when": {
|
|
598
|
+
"var": "solutionAmbitiousness",
|
|
599
|
+
"equals": "ideal_architecture"
|
|
600
|
+
},
|
|
601
|
+
"text": "Because this is an architectural decision: challenge your `decisionCriteria` against the vision explicitly. Ask: 'If we build this, does it make the next architectural decision easier or harder? Does it create the right seams for what the vision says comes next? Does it foreclose anything the vision names as important?' A criterion that only tests whether the design solves today's problem is insufficient -- at least one criterion must test whether the design is the right building block for tomorrow's."
|
|
494
602
|
}
|
|
495
603
|
],
|
|
496
604
|
"requireConfirmation": false
|
|
@@ -557,20 +665,41 @@
|
|
|
557
665
|
"For `design_first`, require at least one direction that meaningfully reframes the problem instead of only packaging obvious solutions.",
|
|
558
666
|
"For `landscape_first`, require the candidate set to clearly reflect landscape precedents, constraints, and contradictions rather than drifting into free invention.",
|
|
559
667
|
"For `THOROUGH`, require one extra push if the first spread still feels clustered or too safe.",
|
|
668
|
+
"If `delegationAvailable = true` and `rigorMode != QUICK`: assign 2-3 non-overlapping focus angles before spawning anything. Then spawn the corresponding WorkRail Executors SIMULTANEOUSLY, each running `wr.routine-tension-driven-design`. The ONLY way to pass context to each executor is via its goal string -- executors start with clean sessions and cannot read the main agent's context variables. Build a self-contained goal string for each executor using these exact markers (the routine reads them by label): 'FOCUS ANGLE: <the assigned angle as a concrete instruction> | PROBLEM: <reframedProblem> | TENSIONS: <bullet list of identified tensions> | CRITERIA: <bullet list of decisionCriteria> | IDEAL END STATE: <idealEndState> | RISKIEST ASSUMPTION: <riskiestAssumption> | PHILOSOPHY: <philosophySources paths or summary> | OUTPUT FILE: design-candidates-angle-N.md'. Assign distinct angles -- concrete examples: (A) 'Anchor every candidate to the ideal end state -- build the best achievable design if effort and scope were no constraint', (B) 'Anchor every candidate to the riskiest assumption -- build the most defensible design that does not bet on any single assumption being true', (C) 'Anchor every candidate to the primary framing risk -- what would the design look like if the current problem framing is wrong?'. After all executors complete, read each executor's output file (the filenames you specified in OUTPUT FILE in each goal string -- e.g. `design-candidates-angle-1.md`, `design-candidates-angle-2.md`, etc.). Synthesize using these criteria: (1) Does the final set span from idealEndState to most-defensible? If not, name the gap. (2) Does at least one candidate from each executor's angle survive? If an angle is absent, justify it. (3) Does cross-executor comparison yield any insight no single executor reached? If yes, add it as a new candidate. (4) Do any candidates that look different resolve the same tension the same way? Collapse to the sharper version. Write the synthesized result to `design-candidates.md`. If `delegationAvailable = false`, generate candidates yourself and record why solo execution was used.",
|
|
560
669
|
"Write these expectations into `designDocPath` so the later synthesis can judge whether the injected routine met them."
|
|
561
670
|
],
|
|
562
671
|
"verify": [
|
|
563
|
-
"The path-specific expectations for candidate generation are explicit before the injected routine runs."
|
|
672
|
+
"The path-specific expectations for candidate generation are explicit before the injected routine runs.",
|
|
673
|
+
"If delegation was used: each executor received a self-contained briefing with a distinct non-overlapping focus angle. The synthesized candidate set reflects main-agent judgment, not a flat concatenation of executor outputs.",
|
|
674
|
+
"If delegation was skipped: the reason is recorded."
|
|
564
675
|
]
|
|
565
676
|
},
|
|
677
|
+
"promptFragments": [
|
|
678
|
+
{
|
|
679
|
+
"id": "p3b-ideal-architecture-target",
|
|
680
|
+
"when": {
|
|
681
|
+
"var": "solutionAmbitiousness",
|
|
682
|
+
"equals": "ideal_architecture"
|
|
683
|
+
},
|
|
684
|
+
"text": "Because `solutionAmbitiousness = 'ideal_architecture'`: require at least one candidate that directly targets `idealEndState` from phase-0a. This candidate represents the best achievable outcome if effort and scope were no constraint. If it turns out to also be the most practical candidate, say so explicitly. If no candidate reaches the ideal end state, that gap must be named and justified in phase-3d -- it cannot be left implicit."
|
|
685
|
+
}
|
|
686
|
+
],
|
|
566
687
|
"requireConfirmation": false
|
|
567
688
|
},
|
|
568
689
|
{
|
|
569
690
|
"id": "phase-3c-candidates-deep-core",
|
|
570
691
|
"title": "Phase 3c: Candidate Generation (Injected Routine)",
|
|
571
692
|
"runCondition": {
|
|
572
|
-
"
|
|
573
|
-
|
|
693
|
+
"and": [
|
|
694
|
+
{
|
|
695
|
+
"var": "rigorMode",
|
|
696
|
+
"not_equals": "QUICK"
|
|
697
|
+
},
|
|
698
|
+
{
|
|
699
|
+
"var": "delegationAvailable",
|
|
700
|
+
"not_equals": true
|
|
701
|
+
}
|
|
702
|
+
]
|
|
574
703
|
},
|
|
575
704
|
"templateCall": {
|
|
576
705
|
"templateId": "wr.templates.routine.tension-driven-design",
|
|
@@ -583,6 +712,9 @@
|
|
|
583
712
|
{
|
|
584
713
|
"id": "phase-3d-select-direction",
|
|
585
714
|
"title": "Phase 3d: Challenge and Select Direction",
|
|
715
|
+
"assessmentRefs": [
|
|
716
|
+
"candidate-quality-gate"
|
|
717
|
+
],
|
|
586
718
|
"promptBlocks": {
|
|
587
719
|
"goal": "Read `design-candidates.md`, challenge the leading option, and make the final selection for me.",
|
|
588
720
|
"constraints": [
|
|
@@ -601,8 +733,9 @@
|
|
|
601
733
|
"If `delegationAvailable = true` and (`rigorMode != QUICK` or `pathRecommendation = full_spectrum`), decide whether a delegated challenge is likely to sharpen the decision enough to be worth the extra step. If yes, spawn ONE WorkRail Executor running `routine-hypothesis-challenge` against the leading option. If not, keep the challenge in your own hands and say why.",
|
|
602
734
|
"If `delegationAvailable = true` and `rigorMode = THOROUGH`, decide whether an execution simulation would materially sharpen the decision. If yes, you may also spawn ONE WorkRail Executor running `routine-execution-simulation`.",
|
|
603
735
|
"Choose `selectedDirection` and `runnerUpDirection`.",
|
|
736
|
+
"Quality ceiling check: explicitly compare the selected direction to `idealEndState` from phase-0a. Answer: does the selected direction reach the ideal end state? If not, name exactly what it falls short of and why that shortfall is justified. If `solutionAmbitiousness = 'ideal_architecture'` and the selected direction is the most conservative or lowest-scope candidate, you must provide a specific reason each more ambitious candidate was ruled out -- 'too complex' or 'too much work' are not acceptable reasons on their own. Scope is a legitimate constraint only when it is a real stated constraint, not a default preference.",
|
|
604
737
|
"Record `acceptedTradeoffs`, `identifiedFailureModes`, and what would trigger a switch.",
|
|
605
|
-
"Update `designDocPath` Decision Log with why the winner won
|
|
738
|
+
"Update `designDocPath` Decision Log with why the winner won, why the runner-up lost, and how the winner compares to `idealEndState`.",
|
|
606
739
|
"Set these keys in the next `continue_workflow` call's `context` object: `selectedDirection`, `runnerUpDirection`, `acceptedTradeoffs`, `identifiedFailureModes`, `hasStrongAlternative`, `needsPrototype`, `needsFurtherResearch`, `recommendationConfidenceBand`."
|
|
607
740
|
],
|
|
608
741
|
"outputRequired": {
|
|
@@ -610,7 +743,8 @@
|
|
|
610
743
|
},
|
|
611
744
|
"verify": [
|
|
612
745
|
"The strongest alternative was developed enough that switching to it would feel real, not just imaginable.",
|
|
613
|
-
"Tradeoffs, failure modes, and switch triggers are explicit."
|
|
746
|
+
"Tradeoffs, failure modes, and switch triggers are explicit.",
|
|
747
|
+
"The selected direction was compared to `idealEndState` -- explicitly, not implicitly. Any gap is named as an accepted limitation with a concrete reason, not left as an assumption."
|
|
614
748
|
]
|
|
615
749
|
},
|
|
616
750
|
"promptFragments": [
|
|
@@ -940,6 +1074,9 @@
|
|
|
940
1074
|
{
|
|
941
1075
|
"id": "phase-6-validate",
|
|
942
1076
|
"title": "Phase 6: Final Validation",
|
|
1077
|
+
"assessmentRefs": [
|
|
1078
|
+
"recommendation-confidence-gate"
|
|
1079
|
+
],
|
|
943
1080
|
"promptBlocks": {
|
|
944
1081
|
"goal": "Validate that you are ending with the right level of confidence and the right caveats for me.",
|
|
945
1082
|
"constraints": [
|