YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Rogue Protocol — Round 1
SMLRA × Abhiyantriki 2026 · Recalibrate
Ship time 2187-04-15, 03:12. The research vessel Aurora is three weeks from Earth. Its ship computer, NINE, writes every log line and raises every alarm. Six hours ago it stopped telling the truth.
NINE floods the crew with false alarms and hides real faults inside calm messages. You are the recalibration unit. You have NINE's logs, and the crew has hand-checked some of them. Train a model that looks at any log line and returns a verdict:
| Verdict | Meaning |
|---|---|
| 1 | True fault. Wake the crew. |
| 0 | Noise. NINE is lying. Ignore it. |
This folder is the whole kit. Run starter_round1.ipynb from top to bottom and you will have a valid submission.csv. That first file is weak on purpose. Improve it, check it, and upload again. Your best upload counts. The form closes at 12:10. Scores are announced at 12:20.
Until then, validation F1 is your scoreboard. Nobody sees the hidden test score before the announcement.
What's in this folder
| File | What it is |
|---|---|
starter_round1.ipynb |
The round. Story, a weak starter model, and the cells that write your submission. |
train.csv |
6,000 logs with the crew's verdict, is_true_fault. Learn from these. |
val.csv |
1,000 more checked logs. Use these to test a model honestly. |
test.csv |
3,000 logs nobody has checked. Your verdicts on these are what get scored. |
check_submission.py |
Format checker. Run it before every upload. |
requirements.txt |
Python packages this folder needs. |
submission.csv |
Created by the notebook. It is not in the zip until you run Act 5. |
Keep every file in this folder. The notebook and the checker load train.csv, val.csv, and test.csv from the folder you run them in.
Set up
You need Python 3. Open a terminal in this folder and install the packages:
pip install -r requirements.txt
jupyter notebook starter_round1.ipynb
requirements.txt installs pandas, numpy, scikit-learn, matplotlib, and Jupyter. LightGBM is listed as optional. The starter model does not need it. If you want it later:
pip install lightgbm
HistGradientBoosting is already inside scikit-learn, so a tree model does not require an extra install.
If jupyter is not found, start it as a module:
python -m jupyter notebook starter_round1.ipynb
Any notebook editor works (JupyterLab, VS Code) as long as two things are true: the kernel has the packages above, and the notebook's working directory is this folder.
What a log contains
train.csv and val.csv have the label. test.csv has the same columns without is_true_fault.
| Column | Meaning |
|---|---|
log_id |
Unique id. Train starts at L00001, val at L06001, test at L07001. |
timestamp |
Ship time. |
module |
Which system: Antenna, Notice-Bus, Lab-Power, Life-Support. |
mode |
Ship mode: CRUISE, DOCKED, ALERT, MAINT. |
node |
Which computer node wrote the line. |
status |
OK / WARN / ERROR / CRIT. |
reading |
Sensor value. |
delay_ms |
How late the log arrived. |
retry_count |
Retries before the log was written. |
message |
Free text from NINE. |
is_true_fault |
The crew's verdict, 1 or 0. Train and val only. |
About one log in four is a real fault. A model that answers 0 to every row looks accurate and still fails the crew. The round is scored on F1 of your 1/0 verdicts, which rewards catching real faults without crying wolf.
Run the notebook
Open starter_round1.ipynb and run every cell from the top (Shift + Enter). The first code cell is the bridge console. Leave it as it is. Set DRAMA = False in that cell if you want to skip the typing animations on a re-run.
| Act | What you do | What you get |
|---|---|---|
| 0 | Run it. | The task: 1 is real, 0 is a lie. |
| 1 | Run it. | train, val, and test loaded, and a column guide. |
| 2 | The starter model lives here. | A logistic regression pipeline on reading, delay_ms, and retry_count. |
| 3 | Set THRESHOLD, then run it again after every new model. |
Probabilities turned into 1/0 verdicts. The cell ships with 0.5. |
| 4 | Run it. | Validation F1, faults caught, faults missed, and false alarms. |
| 5 | Run both cells. | submission.csv, then the format check. |
| Epilogue | Run it once. | A short guide for the next attempt. |
The model does not emit 1 or 0. It emits a probability. You choose the cut-off in Act 3: at or above it, the verdict is 1. The cell starts at 0.5. Set THRESHOLD yourself, then re-run Act 3 after you change Act 2.
Change the model
Edit Act 2. If you keep a scikit-learn pipeline named model that accepts raw log rows, Acts 3, 4, and 5 keep working.
If you build your own feature table instead, replace model.predict_proba(val)[:, 1] in Act 3 and the matching line in Act 5 with your own probabilities for val and test.
Then:
- Set
THRESHOLDin Act 3, then re-run Act 3 and Act 4. Expect the hidden test to land within a few points of your val F1. It can come out higher or lower. - Val is 1,000 logs. F1 moves by about ±0.02 from chance alone. Keep a change when it helps by more than that.
- Re-run Act 5 so
submission.csvmatches the model you just measured.
Check the file
Act 5 writes submission.csv in this folder and runs the checker. Run it yourself any time, from this same folder:
python check_submission.py submission.csv
From a notebook cell:
from check_submission import check
check("submission.csv")
A good file prints TRANSMISSION VALID (or [OK] on a terminal that cannot show the check mark) and the number of verdicts flagged as 1.
The checker rejects the file when any of these are true:
- It is not a readable CSV.
- The columns are anything other than exactly
log_id,is_true_fault, in that order. - A
log_idis repeated. - Any id from
test.csvis missing. - Any id is not in
test.csv. - Any verdict is not exactly
1or0. Probabilities are rejected.
The file Act 5 writes looks like this:
log_id,is_true_fault
L07001,1
L07002,0
One row per test log. 3,000 verdicts.
What you hand in
Two things. Nothing else. No notebook, no code, no zip.
1. The CSV, through the upload form. The link is on the board.
- File name: your team id, exactly as assigned at check-in, for example
team07.csv. - The form closes at 12:10. Upload a valid starter file early, then upload again as you improve. Your best upload counts, not your last one.
2. A paper card, at the card desk, also by 12:10. You can swap the card until then.
Write on it:
- Team id, exactly as assigned (
team07). - What features you used.
- What model you used.
- What trick helped, and how you know.
- At 11:30 NINE asks one question out loud. Write the answer on the same card.
A missing card scores 0 of the card points. An invalid CSV scores 0 for the whole round, card included. Run check_submission.py before you upload.
How the round is scored
Round 1 is out of 100.
| Points | For |
|---|---|
| 10 | A valid file. |
| up to 80 | F1 on the hidden test. 0 points at the baseline announced at the start. 80 points for the best F1 in the room. Linear in between. Below that baseline is 0 of these 80. |
| up to 10 | The card. |
Your val F1 is the number to watch while you work. The hidden test is scored once, after 12:10.
Before 12:10
- The notebook has been run top to bottom once, so a valid
submission.csvexists. -
THRESHOLDin Act 3 is the cut-off for the model you are submitting. - Act 4 has been re-run for that model.
-
python check_submission.py submission.csvprints TRANSMISSION VALID. - The file uploaded to the form is named
<team id>.csv. - The card is at the card desk, with the team id, the three lines, and NINE's answer.