Code Execution Configuration Guide

The Code Execution Service runs learner code in a sandboxed environment. There are three interaction types, served by two distinct configuration formats:

Type Purpose Config Format
Post Learner posts code to an activity (scored). Post & Submission Config
Submission Learner submits an exam response (scored). Post & Submission Config
Run Learner clicks "Run" in an interactive IDE widget (not scored). IDE Runtime Config

Table of Contents


Package Structure (ZIP vs JSON)

Both config formats can be uploaded as either a ZIP package or a single JSON file.

ZIP package

Use a ZIP when you need supporting files alongside config.json (test files, helper libraries, fixtures, multi-line shell scripts).

my_activity.zip
├── config.json            <-- REQUIRED  (the configuration)
├── run                    <-- REQUIRED  (Bash entry point, no extension)
├── compile                <-- OPTIONAL  (Bash build script, no extension)
├── tests/                 <-- your test files / fixtures
│   ├── test_main.py
│   └── data.csv
├── src/                   <-- (Post/Submission only) cleared and replaced with the
│                              learner's submission, see `setup.submission_dir`
└── solution_template.py   <-- can be deleted via `setup.remove_paths`

JSON file

Use a single JSON file when the configuration is self-contained — no extra files, and compile/run are short enough to inline as strings.

When a JSON file is uploaded the system synthesises an equivalent ZIP:

my_config.json  =>  my_config.zip
                    ├── config.json   <-- copy of my_config.json
                    ├── run           <-- contents of the "run" property
                    └── compile       <-- contents of the "compile" property (if present)

If a ZIP also defines compile / run properties inside its config.json, those property values overwrite any compile / run script files present in the ZIP.

Note (IDE Runtime): in the IDE Runtime config, compile and run are objects, not strings, so the auto-conversion above only applies when those objects resolve to a single command. See IDE Runtime Config.


Post & Submission Config

Used for both Post and Submission interactions. After the learner's code runs, the service extracts a status, score, and any feedback panels, and reports them back to OpenLearning. For posts, an optional thumbnail can also be generated.

Lifecycle

  1. Setup. Extract the ZIP, delete files listed in setup.remove_paths, then clear setup.submission_dir and inject the learner's submitted files there.
  2. Execution. Run compile (if present), then run, under the resource limits in execution.
  3. Reporting. Read status, score, and each feedback item from the configured sources (files or stdout/stderr) and return them. For posts, a thumbnail is also extracted if configured.

Post Full Example

{
  "version": "1.0",
  "setup": {
    "submission_dir": "src",
    "remove_paths": ["solution_template.py", "tests/__pycache__"]
  },
  "compile": "g++ -O3 -o autograder main.cpp tests.cpp",
  "run": "./autograder",
  "execution": {
    "cpu_time_limit": 10,
    "wall_time_limit": 20,
    "memory_limit": 256000,
    "enable_network": false
  },
  "status": {
    "source": "file",
    "path": "output/status.txt",
    "default": "Error",
    "success_matcher": "^Passed"
  },
  "score": {
    "source": "file",
    "path": "output/score.txt",
    "default": 0,
    "max_points": 100
  },
  "thumbnail": {
    "source": "file",
    "path": "output/plot.png",
    "format": "image"
  },
  "feedback": [
    {
      "label": "Test Report",
      "source": "file",
      "path": "output/report.txt",
      "format": "text",
      "on_missing": {
        "source": "stderr",
        "format": "text"
      }
    },
    {
      "label": "Compiler Output",
      "source": "stderr",
      "format": "terminal",
      "visible_if_empty": false
    }
  ],
  "show_files": true
}

Minimal Example (JSON-only)

{
  "version": "1.0",
  "run": "python3 -m pytest submission/ -v --tb=short && echo 100 || echo 0",
  "score": {
    "source": "stdout",
    "default": 0,
    "max_points": 100
  }
}

Post & Submission Fields

Field Type Required Default Description
version string Yes Configuration format version. Must be "1.0".
setup object No File system preparation. See setup.
compile string No Shell command for compilation. If omitted from the JSON, a compile script in the ZIP is used (if present).
run string No Shell command to execute. If omitted from the JSON, a run script must exist in the ZIP.
execution object No (defaults) Resource limits. See execution.
status object No "Completed" How to derive the submission status text. See status.
score object No How to derive the numerical score. See score.
thumbnail object No Image to represent the post (posts only, ignored for submissions). See thumbnail.
feedback array No Feedback panels shown to the learner. See feedback.
show_files boolean No true Show a file viewer for browsing post-execution files.

setup

Controls how the file system is prepared before scripts run.

Field Type Required Default Description
submission_dir string No "submission" Folder where the learner's submitted files are placed.
remove_paths string[] No Files/folders in the ZIP to delete before injecting the learner's code. Supports .gitignore syntax.

You don't need to list files inside submission_dir in remove_paths — that directory is cleared automatically.

compile and run scripts

These are Bash scripts (or one-liner strings) that act as the bridge between the runner and your toolchain.

Example run (Python):

#!/bin/bash
python3 -m pytest tests/ --color=yes -v --tb=short --no-header > output/report.txt 2>&1
if [ $? -eq 0 ]; then
    echo "Passed" > output/status.txt
    echo "100"    > output/score.txt
else
    echo "Failed" > output/status.txt
    echo "0"      > output/score.txt
fi

status

A short text label representing the result. If the entire status block is omitted, it defaults to "Completed".

Field Type Required Default Description
source string Yes Where to read status from. See source values.
path string No File path (required if source is "file").
content string No Static text (required if source is "static").
default string No Fallback text if the source returns nothing.
max_length integer No Maximum character length for the status string.
success_matcher string No Regex pattern. If status matches, the submission is marked Successful. If omitted, any non-empty status counts as success.
on_missing object No Fallback when the source is missing. See on_missing.

score

The numerical grade for the submission. Distinct from statusstatus is a label, score is the number.

Field Type Required Default Description
source string Yes Where to read the score from. See source values.
path string No File path (required if source is "file").
content string No Static value (required if source is "static").
default float No Fallback score if the source returns nothing.
max_points float No Maximum possible score (used for display/scaling).
on_missing object No Fallback when the source is missing. See on_missing.

thumbnail

Optional image to represent the post in the activity feed. Only used for Post interactions — ignored for submissions.

Field Type Required Default Description
source string Yes Where to read the image from. See source values.
path string No File path (required if source is "file").
content string No Static content (required if source is "static").
format string No "image" Must be "image" or "text". If "text", the text is rendered into an SVG thumbnail.
on_missing object No Fallback when the source is missing. See on_missing.

Constraint: the final result (including any on_missing fallback) must resolve to an image.

feedback

A list of panels displayed to the learner after execution.

Field Type Required Default Description
label string Yes Title/heading for this panel.
source string Yes Where to read the content from. See source values.
path string No File path (required if source is "file").
content string No Static text (required if source is "static").
format string No How to render the content. See format values. If omitted, this item is skipped.
visible_if_empty boolean No true If false, hide this panel when content is empty.
on_missing object No Fallback when the source is missing. See on_missing.

show_files

Defaults to true. Set to false to hide the post-execution file viewer in the learner's results UI.


IDE Runtime Config

Used for the Run interaction — the interactive "Run" button in an IDE widget. There is no scoring, status, thumbnail, or feedback here; the service simply compiles and/or runs the learner's code and streams back stdout, stderr, and the compile output.

The same ZIP / JSON packaging rules apply (see Package Structure). Note however that setup is not part of this config — the learner's code files are written directly into the working directory.

IDE Runtime Full Example

{
  "version": "1.0",
  "compile": {
    "command_prefix": "gcc",
    "args": "-Wall -Werror -o program program.c",
    "args_placeholder": "Compiler flags",
    "allow_custom_args": true
  },
  "run": {
    "command_prefix": "./program",
    "args_placeholder": "Command-line arguments (optional)",
    "allow_custom_args": true
  },
  "execution": {
    "cpu_time_limit": 10,
    "memory_limit": 256000
  },
  "input": {
    "allow_editing": true,
    "placeholder": "Input data (stdin)",
    "text": "hello world"
  }
}

Minimal Example

{
  "version": "1.0",
  "run": {
    "command_prefix": "python3 main.py"
  }
}

IDE Runtime Fields

Field Type Required Default Description
version string Yes Configuration format version. Must be "1.0".
compile object No Compilation command configuration. See compile/run options.
run object No Run command configuration. If omitted from the JSON, a run script file must exist in the config ZIP. See compile/run options.
input object No Standard input (stdin) configuration. See input.
execution object No (defaults) Resource limits. See execution.

IDE Runtime compile and run Options

The final command run is command_prefix + " " + args (whichever sides are present). Either one may be omitted, but at least one must be present (or a run script file must exist in the ZIP for run).

Field Type Required Default Description
command_prefix string No Fixed prefix of the command. Never editable by the learner.
args string No Default arguments. Editable by the learner only if allow_custom_args is true.
args_placeholder string No "Compiler flags" for compile, "Command-line arguments" for run Placeholder text shown in the arguments input field.
allow_custom_args boolean No false If true, the learner can edit args.

Patterns:

input

Standard input (stdin) for the learner's program.

Field Type Required Default Description
allow_editing boolean No false If true, the learner can edit the stdin input.
placeholder string No "Input data (stdin)" Placeholder text shown in the stdin input field.
text string No Default stdin text to pre-fill.

Data Dictionary

execution (shared)

Both Post/Submission and IDE Runtime configs accept the same execution block. All fields are optional — system defaults apply when omitted.

"execution": {
  "cpu_time_limit": 5.0,
  "wall_time_limit": 10.0,
  "memory_limit": 128000,
  "enable_network": false
}
Field Type Default Description
cpu_time_limit float 5.0 Max CPU time allowed (seconds).
cpu_extra_time float 1.0 Grace period (seconds) before killing the program after the limit.
wall_time_limit float 10.0 Max wall-clock time allowed (seconds).
memory_limit integer 128000 Max RAM usage in kilobytes (128 MB).
stack_limit integer 64000 Max stack size in kilobytes (64 MB).
max_processes_and_or_threads integer 60 Max number of threads/processes allowed.
enable_per_process_and_thread_time_limit boolean false If true, applies cpu_time_limit to each process/thread.
enable_per_process_and_thread_memory_limit boolean false If true, applies memory_limit to each process/thread.
max_file_size integer 1024 Max size of any file the program can create, in kilobytes (1 MB).
redirect_stderr_to_stdout boolean false If true, merges stderr into stdout.
enable_network boolean false If true, allows the program to access the internet.

The execution environment is the "Judge0 Extra CE" runtime. Only packages/tools installed in this environment are available for use.

source values

Used by status, score, thumbnail, feedback, and on_missing.

Value Description Required additional fields
"file" Read content from a file produced during execution. path — relative path to the file.
"stdout" Capture the program's standard output stream. (none)
"stderr" Capture the program's standard error stream. (none)
"static" Use a hardcoded string value. content — the static string to use.

format values

Used by feedback, thumbnail, and on_missing.

Value Description
"text" Displayed as a raw text code block. ANSI-colored text is auto-detected and rendered in a styled terminal.
"terminal" Displayed as ANSI-colored text in a styled terminal emulator.
"markdown" Rendered as Markdown (converted to HTML).
"html" Rendered in a sandboxed iframe. JavaScript is allowed but restricted.
"image" Displayed as an image. Content can be a URL, base64-encoded data URI, or a binary image file.
"ppm" Displayed using a PPM image viewer. Accepts .ppm, .pgm, or .pbm files.

Constraints:

on_missing fallback

If your script crashes or an output file is never produced, you can define a fallback using on_missing. It accepts the same source, path / content, and format fields as the parent block and may itself be nested.

{
  "label": "Test Report",
  "source": "file",
  "path": "output/report.txt",
  "format": "text",
  "on_missing": {
    "source": "stderr",
    "format": "text"
  }
}

on_missing is evaluated when:


Example Configurations

All examples use a FizzBuzz problem: given a number N from stdin, print each number from 1 to N, replacing multiples of 3 with "Fizz", multiples of 5 with "Buzz", and multiples of both with "FizzBuzz".

Each language has three complexity levels:

Level Testing Approach Scoring
Simple Bash runs the program against .in/.out files, uses diff Binary: 100 or 0
Normal Python subprocess script (or compiled test harness for C/Java) checks each case Proportional: (passed/total) × 100
Full Unit tests (Python unittest) or weighted test harness (C/Java) Weighted: each test has assigned points

Python

IDE Runtime

Simple

The minimal config — just runs the student's file:

{
  "version": "1.0",
  "run": {
    "command_prefix": "python3 main.py"
  }
}

Download ZIP

Normal

Adds editable arguments and stdin input:

{
  "version": "1.0",
  "run": {
    "command_prefix": "python3",
    "args": "main.py",
    "args_placeholder": "Command-line arguments",
    "allow_custom_args": true
  },
  "input": {
    "allow_editing": true,
    "placeholder": "Enter a number",
    "text": "15"
  }
}

Download ZIP — contains config.json + run script

Full

Adds a syntax-check compile step and execution limits:

{
  "version": "1.0",
  "compile": {
    "command_prefix": "python3 -m py_compile main.py"
  },
  "run": {
    "command_prefix": "python3",
    "args": "main.py",
    "args_placeholder": "Command-line arguments",
    "allow_custom_args": true
  },
  "input": {
    "allow_editing": true,
    "placeholder": "Enter a number (e.g. 20)",
    "text": "20"
  },
  "execution": {
    "cpu_time_limit": 5,
    "wall_time_limit": 10,
    "memory_limit": 128000,
    "enable_network": false
  }
}

Download ZIP — contains config.json + run script

Post/Submission

Simple

Runs the program against three input files and diffs against expected output. All-or-nothing scoring:

{
  "version": "1.0",
  "run": "python3 submission/main.py < 1.in > all_outputs.txt && python3 submission/main.py < 2.in >> all_outputs.txt && python3 submission/main.py < 3.in >> all_outputs.txt && cat 1.out 2.out 3.out > all_expected.txt && diff all_outputs.txt all_expected.txt > /dev/null && echo 100 || echo 0",
  "score": {
    "source": "stdout",
    "default": 0,
    "max_points": 100
  }
}

Download ZIP — contains config.json + .in/.out test data files

Normal

A Python test script runs the program per test case via subprocess. Proportional scoring:

{
  "version": "1.0",
  "setup": {
    "submission_dir": "submission"
  },
  "execution": {
    "cpu_time_limit": 10,
    "wall_time_limit": 20
  },
  "status": {
    "source": "file",
    "path": "output/status.txt",
    "default": "Error"
  },
  "score": {
    "source": "file",
    "path": "output/score.txt",
    "default": 0,
    "max_points": 100
  },
  "feedback": [
    {
      "label": "Test Results",
      "source": "file",
      "path": "output/results.txt",
      "format": "text"
    }
  ]
}

Download ZIP — contains config.json + run script + test_fizzbuzz.py (subprocess-based test runner that writes score/status/results to output/)

Full

Uses unittest to import and test the student's function directly. Weighted scoring, thumbnail, multiple feedback panels with fallbacks:

{
  "version": "1.0",
  "setup": {
    "submission_dir": "submission",
    "remove_paths": ["solution_template.py"]
  },
  "execution": {
    "cpu_time_limit": 10,
    "wall_time_limit": 20,
    "memory_limit": 256000,
    "enable_network": false
  },
  "status": {
    "source": "file",
    "path": "output/status.txt",
    "default": "Error",
    "success_matcher": "^All Tests Passed"
  },
  "score": {
    "source": "file",
    "path": "output/score.txt",
    "default": 0,
    "max_points": 100
  },
  "thumbnail": {
    "source": "file",
    "path": "output/thumbnail.txt",
    "format": "text"
  },
  "feedback": [
    {
      "label": "Test Report",
      "source": "file",
      "path": "output/report.md",
      "format": "markdown",
      "on_missing": {
        "source": "stderr",
        "format": "terminal"
      }
    },
    {
      "label": "Program Output",
      "source": "stdout",
      "format": "terminal",
      "visible_if_empty": false
    }
  ],
  "show_files": true
}

Download ZIP — contains config.json + run script + run_tests.py (weighted unittest runner) + solution_template.py (starter code deleted via remove_paths)


C

IDE Runtime

Simple

Compile and run with no options:

{
  "version": "1.0",
  "compile": {
    "command_prefix": "gcc -o fizzbuzz main.c"
  },
  "run": {
    "command_prefix": "./fizzbuzz"
  }
}

Download ZIP

Normal

Editable compiler flags, editable run arguments, and stdin input:

{
  "version": "1.0",
  "compile": {
    "command_prefix": "gcc",
    "args": "-o fizzbuzz main.c",
    "args_placeholder": "Compiler flags",
    "allow_custom_args": true
  },
  "run": {
    "command_prefix": "./fizzbuzz",
    "args_placeholder": "Command-line arguments",
    "allow_custom_args": true
  },
  "input": {
    "allow_editing": true,
    "placeholder": "Enter a number",
    "text": "15"
  }
}

Download ZIP — contains config.json + compile script + run script

Full

Strict compiler flags and execution limits:

{
  "version": "1.0",
  "compile": {
    "command_prefix": "gcc",
    "args": "-Wall -Werror -O2 -o fizzbuzz main.c",
    "args_placeholder": "Compiler flags",
    "allow_custom_args": true
  },
  "run": {
    "command_prefix": "./fizzbuzz",
    "args_placeholder": "Command-line arguments",
    "allow_custom_args": true
  },
  "input": {
    "allow_editing": true,
    "placeholder": "Enter a number (e.g. 20)",
    "text": "20"
  },
  "execution": {
    "cpu_time_limit": 5,
    "wall_time_limit": 10,
    "memory_limit": 128000,
    "max_processes_and_or_threads": 1,
    "enable_network": false
  }
}

Download ZIP — contains config.json + compile script + run script

Post/Submission

Simple

Compiles and runs against .in/.out files. All-or-nothing:

{
  "version": "1.0",
  "compile": "gcc -o fizzbuzz submission/main.c",
  "run": "./fizzbuzz < 1.in > all_outputs.txt && ./fizzbuzz < 2.in >> all_outputs.txt && ./fizzbuzz < 3.in >> all_outputs.txt && cat 1.out 2.out 3.out > all_expected.txt && diff all_outputs.txt all_expected.txt > /dev/null && echo 100 || echo 0",
  "score": {
    "source": "stdout",
    "default": 0,
    "max_points": 100
  }
}

Download ZIP — contains config.json + .in/.out test data files

Normal

A C test harness compiled together with the student's code. Tests the fizzbuzz() function directly:

{
  "version": "1.0",
  "setup": {
    "submission_dir": "submission"
  },
  "compile": "gcc -O2 -o test_runner test_fizzbuzz.c submission/fizzbuzz.c -lm",
  "execution": {
    "cpu_time_limit": 5,
    "wall_time_limit": 10
  },
  "status": {
    "source": "file",
    "path": "output/status.txt",
    "default": "Error"
  },
  "score": {
    "source": "file",
    "path": "output/score.txt",
    "default": 0,
    "max_points": 100
  },
  "feedback": [
    {
      "label": "Test Results",
      "source": "file",
      "path": "output/results.txt",
      "format": "text",
      "on_missing": {
        "source": "stderr",
        "format": "terminal"
      }
    }
  ]
}

Download ZIP — contains config.json + compile script + run script + test_fizzbuzz.c (test harness that calls extern const char* fizzbuzz(int n) and writes results to output/)

Full

Weighted scoring, strict compilation, thumbnail, multiple feedback panels:

{
  "version": "1.0",
  "setup": {
    "submission_dir": "submission",
    "remove_paths": ["fizzbuzz_template.c"]
  },
  "compile": "gcc -Wall -Werror -O2 -o test_runner test_fizzbuzz.c submission/fizzbuzz.c -lm",
  "execution": {
    "cpu_time_limit": 5,
    "wall_time_limit": 10,
    "memory_limit": 128000,
    "max_processes_and_or_threads": 1,
    "enable_network": false
  },
  "status": {
    "source": "file",
    "path": "output/status.txt",
    "default": "Error",
    "success_matcher": "^All Tests Passed"
  },
  "score": {
    "source": "file",
    "path": "output/score.txt",
    "default": 0,
    "max_points": 100
  },
  "thumbnail": {
    "source": "file",
    "path": "output/thumbnail.txt",
    "format": "text"
  },
  "feedback": [
    {
      "label": "Test Report",
      "source": "file",
      "path": "output/report.md",
      "format": "markdown",
      "on_missing": {
        "source": "stderr",
        "format": "terminal"
      }
    },
    {
      "label": "Compiler Output",
      "source": "stderr",
      "format": "terminal",
      "visible_if_empty": false
    }
  ],
  "show_files": true
}

Download ZIP — contains config.json + compile script + run script + test_fizzbuzz.c (weighted test harness writing markdown report) + fizzbuzz_template.c (starter code deleted via remove_paths)


Java

IDE Runtime

Simple

Compile and run:

{
  "version": "1.0",
  "compile": {
    "command_prefix": "javac Main.java"
  },
  "run": {
    "command_prefix": "java Main"
  }
}

Download ZIP

Normal

Editable compiler flags and stdin input:

{
  "version": "1.0",
  "compile": {
    "command_prefix": "javac",
    "args": "Main.java",
    "args_placeholder": "Compiler flags",
    "allow_custom_args": true
  },
  "run": {
    "command_prefix": "java Main",
    "args_placeholder": "Command-line arguments",
    "allow_custom_args": true
  },
  "input": {
    "allow_editing": true,
    "placeholder": "Enter a number",
    "text": "15"
  }
}

Download ZIP — contains config.json + compile script + run script

Full

Full options with execution limits:

{
  "version": "1.0",
  "compile": {
    "command_prefix": "javac",
    "args": "Main.java",
    "args_placeholder": "Compiler flags",
    "allow_custom_args": true
  },
  "run": {
    "command_prefix": "java",
    "args": "Main",
    "args_placeholder": "Command-line arguments",
    "allow_custom_args": true
  },
  "input": {
    "allow_editing": true,
    "placeholder": "Enter a number (e.g. 20)",
    "text": "20"
  },
  "execution": {
    "cpu_time_limit": 10,
    "wall_time_limit": 20,
    "memory_limit": 256000,
    "enable_network": false
  }
}

Download ZIP — contains config.json + compile script + run script

Post/Submission

Simple

Compiles and runs against .in/.out files. All-or-nothing:

{
  "version": "1.0",
  "compile": "javac submission/Main.java",
  "run": "java -cp submission Main < 1.in > all_outputs.txt && java -cp submission Main < 2.in >> all_outputs.txt && java -cp submission Main < 3.in >> all_outputs.txt && cat 1.out 2.out 3.out > all_expected.txt && diff all_outputs.txt all_expected.txt > /dev/null && echo 100 || echo 0",
  "score": {
    "source": "stdout",
    "default": 0,
    "max_points": 100
  }
}

Download ZIP — contains config.json + .in/.out test data files

Normal

A Java test harness compiled with the student's code. Tests the FizzBuzz.fizzbuzz() method directly:

{
  "version": "1.0",
  "setup": {
    "submission_dir": "submission"
  },
  "execution": {
    "cpu_time_limit": 10,
    "wall_time_limit": 20,
    "memory_limit": 256000
  },
  "status": {
    "source": "file",
    "path": "output/status.txt",
    "default": "Error"
  },
  "score": {
    "source": "file",
    "path": "output/score.txt",
    "default": 0,
    "max_points": 100
  },
  "feedback": [
    {
      "label": "Test Results",
      "source": "file",
      "path": "output/results.txt",
      "format": "text",
      "on_missing": {
        "source": "stderr",
        "format": "terminal"
      }
    }
  ]
}

Download ZIP — contains config.json + compile script + run script + TestFizzBuzz.java (test harness that calls FizzBuzz.fizzbuzz() and writes results to output/)

Full

Weighted scoring, thumbnail, multiple feedback panels:

{
  "version": "1.0",
  "setup": {
    "submission_dir": "submission",
    "remove_paths": ["FizzBuzzTemplate.java"]
  },
  "execution": {
    "cpu_time_limit": 10,
    "wall_time_limit": 20,
    "memory_limit": 256000,
    "enable_network": false
  },
  "status": {
    "source": "file",
    "path": "output/status.txt",
    "default": "Error",
    "success_matcher": "^All Tests Passed"
  },
  "score": {
    "source": "file",
    "path": "output/score.txt",
    "default": 0,
    "max_points": 100
  },
  "thumbnail": {
    "source": "file",
    "path": "output/thumbnail.txt",
    "format": "text"
  },
  "feedback": [
    {
      "label": "Test Report",
      "source": "file",
      "path": "output/report.md",
      "format": "markdown",
      "on_missing": {
        "source": "stderr",
        "format": "terminal"
      }
    },
    {
      "label": "Compiler Output",
      "source": "stderr",
      "format": "terminal",
      "visible_if_empty": false
    }
  ],
  "show_files": true
}

Download ZIP — contains config.json + compile script + run script + TestFizzBuzz.java (weighted test harness writing markdown report) + FizzBuzzTemplate.java (starter code deleted via remove_paths)