fdeops 5.1.21 → 5.1.22

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/bin/fde.js CHANGED
@@ -1773,21 +1773,33 @@ function looksLikePersonName(s) {
1773
1773
  function signerFromLine(text) {
1774
1774
  const t = String(text || '').replace(/^[-*+]\s+/, '').trim()
1775
1775
  if (!t || /\?|\b(?:not|nobody|unclear|maybe|might|whether|could|should|if|unless|pending|unconfirmed)\b/i.test(t)) return ''
1776
+ // A component/budget/release approver is not the engagement's acceptance
1777
+ // signer. Infer only a bare authority statement or explicit outcome/test
1778
+ // sign-off; leave other scope wording in the original note for agent review.
1779
+ const roleWords = text => text.trim().split(/\s+/).every(word => word.match(ROLE_TOKEN)?.[0] === word)
1780
+ const candidate = (match, who, rolePrefix = false) => {
1781
+ if (!match || !looksLikePersonName(who)) return ''
1782
+ const before = t.slice(0, match.index)
1783
+ const after = t.slice(match.index + match[0].length).replace(/\[source:[^\]]*\]/gi, '').trim()
1784
+ if (before.trim() && (!rolePrefix || !roleWords(before))) return ''
1785
+ if (!/^(?:(?:on\s+)?(?:the\s+)?(?:acceptance tests?|(?:customer |delivered )?outcome))?[.!]?$/i.test(after)) return ''
1786
+ return who.trim()
1787
+ }
1776
1788
  // "Priya (VP Eng) signs off" → Priya. "Finance controller (Helena) signs off" → Helena.
1777
1789
  const titled = t.match(new RegExp('\\b' + SIGNER_NAME + '\\s+\\(' + SIGNER_NAME + '\\)\\s+' + SIGNER_VERB + '\\b'))
1778
1790
  if (titled) {
1779
1791
  const before = titled[1].trim()
1780
1792
  const inside = titled[2].trim()
1781
- if (looksLikePersonName(before) && ROLE_TOKEN.test(inside)) return before
1782
- if (looksLikePersonName(inside)) return inside
1783
- if (looksLikePersonName(before)) return before
1793
+ if (looksLikePersonName(before) && roleWords(inside)) return candidate(titled, before)
1794
+ if (roleWords(before) && looksLikePersonName(inside)) return candidate(titled, inside)
1795
+ return ''
1784
1796
  }
1785
1797
  const paren = t.match(new RegExp('\\(' + SIGNER_NAME + '\\)\\s+' + SIGNER_VERB + '\\b'))
1786
- if (paren && looksLikePersonName(paren[1])) return paren[1].trim()
1798
+ if (paren && looksLikePersonName(paren[1])) return candidate(paren, paren[1], true)
1787
1799
  const named = t.match(new RegExp('\\b' + SIGNER_NAME + '\\s+' + SIGNER_VERB + '\\b'))
1788
1800
  if (!named) return ''
1789
1801
  const who = named[1].trim()
1790
- return looksLikePersonName(who) ? who : ''
1802
+ return candidate(named, who)
1791
1803
  }
1792
1804
 
1793
1805
  function setSigner(eng, who) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fdeops-ingest-mcp",
3
- "version": "5.1.21",
3
+ "version": "5.1.22",
4
4
  "private": true,
5
5
  "description": "Thin stdio MCP sink for FDEOps ingest (stage \u2192 propose \u2192 apply). Zero runtime dependencies.",
6
6
  "bin": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fdeops",
3
- "version": "5.1.21",
3
+ "version": "5.1.22",
4
4
  "description": "Skills for forward deployed engineers across strategy, architecture and engineering. Use individual tasks or @fde coordination; local customer memory supports continuity.",
5
5
  "bin": {
6
6
  "fdeops": "bin/install.js",
package/plugin.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "fdeops",
4
- "version": "5.1.21",
4
+ "version": "5.1.22",
5
5
  "description": "Skills for forward deployed engineers across strategy, architecture and engineering. Use individual tasks or @fde coordination; local customer memory supports continuity.",
6
6
  "author": {
7
7
  "name": "Subash Natarajan",
@@ -29,23 +29,23 @@ Notice: every stakeholder's initiative is P0 or P1. That's the problem this skil
29
29
  | **Dependency** | How many other initiatives are blocked waiting for this? | 0 (standalone) → 5 (critical path for 3+ others) |
30
30
  | **Cost of delay** | What happens each week this doesn't ship? | 1 (nothing) → 5 (measurable loss or regulatory exposure) |
31
31
 
32
- **Triage score = Impact + Dependency + Cost of delay** (simple sum, 3-15 range).
32
+ **Triage score = Impact + Dependency + Cost of delay** (simple sum, 2-15 range).
33
33
 
34
34
  **3. Sort into three lanes:**
35
35
 
36
36
  | Lane | Score | Action |
37
37
  |------|-------|--------|
38
- | **Now** (max 3) | 11-15 | Active work this phase. FDE and team capacity allocated. |
39
- | **Next** (max 5) | 7-10 | Sequenced for the following phase. Dependencies tracked but not started. |
40
- | **Later** (unlimited) | 3-6 | Captured, not committed. Revisit at next triage. |
38
+ | **Now** (max 3) | 11-15 | Proposed active work, subject to actual capacity, dependencies and authority. |
39
+ | **Next** (max 5) | 7-10 | Proposed sequencing; dependencies tracked but not started. |
40
+ | **Later** (unlimited) | 2-6 | Captured, not committed. Revisit at next triage. |
41
41
 
42
- **The cap matters.** "Now" has exactly 3 slots. Not 4, not "3 plus this small one." Discipline is the product.
42
+ **The cap matters.** Three is a maximum, not a quota. Use fewer or zero Now items when capacity, unresolved dependencies or required permissions prevent useful authorized work. Check who is available, effort within the phase and shared bottlenecks; one engineer cannot be allocated to several full-capacity initiatives at once. The score bands are a starting point, not automatic lane assignments: high-scoring blocked work waits, and a lower-scoring prerequisite may come first with an explained rationale. Keep uncertain allocations proposed rather than inventing capacity or approval.
43
43
 
44
44
  **4. Handle the political override.** When a powerful stakeholder pushes a low-scoring initiative into "Now":
45
45
 
46
- - Show the displacement: "Adding X to Now means Y drops to Next. Y is currently blocking Z and W."
47
- - Let them choose: "Which of the current three should Y replace?" Making the trade-off visible makes the conversation honest.
48
- - If they override without trading: log it. `decisions.md`: "Initiative X added to Now without displacement by <who>. Capacity impact: <what slows>."
46
+ - Show the capacity and dependency trade-off. If Now is full for the available team, adding X requires deferring work or an explicitly agreed capacity change; a vacant slot alone is not capacity.
47
+ - Ask the responsible decision-maker to resolve the actual choice, without assuming three items are already active. Record the supplied choice and its source under the existing confirmation rules.
48
+ - An override cannot waive required permissions or create capacity. Keep an unresolved request proposed, with its impact, rather than reporting it as an allocated commitment.
49
49
 
50
50
  **5. Set the triage cadence.** Triage is not a one-time event:
51
51
 
@@ -55,15 +55,15 @@ Notice: every stakeholder's initiative is P0 or P1. That's the problem this skil
55
55
  | Standard (1-4 weeks) | Weekly | New P0 from sponsor |
56
56
  | Programme (months) | Bi-weekly | Quarterly review, team change, market shift |
57
57
 
58
- **6. Communicate the triage result.** The output is not just a priority list - it's a commitment:
58
+ **6. Communicate the triage result.** Distinguish a proposed allocation from an authorized commitment:
59
59
 
60
- > "We're committing to these three initiatives this phase: [A, B, C]. Here's why, here's what they deliver, and here's what's explicitly deferred: [D, E, F, ...]. If priorities change, we re-triage - we don't add without removing."
60
+ > "For the available capacity, I propose [eligible items, or none] this phase. Here's what they deliver, what is blocked or deferred, and which allocation still needs confirmation. Existing agreed work remains agreed; changes need the appropriate decision authority."
61
61
 
62
62
  ## Artifact
63
63
 
64
- **`decisions.md`** - the triage table with scores, lanes, **and an explicit Kill / Later commitment**. Dated. Updates the same Now/Next/Later plan already uses; do not open a second plan section. Referenced by plan and status.
64
+ **`decisions.md`** - the triage table with scores, lanes, and proposed or agreed deferrals. Keep status and decision sources explicit. Update the same Now/Next/Later section plan already uses under the record-confirmation rules; do not open a second plan section. Standalone work returns the draft without initializing records.
65
65
 
66
- Required closing block (plan will not treat triage as done without it):
66
+ For a recorded triage result, preserve this closing block. A draft may contain pending allocations and deferrals; missing agreement must not be filled with invented acceptance:
67
67
 
68
68
  ```markdown
69
69
  ## Triage - <date>
@@ -75,21 +75,21 @@ Required closing block (plan will not treat triage as done without it):
75
75
  ### Kill / defer (not this phase)
76
76
  | Initiative | Why not now | Who accepted |
77
77
  |------------|-------------|--------------|
78
- | ... | ... | <name, date> |
78
+ | ... | ... | <pending, or supplied name, date and source> |
79
79
 
80
- Commitment: we ship only Now. Additions require a removal.
80
+ Allocation: <proposed, or agreed with source>. Now contains only work feasible within the stated capacity and authority. Additions require a capacity and dependency check, and displacement when full.
81
81
  ```
82
82
 
83
83
  **`reality.md`** - if triage revealed that the engagement scope is larger than the timeline supports, update the assessment.
84
84
 
85
85
  ## Checkpoint
86
86
 
87
- Walk the FDE through: the 3 "Now" initiatives and why, the top "Next" items and what triggers their promotion, and the one initiative that will generate the most political pushback for being in "Later." Prepare the FDE for that conversation.
87
+ Walk the FDE through: the proposed or agreed Now items and available capacity, the Next items and what enables their promotion, and any real trade-off requiring a decision. Explain an empty Now lane when applicable; do not fill it to satisfy the title.
88
88
 
89
89
  ## Principles
90
90
 
91
- - "Now" has 3 slots. Not 4. Discipline is the product.
92
- - Every addition requires a removal. Visible trade-offs beat invisible overload.
91
+ - Now has at most three items and must fit actual capacity and dependencies.
92
+ - Every addition requires a capacity check; displace work when full rather than silently overloading the team.
93
93
  - Triage is recurring, not one-time. The list changes; the discipline doesn't.
94
94
  - A logged override protects the FDE. An unlogged override blames them.
95
95
  - The initiative everyone wants but nobody will trade for is the one to watch.
@@ -4,13 +4,15 @@
4
4
 
5
5
  **Read first:** `reality.md`, `brief.md`, `terrain.md`, `context.md`. If `business-case.md` or `prototype-log.md` exist from poc, load those - they carry forward.
6
6
 
7
- The most dangerous moment in a multi-use-case engagement is when the technically interesting problem wins over the high-value problem. Scoring replaces opinion with arithmetic. The arithmetic is wrong - all models are - but it's *visibly* wrong, which means it can be debated and corrected. Opinion can't.
7
+ The most dangerous moment in a multi-use-case engagement is when the technically interesting problem wins over the high-value problem. Scoring makes assumptions and trade-offs visible; it does not replace evidence or judgment. These ordinal ratings are a discussion aid, not calibrated estimates of value or a reason to override a hard constraint.
8
8
 
9
9
  ## Method (you do this work)
10
10
 
11
11
  **1. List every candidate.** From the brief, from discovery conversations, from the FDE's own observations. Include the ones the customer hasn't said aloud but the codebase implies - a high-churn module with no tests is a candidate even if nobody named it.
12
12
 
13
- **2. Score on five dimensions.** Each 1-5, with the scoring rubric below. If discover already ranked candidates with (Value × Data readiness) / Complexity, reuse that order; this table extends the conversation. Do not invent dimension scores from a thin brief - write `unknown` and ask.
13
+ Before ranking work for the proposed step, identify hard feasibility, access, data-permission and policy constraints. Keep blocked or unverified candidates visible with the affected step, owner or authority gap, and evidence needed to reconsider. A high score cannot make dependent work eligible. An authorized design or evidence check may proceed while implementation is blocked; a sponsor's preference does not grant missing API or data permission.
14
+
15
+ **2. Score on five dimensions.** Each 1-5, with the scoring rubric below. Reuse discovery's evidence and rationale, rechecking whether the candidates are eligible for the same next step. Do not invent dimension scores from a thin brief - write `unknown`, return a conditional recommendation and ask only what changes the decision.
14
16
 
15
17
  | Dimension | 1 | 3 | 5 |
16
18
  |-----------|---|---|---|
@@ -27,11 +29,11 @@ Score = (Business value × Urgency × Stakeholder alignment) / (6 - Feasibility)
27
29
  ```
28
30
 
29
31
  Why this formula:
30
- - **Multiplied numerator** - all three must be present. A high-value problem with no urgency or no sponsor scores low because it won't ship.
32
+ - **Multiplied numerator** - a lower rating reduces the score relative to otherwise identical ratings. Because every scale starts at 1, the formula does not establish that urgency, sponsorship or permission is present; eligibility must be checked separately.
31
33
  - **Feasibility inverted** - harder problems get a higher denominator, pulling the score down. A feasibility of 5 (easy) gives denominator 1; feasibility of 1 (hard) gives denominator 5.
32
34
  - **Data readiness as multiplier** - for data-dependent use cases (ML, analytics). For pure engineering work, set to 3 (neutral) unless data quality is genuinely a factor.
33
35
 
34
- **4. Rank and present.** Sort by score. Present the top 3 to the FDE and the sponsor:
36
+ **4. Rank and present.** Compare eligible candidates; show up to three useful options and list blocked work separately. If an uncertain input could reverse the order, show the plausible alternative rankings and the smallest permitted check that distinguishes them, with its owner or an explicit ownership gap. Do not hide uncertainty in a precise-looking score or delay independent authorized work while waiting. The following scores illustrate a recommendation, not a commitment:
35
37
 
36
38
  ```markdown
37
39
  | Rank | Use case | Value | Urgency | Feasibility | Data | Alignment | Score | Recommend |
@@ -49,7 +51,7 @@ Why this formula:
49
51
  **6. Handle the CEO's pet project.** Sometimes the highest-scoring use case isn't the one the most powerful stakeholder wants. That's information, not a problem:
50
52
 
51
53
  - Present the scores honestly - the stakeholder sees you're being rigorous, not political.
52
- - If they override: log it in `decisions.md` as a deliberate choice, note the trade-off, and build what they chose. The FDE who was honest about the trade-off is protected when the override creates problems.
54
+ - If the responsible decision-maker overrides the ranking, preserve the choice, source and trade-off under the existing record-confirmation rules. Check capacity and required permissions before dependent work; an override changes preference, not hard constraints or acceptance authority. An unconfirmed choice remains proposed.
53
55
 
54
56
  ## Artifact
55
57
 
@@ -59,12 +61,12 @@ Why this formula:
59
61
 
60
62
  ## Checkpoint
61
63
 
62
- Walk the FDE through the top 3 scores and the recommendation. One question: "Does the sponsor have a strong preference that overrides the scoring?" If yes, log it. If no, proceed with the highest score to poc or plan.
64
+ Walk the FDE through the eligible options, relevant blockers and any uncertainty that could reverse the recommendation. Keep the proposed allocation pending the appropriate decision authority; silence is not approval. Reuse existing authorization when it covers the next step. If evidence is insufficient, recommend a bounded distinguishing check rather than automatically proceeding with the highest score.
63
65
 
64
66
  ## Principles
65
67
 
66
- - Score replaces opinion. Visible arithmetic beats invisible judgment.
67
- - All three conditions (value, urgency, alignment) must hold - or the use case won't ship.
68
+ - Scores expose assumptions; evidence and eligible scope govern the recommendation.
69
+ - A numerical advantage cannot override a hard constraint or unknown permission.
68
70
  - The technically interesting problem that scores low gets deferred, not pursued.
69
71
  - Present the model; let the human decide. If overridden, log the trade-off.
70
72
  - A use case with no active sponsor is a research project, not an engagement deliverable.
@@ -5,7 +5,7 @@
5
5
  "SKILL.md": "07e8a3b485762e6b6897472fe4c934cb63ed0240d8258761be445729714d782d",
6
6
  "agents/openai.yaml": "3cfc01668b1bc6ec42d429e9730c68fd01520a7d15ea4289dee265e16bcd6b55",
7
7
  "references/business-case.md": "32e000e8351cd59f9eaad8be40babb276df69948ea4f81e01a4672e47f48cb25",
8
- "references/pick-three.md": "fa5a5f6db94c72c5a1c6419276d0f7c13ff3067ce075a074af020f736fe3fad8",
8
+ "references/pick-three.md": "c64a04fd0724b28701bbe334f444d0df93da4d858de993e82ccae04e48b66db9",
9
9
  "references/task-context.md": "9f995c1fe4d8a27d313b4c008a943fbcdd150029358c70b450dbbfb303a2666e"
10
10
  }
11
11
  }
@@ -29,23 +29,23 @@ Notice: every stakeholder's initiative is P0 or P1. That's the problem this skil
29
29
  | **Dependency** | How many other initiatives are blocked waiting for this? | 0 (standalone) → 5 (critical path for 3+ others) |
30
30
  | **Cost of delay** | What happens each week this doesn't ship? | 1 (nothing) → 5 (measurable loss or regulatory exposure) |
31
31
 
32
- **Triage score = Impact + Dependency + Cost of delay** (simple sum, 3-15 range).
32
+ **Triage score = Impact + Dependency + Cost of delay** (simple sum, 2-15 range).
33
33
 
34
34
  **3. Sort into three lanes:**
35
35
 
36
36
  | Lane | Score | Action |
37
37
  |------|-------|--------|
38
- | **Now** (max 3) | 11-15 | Active work this phase. FDE and team capacity allocated. |
39
- | **Next** (max 5) | 7-10 | Sequenced for the following phase. Dependencies tracked but not started. |
40
- | **Later** (unlimited) | 3-6 | Captured, not committed. Revisit at next triage. |
38
+ | **Now** (max 3) | 11-15 | Proposed active work, subject to actual capacity, dependencies and authority. |
39
+ | **Next** (max 5) | 7-10 | Proposed sequencing; dependencies tracked but not started. |
40
+ | **Later** (unlimited) | 2-6 | Captured, not committed. Revisit at next triage. |
41
41
 
42
- **The cap matters.** "Now" has exactly 3 slots. Not 4, not "3 plus this small one." Discipline is the product.
42
+ **The cap matters.** Three is a maximum, not a quota. Use fewer or zero Now items when capacity, unresolved dependencies or required permissions prevent useful authorized work. Check who is available, effort within the phase and shared bottlenecks; one engineer cannot be allocated to several full-capacity initiatives at once. The score bands are a starting point, not automatic lane assignments: high-scoring blocked work waits, and a lower-scoring prerequisite may come first with an explained rationale. Keep uncertain allocations proposed rather than inventing capacity or approval.
43
43
 
44
44
  **4. Handle the political override.** When a powerful stakeholder pushes a low-scoring initiative into "Now":
45
45
 
46
- - Show the displacement: "Adding X to Now means Y drops to Next. Y is currently blocking Z and W."
47
- - Let them choose: "Which of the current three should Y replace?" Making the trade-off visible makes the conversation honest.
48
- - If they override without trading: log it. `decisions.md`: "Initiative X added to Now without displacement by <who>. Capacity impact: <what slows>."
46
+ - Show the capacity and dependency trade-off. If Now is full for the available team, adding X requires deferring work or an explicitly agreed capacity change; a vacant slot alone is not capacity.
47
+ - Ask the responsible decision-maker to resolve the actual choice, without assuming three items are already active. Record the supplied choice and its source under the existing confirmation rules.
48
+ - An override cannot waive required permissions or create capacity. Keep an unresolved request proposed, with its impact, rather than reporting it as an allocated commitment.
49
49
 
50
50
  **5. Set the triage cadence.** Triage is not a one-time event:
51
51
 
@@ -55,15 +55,15 @@ Notice: every stakeholder's initiative is P0 or P1. That's the problem this skil
55
55
  | Standard (1-4 weeks) | Weekly | New P0 from sponsor |
56
56
  | Programme (months) | Bi-weekly | Quarterly review, team change, market shift |
57
57
 
58
- **6. Communicate the triage result.** The output is not just a priority list - it's a commitment:
58
+ **6. Communicate the triage result.** Distinguish a proposed allocation from an authorized commitment:
59
59
 
60
- > "We're committing to these three initiatives this phase: [A, B, C]. Here's why, here's what they deliver, and here's what's explicitly deferred: [D, E, F, ...]. If priorities change, we re-triage - we don't add without removing."
60
+ > "For the available capacity, I propose [eligible items, or none] this phase. Here's what they deliver, what is blocked or deferred, and which allocation still needs confirmation. Existing agreed work remains agreed; changes need the appropriate decision authority."
61
61
 
62
62
  ## Artifact
63
63
 
64
- **`decisions.md`** - the triage table with scores, lanes, **and an explicit Kill / Later commitment**. Dated. Updates the same Now/Next/Later plan already uses; do not open a second plan section. Referenced by plan and status.
64
+ **`decisions.md`** - the triage table with scores, lanes, and proposed or agreed deferrals. Keep status and decision sources explicit. Update the same Now/Next/Later section plan already uses under the record-confirmation rules; do not open a second plan section. Standalone work returns the draft without initializing records.
65
65
 
66
- Required closing block (plan will not treat triage as done without it):
66
+ For a recorded triage result, preserve this closing block. A draft may contain pending allocations and deferrals; missing agreement must not be filled with invented acceptance:
67
67
 
68
68
  ```markdown
69
69
  ## Triage - <date>
@@ -75,21 +75,21 @@ Required closing block (plan will not treat triage as done without it):
75
75
  ### Kill / defer (not this phase)
76
76
  | Initiative | Why not now | Who accepted |
77
77
  |------------|-------------|--------------|
78
- | ... | ... | <name, date> |
78
+ | ... | ... | <pending, or supplied name, date and source> |
79
79
 
80
- Commitment: we ship only Now. Additions require a removal.
80
+ Allocation: <proposed, or agreed with source>. Now contains only work feasible within the stated capacity and authority. Additions require a capacity and dependency check, and displacement when full.
81
81
  ```
82
82
 
83
83
  **`reality.md`** - if triage revealed that the engagement scope is larger than the timeline supports, update the assessment.
84
84
 
85
85
  ## Checkpoint
86
86
 
87
- Walk the FDE through: the 3 "Now" initiatives and why, the top "Next" items and what triggers their promotion, and the one initiative that will generate the most political pushback for being in "Later." Prepare the FDE for that conversation.
87
+ Walk the FDE through: the proposed or agreed Now items and available capacity, the Next items and what enables their promotion, and any real trade-off requiring a decision. Explain an empty Now lane when applicable; do not fill it to satisfy the title.
88
88
 
89
89
  ## Principles
90
90
 
91
- - "Now" has 3 slots. Not 4. Discipline is the product.
92
- - Every addition requires a removal. Visible trade-offs beat invisible overload.
91
+ - Now has at most three items and must fit actual capacity and dependencies.
92
+ - Every addition requires a capacity check; displace work when full rather than silently overloading the team.
93
93
  - Triage is recurring, not one-time. The list changes; the discipline doesn't.
94
94
  - A logged override protects the FDE. An unlogged override blames them.
95
95
  - The initiative everyone wants but nobody will trade for is the one to watch.
@@ -5,7 +5,7 @@
5
5
  "SKILL.md": "d3abc46b68361f6d808191b50183d41eec65eac31cba5d53ef1e22a2ccd7b32f",
6
6
  "agents/openai.yaml": "8f4af12758edb1a4648bb7917ef4c52eb4eb209a3917ae3e04904cdd5fd4dec0",
7
7
  "references/business-case.md": "32e000e8351cd59f9eaad8be40babb276df69948ea4f81e01a4672e47f48cb25",
8
- "references/score-use-cases.md": "bb304cf2de26a2df0b9f2a299e3a6b2760ebce15b8b523d9cb4a584cc26038f8",
8
+ "references/score-use-cases.md": "a8352b0886731a647fdb0305b22eaa83244f367d797e130ceb3271f112886801",
9
9
  "references/task-context.md": "9f995c1fe4d8a27d313b4c008a943fbcdd150029358c70b450dbbfb303a2666e"
10
10
  }
11
11
  }
@@ -4,13 +4,15 @@
4
4
 
5
5
  **Read first:** `reality.md`, `brief.md`, `terrain.md`, `context.md`. If `business-case.md` or `prototype-log.md` exist from poc, load those - they carry forward.
6
6
 
7
- The most dangerous moment in a multi-use-case engagement is when the technically interesting problem wins over the high-value problem. Scoring replaces opinion with arithmetic. The arithmetic is wrong - all models are - but it's *visibly* wrong, which means it can be debated and corrected. Opinion can't.
7
+ The most dangerous moment in a multi-use-case engagement is when the technically interesting problem wins over the high-value problem. Scoring makes assumptions and trade-offs visible; it does not replace evidence or judgment. These ordinal ratings are a discussion aid, not calibrated estimates of value or a reason to override a hard constraint.
8
8
 
9
9
  ## Method (you do this work)
10
10
 
11
11
  **1. List every candidate.** From the brief, from discovery conversations, from the FDE's own observations. Include the ones the customer hasn't said aloud but the codebase implies - a high-churn module with no tests is a candidate even if nobody named it.
12
12
 
13
- **2. Score on five dimensions.** Each 1-5, with the scoring rubric below. If discover already ranked candidates with (Value × Data readiness) / Complexity, reuse that order; this table extends the conversation. Do not invent dimension scores from a thin brief - write `unknown` and ask.
13
+ Before ranking work for the proposed step, identify hard feasibility, access, data-permission and policy constraints. Keep blocked or unverified candidates visible with the affected step, owner or authority gap, and evidence needed to reconsider. A high score cannot make dependent work eligible. An authorized design or evidence check may proceed while implementation is blocked; a sponsor's preference does not grant missing API or data permission.
14
+
15
+ **2. Score on five dimensions.** Each 1-5, with the scoring rubric below. Reuse discovery's evidence and rationale, rechecking whether the candidates are eligible for the same next step. Do not invent dimension scores from a thin brief - write `unknown`, return a conditional recommendation and ask only what changes the decision.
14
16
 
15
17
  | Dimension | 1 | 3 | 5 |
16
18
  |-----------|---|---|---|
@@ -27,11 +29,11 @@ Score = (Business value × Urgency × Stakeholder alignment) / (6 - Feasibility)
27
29
  ```
28
30
 
29
31
  Why this formula:
30
- - **Multiplied numerator** - all three must be present. A high-value problem with no urgency or no sponsor scores low because it won't ship.
32
+ - **Multiplied numerator** - a lower rating reduces the score relative to otherwise identical ratings. Because every scale starts at 1, the formula does not establish that urgency, sponsorship or permission is present; eligibility must be checked separately.
31
33
  - **Feasibility inverted** - harder problems get a higher denominator, pulling the score down. A feasibility of 5 (easy) gives denominator 1; feasibility of 1 (hard) gives denominator 5.
32
34
  - **Data readiness as multiplier** - for data-dependent use cases (ML, analytics). For pure engineering work, set to 3 (neutral) unless data quality is genuinely a factor.
33
35
 
34
- **4. Rank and present.** Sort by score. Present the top 3 to the FDE and the sponsor:
36
+ **4. Rank and present.** Compare eligible candidates; show up to three useful options and list blocked work separately. If an uncertain input could reverse the order, show the plausible alternative rankings and the smallest permitted check that distinguishes them, with its owner or an explicit ownership gap. Do not hide uncertainty in a precise-looking score or delay independent authorized work while waiting. The following scores illustrate a recommendation, not a commitment:
35
37
 
36
38
  ```markdown
37
39
  | Rank | Use case | Value | Urgency | Feasibility | Data | Alignment | Score | Recommend |
@@ -49,7 +51,7 @@ Why this formula:
49
51
  **6. Handle the CEO's pet project.** Sometimes the highest-scoring use case isn't the one the most powerful stakeholder wants. That's information, not a problem:
50
52
 
51
53
  - Present the scores honestly - the stakeholder sees you're being rigorous, not political.
52
- - If they override: log it in `decisions.md` as a deliberate choice, note the trade-off, and build what they chose. The FDE who was honest about the trade-off is protected when the override creates problems.
54
+ - If the responsible decision-maker overrides the ranking, preserve the choice, source and trade-off under the existing record-confirmation rules. Check capacity and required permissions before dependent work; an override changes preference, not hard constraints or acceptance authority. An unconfirmed choice remains proposed.
53
55
 
54
56
  ## Artifact
55
57
 
@@ -59,12 +61,12 @@ Why this formula:
59
61
 
60
62
  ## Checkpoint
61
63
 
62
- Walk the FDE through the top 3 scores and the recommendation. One question: "Does the sponsor have a strong preference that overrides the scoring?" If yes, log it. If no, proceed with the highest score to poc or plan.
64
+ Walk the FDE through the eligible options, relevant blockers and any uncertainty that could reverse the recommendation. Keep the proposed allocation pending the appropriate decision authority; silence is not approval. Reuse existing authorization when it covers the next step. If evidence is insufficient, recommend a bounded distinguishing check rather than automatically proceeding with the highest score.
63
65
 
64
66
  ## Principles
65
67
 
66
- - Score replaces opinion. Visible arithmetic beats invisible judgment.
67
- - All three conditions (value, urgency, alignment) must hold - or the use case won't ship.
68
+ - Scores expose assumptions; evidence and eligible scope govern the recommendation.
69
+ - A numerical advantage cannot override a hard constraint or unknown permission.
68
70
  - The technically interesting problem that scores low gets deferred, not pursued.
69
71
  - Present the model; let the human decide. If overridden, log the trade-off.
70
72
  - A use case with no active sponsor is a research project, not an engagement deliverable.