Fyuu Tutor
Treat project files as the control plane. Keep reusable tutoring logic in this Skill and all learner data, sources, generated content, and live state in the private project.
Route the project
Choose the primary pipeline by the evidence that will prove success:
- Capability: the learner must explain, apply, build, decide, or transfer. Read capability.md.
- Certification: the learner must satisfy a dated exam outline and perform under exam conditions. Read certification.md.
- Language: the learner must understand or produce a target language. Read language.md.
If the success evidence is ambiguous, ask one question that would change the route. Do not route by input format: a PDF, topic, case, or question bank can support any suitable pipeline.
Start
- Locate the project and require
project.tomlpluspipeline.toml. - Run
python3 scripts/validate_project.py --project <project-dir>. - Read core.md and project-schema.md.
- Read the selected pipeline above. When materials must be acquired or converted, also read material-pipeline.md.
- Read teaching-loop.md before planning a lesson, evaluating an attempt, or choosing the next step.
- Before producing any lesson HTML, read ui-contract.md and confirm the UI kit is installed.
- Read the declared private profile, then
MISSION.md,NOTES.md,CURRICULUM.mdwhen present, andSTATUS.md.
Operate
- Confirm synchronization and require
STATUS.mdto beidle. - Claim one bounded project task with
update_status.pybefore changing project artifacts. - Preserve source files and keep production, study, demonstrated performance, and stable mastery distinct.
- Apply the shared material and teaching loops plus only the selected pipeline.
- Put generated lessons, aids, evidence, and history only in the project paths declared by
project.toml. - Run deterministic checks and record remaining manual uncertainty.
- If the private workspace has a documented standing portal authorization and its private portal config enables incremental publishing, run the portal wrapper after releasing the claim. Before production, check the public Skill repository is clean on
main; a dirty public-source worktree is a blocker, never a reason to stash or commit unrelated changes.
Pipeline defaults yield to the private learner profile and project rules for teaching choices. Nothing may override the safety and state rules in core.md.
Finish
- Run the project validator, the smallest pipeline-specific check, and
check_links.py. - Record produced artifacts, learner evidence, unresolved errors, blockers, and one next action separately.
- Rebuild indexes after changing HTML output or
STATUS.md. - Release the claim and verify
STATUS.mdisidle.
Deterministic tools
- Project lifecycle:
scripts/create_project.py,validate_project.py,update_status.py. - Output checks:
scripts/check_links.py,build_index.py,audit_privacy.py. - Material processing:
scripts/pdf/. - Optional pipeline implementations:
scripts/pipelines/. - UI kit:
scripts/sync_ui_kit.py(install/check/upgrade) andscripts/validate_lesson_ui.py(--file/--project/--kit/--self-test). - Learning portal:
scripts/build_portal.py(explicit--projectonly; never publishes all projects by default). Deployment viascripts/deploy_portal.shrequires--publishand is only called through the wrapper. - Offline export:
scripts/export_offline_lesson.pycreates a self-contained single-file HTML by inlining locallesson.cssandlesson.js. Use it when a reader needs a standalone copy for Safari or offline reading. It rejects remote resources,file://links, and missing assets and never modifies the source file. - Portal publish wrapper:
scripts/publish_portal.pyreads a private<workspace>/portal.tomlto determine which projects are eligible for publishing, runs all validators, builds the portal, scans for private data, and callsdeploy_portal.sh --publish.publish_after_validationis an enforced technical eligibility gate and defaults tofalsewhen absent; it is not authorization. A workspace-level standing authorization requires an automatic--publishafter a covered course is produced and released; current-session authority is for a one-off release. Do not ask again for ordinary courses covered by standing authorization. A dirty public Skill worktree, a new project/source/purpose, a changed portal roster/destination, or any privacy/validation failure is a blocker requiring separate authority. If publishing fails, record the failure reason in STATUS.md without changing course status. Never bypass the wrapper to copy private directories into gh-pages. - Public routes are assigned by
build_portal.pyfrom ASCII project IDs, never from private folder names or localized display names. Every publishable HTML filename must be lowercase ASCII kebab-case (for example0002-shared-vision.html); the builder rejects anything else. Keep source-page links local (../assets/,../index.html); the builder rewrites its published copy to the short public route. Course-generation Agents must not hard-code GitHub Pages URLs.
Do not install dependencies, publish content, expose private sources, or resolve another agent's claim without explicit user authority.