Turn one research paper into a falsifiable, public-safe ML study with paired experiments, uncertainty, reproducible artifacts, and a defensible report.
Personalize this lesson
Adapt explanations and teaching visuals to your background and preferred voice.
A research demo can look convincing and still collapse when someone asks for the exact command, seed, data, or baseline. One chart isn't evidence if nobody can tell which choices produced it.
This capstone turns a small idea into a research artifact another engineer can inspect and rerun. You'll read one paper, lock a falsifiable claim, run a controlled offline study, report uncertainty and failures, then defend the result in ten minutes.
The running study asks whether a safe form of reward shaping helps a tiny agent learn faster. Everything runs locally with synthetic data and NumPy. No private logs, live users, paid APIs, or specialized hardware enter the study.
Start with Ng, Harada, and Russell's paper on policy invariance under reward transformations.[1] Its main claim is precise enough to test in a small simulator: a potential-based shaping reward can guide learning while preserving optimal policies under the theorem's assumptions.
Don't begin by reproducing every table or proof. First decide whether the paper contains one claim that fits your time, compute, and safety constraints. Keshav's three-pass reading method provides a practical sequence: classify the paper, inspect its evidence, then reconstruct the part you plan to test.[2]
Use this triage card while reading. Fill it with page or section pointers so a reviewer can trace your interpretation back to source text.
| Triage field | Corridor-study note |
|---|---|
| problem | sparse rewards provide little learning signal before goal completion |
| paper claim | potential-based shaping preserves optimal policies under stated assumptions |
| equation to implement | |
| smallest test | seven-state corridor with tabular Q-learning |
| assumption at risk | final evaluation must use original environment reward |
| evidence you can reproduce | learning speed across fixed simulator seeds |
| claim you can't make | the method improves deep RL or deployed agents |
Read title, abstract, introduction, headings, figures, conclusion, and references. Write one sentence for problem, method, comparison, and claimed result. If those sentences stay vague, the study isn't ready to design.
For this paper, the method isn't "add helpful rewards." Instead, the method derives a transition reward from a potential function. That distinction separates the policy-invariance theorem from arbitrary bonuses that may change the task.
Stop the first pass with a scope decision: reproduce, extend, or decline. This capstone performs a small empirical check of one implication and adds an uncertainty-focused artifact. It doesn't attempt a full paper reproduction.
Study the equation, experimental setup, plots, and failure caveats. Write down what stays constant, what changes, and what the paper measures. Missing implementation detail belongs in an assumptions log, not in a silent guess.
Pay close attention to evaluation reward. A candidate trained with shaped reward can look better if its score includes the extra training bonus. Compare both learned policies using the original environment reward or you have changed the measurement.
Record every adaptation. The corridor, Q-learning hyperparameters, action-slip probability, seed budget, and bootstrap rule are capstone choices rather than claims copied from the paper.
Explain the shaping equation without looking. Rebuild the smallest environment where moving toward a goal changes potential. Predict what should happen to early learning and final policy before running code.
Then challenge the design. Could the candidate receive more steps, a friendlier random stream, or an easier evaluation? Could a single lucky seed drive the mean? Every plausible shortcut becomes a control, ablation, or stated limitation.
Finish paper_triage.md with three labels: supported by source, study adaptation, and unresolved. That file prevents a plausible implementation detail from turning into a misattributed paper claim.
"Does reward shaping help agents learn?" is too broad. It doesn't identify an agent, environment, shaping rule, metric, sample, or outcome that would count against the idea.
A falsifiable hypothesis names an observation that can contradict it. Narrow scope makes the capstone stronger because every noun can become a file, parameter, table column, or assertion.
Use this research question:
In a stochastic seven-state corridor, does potential-based shaping increase tabular Q-learning's first-30-episode goal-reaching rate versus sparse reward, while keeping final greedy-policy success unchanged under original reward?
Lock the contract before inspecting confirmatory results:
| Contract field | Locked value |
|---|---|
| unit of analysis | one paired simulator seed |
| baseline | tabular Q-learning with sparse terminal reward |
| candidate | same Q-learning plus potential-based shaping during training |
| primary metric | first-30-episode success-rate difference, shaped minus sparse |
| uncertainty | 90% paired bootstrap interval over seed differences |
| minimum useful effect | mean paired difference at least +0.10 |
| final-policy guardrail | absolute mean final-success difference at most 0.02 |
| confirmatory sample | seeds 0 through 23 |
| stopping rule | run all 24 seed pairs |
Prediction comes before output. Expect shaping to improve early goal-reaching because each move changes a distance-based potential. Expect final greedy success to match because the shaping term has the potential-based form studied by Ng and colleagues.[1]
That expectation isn't permission to hide a miss. It gives reviewers a record of what you believed before seeing confirmatory values. Exploratory explanations can follow, but they need an explicit label.
Write this expected pattern in study_plan.md before running seeds 0 through 23:
A commit makes later edits visible, but it isn't equivalent to independent preregistration. For formal work, register hypotheses, variables, tests, decision criteria, and exclusions in a timestamped read-only system before collecting confirmatory results.[3]
Support the capstone's narrow claim only if the mean early difference is at least +0.10 and the 90% interval's lower bound is above zero. Also require the final-policy guardrail.
Reject the release claim when either requirement fails. A mean of +0.09 is below the declared effect threshold even if its interval is positive. A mean of +0.20 also fails if final original-reward performance shifts beyond the guardrail.
"Inconclusive" can be accurate when interval width leaves multiple practical interpretations. Keep that label distinct from "no effect" and from "the candidate is worse."
Small research work still needs a data and authority boundary. Synthetic data removes many privacy risks, but a public repository can still leak credentials, copied code, or outputs from proprietary environments.
The corridor generator owns every transition. It doesn't imitate a customer, scrape a service, call an external model, or exercise a live agent. Runs can be shared because their complete input is a tiny configuration plus pseudorandom seed.
Add this boundary to the README before code:
| Surface | Included | Excluded |
|---|---|---|
| data | generated corridor transitions | user messages, production logs, private datasets |
| compute | local CPU and NumPy | remote model APIs, paid accelerators |
| actions | left/right in simulator | browser, shell, account, or network actions |
| outputs | metrics, tables, plots, manifests | secrets, identifiers, raw third-party content |
| claim | this simulator and implementation | human behavior, robotics, deployed-agent safety |
Run a secret scanner before publishing. Review generated files for machine paths and usernames. Use an open license only for code and assets you have authority to release.
The corridor has states 0 through 6. Every episode starts at 0; reaching 6 yields environment reward 1; every other transition yields 0. An intended action reverses with probability 0.15, and an episode ends after 12 steps.
Write the environment contract before writing the agent. This prevents reward, reset, or ending-condition changes from entering one experimental arm unnoticed.
| Environment field | Locked contract |
|---|---|
| observation | integer state in {0, 1, ..., 6} |
| actions | 0 = left, 1 = right |
| reset | return state 0; select pre-generated tape by seed |
| transition | move one cell, clamp at endpoints, reverse intended move on a 0.15 slip |
| reward | 1 on first arrival at state 6; otherwise 0 |
| terminated | agent reaches state 6 |
| truncated | 12 steps elapse without reaching goal |
| random inputs | exploration, action, tie-break, and slip draws indexed by seed, episode, and step |
| logged output | state, intended action, realized move, environment reward, termination reason |
terminated means task reached goal. truncated means measurement budget ended episode. Keep distinction in run rows because treating timeout as terminal success or bootstrapping through true terminal changes learning target.
Tabular Q-learning stores one value for each state-action pair. During training, it updates the chosen action toward observed reward plus the best estimated next-state value. Sutton and Barto provide the broader reinforcement-learning foundation behind this update.[4]
The first diagram follows one environment transition. Both arms then read the same environment reward; only the candidate receives a training-only potential difference before its update. Final evaluation reads the original reward branch for both arms.
Define distance potential as:
States nearer the goal have a larger potential. Candidate training adds:
With discount 0.95, a move toward the goal usually produces a positive shaping signal. A move away usually produces a negative one. The environment reward hasn't changed; only candidate training receives .
| Component | Sparse baseline | Shaped candidate |
|---|---|---|
| states and actions | identical | identical |
| slip tape | paired | paired |
| Q-learning update | identical | identical |
| environment reward | goal only | goal only |
| training-only addition | none | |
| final evaluation reward | goal only | goal only |
Reinforcement-learning measurements can vary with random seeds, environment randomness, codebase, and hyperparameters. Henderson and colleagues show why a single run or loosely standardized baseline can mislead.[5]
Pair each baseline run with candidate run under one pre-generated random tape. Tape stores exploration draws, random actions, tie-break draws, and action slips for every episode and step. Indexing by episode and step prevents early episode termination from shifting all later randomness.
Pairing reduces irrelevant seed noise in the difference estimator. It doesn't erase algorithm variability: policies visit different states, so identical tape entries can affect the arms differently.
Use seeds 900, 901, and 902 to debug code, plots, and manifests. Never include them in confirmatory metrics because you have already observed their behavior.
Use integers 0 through 23 for the locked study. Twenty-four paired seeds fit a laptop capstone and expose heterogeneity, but they aren't a universal sample-size recommendation.
Run every pair. Stopping after ten favorable seeds would make sample size depend on observed outcome. If a run fails mechanically, record failure and rerun policy before looking at aggregate results.
Zero-potential control sets . Under the same tape, it must match sparse training exactly. If it doesn't, candidate code changed more than reward.
Original-reward evaluation is another control. Both arms receive identical greedy evaluation slips, and neither receives shaping reward. A result reported only on shaped return fails the measurement contract.
Use a sign-reversed potential only as an exploratory stress test after confirmatory analysis. It may reveal sensitivity to learning dynamics, but it can't retroactively redefine the primary hypothesis.
An ablation removes or changes one component to identify which mechanism drives a result. Change one factor per row and preserve all other settings.
| ID | Comparison | One changed factor | Purpose | Report class |
|---|---|---|---|---|
E0 | sparse vs zero potential | shaping term fixed at zero | catch implementation drift | required control |
E1 | sparse vs distance potential | training reward only | confirm primary claim | confirmatory |
E2 | paired vs shuffled seed labels | analysis pairing | show pairing's precision effect | planned ablation |
E3 | distance vs reversed potential | potential sign | inspect learning sensitivity | exploratory |
Don't call an unplanned hyperparameter sweep an ablation after choosing its best row. Preserve all runs and label post-result searches exploratory.
For seed , let and be fractions of first 30 training episodes that reach the goal. The paired effect is:
Primary estimate averages all 24 differences:
That number answers a bounded question about mean early success under the declared seed-generating procedure. It doesn't prove every seed improves, so report all values and count regressions.
A bootstrap resamples the 24 paired differences with replacement and recomputes their mean. Repeating that process 10,000 times gives a distribution of plausible mean estimates under the empirical seed sample.
Use fixed bootstrap seed 20260731. Report 5th and 95th percentiles as a 90% interval. Agarwal and colleagues emphasize that finite-run reinforcement-learning comparisons need uncertainty views rather than point estimates alone.[6]
The interval isn't a probability that theorem is true, and its coverage doesn't extend automatically beyond this simulator. It quantifies sampling uncertainty over declared seed pairs, conditional on code and study design.
After 80 training episodes, evaluate each greedy policy for 200 episodes on original reward. Pair evaluation slip tapes by seed. Compute shaped-minus-sparse final-success difference exactly as above.
Require absolute mean final difference at most 0.02. Equal final means don't prove policy invariance generally; they show this finite implementation didn't detect a final-performance change at declared resolution.
Also inspect per-seed final differences. An average near zero can hide equal and opposite failures if candidate helps one region and harms another.
A compact experiment table stops notebook state from becoming methodology. Each row names exact config, sample, output, and decision role.
Store the table in study_plan.md and mirror machine-readable fields in configs/study.json. Freeze both in the same commit as the hypothesis.
Use one status vocabulary: planned, running, complete, mechanical_failure, or excluded_by_locked_rule. "Bad result" isn't an exclusion reason.
| Run | Seeds | Episodes | Evaluation | Output | Decision role |
|---|---|---|---|---|---|
| pilot smoke | 900-902 | 10 | 20 | console trace | debug only |
| zero-potential control | 0-23 | 80 | 200 | exact-equality receipt | implementation check |
| primary paired study | 0-23 | 80 | 200 | seed table + bootstrap | confirmatory claim |
| shuffled-pair analysis | same completed rows | none | none | interval comparison | planned ablation |
| reversed-potential stress | 0-23 | 80 | 200 | separate seed table | exploratory appendix |
A reviewer shouldn't have to guess where hypothesis ends and analysis begins. Keep source, config, immutable run outputs, report, and talk in distinct paths.
This tree is small enough for a public repository while still representing a credible research artifact:
1reproducible-reward-shaping/
2โโโ README.md
3โโโ LICENSE
4โโโ CITATION.cff
5โโโ pyproject.toml
6โโโ uv.lock
7โโโ study_plan.md
8โโโ paper_triage.md
9โโโ configs/
10โ โโโ study.json
11โโโ src/
12โ โโโ corridor_study/
13โ โโโ __init__.py
14โ โโโ environment.py
15โ โโโ train.py
16โ โโโ analyze.py
17โ โโโ manifest.py
18โโโ tests/
19โ โโโ test_environment.py
20โ โโโ test_zero_potential.py
21โ โโโ test_manifest.py
22โโโ data/
23โ โโโ generated/
24โ โโโ README.md
25โโโ artifacts/
26โ โโโ manifest.json
27โ โโโ runs/
28โ โ โโโ primary_seed_rows.csv
29โ โ โโโ bootstrap_means.npy
30โ โโโ checksums.sha256
31โโโ report/
32โ โโโ report.md
33โ โโโ figures/
34โ โ โโโ paired_seed_delta.svg
35โ โโโ tables/
36โ โโโ primary_result.csv
37โโโ talk/
38 โโโ outline.md
39 โโโ q-and-a.mdUse pyproject.toml plus uv.lock to pin NumPy and development tools. README should name supported Python version and one clean command such as uv run corridor-study --config configs/study.json.
Run from a fresh clone or container. Record operating system, architecture, Python, NumPy, commit, config hash, and wall-clock duration in manifest. The machine identity may remain coarse; hostnames and usernames don't belong in public output.
The Machine Learning Reproducibility Checklist calls for clear model, hyperparameter, seed, environment, and result reporting.[7] A lockfile helps, but complete execution instructions and immutable inputs still matter.
Synthetic data still needs provenance. Save generator version, seed range, transition rule, slip probability, state count, step cap, and environment source hash.
Don't commit one unexplained CSV and call it generated. data/generated/README.md should state exact command that reconstructs any derived rows and whether tracked output is canonical or disposable.
If you adapt capstone to public dataset later, record original URL, license, version, retrieval date, checksum, preprocessing command, and excluded rows. Never replace original identifier with local filename alone.
The manifest connects the claim to exact files. JSON stays easy to inspect and hash.
The sample below names identities rather than mutable labels such as latest:
1{
2 "study_id": "corridor-reward-shaping-v1",
3 "git_commit": "7c0ffee",
4 "config_sha256": "<sha256-of-configs-study-json>",
5 "source_sha256": "<sha256-of-src-tree>",
6 "python": "3.12.x",
7 "numpy": "<locked-version>",
8 "confirmatory_seeds": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
9 "bootstrap_seed": 20260731,
10 "primary_rows": "artifacts/runs/primary_seed_rows.csv",
11 "report_table": "report/tables/primary_result.csv",
12 "status": "complete"
13}Add SHA-256 checksums after results become immutable. Verify the checksums in the clean-run script before rendering the report.
CITATION.cff gives software human-readable and machine-readable citation metadata. GitHub can render that file as citation formats for repository visitors.[8] Use release version or persistent identifier after archive.
The complete script below generates paired random tapes, trains both arms, evaluates on original reward, bootstraps paired differences, and prints decision. Its only dependency is NumPy.
Read control points before running: make_tape freezes randomness by episode and step; train changes only reward; evaluate never receives shaping reward; bootstrap samples paired differences.
Run it with uv run reward_shaping_study.py. Expected output follows code.
1#!/usr/bin/env -S uv run --script
2# /// script
3# requires-python = ">=3.12"
4# dependencies = ["numpy"]
5# ///
6
7import numpy as np
8
9N_STATES = 7
10GOAL = N_STATES - 1
11GAMMA = 0.95
12ALPHA = 0.35
13EPSILON = 0.20
14TRAIN_EPISODES = 80
15MAX_STEPS = 12
16SEEDS = tuple(range(24))
17
18def potential(state: int) -> float:
19 return -(GOAL - state) / GOAL
20
21def make_tape(seed: int) -> dict[str, np.ndarray]:
22 rng = np.random.default_rng(seed)
23 shape = (TRAIN_EPISODES, MAX_STEPS)
24 return {
25 "explore": rng.random(shape),
26 "action": rng.integers(0, 2, shape),
27 "tie": rng.integers(0, 2, shape),
28 "slip": rng.random(shape),
29 }
30
31def train(tape: dict[str, np.ndarray], shaped: bool) -> tuple[np.ndarray, np.ndarray]:
32 q = np.zeros((N_STATES, 2), dtype=float)
33 solved: list[int] = []
34
35 for episode in range(TRAIN_EPISODES):
36 state = 0
37 reached_goal = False
38
39 for step in range(MAX_STEPS):
40 if tape["explore"][episode, step] < EPSILON:
41 action = int(tape["action"][episode, step])
42 else:
43 best = np.flatnonzero(q[state] == q[state].max())
44 action = int(best[tape["tie"][episode, step] % len(best)])
45
46 move = -1 if action == 0 else 1
47 if tape["slip"][episode, step] < 0.15:
48 move = -move
49
50 next_state = int(np.clip(state + move, 0, GOAL))
51 environment_reward = float(next_state == GOAL)
52 shaping_reward = (
53 GAMMA * potential(next_state) - potential(state)
54 if shaped
55 else 0.0
56 )
57 training_reward = environment_reward + shaping_reward
58 target = (
59 training_reward
60 if next_state == GOAL
61 else training_reward + GAMMA * q[next_state].max()
62 )
63 q[state, action] += ALPHA * (target - q[state, action])
64 state = next_state
65
66 if state == GOAL:
67 reached_goal = True
68 break
69
70 solved.append(int(reached_goal))
71
72 return q, np.asarray(solved)
73
74def evaluate(q: np.ndarray, seed: int, episodes: int = 200) -> float:
75 slips = np.random.default_rng(10_000 + seed).random((episodes, MAX_STEPS))
76 successes: list[bool] = []
77
78 for episode in range(episodes):
79 state = 0
80 for step in range(MAX_STEPS):
81 action = int(np.argmax(q[state]))
82 move = -1 if action == 0 else 1
83 if slips[episode, step] < 0.15:
84 move = -move
85 state = int(np.clip(state + move, 0, GOAL))
86 if state == GOAL:
87 break
88 successes.append(state == GOAL)
89
90 return float(np.mean(successes))
91
92rows: list[tuple[int, float, float, float, float]] = []
93for seed in SEEDS:
94 tape = make_tape(seed)
95 sparse_q, sparse_train = train(tape, shaped=False)
96 shaped_q, shaped_train = train(tape, shaped=True)
97 rows.append(
98 (
99 seed,
100 float(sparse_train[:30].mean()),
101 float(shaped_train[:30].mean()),
102 evaluate(sparse_q, seed),
103 evaluate(shaped_q, seed),
104 )
105 )
106
107results = np.asarray(rows, dtype=float)
108early_delta = results[:, 2] - results[:, 1]
109final_delta = results[:, 4] - results[:, 3]
110
111bootstrap_rng = np.random.default_rng(20_260_731)
112bootstrap_means = np.asarray(
113 [
114 early_delta[
115 bootstrap_rng.integers(0, len(early_delta), len(early_delta))
116 ].mean()
117 for _ in range(10_000)
118 ]
119)
120interval_low, interval_high = np.quantile(bootstrap_means, [0.05, 0.95])
121
122primary_supported = early_delta.mean() >= 0.10 and interval_low > 0.0
123guardrail_passed = abs(final_delta.mean()) <= 0.02
124
125print(f"paired seeds: {len(SEEDS)}")
126print(f"early sparse mean: {results[:, 1].mean():.3f}")
127print(f"early shaped mean: {results[:, 2].mean():.3f}")
128print(f"mean paired delta: {early_delta.mean():+.3f}")
129print(f"90% paired bootstrap CI: [{interval_low:+.3f}, {interval_high:+.3f}]")
130print(
131 "seeds improved / tied / regressed: "
132 f"{int(np.sum(early_delta > 0))} / "
133 f"{int(np.sum(early_delta == 0))} / "
134 f"{int(np.sum(early_delta < 0))}"
135)
136print(f"final sparse mean: {results[:, 3].mean():.3f}")
137print(f"final shaped mean: {results[:, 4].mean():.3f}")
138print(f"mean final delta: {final_delta.mean():+.3f}")
139print(f"decision: {'SUPPORT H1' if primary_supported else 'REJECT H1'}")
140print(f"guardrail: {'PASS' if guardrail_passed else 'FAIL'}")1paired seeds: 24
2early sparse mean: 0.439
3early shaped mean: 0.582
4mean paired delta: +0.143
590% paired bootstrap CI: [+0.061, +0.225]
6seeds improved / tied / regressed: 19 / 0 / 5
7final sparse mean: 0.911
8final shaped mean: 0.911
9mean final delta: +0.000
10decision: SUPPORT H1
11guardrail: PASSThe primary estimate clears the locked +0.10 threshold, and the 90% interval stays above zero. The final original-reward mean is identical at printed precision. Under the declared rule, the fixture supports H1 and passes the guardrail.
Five of 24 seeds regress. That observation belongs next to headline mean because it shows shaping isn't uniformly better. A reviewer can inspect those rows, rerun them, and ask whether one potential interacts poorly with early exploration.
The result supports one sentence: "In this corridor fixture, potential-based shaping increased mean first-30-episode success by 0.143 across 24 paired seeds, with a 90% paired bootstrap interval of [0.061, 0.225], while mean final original-reward success was unchanged."
Potential-based shaping theory motivates candidate design, but a tiny experiment doesn't prove the theorem. It verifies implementation behavior under one finite setup.
Likewise, a bootstrap interval isn't a certificate of external validity. New environments, algorithms, reward scales, horizons, and hyperparameters can change learning dynamics.
Use precise verbs: observed, estimated, supported under the locked rule, and didn't detect. Avoid proved, guaranteed, always, and works in production.
Report seed, sparse early rate, shaped early rate, paired difference, sparse final rate, shaped final rate, and run status. Sort by seed, not performance.
Keep failed mechanical runs in the ledger with their errors. If the locked rerun rule permits replacement, preserve the first failed attempt and link the replacement rather than overwriting it.
The aggregate table should point to the row-table checksum. A screenshot alone can't support reanalysis.
A rejected hypothesis isn't failed capstone. Hidden rejection is. Strong artifact makes negative result easy to understand, rerun, and extend.
Keep report structure unchanged when claim fails. Replace celebratory language with declared decision, uncertainty, likely explanations, and next discriminating study. Don't quietly change metric or seed set.
Use this diagnosis table after locked analysis:
| Symptom | Plausible cause | Honest response |
|---|---|---|
| interval crosses zero | seed budget too small or effect unstable | report inconclusive result and wider interval |
mean below +0.10 | effect smaller than useful threshold | reject practical claim even if sign is positive |
| final guardrail fails | reward or terminal handling changed task behavior | hold candidate and inspect implementation |
| a few extreme seeds dominate | unstable exploration or environment interaction | show seed distribution and robust summary |
| zero-potential control differs | code paths aren't identical | stop analysis and fix experiment harness |
| clean clone can't run | missing dependency, data, or command | repair artifact before sharing report |
A negative result can still narrow future work. For example, a wide interval may justify more seeds; a stable null effect may rule out one potential; guardrail failure may expose incorrect terminal shaping.
Mark post-result hypotheses exploratory. "Seed 6 regressed because early slips trapped policy" can become next registered study, but it isn't confirmed by same observed seed trace.
A research artifact needs three aligned views. The table preserves exact values, the figure makes the distribution visible, and the report connects evidence to the claim. All three must derive from the same immutable rows.
Generate the table and figure from artifacts/runs/primary_seed_rows.csv. Don't type result numbers into plot code or the report by hand. Add a test that the report-table hash matches the manifest.
Use accessible colors plus sign and position. Negative seed differences need a label or distinct shape so interpretation doesn't depend on red-green perception.
report/tables/primary_result.csv should contain one row per arm plus paired delta summary:
| Metric | Sparse | Shaped | Paired difference |
|---|---|---|---|
| first-30 success | 0.439 | 0.582 | +0.143 |
| 90% interval | n/a | n/a | [+0.061, +0.225] |
| improved/tied/regressed seeds | n/a | n/a | 19/0/5 |
| final original-reward success | 0.911 | 0.911 | +0.000 |
Show every seed difference on common x-axis with visible zero line. Add paired mean and interval, then align early and final arm means on same zero-to-one scale.
Caption should state inference rather than repeat title. Mention five negative seeds and equal final means. Avoid a bar chart that hides seed distribution.
Export SVG for report and PNG for slides. Save plotting command and source hash in manifest.
Keep report concise enough to review in one sitting:
State deviations from plan in their own table. none is acceptable only after checking commit diff between locked plan and final config.
Limitations aren't a ceremonial paragraph. Each should identify unsupported inference and, when possible, experiment that would test it.
This capstone has at least six:
| Limitation | Unsupported inference | Useful next study |
|---|---|---|
| one seven-state corridor | shaping helps other environments | add branching grid and delayed traps |
| tabular Q-learning only | effect transfers to neural agents | preregister small function-approximation study |
| one potential | any potential speeds learning | compare several locked potential families |
| one hyperparameter set | result is tuning-robust | crossed seed-by-hyperparameter design |
| 24 seeds | effect estimate is highly precise | plan seed count from target interval width |
| synthetic task | deployed-agent value or safety | no such claim without separate governed study |
Also state the theorem's boundary. Potential-based shaping preserves optimal policies under the assumptions in the source formulation; a finite implementation can still be wrong, undertrained, or measured on the wrong reward.
Don't describe public-safe synthetic setup as representative of users. Its strength is auditability, not realism.
Each submission should be reviewable before the next stage begins. A milestone is an evidence package, not a calendar date.
Keep reviewer feedback in reviews/ or issue tracker. When feedback changes locked plan, record amendment before confirmatory run.
Use these four submissions:
Submit paper_triage.md, study_plan.md, source links, one-paragraph scope, falsifiable hypothesis, expected result, rejection rule, public-safety boundary, and limitations forecast.
Reviewer should trace shaping equation to paper and distinguish paper claims from study adaptations. No confirmatory results should exist yet.
Exit criterion: another engineer can predict which output supports, rejects, or leaves claim inconclusive.
Submit exact repository skeleton, environment tests, sparse Q-learning baseline, pilot-only run, zero-potential equality test, config schema, dependency lock, and clean-run command.
Reviewer should run seed 900 and inspect one episode trace. They should confirm goal reward, slip behavior, terminal handling, and 12-step cap.
Exit criterion: baseline and zero-potential control are bit-for-bit equal under same tape.
Submit immutable 24-seed row table, paired bootstrap output, experiment table, manifest, checksums, primary figure, planned ablations, and deviation log.
Reviewer should reconstruct headline values from row table and rerun at least one seed pair. Mechanical failures must remain visible.
Exit criterion: decision follows locked rule without manual number edits.
Submit final report, exact reproduction instructions, license, CITATION.cff, archived release identifier if available, ten-minute talk outline, Q&A sheet, and artifact review checklist.
Reviewer should start from clean clone and produce primary table. They should also identify one unsupported claim and verify report doesn't make it.
Exit criterion: independent reviewer can exercise artifact and explain evidence, limits, and next study.
A short technical talk tests whether your research decisions form a coherent story. Ten minutes leaves no room for every implementation detail, so use an evidence hierarchy rather than a file tour.
Practice with a timer and one backup slide per likely challenge. The main deck should fit seven slides and reserve at least two minutes for questions.
Use this pacing:
| Time | Slide | Job |
|---|---|---|
| 0:00-0:45 | problem | sparse reward and narrow corridor question |
| 0:45-1:45 | paper claim | potential-based shaping and assumption boundary |
| 1:45-3:00 | hypothesis | primary effect, expected pattern, rejection rule |
| 3:00-4:30 | design | baseline, candidate, paired tapes, seeds, controls |
| 4:30-6:15 | evidence | seed plot, interval, five regressions, final guardrail |
| 6:15-7:15 | failure checks | zero potential, original-reward evaluation, deviations |
| 7:15-8:00 | limitations | claim boundary and next study |
| 8:00-10:00 | Q&A | defend choices with artifact links |
Write the answers before the presentation. Each answer should point to an evidence file or admit unresolved uncertainty.
| Question | Strong answer shape |
|---|---|
| Why 24 seeds? | bounded laptop budget; report interval width; no claim of universal adequacy |
| Why 90% interval? | locked before results for capstone sensitivity; show exact choice; alternative belongs appendix |
| Why mean? | primary estimand was paired mean; whole distribution and regression count remain visible |
| Did shaping change task? | training reward differed; both final policies evaluated on original reward; guardrail passed |
| Why can five seeds regress? | method changes learning dynamics; mean claim isn't per-seed guarantee |
| Does theorem prove experiment? | no; theorem motivates form, while artifact checks finite implementation |
| Can result transfer to agents? | no; corridor, tabular learner, and synthetic data bound claim |
| What would falsify next idea? | preregister environment family and potential comparison with rejection thresholds |
Don't answer every challenge with "more data." Some failures demand corrected control, better estimand, or narrower claim.
Reproducibility asks whether another team can obtain result using same artifacts and setup; replicability asks about independent artifacts under ACM's current terminology.[9] This capstone targets repeatability first and provides enough documentation for an independent reproducibility attempt.
ACM's functional artifact criteria emphasize documented, consistent, complete, exercisable artifacts with verification and validation evidence.[9] Use those words as review questions, not as a badge claim.
FAIR principles add findability, accessibility, interoperability, and reuse to data stewardship.[10] A public repository, open formats, machine-readable manifest, license, and citation metadata help. They don't replace executable validation.
If any answer is "no," the artifact isn't ready. Fix the package before polishing the talk.
You can move from one paper claim to a bounded empirical question without pretending a small study reproduces an entire field. You can state expected result and rejection rule before confirmatory output, then preserve negative seeds and failed hypotheses.
You can also separate algorithm change from random noise through paired tapes, report bootstrap uncertainty, and keep final evaluation on original task. Those habits apply to model training, retrieval, evaluators, and agent benchmarks.
Ship evidence another engineer can inspect: source, lockfile, config, seed table, manifest, figure, report, limitations, talk, and Q&A. The artifact is credible because the claim remains smaller than the evidence.
Answer every question, then check your score. Score 75% or higher to mark this lesson complete.
9 questions remaining.
Policy Invariance Under Reward Transformations: Theory and Application to Reward Shaping
Ng, A. Y., Harada, D., and Russell, S. ยท 1999 ยท ICML 1999
How to Read a Paper
Keshav, S. ยท 2007 ยท ACM SIGCOMM Computer Communication Review
Welcome to Registrations
Open Science Framework ยท 2026
Reinforcement Learning: An Introduction
Sutton, R. S. and Barto, A. G. ยท 2018 ยท MIT Press
Deep Reinforcement Learning That Matters
Henderson, P., Islam, R., Bachman, P., Pineau, J., Precup, D., and Meger, D. ยท 2018 ยท AAAI 2018
Deep Reinforcement Learning at the Edge of the Statistical Precipice
Agarwal, R., Schwarzer, M., Castro, P. S., Courville, A. C., and Bellemare, M. G. ยท 2021 ยท NeurIPS 2021
The Machine Learning Reproducibility Checklist
Pineau, J., et al. ยท 2021
About CITATION files
GitHub ยท 2026
Artifact Review and Badging
Association for Computing Machinery ยท 2026
The FAIR Guiding Principles for scientific data management and stewardship
Wilkinson, M. D., et al. ยท 2016 ยท Scientific Data
Questions and insights from fellow learners.