Step 283. ★ CTF #3: Team Debut + Goal Setting — Only Measurable Goals Grow a Team
Level 3 — Real-World CTF & Advanced Offensive Skills | Difficulty ★★★☆☆ | Estimated time: 1 weekend (1-hour pre-meeting + competition 24–48 hours + 1-hour scoring retrospective)
Prerequisites: the Steps 279–283 cycle — two sets of logs, solo (
ctf_log.csv) and team (team_log.csv), Step 281’s team retrospective improvement rules, Step 282’s write-up routine.
- What you need: the log CSVs of the last two competitions, the team retrospective’s improvement rule sentences, next weekend’s competition, and today’s goal calculation script.
- ⚠️ All exercises in this chapter are for your own lab and legal platforms only. Applying them to unauthorized systems is a crime. CTF competitions registered on CTFtime are legal platforms the organizers opened for you to join — never attack anything beyond the challenge servers the competition provides.
- Caution: competition platform screens are screen examples. The goal calculation script’s output is locally measured — feed it your logs and it reproduces exactly.
From the third competition, the rules of the game change. The first competition’s goal was finishing; the second was experiencing collaboration. Now two competitions’ data has accumulated, so the third is a competition where you set goals and score them. The difference between a team with goals and one without shows not in that competition’s result, but in what conversation happens after it ends.
1. Learning Objectives
By the end of this chapter, you will be able to:
- Distinguish ranking goals from behavior goals, and design competition goals out of behavior goals only
- Calculate solve counts, coverage, and average solve time from past competition logs as grounds for goals
- Agree on 3 quantitative goals at the pre-meeting and display their progress on the board
- Operate the competition’s last 2 hours as a focus on "the closest problem"
- Score goal attainment after the end and connect shortfalls to rule improvements
2. Background Knowledge — Today’s Tools and Concepts
Today’s Tools at a Glance
| Category | Details |
|---|---|
| Language/environment | 2 sets of competition log CSVs, shared board, Python (goal calculation script) |
| Today’s tools | goal_calc.py (log comparison → behavior goal draft), the goal scoring table |
| Concepts needed | Behavior goals vs outcome goals, previous +α, field coverage, last-2-hours operation, scoring retrospective |
| Today’s deliverable | An agreement document of 3 behavior goals + post-competition scoring results |
2-1. Good Goals Are Behavior, Not Rankings
"Let’s place in the top 50 this competition" is a bad goal. Rankings are a function of variables we can’t control (other teams’ skill, the fit between the problem set and our fields), so whether achieved or missed, you can’t tell why it happened or what to fix.
Good goals are sentences of behavior — things we can control, scored true/false when it’s over.
| Bad goals (outcome, uncontrollable) | Good goals (behavior, controllable) |
|---|---|
| Place in the top 50 | +2 problems solved vs last time |
| Double the score | Solve every problem attempted in our main field |
| Look like a strong team | Write write-ups for every solved problem |
| Solve a lot | 100% compliance with the 1-hour board updates |
The right column’s common trait: all are written before the competition as "what we will do," and scored after it from logs alone. Rankings are a byproduct that follows after these behaviors accumulate.
2-2. The Size of Goals — Previous +α
Too-big goals collapse. "We solved 3 last time, so 10 this time" is not motivation but a reservation for frustration. The right size for a behavior goal is previous +α — a gradual goal that raises only what’s raisable.
The grounds are in the data. What your two competition logs say:
Competition #1 (solo): 6 started / 3 solved / 250 pts — the limits of 1-person coverage
Competition #2 (team): 8 started / 7 solved / 1300 pts — division effect, but 1 duplicate attempt
The team competition’s 7 solves has a one-time jump from introducing division mixed in. So the third competition’s solve-count goal is honestly around "7 plus 2." Gradual goals aren’t conservative — they’re a device that keeps the achieve→reinforce loop turning: a team that achieves its goals raises the next ones itself; a team that collapses gives up on goals altogether.
2-3. Three Kinds of Goals — Score, Coverage, Habit
Build the third competition’s goal board in three layers and it balances.
- Score goals — solve count or total points (e.g., +2 problems vs last time)
- Coverage goals — breadth of fields ("solve 1 problem in Rev, which scored 0 last time," "attempt 1 problem in Misc, which went unattempted")
- Habit goals — compliance with operating rules ("100% 1-hour board updates," "write-ups for all solves," "mandatory swap requests")
A goal board missing habit goals protects nothing when the competition’s operation wobbles. Conversely, habit goals can be scored regardless of points, guaranteeing the team a takeaway even on days the competition was brutal. Step 281’s retrospective improvement rules are candidates here as-is.
2-4. The Last 2 Hours — How a Competition Ends Is Also Strategy
The last 2 hours of a 48-hour competition are a special time zone. Opening a new problem is almost always a loss (you finish just setting up the environment), and blindly digging a stuck problem is also a loss (the odds a wall unbreached for two days breaks in 2 hours).
The answer is concentrating fire on "the closest problem." The criterion for closeness is in the log — a problem whose stuck memo says "there is a concrete next candidate." With even two or three candidates, 2 hours is ample time. Conversely, a problem in the state "no idea what’s wrong" is not a target for the last 2 hours — it’s a target for Step 284’s debrief.
2-5. The Scoring Retrospective — Only With Goals Do Shortfalls Become Information
The retrospective of a goal-less competition ends with "too bad." The retrospective of a competition with goals attaches cause analysis to every missed item — because a shortfall is not failure but a measurement. Like "coverage goal missed: never even attempted a Rev problem → the Rev owner was a gap at kickoff → pre-study 5 easy Rev problems before the next competition," the end of every shortfall’s chain is always a next action.
3. Follow Along
3-1. Calculating Goals from Past Competition Data (Measured)
First, pull the numbers. goal_calc.py reads several competitions’ log CSVs side by side and builds a comparison table and a behavior-goal draft.
# goal_calc.py — read past competition logs and draft 'behavior goals' for the next competition
# usage: python goal_calc.py comp1_log.csv comp2_log.csv ...
import csv, sys
from datetime import datetime
FMT = "%m-%d %H:%M"
FIELDS_ALL = ["Web", "Pwn", "Rev", "Crypto", "Forensics", "Misc"]
def analyze(path):
rows = list(csv.DictReader(open(path, newline="", encoding="utf-8")))
started, solved, elapsed = {}, {}, {}
for r in sorted(rows, key=lambda x: x["time"]):
p, t = r["problem"], datetime.strptime(r["time"], FMT)
if r["event"] == "start":
started[p] = (r["field"], t, int(r["points"] or 0))
elif r["event"] == "solve":
solved[p] = True
if p in started:
elapsed[p] = int((t - started[p][1]).total_seconds() // 60)
fields_tried = {started[p][0] for p in started}
fields_solved = {started[p][0] for p in solved if p in started}
pts = sum(started[p][2] for p in solved if p in started)
avg = sum(elapsed.values()) // len(elapsed) if elapsed else 0
return {"started": len(started), "solved": len(solved), "points": pts,
"fields_tried": fields_tried, "fields_solved": fields_solved, "avg_min": avg}
(the rest — comparison-table printing and goal-draft output — is best seen with the run result below)
Measured output from feeding it the solo competition log (ctf_log.csv) and the combined team log (team_log.csv, Step 281’s deliverable).
$ python goal_calc.py ctf_log.csv team_log.csv
ctf_log.csv team_log.csv
problems started 6 8
problems solved 3 7
total points 250 1300
avg solve time (min) 28 145
field coverage 3/4 4/5
=== Behavior goal draft for the next competition ===
① solves: previous 7 → target 9+ (previous +2)
② coverage: Rev, attempted but unsolved → solve 1+ this time
Misc, unattempted → attempt at least 1 easy problem to widen coverage
③ write-ups: one for every problem solved this time (target: 9)
How to read it: ① notice the jump "avg solve time 28 min → 145 min" in the comparison — it means the team competition took on harder problems, a positive signal. ② coverage 4/5 — the never-attempted field (Misc) and the attempted-but-zero field (Rev) show up distinguished. The two take different prescriptions: unattempted is an assignment problem, unsolved is a skill problem. ③ the draft is not to be adopted as-is — it’s the pre-meeting’s agenda.
3-2. The Pre-Meeting — Agreeing on 3 Goals (Screen Example)
Take the script’s draft into the pre-meeting (the day before the competition, 1 hour). Don’t adopt the draft wholesale — adjust it to the team’s situation.
[Pre-meeting agreement document — example]
Competition: Weekend CTF 3 (Jeopardy, Sat 21:00 – Mon 21:00)
■ 3 behavior goals (scored after the end)
1. 9+ solves (previous 7, +2)
— grounds: team_log.csv solved 7; +2 realistic once swap rule settles
2. Solve 1+ Rev problem + attempt 1+ Misc problem
— grounds: previous coverage 4/5, Rev 0 pts / Misc unattempted
3. 100% 1-hour board updates + record-before-start (record first, problem later)
— grounds: last time's file-upload-rce duplicate attempt, 40-min loss
■ Role check (reflecting last retrospective's improvements)
- Mandatory swap requests: declare unconditionally past 2 hours (last time's packed-binary incident)
- Close the Rev owner gap: bob pre-studies 3 easy Rev problems during the week
Notice each goal carries a "— grounds:" line. A goal without grounds is a declaration; a goal with grounds is a plan. And every one is a sentence scorable from logs after the competition.
3-3. During the Competition — Loading Goals onto the Board
Goals that live only in the meeting document disappear. Add a goal-status row at the top of the board so attainment shows with every 1-hour update (screen example):
[Board top — goal status row]
Goal 1, 9 solves: currently 5 (as of Sat 24:00) → need +2 by Sunday morning
Goal 2, Rev solve: packed-2 in progress (bob, 40 min in)
Goal 3, 100% updates: last update 23:00 ✅ (0 misses)
This display’s effect is real-time decision-making. If goal 1 is in danger Sunday afternoon, stop opening new problems and switch to "the closest problem"; if goal 2 is in danger, postpone the Misc attempt and attach someone to Rev — goals must be visible for switches to happen.
3-4. Operating the Last 2 Hours
Two hours before the end, the captain looks at the board and declares (screen example):
[2 hours before the end — captain's declaration example]
Currently 8 solved. 1 to goal.
Closest-problem candidates:
① Web - cache-poison (alice) — last stuck memo: "have a cache-key bypass idea"
② Crypto - lcg-basic (minho) — 2 candidate attacks left
Decision: everyone concentrates on ①②. No new attempts. The Misc attempt goal is already met, so no overreach.
No new attempts is the only absolute rule of this time zone. And whatever the outcome — whether ① solves or not — this declaration itself is the practice of goal-based operation.
3-5. After the End — Scoring and Cause Analysis
The post-competition meeting opens with the scoring table.
[Goal scoring — example]
1. 9 solves → result 8 ❌ missed
cause: Sunday morning's 3 hours burned "retrying stuck problems" — stagnation with no new attempts
improvement: add a rule to move to "easy problems in untouched fields" at the 2-hour stagnation mark
2. Solve 1 Rev problem → packed-2 solved ✅ achieved
cause analysis (positive): bob's weekday pre-study was decisive — promote pre-study to mandatory pre-competition
3. 100% updates → 1 miss (Sat dawn) ❌ missed
cause: everyone deep in focus ignored the alert → introduce a bot-rung update alarm, not a captain-rung one
Two misses, one achievement — this is not failure. To adjust the reason the original assignment’s completion criterion was "achieve 2 of 3 goals": in a first run of goal-based operation, achieving everything means the goals were too low, and missing everything means they were too high. Achieving 1–2 of 3 is evidence the goal size was right, and the missed items’ cause analysis becomes the next competition’s rules.
4. Missions & Exercises
Mission — Goal-Based Competition Operation
- Feed the last two competition logs to
goal_calc.pyand produce the comparison table and goal draft. - Agree on 3 behavior goals at the pre-meeting — attach a "— grounds:" line to each, and check whether the last retrospective’s improvements are reflected.
- Keep a goal-status row on the board during the competition, and declare the "closest problem" focus 2 hours before the end.
- Write the scoring table after the end, completing the cause → improvement-rule chain for every missed item.
- Aim to achieve at least 2 of 3 goals — if cause analysis is complete even with misses, this mission is a success.
Exercises
Exercise 1. Explain why "place in the top 50" is a bad goal, from the perspectives of controllability and scorability.
Exercise 2. How should you interpret the increase "avg solve time 28 min → 145 min" in 3-1’s measured comparison table? Why is it not a bad signal?
Exercise 3. In coverage goals, explain why "unattempted fields" and "attempted-but-zero fields" take different prescriptions.
Exercise 4. Explain, in expected-value terms, why "no new attempts" is the absolute rule of the last 2 hours.
5. Model Answers & Completion Criteria
Mission Model Answer
How to verify: ① are all 3 goals in the pre-meeting document behavior sentences, with "— grounds:" pointing at log numbers? ② are uncontrollable goals like rankings or points absent? ③ does the board show goal status updated across time slots? ④ is there a record of the declaration 2 hours before the end (or an equivalent focus decision)? ⑤ does every missed item in the scoring table pair a cause with an improvement rule — writing only misses with no improvements makes it a scoreboard, not a debrief.
Exercise Answers
Answer 1. Rankings are a function of uncontrollable variables — other teams’ skill and the problem set’s composition — so you can miss despite optimal operation and achieve despite sloppy operation. Scoring yields no "what to fix." Behavior goals are controllable and scored true/false from logs, so a miss produces a next action through cause analysis.
Answer 2. The solo competition attempted mostly easy, solvable problems (avg 28 min); the team competition, thanks to division, challenged harder 200–300-point problems (avg 145 min). The rise in solve time is not slowing down but a raised level of challenge. The total confirms the reading — 250 points to 1300. If time rose while points stayed flat, that would be a bad signal.
Answer 3. Unattempted is an assignment problem — a gap in ownership at kickoff, or problems never even read — so the prescription is operational improvement (explicit assignment, attempt allocation). Attempted-but-zero is a skill problem — attempted but stopped at a wall — so the prescription is learning (block A debrief, weekday pre-study). Same zero, different cause systems — which is why the script shows the two distinguished.
Answer 4. A new problem carries fixed costs of environment setup and comprehension (typically 30+ minutes), and the odds of breaking through within the remaining 90 minutes are unpredictable for a problem with two days of no data. A "closest problem," by contrast, has concrete remaining candidates, giving the highest expected success probability for 2 hours. Between an option with known expected value and an unknowable one, the former is the answer when remaining time is short.
Completion Criteria Checklist
- [ ] I can explain the difference between behavior goals and outcome goals with examples
- [ ] I produced the comparison table and goal draft from the last two competition logs
- [ ] I left 3 behavior goals with grounds in an agreement document
- [ ] I loaded goal status onto the board and kept it with the 1-hour updates
- [ ] I executed the "closest problem" focus 2 hours before the end
- [ ] I completed cause → improvement rule for every missed item in the scoring table
- [ ] I can explain why "achieve 2 of 3" is the target (right sizing)
6. Common Pitfalls & Fixes
Wall 1. The goals were too big and the whole team gave up mid-competition
Symptom: once goal attainment became mathematically near-impossible by Saturday night, board updates stopped.
Cause: goals were set by mood, without previous data — something like "15 this time."
Fix: set goals only as +α from goal_calc.py‘s previous-competition numbers. And after setting a goal, define one more mid-checkpoint — "N by Saturday midnight means on track" — and you get an early switch instead of resignation.
Wall 2. We set goals but nobody looks at them during the competition
Cause: the goals were in the meeting document but not on the board the team stares at all day.
Fix: keep goals resident in the board’s top row (3-3). Goals in a document are forgotten within 3 hours of the start. Only goals in sight intervene in operation.
Wall 3. The goal calculation script throws an error
Symptom (measured — running with no log file arguments):
$ python goal_calc.py
Traceback (most recent call last):
File ".../goal_calc.py", line 48, in <module>
last, prev = stats[-1], ...
IndexError: list index out of range
Cause: no log CSVs passed as arguments. The script needs at least 1 log (2 for a meaningful comparison).
Fix: pass the log files as arguments, like python goal_calc.py ctf_log.csv team_log.csv. If you’ve only run one competition so far, one file still gives a summary — comparisons accumulate from the next competition on.
Wall 4. Miss cause analysis ends with "let’s do better next time"
Cause: you looked for the cause in people (willpower). A willpower cause’s prescription is always "do better," and that sentence vanishes by the next competition.
Fix: look for the cause in procedure — not "we missed the dawn update (willpower)" but "we didn’t have a bot, rather than a person, ring the update alarm (procedure)." A procedure cause’s prescription becomes a rule sentence, and a rule sentence becomes the next kickoff’s agenda.
Wall 5. We hit the goals but I don’t feel growth
Cause: the goals may all have been score goals. Points can be the result of re-doing what you already knew from the last competition.
Fix: check the goal board’s three layers (2-3) — were there coverage goals and habit goals? Habit goals in particular (board, swaps, write-ups) are indicators showing the team is getting stronger even during periods of flat scores. A competition with all three layers feels different in growth.
7. Summary
Today’s Concepts
| Concept | One-line explanation |
|---|---|
| Behavior goal | A controllable goal scorable from logs — the alternative to ranking goals |
| Previous +α | The right goal size — gradualness that keeps the achieve→reinforce loop turning |
| Three layers of goals | Score goals + coverage goals + habit goals |
| Unattempted vs unsolved | The former is an assignment problem (operation), the latter a skill problem (learning) — different prescriptions |
| The last 2 hours | No new attempts + all-in focus on "the closest problem" |
| Scoring retrospective | A miss = not failure but a measurement — completed as a cause→rule chain |
| 2 of 3 | The right attainment rate for a first goal run — achieving all means the goals were too low |
Today’s Commands & Tools
| Command/tool | What it does |
|---|---|
python goal_calc.py log1.csv log2.csv |
Cross-competition comparison table + behavior goal draft |
| Pre-meeting agreement document | Fix 3 behavior goals with grounds |
| Board goal-status row | Real-time visibility of goals — grounds for switch decisions |
| Goal scoring table | Post-competition attainment scoring + miss causes → improvement rules |
The Core Instinct
Look back over the competition cycle’s three chapters — the first competition measured (Step 279), the debriefs dismantled walls (Steps 280, 282), and the third competition set goals and scored them (today). Your team now has a loop where data circulates: competition → log → debrief → goals → competition. As long as this loop turns, your growth is no longer luck but a system.
The loop’s next turn is a team-level weakness diagnosis — visualizing three competitions’ data by field to draw "our team’s map." The data is already inside the logs.
Once every box is checked, Step 283 is complete. Click the checkbox in the sidebar to save your progress.