A pattern-based adult self-reflection tool exploring autism-leaning, ADHD-leaning, and mixed presentations — including masked, internalized, and emotionally-regulated patterns that conventional screeners tend to miss.
https://amy2213.github.io/MaskCoreCost/
Not a validated screening instrument. Not a diagnosis. Structured reflection only.
- 89 questions across 6 modules: Core Pattern Scan, Mask / Core / Cost, Emotional Regulation, Development and Context, Bias-Aware Presentation, Rule-Out Tension.
- Full ADHD coverage — inattentive, hyperactive/impulsive, emotional dysregulation, rejection sensitivity, time perception, and working memory.
- Expanded autism coverage — special interests, stimming, pragmatics/literal interpretation, social reciprocity.
- 12 result profiles ranked by independent match score, with near-matches surfaced as secondary.
- Signed-weight scoring with correct negative-weight normalization.
- Computed uncertainty ceiling (no magic constants).
- Profile matching by weighted criteria, not order-dependent if/else.
- Local session persistence with schema versioning.
- Keyboard-first navigation (1–5 to answer, 0 for "not sure", ← → to navigate).
- Pre-submit answer review with jump-to-edit.
- JSON export, print-to-PDF, shareable anonymized result URLs.
- Interactive SVG radar chart with per-dimension tooltips.
- Dark void palette with neon triad accent (cyan / violet / magenta).
- Glass panels with gradient borders, backdrop blur, ambient glow.
- Canvas particle field, mouse-reactive, pauses when tab is hidden.
- Cinematic "synthesizing" transition before results reveal.
- Fully motion-reduced variant when
prefers-reduced-motion: reduce. - Print stylesheet for clean PDF exports.
Because app.js uses ES modules, you can't just double-click index.html. You need a local server.
- Open the folder in VS Code
- Install the Live Server extension
- Right-click
index.html→ Open with Live Server
# Python
python3 -m http.server 8000
# Node.js
npx serve .Then open http://localhost:8000.
- Create a new GitHub repo (public) and push this folder.
- Go to Settings → Pages.
- Under Source, select
Deploy from a branch, pick your default branch, and root (/). - Save. GitHub will publish the site at
https://<user>.github.io/<repo>/within a minute.
No build step required — everything is pure static HTML/CSS/JS.
If you rename the repo or change hosting, the app still works because all imports are relative.
| File | What it holds |
|---|---|
index.html |
Markup + asset wiring. No logic. |
styles.css |
Design tokens, dark neon aesthetic, responsive layout, print styles. |
questions.js |
QUESTIONS, MODULES, RESPONSE_OPTIONS, SPECIFICITY_WEIGHT, SCHEMA_VERSION. Pure data. |
app.js |
Scoring pipeline, UI rendering, persistence, keyboard, radar, particles, exports. |
The separation is strict: questions.js is the single source of truth for content and can be edited without touching logic.
answers
│
▼
accumulateRawScores() ─── handles positive + negative weights symmetrically
│
▼
normalizeScores() ─── 0 = no signal, 100 = full signal
│
├── computeOverlap()
├── computeContradiction()
├── computeConsistency()
└── computeUncertaintyScore()
│
▼
computeConfidence() ─── weighted combination, with burnout/recency penalties
│
▼
buildProfile() ─── ranked match against PROFILE_LIBRARY
│
▼
renderResults() ─── cards, radar, notes, crisis block (conditional)
Append to the QUESTIONS array in questions.js:
{
id: "Q090", // unique, sequential
module: "core_pattern_scan", // must exist in MODULES
order: 90, // used within module for ordering
text: "...",
type: "surface", // surface|internal|cost|context|developmental|ruleout
domains: ["..."], // freeform tags, informational only
reverse: false, // true = "high answer = low signal"
specificity: "high", // high|medium|broad
signals: { autism: 2, ... }, // signed weight per signal
followup_trigger: null // reserved for future branching
}New questions appear in the right module automatically — traversal order is (module position in MODULES, order field).
- Add
{ id: "...", title: "..." }toMODULESinquestions.js. - Add the module to
MODULE_UNCERTAINTY_WEIGHTinapp.js(1 for typical, 2 for high-uncertainty domains like developmental history). - Assign questions to the new
moduleid.
Append to PROFILE_LIBRARY in app.js:
{
id: "my_profile",
label: "My Profile Label",
criteria: [
{ score: "autism", op: ">=", value: 55, weight: 1.0 },
{ score: "masking", op: "<", value: 40, weight: 0.8 }
]
}A profile fires when its weighted criteria cross 50%, and the highest-matching profile wins.
Append to VISIBLE_RESULT_CARDS in app.js:
["Label Shown", "signal_key_in_scores"]Append to RADAR_DIMENSIONS in app.js with a label and a plain-language desc. Keep to 6–9 total; too many spokes become unreadable.
During the assessment:
1–5— choose an answer0— "Hard to tell / Not sure"←— previous question→orEnter— next question
Everything stays on your device. Answers are persisted to localStorage under the key mcc.session.v2 and never leave the browser. The "Copy share link" feature encodes only the final normalized score vector in the URL hash — not your individual answers.
- Optional follow-up branches when specific signals spike (machinery exists in
followup_trigger, currently unused). - Per-module retake without redoing the whole assessment.
- Rendered PDF export (currently uses browser print).
See CHANGELOG.md.