Personal Artifacts Manual
April 21, 2026 ยท View on GitHub
This is the canonical operational guide for personal NEXO artifacts.
Use it when deciding what to create, where it should live, how it should be declared, and how to verify that it is wired correctly. This document exists so NEXO does not improvise different rules across sessions or operators.
Scope
This manual covers five decisions:
- Should this be a personal script?
- Should this be a skill?
- Should this be a personal plugin?
- Should this only be a personal schedule attached to an existing script?
- Should this be a core repo change instead of a personal artifact?
If a proposal touches personal runtime behavior and this manual does not clearly cover it, stop and update this document before building more surface.
If the agent needs a reusable procedure for making this decision, the canonical matching skill is SK-CREATE-NEXO-PRIMITIVE.
For product-engineering context around releases, managed installs, source/runtime separation, and operator-safe migrations, pair this manual with docs/product-engineering-handbook.md.
First Principles
- Personal artifacts live under
NEXO_HOME, not in reposrc/, unless the behavior should ship to every user. - Git installs update on merge to
main. Release tags are for packaged artifacts and public release surfaces, not the only path by which users get code updates. - A personal cron is not a separate code artifact. It is a managed schedule attached to a personal script or daemon helper.
- Do not edit LaunchAgent plist files directly for personal automation. Use the official scheduling flow.
- Personal scripts and skill executables must use the stable CLI or
nexo_helper.py, not direct imports into NEXO databases or private runtime internals. - The source of truth is behavior implemented in the runtime: parser, scheduler, doctor, loader, and templates.
Decision Tree
Use this order:
- If the change should become part of the product for every user, make a core repo change.
- If you need a new MCP tool callable by Claude/Codex/Desktop sessions, make a personal plugin.
- If you need a reusable procedure for agent behavior, make a skill.
- If you need autonomous execution, file/system work, or scheduled automation, make a personal script.
- If you already have the script and only need timing, add or reconcile a personal schedule to that script.
Quick Selection Table
| Need | Correct artifact | Why |
|---|---|---|
| Background automation, cron, file operations, integrations, reports | Personal script | Scripts are the runtime unit for autonomous execution and scheduling |
| Reusable operator procedure, guide, executable task wrapper | Skill | Skills encode repeatable process for the agent layer |
| New MCP tool in the runtime surface | Personal plugin | Plugins expose callable tools to every connected client |
| Timing only for an existing script | Personal schedule | Scheduling is attached to scripts, not invented as a separate artifact |
| Capability should ship to all users | Core repo change | Personal artifacts should not masquerade as product changes |
Ownership Map
| Surface | Purpose | Lives in |
|---|---|---|
| Core plugins | Product MCP tools for all users | src/plugins/ in source, NEXO_HOME/core/plugins/ in installed runtimes |
| Personal plugins | Local runtime extensions/overrides | NEXO_HOME/personal/plugins/ |
| Core skills | Product skill definitions | src/skills/ in development, NEXO_HOME/core/skills/ in packaged installs |
| Personal skills | Local operator skills | NEXO_HOME/personal/skills/ |
| Personal scripts | Local automation units | NEXO_HOME/personal/scripts/ |
| Runtime-staged skill executables | Generated/executable runtime copies | NEXO_HOME/skills-runtime/ |
| Personal schedules | Registry + LaunchAgent/systemd artifacts attached to scripts | discovered from NEXO_HOME/personal/scripts/ metadata and registered by the scheduler |
| Product docs | Shared documentation for all users | repo docs/ and README.md |
Artifact Rules
1. Personal Scripts
Use a personal script when the main thing you need is autonomous work:
- scheduled execution
- file or shell operations
- repeated operational jobs
- data pulls, reports, integrations
- agentic automation that should run outside an interactive session
Official path:
- Scaffold with
nexo scripts create NAMEor copytemplates/script-template.py/templates/script-template.sh. - Add inline metadata in the first 25 lines.
- Validate with
nexo scripts doctor NAME. - Reconcile with
nexo scripts reconcile. - Verify with
nexo scripts list,nexo scripts schedules, andnexo doctor --tier runtime.
Do not:
- query
nexo.dborcognitive.dbdirectly - import internal DB modules from personal scripts
- hardcode
claude -por provider-specific model choices inside the script - touch personal LaunchAgents manually
2. Skills
Use a skill when the main thing you need is a reusable procedure for the agent layer:
- a standard operating procedure
- a repeatable multi-step workflow
- a task the agent should match and apply by intent
- a procedure that may later gain an executable script
Modes:
guide: text-only procedureexecute: script-backed skillhybrid: guide plus executable
Official path:
- Create a directory under
NEXO_HOME/personal/skills/for personal use. - Add
skill.jsonandguide.md. - Add
script.pyorscript.shonly if the skill truly needs execution. - Sync with
nexo skills sync. - Inspect with
nexo skills get .... - Validate behavior with
nexo skills apply ... --dry-runbefore relying on it.
Do not use a skill as a substitute for a background scheduler. Skills are agent procedures, not cron entries.
3. Personal Plugins
Use a personal plugin when you need a new MCP tool available to the local NEXO runtime and all connected clients:
- a custom tool callable from Claude Code, Codex, or Claude Desktop
- a runtime extension that does not belong in public core yet
- a local override of a repo plugin by filename
Official path:
- Scaffold with
nexo_personal_plugin_create(...)ortemplates/plugin-template.py. - Edit the file in
NEXO_HOME/personal/plugins/. - Load or reload with
nexo_plugin_load("filename.py"). - Verify with
nexo_plugin_list().
Use a companion script only if the plugin needs a local automation unit as part of its implementation.
Do not use a plugin when a script is enough. If the capability is "run this job every day", that is a script plus schedule problem, not a plugin problem.
4. Personal Schedules
Use a personal schedule only as an attachment to a personal script or daemon helper.
Official path:
- Declare schedule metadata in the script.
- Run
nexo scripts reconcileto sync filesystem state and create/repair the schedule. - Verify with
nexo scripts schedulesandnexo doctor --tier runtime.
You may use nexo_schedule_add(...) directly for one-off schedule creation, but declared metadata plus reconcile is the canonical path for persistent personal automation.
Do not:
- edit
~/Library/LaunchAgents/manually - create unmanaged manual schedules and then pretend they are canonical
5. Core Repo Changes
Use a core repo change when:
- the behavior is part of NEXO Brain as a product
- every user should get it via merge/update
- the docs are meant to define product-wide behavior
- the code lives in
src/,docs/,templates/, tests, or release assets
If the change belongs to all users, do not hide it in NEXO_HOME/.
Scheduling Metadata: Exact Supported Rules
The declared schedule parser accepts these relevant keys:
namedescriptionruntimecron_idscheduleinterval_secondsschedule_requiredrecovery_policyrun_on_bootrun_on_wakeidempotentmax_catchup_age
Supported formats
schedule=HH:MMschedule=HH:MM:weekdayinterval_seconds=<positive integer>max_catchup_age=<integer seconds>
Unsupported formats
monthly:12d- arbitrary cron expressions
- direct plist edits presented as official scheduling
If both schedule and interval_seconds are set, the declaration is invalid.
If a script is declared as scheduled, it must also provide:
nameruntimecron_idschedule_required=true
Monthly Jobs: Canonical Pattern
LaunchAgent calendar scheduling does not give NEXO a dedicated "day 1 of month" metadata format in the declared parser.
The canonical pattern for monthly personal jobs is:
- declare a daily calendar schedule, for example
schedule=09:00 - keep
schedule_required=true - inside the script, self-gate on day-of-month and skip on other days unless forced
This is the live pattern already used by monthly jobs such as gbp-monthly-audit.py.
Do not invent monthly:1 in inline metadata.
Stub vs Real Runner
Some workflows have both:
- a helper/template/stub file
- the actual executable runner
Before attaching a schedule, verify which file is the real executable.
Rule:
- schedule the real runner
- do not schedule the stub/helper if its own header says the real job lives elsewhere
This matters especially for paired .py and .sh variants of the same logical workflow.
Verification Checklists
Personal script checklist
- file is in
NEXO_HOME/personal/scripts/ - metadata matches the real runtime behavior
nexo scripts doctor NAMEpassesnexo scripts reconcilecompletes without driftnexo scripts schedulesshows the expected managed schedulenexo doctor --tier runtimedoes not report orphan/drift for that script
Skill checklist
- skill lives in the right directory (
NEXO_HOME/personal/skills/for personal) skill.jsonandguide.mdexist- optional script uses stable CLI / helper path
nexo skills syncsucceedsnexo skills getshows the expected metadatanexo skills apply --dry-runbehaves coherently
Personal plugin checklist
- file lives in
NEXO_HOME/personal/plugins/ - tool names are explicit and prefixed appropriately
nexo_plugin_load(...)succeedsnexo_plugin_list()shows the plugin and tools- if the plugin depends on a script, that companion artifact is documented
Core change checklist
- change lives in repo, not
NEXO_HOME - docs/tests updated together
- branch/PR/merge path is used
- remember: git users get the code at merge to
main; packaged release surfaces are a second channel
Anti-Patterns
Never do these:
- edit personal LaunchAgent plist files directly and call it the official path
- document unsupported parser syntax as if it were real
- turn a personal workaround into product-wide documentation without code backing it
- use a skill for a background scheduler problem
- use a plugin when a simple script is enough
- schedule a helper/stub file instead of the real executable
- change only a runtime/personal copy of a core plugin and forget the repo source of truth
- claim users need a tagged release to get git-based updates after merge to
main
What To Tell Another Session
If another session proposes a personal artifact flow, check these first:
- Does it match the actual parser/scheduler formats?
- Does it keep ownership correct: core vs
NEXO_HOME? - Is it using reconcile/doctor instead of manual plist edits?
- Is it scheduling the real runner, not the stub?
- Is it describing git-update vs packaged-release behavior honestly?
If any answer is "no", correct the plan before building.
Source Anchors
This manual is grounded in the current runtime behavior implemented in:
docs/writing-scripts.mddocs/runtime-templates.mddocs/skills-v2.mdsrc/script_registry.pysrc/plugins/schedule.pysrc/plugins/personal_scripts.pysrc/plugins/personal_plugins.pysrc/plugin_loader.pysrc/doctor/providers/runtime.pytemplates/script-template.pytemplates/email-template.mdtemplates/plugin-template.pytemplates/skill-template.mdtemplates/skill-script-template.py
When runtime behavior changes, update this manual in the same change.