The directory
dir resolves against the eval file. Sphynx reads two directories and nothing else:
Files outside those two directories are ignored unless the manifest names them, so a
README.md can document the profile without shipping. node_modules and .git are skipped at any depth.
The manifest
profile.json holds what is not a file. It is optional.
profile.json
If
systemPrompt, install or run names a file inside the profile directory, the file’s content is used. Otherwise the value is used as written, so "systemPrompt": "system.md" ships the file and "systemPrompt": "Be terse." ships the sentence. A value that names a file outside the directory is an error. env values are always literal.
install runs after both file stages, so it can read what the profile shipped, and before the case’s prepare step. A profile that sets run on any harness other than command is rejected.
Limits
Files are text. A file containing a NUL byte is skipped, so a checked-in binary does not fail the compile.
System prompts
The prompt is always written into the sandbox. Each harness receives it differently:
For file-based delivery, check the trajectory to confirm the harness read the instructions.
Identity
The profile name is part of the variant. Two profiles on the same harness, model and sandbox are two variants with separate histories, the same as two harnesses. The profile version is not. It is a hash of the files, system prompt, environment, install and run commands. When you edit a profile, the next batch adds a run on the same variant, and each run records the version it used. Renaming a file changes the version. Renaming the profile creates a new variant.Comparing fairly
Ship the same skills to every variant. Skills live in agent-specific directories such as.claude/skills and .agents/skills, so write them under workspace/ into every directory the compared harnesses read. Otherwise you measure the skills, not the harness.
Hold the model constant. If a profile needs a provider another variant cannot use, or the model ids do not overlap, the variants are not comparable. Say so next to the results instead of reading the difference.
Change one thing at a time. If the profile and the model both change between runs, you cannot tell which one moved the result.