Sprint 4 — vW4 — Predict Three Markets, Defend Your Call
Last sprint you automated. This sprint your team makes a real call on three markets, locks it, and can explain it out loud. Then you build the last two stages of the system architecture: measuring how far off you were, and deciding what to change.
The Sprint Goal
Two New Ideas This Sprint: Delta and Prescription
These are Stages 6 and 7 of the system architecture. They are new this sprint, so here they are in plain words. In Scrum terms: your prediction is the sprint's work, the delta is your Sprint Review of it, and the prescription is your Retrospective action item.
- How far off were you? The size of the error.
- Was the direction right? Did you call up when it went down?
- Which agent pulled you furthest the wrong way? Look at what each of your agents (Almanac, Macro, Technical) and the LLMs said that week, and see which one pointed furthest from what happened and how much your final call leaned on it.
Worked example (invented numbers, not real markets)
| Step | Example |
|---|---|
| What you predicted | A market's closing level of 5,000, up from last Friday's close of 4,980 |
| What actually happened | It closed at 5,050 |
| Delta: how far off | 50 points, which is about 1.0% of 5,050 |
| Delta: direction | Right. It went up, as you called |
| Delta: which agent | The Technical agent said "up strongly" and the Macro agent said "up". The Almanac agent said "down" and pulled the final call lower than the market went. So the Almanac contributed most to the miss |
| Prescription | "Lean less on the Almanac agent for the next call, because its 'down' view was furthest from the outcome. Add a check: if the Almanac disagrees with both other agents, R5 must ask why before we accept it." |
Prediction Challenge — Three Markets
| Market | You predict | Where to read it | Owner |
|---|---|---|---|
S&P 500 (^GSPC) | The closing level on Friday 2 Oct | Yahoo Finance · ^GSPC history | R2 |
Nasdaq-100 (^NDX) | The closing level on Friday 2 Oct | Yahoo Finance · ^NDX history | R3 |
Gold futures /GC, December 2026 (GCZ26.CMX) | Direction only: UP or DOWN. Will Friday 2 Oct's close be above or below Friday 25 Sep's close? | Yahoo Finance · GCZ26.CMX (then click Historical Data) | R4 |
How to read the close
The close is the close of market on Friday. Markets don't trade on Saturday, so Friday's close is the last price of Friday's New York session. That lands early Saturday morning in Singapore (stocks about 4:00 pm New York = 04:00 SGT; gold futures about 5:00 pm New York = 05:00 SGT). Check Saturday morning or later.
- Open the market's Historical Data page on Yahoo Finance, set to Daily.
- Find the row for the date.
- Read the Close column. Not Adj Close.
Source of record: Yahoo Finance, so every team is scored against the same number. If it's unreachable for the two indices, use Google Finance and say so in your commit message. For gold, use the same source for both Fridays.
Gold example (invented numbers): Friday 25 Sep close 3,000 and Friday 2 Oct close 3,040 means UP. The size of the move doesn't matter, only the direction. An identical close counts as no result. GCZ26.CMX means gold futures (GC), December (Z), 2026, on COMEX. Always use this exact contract for both Fridays, because a different contract month has a different price.
Your Entry: predictions/vW4.json
One file, one prediction per team, on main in your team repo.
{
"sprint": "vW4",
"team": "team-N",
"team_call": { "spx_close": 0.00, "ndx_close": 0.00, "gold_direction": "UP" },
"why": {
"spx": "One sentence: what you relied on for this call.",
"ndx": "One sentence.",
"gold": "One sentence."
},
"leads": { "spx": "github-username (R2)", "ndx": "github-username (R3)", "gold": "github-username (R4)" },
"r1_confirms": true
}
team_callis your final call. R1 files it after R5's Human Score.whyis one sentence per call, written by that market's owner.gold_directionmust read exactly"UP"or"DOWN".- R1 (Scrum Master) makes sure every sentence is in the file, then sets
r1_confirmsto true. - Anything missing or unreadable is no entry.
What counts as your entry
main at Wednesday 23:59 Singapore time, judged by when GitHub received your push (not the date on your commit). After that, the prediction is fixed.
Defend It on Monday
| Weak | Good (invented examples) |
|---|---|
| "I think the market will go up." | "Support near 4,960 held twice last week and Friday's jobs report is the main risk, so I expect a modest rise." |
| "Gold will fall." | "Rate-cut expectations were pushed out after the inflation data, which usually weighs on gold, and it has failed twice at its recent high, so I say DOWN." |
A good sentence names something specific we can ask about: a level, a dated event, a pattern and where it came from. Keep the files behind it committed before the deadline (your R2 and R3 outputs, the LLM log, the Human Score) so you can open them on the day.
The Backlog — All Six Roles, In Concert
File predictions/vW4.json and name the three owners. Chase the three owners for their sentences, and check none is missing. Commit checkin/wednesday.md by Wednesday 12:00 — use the check-in template: contact each role member individually and write down what they actually did and what’s blocking them, in their own terms, not a one-word label and not a copy of the group chat. Confirm every teammate has GitHub write access and FigJam edit access before the Wednesday deadline. Keep data/roles.json: the student name and GitHub username in each role R1–R6, for every sprint so far, with a new entry at the start of each sprint because roles rotate. Also update data/figjam_status.json every day: the cards in each FigJam column and, for every Done card, its Discord message link. With R4, write the prescription.
Almanac and macro outputs covering all three markets, committed before the LLMs are queried. You own the S&P 500 call and its sentence.
Technical outputs covering all three markets, committed before the LLMs are queried. You own the Nasdaq-100 call and its sentence. With R6, create instruments.json: one file listing every ticker and its Yahoo source, so no script hard-codes a ticker.
instruments.json committed.You own the gold call and its sentence. Record the Friday closes, with the source URL, in actuals/vW4.json. Then work out the delta (explained above) for your Sprint 3 S&P 500 prediction with a small script, and save it as delta/vW4.json with a short narrative. With R1, write the prescription, one specific change for next sprint, in prescriptions/vW4.json.
Human Score on each of the three markets in human-score/vW4.json: confirm, adjust or override the owner's number, with the reason written down. Then build your team dashboard at ui/index.html (see below) and keep it live all week: the Roles, GitHub and FigJam panels by Tuesday night, the Predictions panel with the prediction on Wednesday, the rest by Saturday.
Query ChatGPT, Gemini and DeepSeek with identical prompts on all three markets. Build Stage 3, LLM Synthesis (llm-synthesis/vW4.json): where the models agreed and diverged, per market, before the Human Score, plus a narrative. Commit all evidence, keep the folder clean, create the vW4 release tag, and verify the link. Write a small script that reads your repo's commits for the current sprint and writes data/github_activity.json, keeping the entries for earlier sprints. Run it and commit the result every day.
Your Dashboard: Your Live Weekly Tracker
Style it however you like. The structure is the same for every team, so anyone can find what they're looking for.
- It lives at
ui/index.htmlin your team repo. - It has these eight panels, in this order, each tagged with the attribute shown.
- Each panel reads its committed file directly. No hand-typed numbers.
- Every panel shows Last updated, taken from the file's
updated_atfield, so nobody has to guess how fresh it is. - A panel whose data doesn't exist yet shows "Not yet available", not an error.
| Panel | Attribute | Reads | Live by |
|---|---|---|---|
| Roles: for every sprint so far, the student name in each role R1–R6, with the current sprint highlighted | data-panel="roles" | data/roles.json | Tue 29 Sep 23:59, then a new entry each sprint |
| GitHub Activity: for each sprint, commits per role and per student, last commit time, the ten latest commits | data-panel="github" | data/github_activity.json | Tue 29 Sep 23:59, then refreshed daily |
| FigJam Activity: the cards in To Do, In Progress, Review and Done, with a Discord link on every Done card | data-panel="figjam" | data/figjam_status.json | Tue 29 Sep 23:59, then updated daily |
| Predictions: the three calls, each owner, each one-sentence reason | data-panel="predictions" | predictions/vW4.json | Wed 30 Sep 23:59 |
| LLM Synthesis | data-panel="llm-synthesis" | llm-synthesis/vW4.json | Sat 3 Oct 23:59 |
| Human Score | data-panel="human-score" | human-score/vW4.json | Sat 3 Oct 23:59 |
| Delta: predicted vs actual, how far off, right or wrong direction, which agent pulled you off | data-panel="delta" | delta/vW4.json | Sat 3 Oct 23:59 |
| Prescription: the one change for next sprint | data-panel="prescription" | prescriptions/vW4.json | Sat 3 Oct 23:59 |
What the Roles, GitHub and FigJam panels should show (invented data)
Roles, one row per sprint, so the rotation is visible:
| Sprint | R1 | R2 | R3 | R4 | R5 | R6 |
|---|---|---|---|---|---|---|
| vW3 | Alex Tan | Ben Lee | Chen Wei | Dana Ng | Eli Koh | Fay Lim |
| vW4 (this sprint) | Fay Lim | Alex Tan | Ben Lee | Chen Wei | Dana Ng | Eli Koh |
GitHub Activity, last updated Tue 29 Sep 21:40:
| Role | Who | Commits since Mon | Last commit |
|---|---|---|---|
| R1 | student-a | 4 | Tue 20:12 |
| R2 | student-b | 3 | Tue 18:30 |
| R3 | student-c | 5 | Tue 21:05 |
| R4 | student-d | 0 | none yet |
| R5 | student-e | 6 | Tue 21:40 |
| R6 | student-f | 2 | Mon 22:15 |
Plus the ten latest commits (role, author, message, time).
FigJam Activity, last updated Tue 29 Sep 21:30:
| To Do | In Progress | Review | Done |
|---|---|---|---|
| Write gold sentence (R4) Build delta script (R4) Release tag vW4 (R6) | Technical outputs (R3) Dashboard panels (R5) | Almanac and macro notes (R2) | Wednesday check-in (R1) + Discord link Access confirmed (R1) + Discord link |
Notice that R4 has no commits yet in the first table. That is exactly what this panel is for.
Tuesday's first version: you can fill in data/github_activity.json and data/figjam_status.json by hand to get the panels live. After that they must be refreshed every day.
Keeping it fresh
- GitHub: R6's script reads your commits for the current sprint and writes
data/github_activity.json. Run it and commit the result every day. Keep the entries for earlier sprints. - FigJam: R1 updates
data/figjam_status.jsonevery day from the board. It takes a few minutes. - Roles: roles rotate every sprint, so at the start of each sprint R1 adds a new entry to
data/roles.jsonwith each student's name and GitHub username per role. Fill in every earlier sprint too, so the history starts complete. This is how we see who did what work, sprint by sprint.
What goes in each file
| File | Required fields |
|---|---|
data/roles.json | for every sprint so far (vW1, vW2, vW3, vW4…): the sprint's start date and, for each of R1–R6, the student's name and GitHub username |
data/github_activity.json | updated_at; for each sprint, per role: the student's name, commits and last commit time; the ten latest commits (role, author, message, time) |
data/figjam_status.json | updated_at, board_url; the four columns, each a list of cards (title, owner role); every Done card also has its discord_link |
llm-synthesis/vW4.json | per market: each model's view, whether they agree (yes/no), the divergence note; plus narrative |
human-score/vW4.json | per market: score, decision (confirm / adjust / override), justification |
delta/vW4.json | market, predicted, actual, error, error_pct, direction_correct, the agent that pulled you furthest off; plus narrative |
prescriptions/vW4.json | the agent, the change (lean more or less on it, or add a check), the reason |
Then: Write It Up and Present
Everything You Hand In
| What | Owner | Due |
|---|---|---|
predictions/vW4.json: the team's call on all three markets, one sentence per call, R1 confirmation | R1 (owners write the sentences) | Wed 30 Sep 23:59 |
R2 and R3 outputs, llm-synthesis/vW4.json, human-score/vW4.json, all committed before the deadline | R2, R3, R6, R5 | Wed 30 Sep 23:59 |
Roles, GitHub Activity and FigJam Activity panels live in ui/index.html, then refreshed every day | R5 (panels), R1 (roles and FigJam files), R6 (GitHub file) | Tue 29 Sep 23:59, then daily |
Predictions panel live in ui/index.html | R5 | Wed 30 Sep 23:59 |
checkin/wednesday.md: individual per-role status | R1 | Wed 30 Sep 12:00 |
actuals/vW4.json, delta/vW4.json and its script | R4 | Sat 3 Oct 23:59 |
prescriptions/vW4.json | R4 + R1 | Sat 3 Oct 23:59 |
| Dashboard with all eight panels, current | R5 | Sat 3 Oct 23:59 |
instruments.json | R6 + R3 | Sat 3 Oct 23:59 |
Release tag vW4, link verified | R6 | Sat 3 Oct 23:59 |
| Working commits from every role R1–R6, at least 5 each | All six | Sat 3 Oct 23:59 |
| Every FigJam card in Done links a Discord message | R1 | Sat 3 Oct 23:59 |
Monday 5 Oct — Start With Your Progress
- UI (R5, 2 minutes): open
ui/index.htmland walk through the eight panels in order. Say what changed since last week. - FigJam (R1, 1 minute): open the board and show the cards in Done, each with its linked Discord message.
- GitHub (R6, 1 minute): open the repo and show this week's commits across roles, the release tag and the evidence folder.
Then your presentation, and the oral defense of your prediction.
Timeline
| When (Singapore time) | What |
|---|---|
| Mon 28 Sep | Sprint 4 starts |
| Tue 29 Sep 23:59 | Dashboard live with Roles, GitHub and FigJam panels, updated with real data |
| Wed 30 Sep 12:00 | Individual per-role check-in committed (R1) |
| Wed 30 Sep 23:59 | Prediction locked: file, sentences, R1 confirmation and the Predictions panel |
| Fri 2 Oct | The target Friday. The US close lands early Saturday morning Singapore time |
| Sat 3 Oct 23:59 | Everything else due (Saturday, not Sunday) |
| Sun 4 Oct | Nothing is due. Your work is reviewed ahead of Monday |
| Mon 5 Oct | Live progress block, presentation, oral defense |