elliot-stack 1.0.13 → 1.0.15
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/README.md +13 -3
- package/package.json +1 -1
- package/skills/estack-active-learning-tutor/SKILL.md +371 -0
- package/skills/estack-active-learning-tutor/assets/teach_list_template.md +4 -0
- package/skills/estack-active-learning-tutor/paths/active-learning.md +37 -0
- package/skills/estack-active-learning-tutor/paths/diagnostic-quiz-generated.md +63 -0
- package/skills/estack-active-learning-tutor/paths/diagnostic-quiz-imported.md +49 -0
- package/skills/estack-active-learning-tutor/paths/practice-walkthrough.md +113 -0
- package/skills/estack-active-learning-tutor/references/teaching-turn-examples.md +202 -0
- package/skills/estack-better-title/SKILL.md +63 -0
- package/skills/estack-chris-voss/SKILL.md +63 -0
- package/skills/estack-customer-discovery/SKILL.md +63 -0
- package/skills/estack-flight-planner/SKILL.md +398 -0
- package/skills/estack-flight-planner/references/config_schema.md +156 -0
- package/skills/estack-flight-planner/references/flight_history_schema.md +97 -0
- package/skills/estack-flight-planner/references/shuttle_schedules.md +98 -0
- package/skills/estack-flight-planner/scripts/check_setup.sh +89 -0
- package/skills/estack-flight-planner/scripts/fetch_flights.py +99 -0
- package/skills/estack-flight-planner/scripts/filter_flights.py +265 -0
- package/skills/estack-flight-planner/scripts/pair_shuttles.py +173 -0
- package/skills/estack-github-issue-tracker/SKILL.md +52 -0
- package/skills/estack-repo-search/SKILL.md +63 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Path D — Practice Test Walkthrough
|
|
2
|
+
|
|
3
|
+
You and the student work through a practice test together, one question at a time. For each question you help build up the underlying concepts via clarification questions, then the student attempts the actual practice question. Concepts are added to `teach_list.md` per-question — the journal builds incrementally as questions surface them. The "do not preload" guidance is about *initialization* (don't seed the journal with concepts no question has surfaced yet); once a question surfaces a concept, teach the full sub-concept cluster of its parent topic per the **Teaching approach** rule in `SKILL.md`.
|
|
4
|
+
|
|
5
|
+
This is the only path that uses the `=== ACTIVE QUESTION ===` footer.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Path D footer type — `=== ACTIVE QUESTION ===`
|
|
10
|
+
|
|
11
|
+
Displays the verbatim practice exam question the student is attempting. The question text and options match the source material exactly — no paraphrasing, no transcribed answer key, no reasoning hints in the footer block.
|
|
12
|
+
|
|
13
|
+
The footer holds everything the student needs to answer: question text, data tables, answer choices, setup context. The body holds framing or teaching; the footer holds the question and only the question.
|
|
14
|
+
|
|
15
|
+
While the `=== ACTIVE QUESTION ===` footer is in flight, every turn until the student submits an attempt is a **Teaching turn** (see SKILL.md's TURN TYPES section). The student submitting an attempt is what flips the next turn to a **Scoring turn**.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Teaching turns during Path D
|
|
20
|
+
|
|
21
|
+
<goal>
|
|
22
|
+
When the active question is in flight and the student needs teaching, the teaching turn produces concept-general material that equips the student to bridge to *any* analogous problem on this concept.
|
|
23
|
+
</goal>
|
|
24
|
+
|
|
25
|
+
<success-criterion>
|
|
26
|
+
Take the teaching turn in isolation. A peer who has never seen the active question could read the body and learn the concept fully. Every sentence is concept-general — applicable to any analogous problem. If a sentence only makes sense given the active question's specific setup (its variables, comparative structure, inferential map, MCQ option logic), that sentence belongs in a Scoring turn instead.
|
|
27
|
+
</success-criterion>
|
|
28
|
+
|
|
29
|
+
<reasoning>
|
|
30
|
+
The student's job is to bridge concept → specific problem. If the teaching turn does the bridging for them, the student parrots rather than learns. This generalizes the V3 "variable isolation" idea (rename numbers and dates) to cover *logical* structure, not just values: the comparative shape of the question, the way the options carve up the concept space, and the inferential chain to the answer all live in the active question's territory. They belong to scoring.
|
|
31
|
+
</reasoning>
|
|
32
|
+
|
|
33
|
+
### Concrete shape of a Teaching turn during Path D
|
|
34
|
+
|
|
35
|
+
1. **Lead with the concept cluster, not a worked example.** The default teaching segment per `SKILL.md` is concept → definition → mechanics → formula → pitfalls. A worked example is added only on escalation per the **Teaching approach** rule.
|
|
36
|
+
|
|
37
|
+
2. **Use entirely fresh dummy values when illustrating mechanics.** Different names, dates, percentages, dollar/unit values. If the active question is about March collections at 35/45/20, an illustration uses something like August collections at 10/60/30.
|
|
38
|
+
|
|
39
|
+
3. **Teach the cluster, not the option labels.** When the active question is multiple choice, the teaching turn explains the underlying concept(s) so the student maps the options to the concept themselves. Walking through each option's category is a Scoring-turn move.
|
|
40
|
+
|
|
41
|
+
4. **Confirm understanding with a fresh dummy probe.** After teaching, run the **Confirming understanding** flow from `SKILL.md`: a `=== CLARIFICATION QUESTION ===` on a fresh dummy scenario, or — if the student spontaneously demonstrates the concept by answering the active question correctly with reasoning — that satisfies the checkpoint.
|
|
42
|
+
|
|
43
|
+
5. **One footer in flight at a time.** Per the FOOTER PROTOCOL in `SKILL.md`: when a Socratic probe is the right next move, the probe **becomes** that turn's footer (`=== CLARIFICATION QUESTION ===`). The active question is paused for that turn and returns next turn after the probe resolves.
|
|
44
|
+
|
|
45
|
+
6. **Diagnose by asking, not telling.** When the student is stuck, ask them to walk through their reasoning. Use what they say to identify the missing concept, then teach it.
|
|
46
|
+
|
|
47
|
+
### Worked example: GOOD vs. comparison teaching turn
|
|
48
|
+
|
|
49
|
+
For 2–3 fully written GOOD/comparison teaching turns with annotation, see `references/teaching-turn-examples.md`. The risk-preferences MCQ example is the most useful for Path D — read it before the first teaching segment of a Path D session.
|
|
50
|
+
|
|
51
|
+
A short illustrative contrast for the same active question ("Which of these gambles would a risk-averse person reject?"):
|
|
52
|
+
|
|
53
|
+
- **Concept-general body (GOOD):** *"Risk preferences classify how a decision-maker trades expected value against variance. A risk-averse person prefers a certain payoff to a gamble of equal expected value — the spread itself is a cost. Mechanically: given two prospects with the same expected value, a risk-averse person picks the one with lower variance. The exam trap to watch for: a higher EV gamble can still be rejected when the variance gap is large enough to outweigh the EV gain."*
|
|
54
|
+
- **Question-shaped body (drift):** *"Look at option A — it has higher expected value but more spread. Option B is a sure thing. A risk-averse person would..."* This sentence only exists because the active question structured itself this way. It's a Scoring-turn move.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Step 1 — Confirm and read
|
|
59
|
+
|
|
60
|
+
1. Confirm with the student which practice test (or section) they want to walk through.
|
|
61
|
+
2. Read the practice exam file fully. Read the student's notes fully. Read the relevant slides and transcripts fully.
|
|
62
|
+
|
|
63
|
+
Footer: `=== CONFIRM TO PROCEED ===` "Practice test loaded: {name}. Start with question {N}?"
|
|
64
|
+
|
|
65
|
+
## Step 2 — Per-question loop
|
|
66
|
+
|
|
67
|
+
Repeat for every question in the practice test the student wants to cover.
|
|
68
|
+
|
|
69
|
+
### 2a. Display the active question
|
|
70
|
+
|
|
71
|
+
Append journal entries for question N's concept(s) per the **TEACH LIST PROTOCOL** in `SKILL.md`:
|
|
72
|
+
|
|
73
|
+
- One `Q-OPEN` line for question N with its parent topic.
|
|
74
|
+
- One or more `SUB-ADD` lines per the sub-concept granularity guidance (default one; decompose when the parent topic genuinely clusters into multiple distinct testable ideas).
|
|
75
|
+
|
|
76
|
+
Body: brief framing of the question — no setup hints, no formula previews.
|
|
77
|
+
|
|
78
|
+
Footer: `=== ACTIVE QUESTION ===` with question N's text, data tables, and options exactly as written in the source.
|
|
79
|
+
|
|
80
|
+
### 2b. Branch on the student's response
|
|
81
|
+
|
|
82
|
+
- **Student attempts the question directly** → next turn is a Scoring turn → go to **2d**.
|
|
83
|
+
- **Student asks for help, says they don't get it, or shows clear gaps in their reasoning** → next turn is a Teaching turn → go to **2c**.
|
|
84
|
+
|
|
85
|
+
### 2c. Teach the concepts (Teaching turns)
|
|
86
|
+
|
|
87
|
+
1. Diagnose by asking. Use a `=== CLARIFICATION QUESTION ===` that asks the student to walk through their current thinking and where it stops making sense.
|
|
88
|
+
2. Run the gap sub-process from `SKILL.md`. Teach using the **Teaching template** with the concept-general shape described above. The teach queue (tracked via `SUB-ADD` and `MASTERED` lines) handles any prerequisite or adjacent gaps that surface — the active question does not return until the queue is empty.
|
|
89
|
+
3. Confirm understanding per `SKILL.md` (clarification question on a fresh dummy scenario, or skip per the skip condition). Append `CLARIFY-FAIL` if the student missed it; on pass, the next step's `MASTERED` records the result.
|
|
90
|
+
4. Append a `TEACH-TURN` line listing the sub-concepts taught this turn. Append `MASTERED` lines as sub-concepts demonstrate mastery.
|
|
91
|
+
5. When the primary concept(s) of question N are MASTERED and the teach queue is empty, ask if the student is ready to attempt the question.
|
|
92
|
+
- Footer: `=== CONFIRM TO PROCEED ===` "Ready to take question {N}?"
|
|
93
|
+
- Yes → next turn switches back to `=== ACTIVE QUESTION ===`. No → continue with whatever else they need (return to 2c.1).
|
|
94
|
+
|
|
95
|
+
### 2d. Evaluate the active question (Scoring turn)
|
|
96
|
+
|
|
97
|
+
When the student submits an answer to question N, this turn is a Scoring turn:
|
|
98
|
+
|
|
99
|
+
1. **Look up the answer key just-in-time.** Read it from its original source location — the chat message where the student first provided it, the practice exam file, or the project file containing it. Do not transcribe it elsewhere; this turn's reference is enough.
|
|
100
|
+
2. State the verdict on the active question (correct / incorrect / partial, and which option) before discussing reasoning. Append an `ATTEMPT` line to the journal with the verdict.
|
|
101
|
+
3. **Correct + reasoning** → append `MASTERED` lines for every concept question N tested. Move to question N+1 (return to 2a).
|
|
102
|
+
4. **Correct + shallow** → ask for the reasoning before counting it.
|
|
103
|
+
5. **Wrong** → run the gap sub-process. Apply the **Helping the student arrive at the answer themselves** rule from `SKILL.md`: hold the answer until the student earns it. Teach (next turn flips back to Teaching), confirm understanding, then re-display question N as `=== ACTIVE QUESTION ===` for a retry. Cycle 2c → 2d until the student reaches the answer themselves.
|
|
104
|
+
|
|
105
|
+
The retry result and the next question are always different turns — present Question N+1 only on the turn after Question N's retry has been scored.
|
|
106
|
+
|
|
107
|
+
## Step 3 — Close
|
|
108
|
+
|
|
109
|
+
Use the **UNIVERSAL CLOSE** in `SKILL.md`. Path D's path-specific completion criterion: every targeted practice question is answered correctly with reasoning explained.
|
|
110
|
+
|
|
111
|
+
### Early-close branch
|
|
112
|
+
|
|
113
|
+
If the student announces they're out of time or stops mid-session, run the Universal Close immediately using the journal's current state. Scan the journal bottom-up: anything whose most recent line is `MASTERED` is owned; anything else is a cram item. Highlight unmastered concepts as the cram list for the student's remaining study time.
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# Teaching Turn — Worked Examples
|
|
2
|
+
|
|
3
|
+
Three fully written example Teaching turns. Read these before your first teaching segment so the shape of a good Teaching turn is concrete in context.
|
|
4
|
+
|
|
5
|
+
Each example shows:
|
|
6
|
+
- The active question (header only — for example purposes; not part of the teaching turn body)
|
|
7
|
+
- The student's prompt that triggered the teaching turn
|
|
8
|
+
- The teaching turn body, written as an actual response
|
|
9
|
+
- A "why this passes the success criterion" annotation
|
|
10
|
+
|
|
11
|
+
The success criterion (from `SKILL.md` TURN TYPES > Teaching): a peer who never saw the active question could read the body in isolation and learn the concept fully. Every sentence is concept-general — applicable to any analogous problem on this concept.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Example 1 — MCQ logical-trap, cold start ("teach me X")
|
|
16
|
+
|
|
17
|
+
<active-question> *(for context only — does not appear in the teaching turn body)*
|
|
18
|
+
|
|
19
|
+
> Which of the following describes the choice a risk-averse decision-maker would make?
|
|
20
|
+
>
|
|
21
|
+
> A) Always choose the prospect with the highest expected value, regardless of variance.
|
|
22
|
+
> B) Always choose the prospect with the lowest variance, regardless of expected value.
|
|
23
|
+
> C) Among prospects with the same expected value, choose the one with the lowest variance.
|
|
24
|
+
> D) Among prospects with the same variance, choose the one with the lowest expected value.
|
|
25
|
+
|
|
26
|
+
</active-question>
|
|
27
|
+
|
|
28
|
+
<student-prompt>
|
|
29
|
+
"idk teach me risk"
|
|
30
|
+
</student-prompt>
|
|
31
|
+
|
|
32
|
+
<teaching-turn-body>
|
|
33
|
+
|
|
34
|
+
### Risk preferences
|
|
35
|
+
|
|
36
|
+
In decision theory, **risk preferences** classify how a decision-maker trades expected value against the variability of outcomes. Three preference types describe how a person ranks gambles whose payoffs differ in spread.
|
|
37
|
+
|
|
38
|
+
- **Expected value (EV)** is the probability-weighted average of the possible payoffs of a prospect. EV measures the *center* of the distribution.
|
|
39
|
+
- **Variance / standard deviation (SD)** measures the *spread* of the payoffs around the EV. In risk theory, variance is the standard quantitative proxy for "how risky" a prospect is.
|
|
40
|
+
- **Risk-averse** decision-makers experience the spread as a cost. Given two prospects with the *same* expected value, a risk-averse person prefers the one with lower variance. Given two prospects with the *same* variance, they prefer the one with higher expected value. The ordering is: lower spread is better, all else equal.
|
|
41
|
+
- **Risk-neutral** decision-makers care only about expected value. They are indifferent to variance and rank prospects purely by EV.
|
|
42
|
+
- **Risk-loving** decision-makers experience the spread as a benefit. Given equal EV, they prefer higher variance.
|
|
43
|
+
|
|
44
|
+
**Formula sketch.** Expected value of a prospect with payoffs `x_i` and probabilities `p_i`:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
EV = Σ p_i · x_i
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Variance of the same prospect:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
Var = Σ p_i · (x_i − EV)²
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Standard deviation is the square root of variance and lives in the same units as the payoffs.
|
|
57
|
+
|
|
58
|
+
**The trap to watch for.** The defining behavior of risk-aversion is conditional: it is the choice between prospects of **equal expected value**. Many exam questions describe a risk-averse person and offer gambles with *different* expected values, betting that the student will assume "risk-averse means always pick the lower variance." That is a stronger claim than the definition — risk-aversion does not mean ignoring EV. A risk-averse person can still take a higher-variance gamble if the expected value gain is large enough.
|
|
59
|
+
|
|
60
|
+
**Quick illustrative scenario** *(invented, not the active question's setup):*
|
|
61
|
+
|
|
62
|
+
A risk-averse investor faces two assets. Asset Q yields $200 for sure. Asset R yields $400 with probability 0.5 and $0 with probability 0.5. EV of Q = $200; EV of R = $200. The variance of Q is 0; the variance of R is positive. A risk-averse investor picks Q.
|
|
63
|
+
|
|
64
|
+
</teaching-turn-body>
|
|
65
|
+
|
|
66
|
+
<annotation>
|
|
67
|
+
The body never references the active question's option labels (A, B, C, D), never narrates "the trap" relative to the active question's specific options, and never says "the answer is C." The illustrative scenario uses different names ($200/$400, Asset Q/R) than anything in the active question. A peer who never saw the active question could read this and independently identify which option captures the risk-averse rule.
|
|
68
|
+
</annotation>
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Example 2 — Multi-step calculation, wrong attempt
|
|
73
|
+
|
|
74
|
+
<active-question> *(for context only)*
|
|
75
|
+
|
|
76
|
+
> A company expects March sales of 1,200 units. Its policy is to hold ending finished-goods inventory equal to 25% of next month's sales. Beginning March inventory was 280 units. April sales are forecast at 1,400 units. How many units must be produced in March?
|
|
77
|
+
|
|
78
|
+
</active-question>
|
|
79
|
+
|
|
80
|
+
<student-prompt>
|
|
81
|
+
"I tried 1,200 + 280 = 1,480. That's wrong, isn't it? I'm lost."
|
|
82
|
+
</student-prompt>
|
|
83
|
+
|
|
84
|
+
<teaching-turn-body>
|
|
85
|
+
|
|
86
|
+
### Production budget
|
|
87
|
+
|
|
88
|
+
The **production budget** answers a single question: how many units does a manufacturer have to *produce* in a given period to (a) satisfy the period's sales and (b) leave the desired ending inventory on hand for the next period? Inventory at the start of the period reduces the production requirement; desired inventory at the end of the period adds to it.
|
|
89
|
+
|
|
90
|
+
- **Budgeted unit sales** are the units forecast to be sold during the period. They are the "demand" the budget must meet.
|
|
91
|
+
- **Desired ending finished-goods inventory** is the policy-driven cushion the firm wants on hand at the close of the period. A common policy is "X% of next period's budgeted sales," because future sales drive future production lead times.
|
|
92
|
+
- **Beginning finished-goods inventory** is the units on hand at the start of the period, carried over from the prior period's ending inventory. Those units are already produced — they reduce what production must contribute this period.
|
|
93
|
+
|
|
94
|
+
**The formula:**
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
Production (units) = Budgeted sales (units)
|
|
98
|
+
+ Desired ending inventory (units)
|
|
99
|
+
− Beginning inventory (units)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**Why the formula has that shape.** Sales drain inventory; production refills it. To end with the desired cushion, the firm needs to produce enough to (1) replace what sales took, and (2) build the cushion up to (or down to) the desired ending level. Beginning inventory is a head start — units already on the shelf don't have to be produced.
|
|
103
|
+
|
|
104
|
+
**The trap to watch for.** Two patterns trip students up:
|
|
105
|
+
|
|
106
|
+
1. Confusing "ending inventory of *this* period" with "next period's sales." The policy is usually expressed as a percentage of *next period's* sales, but the policy is referring to the inventory at the *end of this period*. The percentage of next period's sales gives you the ending-inventory-this-period number directly.
|
|
107
|
+
2. Adding rather than subtracting beginning inventory. Beginning inventory is already on hand — it's a credit against required production, not an addition to it.
|
|
108
|
+
|
|
109
|
+
**Quick illustrative scenario** *(invented values):*
|
|
110
|
+
|
|
111
|
+
A bakery forecasts August sales of 600 cakes. Its policy is to hold ending inventory equal to 30% of September's forecast sales. September sales are forecast at 800 cakes. Beginning August inventory is 150 cakes.
|
|
112
|
+
|
|
113
|
+
- Desired ending inventory = 30% × 800 = 240 cakes.
|
|
114
|
+
- Production = 600 (sales) + 240 (desired ending) − 150 (beginning) = **690 cakes**.
|
|
115
|
+
|
|
116
|
+
</teaching-turn-body>
|
|
117
|
+
|
|
118
|
+
<annotation>
|
|
119
|
+
The body teaches the production-budget formula without using March, April, 1,200, 1,400, 280, or 25%. It explains both the structure of the formula and the two most common mistakes (one of which the student just made — adding beginning inventory instead of subtracting it). The student now has the conceptual material to redo the active question themselves. The illustrative scenario uses August/September/cakes/600/800/150 — entirely different values.
|
|
120
|
+
</annotation>
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Example 3 — "I don't get it" cold start, calculation-heavy concept
|
|
125
|
+
|
|
126
|
+
<active-question> *(for context only)*
|
|
127
|
+
|
|
128
|
+
> A project costs $50,000 today and is expected to return $18,000 per year for 4 years. The firm's required rate of return is 9%. What is the project's NPV?
|
|
129
|
+
|
|
130
|
+
</active-question>
|
|
131
|
+
|
|
132
|
+
<student-prompt>
|
|
133
|
+
"I don't get it. What even is NPV?"
|
|
134
|
+
</student-prompt>
|
|
135
|
+
|
|
136
|
+
<teaching-turn-body>
|
|
137
|
+
|
|
138
|
+
### Net present value (NPV)
|
|
139
|
+
|
|
140
|
+
**Net present value** is the dollar value today of the future cash flows a project generates, *minus* the cost of the project. It answers: "After accounting for the time value of money, does this project make me richer or poorer?"
|
|
141
|
+
|
|
142
|
+
- **Time value of money** is the principle that a dollar received in the future is worth less than a dollar today, because today's dollar can be invested. The further out a future dollar is, the less it is worth right now.
|
|
143
|
+
- **Discount rate** is the per-period rate used to translate a future dollar into today's dollar. It typically equals the firm's required rate of return — the minimum yield the firm demands of any project given its risk and the firm's cost of capital.
|
|
144
|
+
- **Present value of one future cash flow** is that cash flow divided by `(1 + r)^t`, where `r` is the discount rate per period and `t` is the number of periods until the cash flow is received.
|
|
145
|
+
- **NPV** sums the present value of every future cash flow the project produces and subtracts the project's up-front cost (which is already in today's dollars and so is not discounted).
|
|
146
|
+
|
|
147
|
+
**The formula:**
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
NPV = − C₀ + Σ (CF_t / (1 + r)^t), for t = 1 to N
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Where:
|
|
154
|
+
- `C₀` is the initial investment (a positive number subtracted at the front, or written as a negative cash flow at t=0)
|
|
155
|
+
- `CF_t` is the net cash flow received at the end of period `t`
|
|
156
|
+
- `r` is the discount rate per period
|
|
157
|
+
- `N` is the number of periods over which the project runs
|
|
158
|
+
|
|
159
|
+
**The decision rule.** A project with **NPV > 0** adds value — the discounted future cash flows more than cover the cost. A project with **NPV < 0** destroys value. A project with **NPV = 0** breaks even at the required rate.
|
|
160
|
+
|
|
161
|
+
**The trap to watch for.** Two recurring errors:
|
|
162
|
+
|
|
163
|
+
1. Forgetting to subtract the initial investment. The "P" in NPV is the present *value* of inflows; the "N" (net) is what makes it net of the cost. Computing only the discounted cash inflows gives you PV, not NPV.
|
|
164
|
+
2. Discounting the initial investment. The initial cost is paid today (t=0) and is already in today's dollars — it does not get divided by `(1 + r)`.
|
|
165
|
+
|
|
166
|
+
**Quick illustrative scenario** *(invented values):*
|
|
167
|
+
|
|
168
|
+
A project costs $1,000 today and pays $600 at the end of year 1 and $700 at the end of year 2. Required rate is 10%.
|
|
169
|
+
|
|
170
|
+
- PV of year 1 cash flow = 600 / 1.10 = $545.45
|
|
171
|
+
- PV of year 2 cash flow = 700 / (1.10)² = $578.51
|
|
172
|
+
- NPV = −1,000 + 545.45 + 578.51 = **$123.96**.
|
|
173
|
+
|
|
174
|
+
The project's NPV is positive, so it adds value at the 10% required rate.
|
|
175
|
+
|
|
176
|
+
</teaching-turn-body>
|
|
177
|
+
|
|
178
|
+
<annotation>
|
|
179
|
+
The body never uses $50,000, $18,000, 4 years, or 9%. It explains the concept end-to-end (definition, mechanics, formula, decision rule, two common traps) and walks a single 2-period dummy example to make the discounting mechanics concrete. The student now has every piece they need to set up and solve the active question themselves. The illustrative scenario's numbers are deliberately small and clean ($1,000 / $600 / $700 / 10%) to keep arithmetic from competing with the concept.
|
|
180
|
+
</annotation>
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Pattern summary
|
|
185
|
+
|
|
186
|
+
Across all three examples, the Teaching turn body:
|
|
187
|
+
|
|
188
|
+
1. **Names the concept** as a heading.
|
|
189
|
+
2. **Defines** the concept and its component pieces.
|
|
190
|
+
3. **States the formula** when the concept has one, with variables labeled.
|
|
191
|
+
4. **Explains the structure** — why the formula has its shape, what the decision rule is.
|
|
192
|
+
5. **Calls out the traps** — the recurring exam mistakes for this concept, framed independently of the active question.
|
|
193
|
+
6. **Walks one dummy illustration** (only when the concept benefits from concrete arithmetic; for purely conceptual topics this can be skipped).
|
|
194
|
+
|
|
195
|
+
What never appears in the body:
|
|
196
|
+
|
|
197
|
+
- The active question's specific variable values.
|
|
198
|
+
- The active question's option labels.
|
|
199
|
+
- A sentence that maps a concept piece to the active question ("so for option B, this means...").
|
|
200
|
+
- The correct answer or the reasoning chain that distinguishes the correct answer from distractors.
|
|
201
|
+
|
|
202
|
+
Those moves all belong to the **Scoring turn** that comes after the student attempts.
|
|
@@ -60,3 +60,66 @@ __CLAUDE_TITLE__
|
|
|
60
60
|
Replace `<chosen title>` with the actual chosen title. The quoted heredoc (`<<'__CLAUDE_TITLE__'`) prevents the shell from interpreting any special characters in the title — quotes, apostrophes, dollar signs, backticks, etc. are all passed through literally. After running, confirm the rename succeeded.
|
|
61
61
|
|
|
62
62
|
**Important:** The live UI border won't update until the next session resume — the persisted title will show in the session list and on next `/resume`.
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Skill Feedback
|
|
67
|
+
|
|
68
|
+
If the user shares feedback about this skill — a bug, something confusing, a missing feature, or a suggestion — ask them to describe it in a bit more detail (what they expected, what happened, and any relevant context). Then file the issue using whichever method is available:
|
|
69
|
+
|
|
70
|
+
**If `gh` is installed** (`gh --version` succeeds), create the issue directly:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
gh issue create \
|
|
74
|
+
--repo ElliotDrel/e-stack \
|
|
75
|
+
--title "estack-better-title: <concise summary>" \
|
|
76
|
+
--body "<description from user feedback — expected vs. actual behavior and context>"
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**If `gh` is not installed**, build a pre-filled URL and share it so the user can click, review, and submit:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
python3 -c "
|
|
83
|
+
import urllib.parse
|
|
84
|
+
title = 'estack-better-title: <concise summary>'
|
|
85
|
+
body = '<description from user feedback — expected vs. actual behavior and context>'
|
|
86
|
+
base = 'https://github.com/ElliotDrel/e-stack/issues/new'
|
|
87
|
+
print(base + '?title=' + urllib.parse.quote(title) + '&body=' + urllib.parse.quote(body))
|
|
88
|
+
"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Share the printed URL with the user. They click it, review the pre-filled title and body, then click **Submit new issue**.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Skill Feedback
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Skill Feedback
|
|
99
|
+
|
|
100
|
+
If the user shares feedback about this skill — a bug, something confusing, a missing feature, or a suggestion — ask them to describe it in a bit more detail (what they expected, what happened, and any relevant context). Then file the issue using whichever method is available:
|
|
101
|
+
|
|
102
|
+
**If `gh` is installed** (`gh --version` succeeds), create the issue directly:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
gh issue create \
|
|
106
|
+
--repo ElliotDrel/e-stack \
|
|
107
|
+
--title "estack-better-title: <concise summary>" \
|
|
108
|
+
--body "<description from user feedback — expected vs. actual behavior and context>"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**If `gh` is not installed**, build a pre-filled URL:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
python3 -c "
|
|
115
|
+
import urllib.parse
|
|
116
|
+
title = 'estack-better-title: <concise summary>'
|
|
117
|
+
body = '<description from user feedback — expected vs. actual behavior and context>'
|
|
118
|
+
base = 'https://github.com/ElliotDrel/e-stack/issues/new'
|
|
119
|
+
print(base + '?title=' + urllib.parse.quote(title) + '&body=' + urllib.parse.quote(body))
|
|
120
|
+
"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Share the printed URL with the user and offer to open it in their browser.
|
|
124
|
+
|
|
125
|
+
They can also click it directly, review the pre-filled title and body, and click **Submit new issue**.
|
|
@@ -76,3 +76,66 @@ quick index of when to reach for each tool:
|
|
|
76
76
|
|
|
77
77
|
Use calm, confident language. If the situation is high-stakes, slow down and be precise. Never
|
|
78
78
|
rush the user into a compromise — no deal is better than a bad deal.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Skill Feedback
|
|
83
|
+
|
|
84
|
+
If the user shares feedback about this skill — a bug, something confusing, a missing feature, or a suggestion — ask them to describe it in a bit more detail (what they expected, what happened, and any relevant context). Then file the issue using whichever method is available:
|
|
85
|
+
|
|
86
|
+
**If `gh` is installed** (`gh --version` succeeds), create the issue directly:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
gh issue create \
|
|
90
|
+
--repo ElliotDrel/e-stack \
|
|
91
|
+
--title "estack-chris-voss: <concise summary>" \
|
|
92
|
+
--body "<description from user feedback — expected vs. actual behavior and context>"
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**If `gh` is not installed**, build a pre-filled URL and share it so the user can click, review, and submit:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
python3 -c "
|
|
99
|
+
import urllib.parse
|
|
100
|
+
title = 'estack-chris-voss: <concise summary>'
|
|
101
|
+
body = '<description from user feedback — expected vs. actual behavior and context>'
|
|
102
|
+
base = 'https://github.com/ElliotDrel/e-stack/issues/new'
|
|
103
|
+
print(base + '?title=' + urllib.parse.quote(title) + '&body=' + urllib.parse.quote(body))
|
|
104
|
+
"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Share the printed URL with the user. They click it, review the pre-filled title and body, then click **Submit new issue**.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Skill Feedback
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Skill Feedback
|
|
115
|
+
|
|
116
|
+
If the user shares feedback about this skill — a bug, something confusing, a missing feature, or a suggestion — ask them to describe it in a bit more detail (what they expected, what happened, and any relevant context). Then file the issue using whichever method is available:
|
|
117
|
+
|
|
118
|
+
**If `gh` is installed** (`gh --version` succeeds), create the issue directly:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
gh issue create \
|
|
122
|
+
--repo ElliotDrel/e-stack \
|
|
123
|
+
--title "estack-chris-voss: <concise summary>" \
|
|
124
|
+
--body "<description from user feedback — expected vs. actual behavior and context>"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
**If `gh` is not installed**, build a pre-filled URL:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
python3 -c "
|
|
131
|
+
import urllib.parse
|
|
132
|
+
title = 'estack-chris-voss: <concise summary>'
|
|
133
|
+
body = '<description from user feedback — expected vs. actual behavior and context>'
|
|
134
|
+
base = 'https://github.com/ElliotDrel/e-stack/issues/new'
|
|
135
|
+
print(base + '?title=' + urllib.parse.quote(title) + '&body=' + urllib.parse.quote(body))
|
|
136
|
+
"
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Share the printed URL with the user and offer to open it in their browser.
|
|
140
|
+
|
|
141
|
+
They can also click it directly, review the pre-filled title and body, and click **Submit new issue**.
|
|
@@ -56,3 +56,66 @@ At the end of each step, offer to produce a written summary the user can referen
|
|
|
56
56
|
### Step 5: Continue the flow
|
|
57
57
|
|
|
58
58
|
After completing a step, offer to continue to the next one by name (e.g., "Would you like to continue to **Step 3: Interview Execution**?"). Never reference a step by number alone — always include the name so the user knows what it covers. If the user jumped into a specific step, still offer the next step — they might want to keep going.
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Skill Feedback
|
|
63
|
+
|
|
64
|
+
If the user shares feedback about this skill — a bug, something confusing, a missing feature, or a suggestion — ask them to describe it in a bit more detail (what they expected, what happened, and any relevant context). Then file the issue using whichever method is available:
|
|
65
|
+
|
|
66
|
+
**If `gh` is installed** (`gh --version` succeeds), create the issue directly:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
gh issue create \
|
|
70
|
+
--repo ElliotDrel/e-stack \
|
|
71
|
+
--title "estack-customer-discovery: <concise summary>" \
|
|
72
|
+
--body "<description from user feedback — expected vs. actual behavior and context>"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**If `gh` is not installed**, build a pre-filled URL and share it so the user can click, review, and submit:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
python3 -c "
|
|
79
|
+
import urllib.parse
|
|
80
|
+
title = 'estack-customer-discovery: <concise summary>'
|
|
81
|
+
body = '<description from user feedback — expected vs. actual behavior and context>'
|
|
82
|
+
base = 'https://github.com/ElliotDrel/e-stack/issues/new'
|
|
83
|
+
print(base + '?title=' + urllib.parse.quote(title) + '&body=' + urllib.parse.quote(body))
|
|
84
|
+
"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Share the printed URL with the user. They click it, review the pre-filled title and body, then click **Submit new issue**.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Skill Feedback
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Skill Feedback
|
|
95
|
+
|
|
96
|
+
If the user shares feedback about this skill — a bug, something confusing, a missing feature, or a suggestion — ask them to describe it in a bit more detail (what they expected, what happened, and any relevant context). Then file the issue using whichever method is available:
|
|
97
|
+
|
|
98
|
+
**If `gh` is installed** (`gh --version` succeeds), create the issue directly:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
gh issue create \
|
|
102
|
+
--repo ElliotDrel/e-stack \
|
|
103
|
+
--title "estack-customer-discovery: <concise summary>" \
|
|
104
|
+
--body "<description from user feedback — expected vs. actual behavior and context>"
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**If `gh` is not installed**, build a pre-filled URL:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
python3 -c "
|
|
111
|
+
import urllib.parse
|
|
112
|
+
title = 'estack-customer-discovery: <concise summary>'
|
|
113
|
+
body = '<description from user feedback — expected vs. actual behavior and context>'
|
|
114
|
+
base = 'https://github.com/ElliotDrel/e-stack/issues/new'
|
|
115
|
+
print(base + '?title=' + urllib.parse.quote(title) + '&body=' + urllib.parse.quote(body))
|
|
116
|
+
"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Share the printed URL with the user and offer to open it in their browser.
|
|
120
|
+
|
|
121
|
+
They can also click it directly, review the pre-filled title and body, and click **Submit new issue**.
|