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 |
Both config formats can be uploaded as either a ZIP package or a single JSON file.
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`
run and compile must be Bash scripts with no file extension.compile is only needed for compiled languages (C, C++, Java, ...).setup.submission_dir (default submission) is automatically cleared and replaced with the learner's files — you do not need to list it in remove_paths.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/runproperties inside itsconfig.json, those property values overwrite anycompile/runscript files present in the ZIP.
Note (IDE Runtime): in the IDE Runtime config,
compileandrunare objects, not strings, so the auto-conversion above only applies when those objects resolve to a single command. See IDE Runtime 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.
setup.remove_paths, then clear setup.submission_dir and inject the learner's submitted files there.compile (if present), then run, under the resource limits in execution.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.{
"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
}
{
"version": "1.0",
"run": "python3 -m pytest submission/ -v --tb=short && echo 100 || echo 0",
"score": {
"source": "stdout",
"default": 0,
"max_points": 100
}
}
| 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. |
setupControls 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_dirinremove_paths— that directory is cleared automatically.
compile and run scriptsThese 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
statusA 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. |
scoreThe numerical grade for the submission. Distinct from status — status 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. |
thumbnailOptional 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_missingfallback) must resolve to an image.
feedbackA 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_filesDefaults to true. Set to false to hide the post-execution file viewer in the learner's results UI.
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.
{
"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"
}
}
{
"version": "1.0",
"run": {
"command_prefix": "python3 main.py"
}
}
| 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. |
compile and run OptionsThe 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:
- Lock everything: put the entire command in
command_prefix, setallow_custom_argstofalse(or omit it).- Lock the binary, free the args:
command_prefix: "gcc",args: "-Wall -o program program.c",allow_custom_args: true.- Free the entire command: omit
command_prefix, put the default inargs, setallow_custom_args: true.
inputStandard 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. |
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 valuesUsed 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 valuesUsed 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:
status and score are always treated as text — format cannot be set on them.thumbnail defaults to "image". Also accepts "text", which renders the text as an SVG thumbnail.format is omitted on a feedback item, that item is skipped entirely.on_missing fallbackIf 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:
source is "file" and the file does not exist.source is "stdout" or "stderr" and the stream is empty/missing.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 |
The minimal config — just runs the student's file:
{
"version": "1.0",
"run": {
"command_prefix": "python3 main.py"
}
}
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
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
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
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/)
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)
Compile and run with no options:
{
"version": "1.0",
"compile": {
"command_prefix": "gcc -o fizzbuzz main.c"
},
"run": {
"command_prefix": "./fizzbuzz"
}
}
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
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
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
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/)
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)
Compile and run:
{
"version": "1.0",
"compile": {
"command_prefix": "javac Main.java"
},
"run": {
"command_prefix": "java Main"
}
}
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 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
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
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/)
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)