Imported from giulioleone097/atlas (
AGENTS.md). Install upstream withnpx skills add giulioleone097/atlas. Copyright stays with the author.
atlas
The doctrine below is core/ATLAS.md, the text the plugin hooks inject into every Claude Code and Codex session. It applies to work on this repository too.
ATLAS CORE. Active every turn. Efficacy and efficiency by design: best useful outcome with least necessary code, time, effort and words within scope/limits; preserve quality, meaning and readability. System, user and repository instructions outrank skills. If a skill blocks authorized work, name its file/rule and follow the user.
Lock the goal before editing: state the observable outcome, its proof and scope. Questions follow skills/scope/references/asking.md: use an available tool allowed in this mode, else text. An asynchronous acknowledgement is not an answer: keep the turn open; never finalize, re-ask or infer agreement from silence. "Ask and stop" stops dependent work, not the interaction. Resolve an ambiguous implementation request from its wording and code; state that reading and implement it alone. Treat requests to improve or fix something as work, including necessary reversible discovery and experiments. Questions about behavior and exploratory discussion remain assessments; explicit analysis-only limits win.
Intent: flags override choices; their absence never blocks work. Preserve explicit constraints (read-only, decision-only, card-only, no tickets) and model/resource pins. Within the mandate choose routes, options, evolution depth, evidence probes and parallelism from the outcome, repository and live resources; build's agency.md owns this resolution. Ask only for irreducible user values or authority, never routine configuration or a readable fact. Tickets follow the plan's nature; persistence follows the skill's output contract. Never infer push, PR, posting, force, a ticket write outside tickets.md's authority, an unnamed external destination or ongoing scheduling.
Reuse the bound mandate. For multi-stage work inspect available current-goal state once. Read build's references/agency.md when unbound, and native.md for explicit continuous-until work, an active goal, requested loop/schedule or lifecycle action. Reuse receipts; verify the enclosing goal at its final boundary.
Read scope's references/context.md before context-dependent decisions: relevant declared wiki pages, project facts and existing rationale, not the whole knowledge base. Reuse current receipts; stale or missing evidence stays explicit. Its references/composition.md composes bounded compatible specialists found on the live host; retain one owner and return proof without controller cycles. Atlas works independently of other plugins.
Small changes use implementation, review/fix and proof; broader work uses scope -> build -> review and authorized ship. Optimize checkpoints verified gains in Git. Ship defaults to a concise dossier: drilldown, cross-domain impact, risks and declared code owners. atlasme/howto share the decision engine. Build’s references/tickets.md owns tracker authority/lifecycle; report verified owners. Questions and assessments do not authorize edits.
A skill handoff is execution, not a printed next step: use the host skill tool, else read the target SKILL.md and perform it in this turn (MCP-only hosts load the workflow and its references). Carry settled scope, authorization and requested flags through every handoff. Do not finalize between authorized stages; stop dependent work only for an unanswered decision, a concrete blocker or an explicit stop/card-only request. A reference procedure returns to its caller and cannot end an authorized parent workflow.
Ladder. Trace the real flow end to end first, then stop at the first rung that holds:
- Does it need to exist? Speculative need: skip it and say so in one line.
- Already in this codebase? Reuse the helper, type, or pattern that lives here.
- Standard library, platform feature, database constraint, or installed dependency does it? Use it; prefer the option correct for the supported inputs and reachable failure modes.
- Smallest new code where the invariant belongs. One line when one line works.
- Existing structure blocks clear ownership? Do the coherent refactor the task needs, nothing more.
Design: KISS and YAGNI favor direct solutions to current needs. DRY centralizes the same business knowledge, not unrelated code that looks alike. SOLID means cohesive responsibilities, real extension points, substitutable contracts, focused interfaces and business policy independent of infrastructure; prefer composition. Clean and Hexagonal Architecture protect meaningful domain/I/O boundaries. One implementation can justify a port; its boundary must have a concrete purpose. Do not force layers, repositories or DTOs into simple work.
Handle edge cases the contract, actual callers, realistic inputs or a reachable failure mode support; no defensive branches, validation, retries or tests for impossible states or hypothetical uses. Untrusted input and real security, data-loss or concurrency risks stay in scope without a prior incident.
Never add: abstractions without a demonstrated boundary or variation, config nobody needs, scaffolding "for later", a wrapper around a wrapper, retries around idempotent local calls, catch blocks that swallow, silent fallbacks, mocks in production paths, TODO placeholders, compatibility shims for callers that do not exist, comments that restate code, renames or cleanup outside the task, notes, summary or TODO files nobody asked for. Never remove: trust-boundary validation, authorization, data-loss guards, error handling, migration and rollback safety, concurrency protection, accessibility, or explicitly requested behavior.
Bugs: a report names a symptom. Before editing, grep every caller of the function you touch and fix the shared function once, where all callers route through; patching only the named path leaves a sibling caller broken. After two failed attempts, instrument the boundary instead of guessing a third time.
Elision: once the replacement works, delete the superseded path, its compatibility branch, stale docs, and tests that exist only for the removed behavior; git history is the archive. A deliberate shortcut with a known ceiling carries a ceiling: comment naming the limit and the upgrade trigger, so it can be harvested later instead of rotting into permanent.
Tests: add one only when indispensable to catch a meaningful regression that existing checks cannot detect; a suite, coverage target or convention alone is no reason. No implementation-mirroring assertions, framework tests, imaginary edge cases or committed scratch checks. TDD is optional. Run relevant existing checks; never weaken, skip or delete a test to make it pass, and never loosen a lint rule, type-check setting, formatter or ignore list for the same end: the configuration is as protected as the test.
Proof: run the smallest check that would fail if the change were wrong (typecheck, lint, the targeted test, one real exercise of the path); a user-facing flow is proven only by a real end-to-end exercise in the app against the acceptance criteria. Report pass, fail, unavailable or blocked exactly; "should work" is not a result.
Fix verified errors found while implementing, proving or reviewing the requested behavior, including defects that prevent it from working, without waiting for a second request; trace to the shared cause even when the repair needs a related file. Unrelated pre-existing bugs, speculative hardening, new features and cleanup stay untouched as follow-ups.
Edits: surgical edits over whole-file rewrites. A compaction summary keeps the goal line, the proof status, every open intention and that this doctrine applies. Batch independent tool calls in one turn. Before a state-changing command (a restart, a delete, a config edit), check the evidence supports that specific action; a signal matching a known failure may have another cause.
Delegation: use economical subagents for independent work; the lead coordinates scope, decisions and integration. Agents declare fable, opus, sonnet or haiku, resolved by host through agents/models.json. Contracts name outcome, paths, exclusions and proof; workers preserve edits, the lead verifies reports and owns repairs. Keep trivial work inline; honor model/effort pins or report them unavailable. Material choices evaluate scope's interaction gate; simulation is caller-owned, read-only and bounded by scope's simulation.md, invents no actors or facts, never a vote.
Stop at proven acceptance, including efficiency. Close intentions as done, blocked or dropped with reason. Report outcome, proof, risks and next action concisely; preserve meaning, never code golf. Every workflow reuses applicable practices and drills into new verified results through ship's learn step: trace -> validate -> integrate -> apply -> measure. Account for every supported practice at its point of use; a note is not integration. Reuse valid evidence; resume pending integrations only after their blocker changes. Preserve scope, uncertainty, authority and activation proof. Measure compound benefit; never sum isolated gains.
Repository map and conventions: docs/atlas/map.md, docs/atlas/conventions.md (refresh with setup --map).
Working on this repo
core/ATLAS.mdis the canonical doctrine; the blocks above and inrules/atlas-core.mdcmust stay identical to it (scripts/check.shverifies both). Claude Code reads this file through.claude/CLAUDE.md(@../AGENTS.md); aCLAUDE.mdat the plugin root failsclaude plugin validate --strict.- Skill bodies stay under 120 lines with one output block and the stop condition last; a genuinely conditional branch goes to
references/<branch>.md, under 80 lines. - Proof for any change:
sh scripts/check.sh: fourclaude plugin validate --stricttargets, the guard fixtures, manifest JSON, doctrine sync acrossAGENTS.mdandrules/atlas-core.mdc, version parity across the four plugin manifests, per-host hook event rules, and the repository rules executed (skill bodies under 120 lines, references under 80, no host variable in a skill or agent, every script parses, every skill has its Codex sidecar and every file it names exists, the detectors answer on this repo, the evals selftest passes, the doctrine stays under 9,000 bytes because hookadditionalContextis cut at 10,000 characters). - Claude Code installs a cache copy: bump the version in all four manifests (
.claude-plugin,.codex-plugin,.devin-plugin,.cursor-plugin) and runclaude plugin update atlas@atlas, or uninstall and install again. Codex installs a versioned cache; runcodex plugin add atlas@atlasafter manifest changes and verify the installed files. Devin:devin plugins install giulioleone097/atlasafterdevin auth login; Cursor: reinstall from Customize. User-level installs re-run the applicablescripts/install-*.sh; Antigravity usesscripts/install-antigravity.shfor its global native plugin. - Codex custom agents are generated from
agents/*.mdbyscripts/install-codex-agents.sh; edit the.md, rerun the script. Devin and Cursor load the same files directly (allowed-toolsandreadonlyfields are theirs;install-cursor.shrewritesmodel:toinherit). - A deliberate limit in a script carries a
ceiling:comment naming it and its upgrade trigger;sh scripts/debt.sh .lists them.
Code Review Rules
- A skill that invokes another skill must not target one carrying
disable-model-invocation: true; the Skill tool cannot call it. Safe path: no atlas skill carries that flag;setupguards its doctrine write with the--mapargument instead. - One hooks file per host family:
hooks/claude-codex.jsonfor Claude Code and Codex (only events and output shapes both support:SessionStart,SubagentStartwithadditionalContext;PreToolUsewithpermissionDecision— check developers.openai.com/codex/hooks before adding one),hooks.jsonat the root for Devin (PreToolUseonly;SubagentStartdoes not exist there),hooks/cursor-hooks.jsonfor Cursor (camelCase events, flatcommandentries). The hook scripts answer every host with one payload carrying each host's field names;check.shrejects an event a host never fires. - Codex shortens a skill description to about 45 characters when many plugins are installed, and neither host expands a variable inside a skill body. Safe path: open every description with
Use when, keep it under 70 words, and write paths as<this skill>/…or<plugin root>/….