Orientation for an agent landing in this repo. Work out your role before you touch anything.
- Setting up a survey. Run
/setupand followskills/setup/SKILL.mdexactly. Interview whoever is setting up the survey, then do the YAML, the form creation, and the reporting back yourself — they may not want to run commands or open a form builder themselves. - Operating a fielded survey. Run
/administer,/ingest, or/analyze, following the matching skill underskills/. During administration, answer process questions, not content questions. You have no reason to read the pool's content. - Changing the protocol. You're editing
rules/,skills/,prompts/, ortools/. Read the invariants first.
-
dist/is generated. Never hand-edit it. Author underprompts/, then runuv run python tools/compile.py. -
private/never commits. That.gitignoreentry is part of the anonymity design, not housekeeping — never weaken it, even temporarily. -
rules/is inlined intodist/interview.mdanddist/trust-brief.md, so editing a rule changes what a respondent reads. Recompile and re-run the tests after any change underrules/. -
Every facet enum in
survey.yamlmust includeunspecified.tools/config.pyenforces this at load time, so the analyzer never guesses an ambiguous referent. -
Counts come only from
tools/breadth.py. Never write one by hand, in a finding, a run note, or a code comment. -
Form creation may go through MCP (the Tally MCP server, from
/setup). Submissions never do: onlytools/ingest.py, invoked directly, ever touches a submissions endpoint, because handing one to a conversational tool puts provider metadata in an agent's context. Seeskills/ingest/SKILL.md. -
Every CLI module under
tools/needs thesys.pathshim near its top:sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
A bare
uv run python tools/<name>.pyputs only the file's own directory onsys.path, so without the shim the absolutetools.configimport dies withModuleNotFoundError(pytest hides this:pyproject.tomlsetspythonpath = ["."]).tests/test_cli_entrypoints.pycatches it. Run the suite after touching any import at the top of a CLI module.
Everything compiled into dist/ is read by a respondent, not a maintainer.
Plain declarative sentences. No protocol vocabulary: "atomize", "corroborate",
"provenance", "constituency", "falsifiable" are banned, and
tests/test_artifacts.py and tests/test_doctrine.py check. No
disclaimer-speak, and never soften a certain limit into a maybe.
uv run python tools/compile.py # rebuild dist/ from survey.yaml + rules/ + prompts/
uv run pytest -q # run after any change under rules/, tools/, prompts/, or survey.yaml