Step 340. A Memoir of the Entire Competition Journey — Assetization: Turning Experience into Story
Level 4 — Professional | Difficulty ★★★☆☆ | Estimated time: 2 days (half a day gathering material + half a day for the timeline + 1 day writing)
Prerequisites: the entire competition record from Steps 279–339 — each competition’s logs, review tables, gap analyses, Write-up links, and the versions of the team charter.
- What you need: all your competition records to date (ranks, points, solved problems, review documents), Python 3, and a blog account. The journey-analysis script is a measured tool you run on your own records; the memoir-body examples are screen examples.
- Caution: when publishing teammates’ names or records in the memoir, consent and anonymization come first. If you made private agreements with competition organizers (problem details, etc.), honor their scope.
- ⚠️ All exercises in this chapter are for your own lab and legal platforms only. Applying them to unauthorized systems is a crime.
Unfold the journey from CTF #1 to now. The team that cheered over two solves at its first competition has passed through the domestic finals and international competitions to arrive here. Left as-is, this record is a scattered bundle of files — but woven into a single document, it becomes three things: a guide for those who come after, the most powerful content in a portfolio, and a record your future self will read.
What you make today is a competition-journey memoir. Not a list of ranks, but the story of "how a team grew." The misery of the first competition, the competition that became a turning point, the evolution of team operations, what was learned at each competition — you complete these materials into a single piece of writing.
1. Learning Objectives
By the end of this chapter, you will be able to:
- Collect scattered competition records in one place while keeping the "no record" rule
- Build a per-competition timeline of "rank / what we learned / how the team changed"
- Extract turning-point candidates with the analysis script and write each as a story
- Summarize the journey in numbers — total entries, total solves, percentile trajectory
- Publish the memoir on a blog after passing the teammate-consent procedure
2. Background Knowledge — Today’s Tools and Concepts
Today’s Tools at a Glance
| Category | Details |
|---|---|
| Language/environment | Python 3 (timeline analysis), Markdown, a blog platform |
| Today’s command | python step340_journey.py — journey timeline, statistics, turning-point candidates, TOC draft |
| Concepts needed | Assetization, timelines, turning points, the "no record" rule, the consent procedure for publication |
| Today’s deliverable | One competition-journey memoir (5-chapter structure) + a published blog version |
2-1. Assetization — Experience Becomes an Asset When It Becomes a Document
Twenty competitions’ worth of experience is not an asset in itself — memory fades, and scattered logs can’t be searched. The point where experience becomes an asset is the moment it converts into a document.
Keep the three things assetization makes distinct. ① A guide for juniors — "the growth story a beginner team can most realistically read" is exactly the document you’ve searched for in vain until now. What you didn’t have, you now make. ② A portfolio — one memoir containing the growth trajectory and its analysis is far stronger to a hiring manager than a resume line reading "participated in many competitions." ③ A record for your future self — a year from now, you will have forgotten the grounds for today’s judgments. Only a document can speak to the you of that time.
2-2. The Timeline Comes First — Once the Table Is Done, the Writing Is Just Unfolding It
The advice for when you’re stuck is fixed — when you can’t tell where to start writing, complete the timeline first. Once the table is complete, the writing is nothing more than unfolding that table into prose.
The timeline has three columns — rank / what we learned / how the team changed. Fill in only ranks and it becomes a report card; fill in only lessons and it becomes a diary. Only the three columns together make "a story of growth." And Step 297’s rule applies here too — don’t fill from memory; mark rounds without logs explicitly as "no record." The distribution of "no record" cells is itself data showing the periods when the team’s record-keeping routine broke down.
2-3. Turning Points — Pick the Decisive Moments That Made the Growth
The memoir’s heart is three turning-point stories. Don’t try to write everything — pick the three decisive moments that made the growth, and write each in depth.
There are four turning-point candidate types. ① The first meaningful rank — the competition that confirmed "we can do this too." ② An operations reform — the competition where team rules changed and results followed. ③ A shock — a competition that updated your standards, like the zero-solve stretch at an international competition. ④ A harvest — the competition where long training was cashed into points. The script in 3-1 automatically flags rounds with large percentile leaps as candidates — but numbers only supply candidates; the final selection is made by cross-checking your memory against the records.
2-4. The Publication Procedure — Consent and Anonymization
The memoir is complete only when it’s published on a blog. But two procedures come before publication.
First, teammate consent. The team’s failure scenes and internal rules are assets of the entire team, so quoting real names, nicknames, and internal conversations goes through each person’s confirmation. Second, anonymization. Competition-platform internals, non-public details of vulnerabilities you reported, and real infrastructure information get blurred or removed. "The structure of growth concretely, sensitive information abstractly" is the published version’s principle.
3. Follow Along
3-1. Gathering Material and the Journey-Analysis Script
Gather the material in one folder — competition logs, review documents, Write-up links, team-charter versions. Then save step340_journey.py and replace RECORDS with your actual records.
# step340_journey.py — entire competition-journey memoir generator
# Replace RECORDS with your actual records
# (round/competition name, total teams, our rank, solves, note)
RECORDS = [
("CTF #1 weekend", 380, 291, 2, "first competition — finishing was the goal, solved almost nothing"),
("CTF #5 regular", 402, 165, 5, "first Hard attempt — felt the power of division of labor"),
("CTF #10 anniversary", 428, 120, 8, "top 30% entry — the heap boot camp pays off"),
("Domestic qualifier", 612, 45, 9, "finals berth — the team-operations reform validated"),
("Domestic finals", 24, 7, 5, "offline finals — felt the top-tier wall"),
("International CTF", 1900, 640, 1, "the world's ceiling — surviving the zero-solve stretch"),
("Top-level rematch", 150, 4, 6, "the target competition — a prepared team's execution"),
]
print("=== Competition Journey Timeline ===n")
total_solves = 0
turning = []
for i, (name, total, rank, solves, note) in enumerate(RECORDS, 1):
pct = rank / total * 100
total_solves += solves
arrow = ""
if i > 1:
prev_pct = RECORDS[i-2][2] / RECORDS[i-2][1] * 100
if prev_pct - pct >= 10:
arrow = " <- turning-point candidate (percentile leap of 10%p or more)"
turning.append(name)
print(f"{i:>2}. {name:<14} {total:>5} teams, rank {rank:>4} (top {pct:4.1f}%) solves {solves}{arrow}")
print(f" lesson: {note}")
print(f"n=== The Journey in Numbers ===")
print(f"total entries {len(RECORDS)} / total solves {total_solves}")
first_pct = RECORDS[0][2] / RECORDS[0][1] * 100
last_pct = RECORDS[-1][2] / RECORDS[-1][1] * 100
print(f"percentile change: top {first_pct:.1f}% -> top {last_pct:.1f}%")
print(f"turning-point candidates: {len(turning)} ({', '.join(turning) if turning else 'none — select manually'})")
print("n=== Memoir TOC Draft ===")
print("1. The journey in numbers — the table above + a percentile-trajectory graph")
print("2. Turning-point stories — 3 candidate competitions, each as one story")
print("3. The evolution of team operations — changes across charter versions")
print("4. To those who follow — the trial and error a starting team can avoid")
print("5. The next journey — declaring the move to a new growth axis")
Here’s the measured output from running it with this chapter’s example data:
=== Competition Journey Timeline ===
1. CTF #1 weekend 380 teams, rank 291 (top 76.6%) solves 2
lesson: first competition — finishing was the goal, solved almost nothing
2. CTF #5 regular 402 teams, rank 165 (top 41.0%) solves 5 <- turning-point candidate (percentile leap of 10%p or more)
lesson: first Hard attempt — felt the power of division of labor
3. CTF #10 anniversary 428 teams, rank 120 (top 28.0%) solves 8 <- turning-point candidate (percentile leap of 10%p or more)
lesson: top 30% entry — the heap boot camp pays off
4. Domestic qualifier 612 teams, rank 45 (top 7.4%) solves 9 <- turning-point candidate (percentile leap of 10%p or more)
lesson: finals berth — the team-operations reform validated
5. Domestic finals 24 teams, rank 7 (top 29.2%) solves 5
lesson: offline finals — felt the top-tier wall
6. International CTF 1900 teams, rank 640 (top 33.7%) solves 1
lesson: the world's ceiling — surviving the zero-solve stretch
7. Top-level rematch 150 teams, rank 4 (top 2.7%) solves 6 <- turning-point candidate (percentile leap of 10%p or more)
lesson: the target competition — a prepared team's execution
=== The Journey in Numbers ===
total entries 7 / total solves 36
percentile change: top 76.6% -> top 2.7%
turning-point candidates: 4 (CTF #5 regular, CTF #10 anniversary, Domestic qualifier, Top-level rematch)
=== Memoir TOC Draft ===
1. The journey in numbers — the table above + a percentile-trajectory graph
2. Turning-point stories — 3 candidate competitions, each as one story
3. The evolution of team operations — changes across charter versions
4. To those who follow — the trial and error a starting team can avoid
5. The next journey — declaring the move to a new growth axis
How to read it: look at three things. ① The four turning-point candidates — all rounds where the percentile leapt 10%p or more over the previous competition. Pick three of them and write them as stories. ② Row 6’s implication — the international competition’s percentile worsened to 33.7%, but this is not regression; it’s a different pool (the participant pool centers on world-ranking teams). This is why you annotate each competition’s character when reading a timeline. ③ "No record" handling — when you substitute real records, don’t delete rounds lacking logs; leave them marked "no record" in the note.
3-2. Completing the Timeline Table
Transfer the script’s output into the memoir’s Chapter 1 material. What the script computes is only the numbers; the "how the team changed" column is filled by you from the charter’s version history.
One example row of the timeline table (screen example):
| Domestic qualifier | rank 45 of 612 teams (top 7.4%) | solves 9 |
| lesson: the power of compressed time management |
| team change: charter v3 — the first competition with the 30-minute stall swap rule |
How to fill the "team change" column — unfold the team charter’s Git history and connect which rule appeared right after which competition. If a rule’s introduction competition and a results leap are adjacent, that is the skeleton of a turning-point story as-is.
3-3. Writing the Turning-Point Stories — The Structure of Three Pieces
Pick three from the candidates and write each as one story. The recommended structure per piece is five paragraphs.
Paragraph structure of a turning-point story (screen example):
1. Us back then — the team's state and anxiety right before the competition
2. The decision — what we decided to change (rules, division of labor, training)
3. The competition — the scene where the change was tested
4. Result and interpretation — the numbers, and what the numbers don't say
5. What remained — the rules and habits this competition permanently left the team
The key is paragraph 3’s "scene." "We introduced the swap rule" is information; "06:30 — the moment the 30-minute-stall alarm rang and nobody objected as ‘[abandoning]’ appeared in the channel" is a story. What a junior reads and applies to their own team is not information but scenes — to restore the scenes, quote the competition log’s timestamps.
3-4. Summarizing in Numbers — A First Chapter Without Modifiers
The memoir’s first chapter holds only numbers, without modifiers — exactly the credibility principle of long-term review learned in Step 297.
Numbers summary (screen example — based on 3-1's measured output):
- Total entries: 7 (3 weekend CTFs, domestic qualifier & finals, international CTF, rematch)
- Total solves: 36
- Percentile trajectory: top 76.6% -> top 2.7%
- Field coverage: web only at the start -> now all fields: web/pwn/rev/crypto/forensics
Don’t forget the last item, coverage — per Step 297’s conclusion, the growth of field coverage, more than the growth of rank, is the substance of the weight-class rise. If you want to draw the percentile graph, reuse Step 297’s season_review.py as-is — just replace ROUNDS with this journey’s records.
3-5. Publishing on the Blog — The Consent and Anonymization Procedure
Once the draft is complete, walk the publication procedure.
Publication checklist (screen example):
[ ] Draft shared with all teammates — quoted remarks & records confirmed by their owners
[ ] Naming convention agreed (real names / initials / pseudonyms)
[ ] Competition non-public information reviewed — problem details, scope of promises to organizers
[ ] Sensitive information anonymized — infrastructure info, reported-vulnerability details
[ ] Teammate credits and thanks at the end
[ ] Link shared in the team channel after publication — as the next season's first document
One more meaning of publication to note — this memoir becomes "the most realistic growth story a beginner can read." Because it’s not a genius’s championship tale, but the story of a team that solved two problems at its first competition and came this far through rules and records. One more such story on the internet is an asset for the entire ecosystem.
4. Missions & Exercises
Mission — Completing and Publishing the Competition-Journey Memoir
- Gather all competition records in one folder and make a list that explicitly marks missing rounds as "no record."
- Replace
RECORDSinstep340_journey.pywith real records, run it, and complete the timeline table (three columns: rank / lesson / team change). - Pick three turning-point candidates and write them in 3-3’s five-paragraph structure.
- Complete the memoir in the 5-chapter structure (numbers → turning points → evolution of team operations → to those who follow → the next journey).
- After passing the publication checklist (3-5), publish on the blog and share in the team channel.
Exercises
Exercise 1. Explain the conditions for experience to become an "asset" from the documentation perspective, and describe each of the three assets a memoir creates (a guide for juniors, a portfolio, a record for your future self).
Exercise 2. Explain two reasons the "no record" rule (not filling from memory) is needed when building the timeline.
Exercise 3. In 3-1’s measured output, explain via the script’s verdict logic why the international competition (row 6) is not flagged as a turning-point candidate despite its percentile being worse than the previous competition — and explain how this round’s percentile drop should be narrated in the memoir.
Exercise 4. Explain the difference between "information" and "scene" in a turning-point story with examples, and why what reaches juniors is the scene.
5. Model Answers & Completion Criteria
Mission Model Answer
Check against these verification criteria.
- Completeness of collection: is every round in the list, and are missing rounds explicitly marked "no record" — is there no round quietly deleted from the list?
- The timeline’s three columns: are rank, lesson, and team change all filled, and is "team change" connected to the charter’s version history?
- Depth of the turning points: do all three pieces follow the five-paragraph structure, with competition-log quotes in paragraph 3?
- The first chapter’s numbers: does the memoir’s first chapter contain a modifier-free numbers summary?
- The publication procedure: are there traces of passing the teammate-consent and anonymization checklist?
Exercise Answers
Answer 1. Experience fades while it remains in memory, can’t be searched as scattered files, and can’t be conveyed to others. The moment it converts into a document, three things become possible — search, conveyance, and preservation across time. The three assets a memoir makes are these. A guide for juniors: as a map of the trial and error beginner teams will face, it provides "a realistic path" that a genius’s championship tale can’t. A portfolio: a resume’s "participated in many competitions" is a claim, but a memoir containing the growth trajectory and its analysis is evidence — and it demonstrates record-keeping, analysis, and writing ability themselves. A record for your future self: as time passes you forget the grounds for your judgments, and only a document can speak to the you of that time — at the next challenge’s starting line, this document becomes the reference point.
Answer 2. First, numbers filled from memory contaminate the analysis — memory easily gilds toward success, so a trend line drawn over it becomes not the real growth curve but memory’s curve. Second, the distribution of "no record" cells is itself data — the periods where records are missing are periods when the team’s record-keeping routine broke, and checking whether those periods overlap with results stagnation is one of the retrospective’s insights. Don’t hate the empty cells — mark them. In a retrospective, an empty cell is also information.
Answer 3. The script’s turning-point verdict asks "did the percentile improve (drop numerically) by 10%p or more over the previous round" — prev_pct - pct >= 10. The international competition’s percentile worsened from 29.2% to 33.7%, so prev_pct - pct is negative and it can’t be a candidate. However, this drop is not skill regression but a change of stage — the participant pool changed to center on world-ranking teams, so the percentile’s denominator is a different distribution. In the memoir, this round should be narrated not as a rank retreat but as "an update of standards" — feeling the world’s ceiling firsthand and surviving the zero-solve stretch is this competition’s harvest, and in substance it belongs to the biggest turning points (the shock type). Since it’s the representative case where the numbers’ verdict and the story’s verdict differ, it works well as an example of the principle that the script supplies candidates but the final selection is made by context.
Answer 4. Information is "we introduced the swap rule"; a scene is "06:30 — the moment the 30-minute-stall alarm rang and ‘[abandoning]’ appeared in the channel with no objections." Information states what was done; a scene shows how it actually worked. The reason scenes reach juniors — a reader can read information and still feel "that wouldn’t work on our team," but reading a scene lets them overlay it onto their own team’s meeting scene. What moves someone to the application stage is not accuracy but imaginability, and scenes are restored only by quoting timestamps and verbatim messages from competition logs. Which is why the first task of turning-point writing is not writing — it’s reading logs.
Completion Criteria Checklist
- [ ] I collected records for every round and marked the "no record" rounds explicitly
- [ ] I ran
step340_journey.pyon real records and extracted the timeline - [ ] I completed the timeline table with the three columns: rank / lesson / team change
- [ ] I wrote the three turning-point pieces in the five-paragraph structure
- [ ] I placed a modifier-free numbers summary (entries, solves, percentile, coverage) in the first chapter
- [ ] I passed the teammate-consent and anonymization checklist
- [ ] I published on the blog and shared in the team channel
6. Common Pitfalls & Fixes
Wall 1. I don’t know where to start writing — an hour in front of a blank page
Symptom: only a cursor blinking under the memoir’s title.
Cause: you started with writing — a memoir’s first task is not prose but the table.
Fix: complete the timeline first. Start by filling RECORDS in step340_journey.py — once the table is complete, the writing is nothing more than unfolding it. If you’re still stuck, split by paragraph unit — start from "one paragraph 3 (the scene) of one turning point." The blank page’s enemy is scale, not writing.
Wall 2. Not a single turning-point candidate comes up
Symptom: you ran the script and got "turning-point candidates: 0."
Cause (a frequent mistake): grabbing the wrong index for the previous round. This chapter’s script was like that in its first draft too — inside enumerate(RECORDS, 1), RECORDS[i-1] is itself (measured — before the fix, a run showed four leaps but zero candidates).
Fix: the previous round is RECORDS[i-2]. The script printed in this chapter is the fixed version. Generalizing — "when indexing a list inside a 1-based enumerate, re-check the offset." And there are cases where there truly are no candidates (a team whose every competition was gentle) — in that case, pick turning points from the "team change" column instead of percentiles. Numbers are a candidate-selection tool, not the definition of a turning point.
Wall 3. Old competition logs are gone — can’t I fill from memory?
Symptom: the early competitions’ logs are lost, but you roughly remember the ranks.
Cause: a period before the record-keeping routine settled — and that itself is material for the retrospective.
Fix: don’t fill from memory; leave it as "no record" (2-2, Exercise 2). Instead, look for official records — the team history on CTFtime, the competition platform’s archive, day-of messages in the team channel. Messenger search is surprisingly powerful — a "what place did we get?" message right after the end substitutes for the log. If there’s still nothing, "no record" is the right answer. Write that fact honestly in the memoir, and the sentence works for juniors as the lesson "keep records from the very beginning."
Wall 4. One teammate is reluctant about publishing the memoir
Symptom: they balk at publication, saying "my mistake scene is in it."
Cause: the draft was often written first without the consent procedure — and that reluctance is legitimate.
Fix: propose two things. ① Pseudonymize or rewrite that scene — the memoir’s substance is what was learned, not who did it, so the story survives with the person removed. ② Grant the owner of a failure scene final review rights over that paragraph — a person who holds the right to narrate their own failure usually writes it most accurately. Scenes where no agreement is reached get cut — the team outlasts any single memoir.
Wall 5. Writing the memoir, it feels like bragging, and I hesitate to publish
Symptom: repeatedly deleting and rewriting the sentence "this is how we grew."
Cause: a problem of the memoir’s tone — written as a success story it becomes bragging; written as a growth story it becomes a guide.
Fix: apply two rules. ① The first chapter holds only modifier-free numbers (3-4) — numbers are not the grammar of bragging. ② Deliberately maintain the share of failures — the first competition’s misery, the rules that broke, the international competition’s zero-solve stretch. Readers connect not at the success tale but at the point of "I could start from there too." Finally, end the memoir’s last paragraph with "to the person who walks this path next" — a piece whose gaze faces the reader cannot become bragging.
7. Summary
Today’s Concepts
| Concept | One-line explanation |
|---|---|
| Assetization | Experience becomes a searchable, conveyable, preservable asset when converted into a document |
| Timeline first | Once the table is complete, the writing is just unfolding it — rank / lesson / team change |
| The "no record" rule | Don’t fill from memory — the distribution of empty cells is also data |
| Turning points | The 3 decisive moments that made the growth — numbers supply candidates, context selects |
| Information and scene | What gets conveyed is the scene — restore it with log quotes |
| Publication procedure | Teammate consent → anonymization → credits — the team comes before the memoir |
Today’s Tools & Commands
| Tool/command | What it does |
|---|---|
python step340_journey.py |
Generates the timeline, statistics, turning-point candidates, and memoir TOC draft |
| Timeline table | Rank / lesson / team change — the memoir’s skeleton |
| Turning-point five paragraphs | Us back then → decision → competition scene → result & interpretation → what remained |
| Publication checklist | Consent · pseudonyms · non-public info · anonymization · credits · sharing |
Reusing season_review.py |
Percentile-trajectory graph (Step 297’s tool, just swap ROUNDS) |
The Core Instinct
Something strange happens as you write the memoir — before writing you thought "what have we even done all this time?", but in the process of filling the table and restoring the scenes, growth piles up before your eyes in numbers and sentences. A retrospective’s first beneficiary is not the reader — it’s the writer.
And this document is not a period but a milestone. Chapter 5’s "next journey" continues into the next chapters — the exploration and launch of a new growth axis. What you learned on the competition stage (records, reviews, rules, decisions) is a general-purpose engine that works as-is in any new field. The blueprint of that engine is exactly the memoir you completed today.
Once every box is checked, Step 340 is complete.