SPARC browser acceptance — October 9, 2026
Result: partial acceptance. Both selection cycles ran with real provider responses in the localhost hotfix application. All five instructional primitives were observed in both versions, including the different stopping behavior. Two observed problems and the untested cases below prevent a blanket acceptance claim.
Environment and scope
- Native hotfix watcher at
http://localhost:3200; in-app Chromium browser; existing local administrator account; synthetic answers only. - Uploaded the unchanged Student Selected and Agent Selected Confidence Interval TDF/stimulus pairs from the existing config repository through the application's upload UI. Import-as-copy and email were unchecked. The original Confidence Interval package was not changed.
- Real provider generation and scoring used the authored
openai/gpt-5.4-nanomodel, confirmed in the provider response. No substituted provider output or hidden score/state injection was used. - This walkthrough changed local lesson/test history data and this acceptance documentation. It did not edit application code, migrate data, deploy, commit, or push. Existing application, wiki, and config working-tree changes were preserved.
- Local screenshots and upload archives are ignored under
C:\dev\MoFaCTS\tmp\sparc-browser-acceptance. They are local evidence, not published wiki assets.
Student-selected version
| Check | Observed result |
|---|---|
| Opening and initial response | Standard opening displayed; keyboard entry, Tab to Submit, and Enter submitted the answer. One scored turn produced the six-option menu. |
| Menu/input boundary | Response field became read-only and Submit disabled while choosing. Focus moved to the first option. |
| Early progression | Move to the next target worked before full coverage; it returned another menu without adding a learner turn. |
| Question only | Generated one question; input regained focus. Reload restored the same question once. Answering returned directly to the menu. |
| Explanation and question | Explanation preceded one question. |
| Rich content and question | First request failed validation, as described below. Explicit retry produced a readable table/worked interpretation followed by one question. |
| Explanation, rich content, question | Explanation, table, and final question appeared in the required order. |
| AutoTutor response | Native acknowledgement and targeted elicitation appeared as one coherent response; no extra generic question was appended. |
| Fully covered practice | Coverage reached 3/3 at turn 3. Further selections and answers continued through turn 6, and the menu remained available. |
| Save/resume | Save and return reached Practice. Continue reopened 3/3 coverage, six turns, and all six menu options, without another assessment. |
Agent-selected version
| Synthetic response sequence | Observed production/output |
|---|---|
| Initial incorrect interpretation about individual people | Misconception start; native AutoTutor prompt and correction. |
| No-progress answer | dialogue.scaffold.misconception.prompt-no-progress; instruction.explanation-question. |
| Another no-progress answer | dialogue.scaffold.misconception.hint-no-progress; instruction.rich-question, rendered as a table and question. |
| Another no-progress answer | dialogue.scaffold.misconception.assertion; instruction.explanation-rich-question, with correct component order. |
| Corrected misconception | Misconception score returned to zero; an expectation-start production selected a pump. |
| Two subsequent uncertain answers | An expectation pump-progress response, then dialogue.scaffold.expectation.pump-no-progress invoking instruction.question. The first uncertainty response coincided with a coverage increase; this walkthrough did not audit cumulative AI scoring. |
| Full correct interpretation | 3/3 expectations and eight turns. No new question or agency menu; response input and Submit disappeared and Continue became available. |
| Reload and finish | Reload restored 3/3 and eight turns with Continue. Continue returned to Practice. |
No agency choice buttons were shown during the agent sequence. Both versions exercised the shared five-primitive catalog through their respective productions.
Observed problems
- Generated rich content was rejected once. Selecting Example or visual and a question produced
Invalid rich instruction: Unsupported rich instruction element. The failed raw output was not captured, so the offending tag is unknown. The app retained the accepted choice, disabled the other choices, and enabled an explicit retry of the same choice. Reload retained that binding; retry succeeded without another scored turn. This demonstrates recovery, but the initial generation was a real learner-visible failure. The provider prompt requests semantic HTML, while validation imposes a tag allowlist that is not enumerated in that prompt. Align the generation contract with the renderer's existing supported HTML and improve diagnostic specificity; do not weaken sanitization or substitute content. - Answer inputs have no accessible name. Both versions expose an unnamed textbox in the accessibility tree. The
text-input/fraction-inputbranch inmofacts/client/views/experiment/svelte/components/SparcNode.sveltedoes not associate the authored response label with the input. Keyboard focus and submission worked, but this does not satisfy accessible labeling.
Generated question relevance also warrants human review: several prompts revisited long-run coverage while the diagnostic selected-target identifier ended in e3. No target-binding defect or scoring regression was established by this observation, and no provider/scoring changes were made.
Still unverified
- Competing different choices against one menu in live Mongo: a second browser login invalidated the first session before both selections could reach arbitration. Session invalidation is not evidence of choice conflict handling. No authentication bypass was used.
- Deliberate double-submit, stale/tampered choice, and uncertain-history-write injection in a live browser. Existing automated contracts remain separate evidence.
- Feedback-bearing drill-node continuation into the next menu. These composite questions exercised the test-only path; native AutoTutor feedback is a different case.
- Image/figure asset rendering. The reference lessons supplied no image assets and generated tables/worked interpretations; this does not cover every supported rich form.
- Original AutoTutor reference lesson before/after comparison, a non-admin learner account, narrow/mobile layouts, full screen-reader announcements, and non-English localization.
- Direct numerical inspection of persisted logit deltas and live/hydrated passive probabilities. Browser progress is not evidence of this internal numerical contract.
Relation to earlier verification
The previously authorized Meteor integration run passed: harness 16, server 777 (15 pending), Chromium client 1,095 (7 pending), with zero server/client failures and exit code 0. Full typecheck, lint, the 165-test isolated SPARC suite, and 27 analytics-method tests had passed before this walkthrough. Those checks were not rerun: no application code changed, and authorization for another test:ci invocation was not available. Wiki diff/whitespace checks were performed for this documentation update.
Resolve the rich-output contract and input-label findings, then recheck those browser paths. Keep the remaining cases open until separately exercised; this run supports the core cycle behavior, not complete release or learner-study readiness.
October 11 navigation follow-up
The browser investigation now retains a screenshot, URL, and DOM observation at each relevant transition in ignored local evidence files. A fresh agent lesson reached 3/3 expectations, displayed Continue, and returned to the practice menu when Continue was pressed. Re-entry from the completed lesson's menu control stayed on the practice menu with the existing completed-lesson warning. This sequence did not reproduce the earlier sign-in initialization error.
A focused regression reproduced a separate concrete lifecycle defect: rejecting initialization after the owning screen unmounted still called failure routing, and completing readiness after unmount still rendered and started the runtime. The mounted surface now owns a launch generation, revoked before unmount cleanup. The launch orchestrator returns an explicit cancelled result for stale completions; its failure routing, render readiness, and runtime startup cannot take effect on a departed screen. The app initialization wrapper also discards stale coordinator updates. Active initialization failures remain visible. Both failing cases now pass; all 14 focused launch/lifecycle contracts, full-app typecheck, and lint passed. Lint retained 28 existing ostrio-files warnings. No Meteor integration or release check was run.
Normal password sign-in calls Meteor.logoutOtherClients. Fresh-tab sign-ins during the earlier walkthrough could therefore invalidate an earlier lesson session; this was a testing confound, not evidence that completion intentionally routes to sign-in. The later walkthrough uses one authenticated tab. After the lifecycle change, the student dialogue resumed with its saved figure and accepted answer, and Save and return reached the practice menu without an initialization error. The exact trigger in the earlier detached tab remains unconfirmed. October 11 final live follow-up: a seven-turn agent-selected dialogue used weak, partially correct answers rather than repeated empty refusals. It selected Pump, Prompt (unsupported), Pump after partial progress, and Prompt (supported) at assistance 1.33, all on the same active expectation. Supported generation completed through Seedream. Automatic aspect ratio first returned a 1424-by-800 figure whose remaining whitespace was judged excessive; a stronger compact-panel instruction then returned 1440-by-720, with a smaller gap, larger readable labels, and correctly aligned endpoint labels. The final figure is more compact, but the model does not guarantee an exact pixel-tight bounding box. The prior generated figures remained in saved history; they were not replaced. The corrected selection labels were observed live. A complete answer reached 3/3 expectations, left only Continue, and Continue returned to the authenticated practice menu without an initialization error. Relevant screens, URLs, and DOM observations are retained locally; no production data was used. Full-app typecheck and lint passed, all 137 SPARC contracts passed, and all 14 focused launch/lifecycle contracts passed. No new Meteor integration invocation, release check, commit, or push was performed. October 11 cross-topic figure test: after the user stopped confidence-interval testing, the unchanged Compound Interest demo was exercised through the live admin competitive policy. Four weak, partially correct responses led to Pump, Pump after partial progress, Prompt (unsupported), and Prompt (supported), all on the compounding-mechanism target. The supported question asked what role previously earned interest has in the next period's interest calculation. Seedream returned a loaded 1568-by-672 figure with separately labeled Deposit and Earlier interest inside one Account, alongside Interest calculation and Next period. The grouping is relevant to the target and the compact layout is legible; however, the central equals sign is semantically ambiguous because the account balance is an input to the calculation, not equal to it. This is an observed figure-quality deficiency, not a provider or rendering failure. The figure and complete tutor context were retained locally and the browser was left at that question for review. No topic-specific prompt adjustment, runtime code change, package change, automated test rerun, commit, or push was performed in this cross-topic trial.
October 11 four-system figure comparison
The current localhost build generated supported prompts through real scored tutor turns in Natural Selection, Reinforcement/Punishment, and Confidence Interval, and restored the previously generated current-build Compound Interest agent example. All four also ran through student-selected menus and generated a supported prompt after the explicit button choice. Three new student-selected comparison packages were added to canonical config storage and uploaded through MoFaCTS; Confidence Interval used its existing student-selected package. Content, expectations, misconceptions, and KC identities were retained; package and page identities are distinct. The completed old Confidence Interval agent test was reset using its lesson settings before a fresh run. No application code, production deployment, or Meteor integration-test invocation was part of this comparison.
| System | Selected expectation | Agent width | Student width |
|---|---|---|---|
| Natural Selection | autotutor.natural-selection-001.kc.e3: Individuals with traits better suited to the environment leave more surviving offspring. | 400px | 380px |
| Reinforcement/Punishment | autotutor.reinforcement-punishment-001.kc.e1: Reinforcement increases the future likelihood of a behavior; punishment decreases it. | 320px | 320px |
| Compound Interest | autotutor.compound-interest-001.kc.compounding-mechanism: Earned interest remains in the account and becomes part of the balance used to calculate the next period’s interest. | 360px | 360px |
| Confidence Interval | autotutor.stats-confidence-interval-001.kc.e1: Repeated-sampling interpretation assumes random samples and the same interval-construction method across repetitions. | 400px | 400px |
Eight tutor screenshots, eight figure detail screenshots, and four student-menu screenshots were collected locally with exact expectation IDs and full texts. Images remain private DynamicAssets attached to durable tutor turns in the local system, rather than authored stimulus assets. Returning to the menu and reopening restored the Natural Selection, Reinforcement/Punishment, and Compound Interest agent examples. Student menus offered Pump, Prompt unsupported, Prompt supported, Hint, Assertion, and Move to the next KC; their supported move recorded the student-choice production rather than competitive selection.
Quality findings retained for review: the Natural Selection student figure grouped one Other-trait-colored icon under the Better-suited trait bracket; the Compound Interest student figure included a connection arrow despite the intended omission and accessible description saying the connection was absent. The rendering and selection paths worked, but these generated-content errors prevent claiming consistent instructional image quality. One OpenRouter connection timeout interrupted the initial Natural Selection student assessment; an ordinary resubmission succeeded, and the final dialogue showed one accepted learner turn.