Install
$ agentstack add skill-dan-cleary-fdestack-value-frame ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
/value-frame
Frame a customer opportunity in defensible dollar terms.
Step 0: Parse inputs
The customer name is the first argument. Everything after it is the opportunity descriptor (e.g., "payment terms optimization", "ticket deflection from chatbot", "stockout reduction").
If no customer name is provided: ask "Which customer? (e.g. /value-frame acme )" If no opportunity is provided: ask "What opportunity are we framing? Reference the latest /scope file or describe in one line."
Set CUSTOMER_NAME from the first argument.
Step 1: Check session marker
MARKER="/tmp/fdestack-session-$CUSTOMER_NAME"
if [ -f "$MARKER" ]; then
MARKER_TS=$(grep '^ts=' "$MARKER" | cut -d= -f2)
NOW=$(date +%s)
AGE=$(( NOW - MARKER_TS ))
if [ "$AGE" -lt 43200 ]; then
echo "MARKER_OK=true"
else
echo "MARKER_STALE=true AGE_H=$(( AGE / 3600 ))"
fi
else
echo "MARKER_MISSING=true"
fi
If MARKER_MISSING=true or MARKER_STALE=true: > Run /customer-context $CUSTOMER_NAME first, then retry /value-frame.
Stop. Do not proceed.
Step 2: Verify scope exists (recommended, not required)
SCOPE_COUNT=$(ls customers/$CUSTOMER_NAME/scope-*.md 2>/dev/null | wc -l | tr -d ' ')
echo "SCOPE_COUNT=$SCOPE_COUNT"
If SCOPE_COUNT=0: print > No /scope file found for $CUSTOMER_NAME. /value-frame works best when the > opportunity is already scoped — the scope file gives us the wedge size and > success criteria to translate into value. You can proceed without one, but > the resulting value frame may be harder to defend. > Continue anyway? (yes / no)
If FDE says no, stop. If yes, proceed and note "no-scope" in the value-frame file's "Problem source" line.
Step 3: Load cross-customer learnings
LEARNINGS_FILE="$HOME/.fdestack/learnings.jsonl"
if [ -f "$LEARNINGS_FILE" ] && [ -s "$LEARNINGS_FILE" ]; then
tail -5 "$LEARNINGS_FILE" | jq -r '"[learning] " + .key + ": " + .insight' 2>/dev/null || true
fi
Note any learnings that mention value framing patterns, customer industry, or this opportunity type.
Step 4: Load context
Read in this order:
customers//profile.md— company size, industry, what numbers will landcustomers//stack.md— data we have access to (which assumptions are computable vs. estimated)- Most recent
customers//scope-*.md(if any) — the wedge problem this is framing value for - Most recent
customers//discovery-*.md— stakeholder context (who's the audience, what numbers do they already throw around) customers//value-frame-*.md(if any prior) — what we've already framed for this customercustomers//decisions.md— any methodological decisions already locked in
Step 5: Identify the lever
Every value frame translates a process improvement into one of these levers. Force the FDE to pick exactly ONE primary lever. If two apply, the secondary one goes into "Additional Value" — never into the headline number.
| Lever | What it captures | Typical unit economics | |---|---|---| | Time | FTE hours freed, cycle time compressed | hours/week × $/hour × 52 weeks | | Errors | Rework avoided, escalations prevented | error rate × $/error × annual volume | | Capital | Working capital freed, inventory reduced | $ tied up × cost-of-capital × duration | | Volume | Incremental revenue, throughput gains | incremental units × margin × probability | | Risk | Compliance fines avoided, downtime prevented | P(event) × $/event annually |
Ask: "Which lever is this primarily about?" If the FDE answers "all of them" or "I'm not sure" or names something not in this taxonomy → mark lever-unclear for the unknowns loop.
Step 6: State unit economics
For the chosen lever, write the formula explicitly. Examples:
- Time lever:
value = hours_saved_per_week × loaded_hourly_rate × 52 - Capital lever:
value = working_capital_freed × cost_of_capital_pct × (days_held / 365) - Errors lever:
value = error_rate_pct × $_per_error × annual_volume
If the formula has more than 4 terms, it's probably trying to do too much — ask the FDE to simplify or split into primary + additional.
Step 7: Surface assumptions
Every term in the unit economics formula is either:
- Measured — comes from the customer's data, defensible
- Stated — comes from a public benchmark or industry source, defensible if cited
- Estimated — comes from FDE judgment, must be flagged
For each term, label it [measured], [stated: ], or [estimated]. If more than 50% of terms are [estimated], mark assumptions-thin for the unknowns loop.
Step 8: Compute headline + sensitivity
Headline: plug expected values into the formula. State the annualized number.
Sensitivity: compute three points unless the FDE has a reason to use a different range:
- Conservative: each assumption set 30% worse than expected
- Likely: expected values (= headline)
- Aggressive: each assumption set 30% better than expected
If the conservative and aggressive numbers are within ±15% of each other, the model is too smooth — the FDE is probably hiding uncertainty. Ask: "Where's the real uncertainty in this estimate?"
If they can't name it → mark sensitivity-suspicious for the unknowns loop.
Step 9: Defensibility check
Ask the FDE: "If a skeptical CFO at $CUSTOMER_NAME sees this, what's the first thing they push back on?"
Categorize the answer:
- Methodology ("how did you arrive at the rate?") → fix by citing the source or marking the assumption explicitly
- Numbers ("that volume seems high") → fix by showing where it came from in their data
- Strategic relevance ("we already do this") → not a value-frame problem; this is a scoping problem. Push back to
/scope.
If the FDE can't articulate a likely pushback → mark defensibility-untested for the unknowns loop.
Step 10: Push vague items to unknowns.md HIGH
For each item flagged in Steps 5-9 (lever-unclear, assumptions-thin, sensitivity-suspicious, defensibility-untested), append a line to customers//unknowns.md under ## HIGH — Unknown, Blocking with format:
- [value-frame-] — need answer to defend value to customer.
Update the ## Last Updated line on unknowns.md.
If no vague items, do not modify unknowns.md.
Step 11: Write the value-frame file
Set FRAME_DATE=$(date +%Y-%m-%d). Handle collision with the same -2, -3 suffix pattern:
FRAME_FILE="customers/$CUSTOMER_NAME/value-frame-$FRAME_DATE.md"
if [ -f "$FRAME_FILE" ]; then
i=2
while [ -f "customers/$CUSTOMER_NAME/value-frame-$FRAME_DATE-$i.md" ]; do
i=$((i + 1))
done
FRAME_FILE="customers/$CUSTOMER_NAME/value-frame-$FRAME_DATE-$i.md"
fi
Set FDE_NAME="$(git config user.name)". Write:
# Value frame:
**Date:**
**FDE:**
**Problem source:**
**Customer-side audience:**
## Opportunity (one sentence)
## Primary Lever
## Unit Economics
## Assumptions
- **:** [measured | stated: | estimated]
- **:** [measured | stated: | estimated]
- **:** [measured | stated: | estimated]
## Headline
**$/year** (annualized, likely case)
## Sensitivity
- Conservative (assumptions -30%): **$/year**
- Likely: **$/year**
- Aggressive (assumptions +30%): **$/year**
## Defensibility
**Most likely pushback:**
**Specifically:**
**Response prepared:**
## Additional Value (secondary, not in headline)
-
## Open Items
Step 12: Commit
git add "customers/$CUSTOMER_NAME/"
git commit -m "value-frame: $CUSTOMER_NAME $FRAME_DATE"
No confirmation prompt — the FDE just walked through Steps 5-10 interactively.
Step 13: Summary
Print:
Value frame written:
Primary lever:
Headline: $/year (sensitivity: $ — $)
Defensibility pushback type:
[if any items pushed to unknowns.md]
Unresolved items added to unknowns.md (HIGH):
-
Next:
- If unresolved items: address them before the customer conversation
- If clean: this number is ready to defend. /poc when you want to prove it
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Dan-Cleary
- Source: Dan-Cleary/fdestack
- License: MIT
- Homepage: https://github.com/Dan-Cleary/fdestack
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.