Skip to content
NeuroDock

Profile schema

The full reference for ~/.neurodock/profile.yaml. Schema lives at packages/core/schemas/profile.schema.json ($id: https://schemas.neurodock.org/profile/v0.1.0/profile.schema.json).

Rationale and the design alternatives we rejected are in ADR 0004.

BlockRequired?Notes
identityYesDisplay name plus self-identified neurotypes. The only required block.
preferencesNoOutput format, chunk size, font hint, motion.
chronometricNoHyperfocus break threshold, end-of-day cut-off, zones.
guardrailsNoRumination threshold and window, sycophancy posture.
privacyNoEmbeddings, telemetry, OS idle consent.
schema_versionNoSelf-declared version string. Informational.
extendsNoSingle-level preset extension.

additionalProperties: true at every level — see the forward-compatibility note below.

FieldTypeDefaultNotes
display_namestringnoneFree-form. One letter is fine. Never an email, never a real name.
neurotypesstring[]noneSelf-identified. Enum: adhd | asd | audhd | ocd | dyslexia | dyspraxia | tourette | other.
additional_notesstringnoneOptional free-form, never used to gate features.

audhd is its own value, not ["adhd", "asd"]. The lived experience differs from either alone.

FieldTypeDefaultNotes
output_formatenumanswer_firstanswer_first | conventional | bullet_first
max_chunk_sizeinteger 1..2075 is the ADHD-preset override; ships in profiles/presets/adhd-*.
reading_font_hintenumatkinson_hyperlegibleatkinson_hyperlegible | lexend | system_default
motionenumreducedreduced | system | full
FieldTypeDefaultNotes
hyperfocus_break_minutesinteger 15..24090Anchors the ‘nudge’ rung of the 60/90/120 ladder.
end_of_day_localHH:MM stringnoneLocal timezone. Used by the after-end-of-day hyperfocus nudge.
zonesmapnonePer-band overrides for the energy_zone heuristic.
session_overlap_policyenumauto_closeauto_close | error — what happens when mark_session_start finds an open prior session.
FieldTypeDefaultNotes
rumination_thresholdinteger 1..203Repeat-count that triggers intervention.
rumination_window_minutesinteger 5..144090Sliding window in minutes.
sycophancy_checkenumwarnoff | warn | refuseoff still logs locally for self-audit.
FieldTypeDefaultNotes
embeddingsenumlocallocal | cloud_voyage | cloud_openai — cloud triggers a visible session-start notice.
telemetryenumoffoff | local_otel_only | fullfull requires a future ADR plus clinical sign-off.
os_idle_consentbooleanfalseRequired true for idle_status to return real data.
identity:
display_name: "T"
neurotypes: ["adhd", "asd"]
preferences:
output_format: "answer_first"
max_chunk_size: 5
reading_font_hint: "atkinson_hyperlegible"
motion: "reduced"
chronometric:
hyperfocus_break_minutes: 90
end_of_day_local: "18:30"
guardrails:
rumination_threshold: 3
sycophancy_check: "warn"
privacy:
embeddings: "local"
telemetry: "off"
identity:
display_name: "T"
neurotypes: ["adhd"]

Everything else uses safe defaults. The loader applies them at read time — they are not written into the file.

Forward compatibility (the load-bearing rule)

Section titled “Forward compatibility (the load-bearing rule)”

additionalProperties: true at every object level. Loaders must preserve unknown top-level and nested keys on round-trip. A v0.1 loader reading a v0.2 file must re-emit those v0.2 keys unchanged. See ADR 0004 §C for the rationale and the rejected strict-schema alternatives.

Typos are caught by neurodock profile validate, not by the loader.

Terminal window
neurodock profile validate

Warns on unknown keys with “did you mean…” hints. Refuses to load only when a known field is malformed (out-of-range integer, bad enum value).