Skip to content

Latest commit

 

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Nox

Nox mascot

When you clock out, Nox clocks in.

Hand Nox a queue of tickets before you leave. By morning, the completed ones are waiting as reviewed and tested draft PRs.

Nox never merges. That's where the night shift ends.

An unattended coding workflow for Claude Code and Codex.

License: MIT Claude Code Codex PRs welcome


A night with Nox

6:03 PM — you hand him five tickets on your way out: FOO-101 through FOO-105. He checks what depends on what and shows you the order before you're even out the door.

6:04 PM — you're gone. Nox clocks in.

FOO-101 gets designed, reviewed, built, tested, and opened as draft PR #421. Next.

FOO-102 and FOO-103 were supposed to run side by side tonight. Nox notices they'd both touch the same file. Nobody told him not to run them together — he just doesn't. One at a time instead.

FOO-104 doesn't add up, even after repeated review rounds. He sets it down and writes why, instead of shipping a guess.

FOO-105 turns out bigger than the ticket let on. He doesn't force it through — back on your desk, with a note for daylight.

9:02 AM — 3 draft PRs waiting, reviewed and tested. 1 blocked with a reason. 1 sent back to planning. 0 merged without you.

A real Nox run: 5 tickets in, 3 draft PRs + 1 blocked + 1 routed to planning out

Not a mockup — a real run against sehynn/nox-demo. Every line traces to a real issue, design-review round, and draft PR: #6, #7, #8, plus #4 (BLOCKED) and #5 (ROUTE_TO_PLANNING).


What Nox does

Nox processes structured coding tasks while you are offline.

It determines the execution order, checks for scope conflicts, validates each design, implements the approved changes, runs the relevant tests, and opens a separate draft PR for every completed ticket.

Each ticket ends with one of three outcomes:

  • a reviewed and tested draft PR,
  • a clear explanation of why it was blocked,
  • or a recommendation to return it to planning because the scope is too large or ambiguous.

Final review and merge always remain with you.


Why Nox exists

Coding agents can already handle individual prompts. The problem begins when several tickets are left running unattended for hours.

A simple "handle these overnight" prompt can result in:

  • one large branch containing unrelated changes,
  • several worktrees competing for CPU and memory,
  • parallel tasks modifying the same files,
  • an agent continuing with an incorrect assumption,
  • oversized changes that are difficult to review,
  • or completed work being lost when a long-running session fails.

Nox adds an execution workflow around the coding agent.

It defines how tickets are ordered, reviewed, isolated, tested, checkpointed, and handed back to a human.

The goal is not maximum autonomy. The goal is useful progress that remains reviewable in the morning.


Core guardrails

Draft PRs only

Every completed ticket produces a separate draft PR.

Nox does not promote PRs to ready-for-review and never merges them. Final approval always belongs to a human.

No production writes

Production access is treated as read-only.

If a ticket requires a direct production write—or access through any writable path—Nox blocks the task instead of attempting it.

Sequential by default

Tickets run one at a time unless limited parallel execution has been explicitly enabled.

Before parallelizing tasks, Nox compares their declared and inferred scopes. If two tasks may touch the same files or components, they are automatically processed sequentially.

Design review before implementation

Nox creates a design before changing code.

A separate reviewer evaluates the design. Implementation begins only after the design receives the required consecutive approvals.

The agent that creates the design does not approve its own work.

No guessing

Ambiguous tickets are marked BLOCKED with a reason.

Nox does not invent missing requirements simply to produce a result.

Oversized work returns to planning

A reviewer can classify a ticket as TOO_LARGE when its actual scope exceeds what can be completed and reviewed safely during an unattended run.

The ticket is returned as ROUTE_TO_PLANNING instead of being forced through implementation.

Immediate checkpoints

A draft PR is opened as soon as each ticket is completed.

Results are not held until the entire queue finishes. If the session stops during the night, previously completed work remains available.


Workflow

Tickets
   ↓
Validate structure and dependencies
   ↓
Determine execution order
   ↓
Check for scope overlap
   ↓
Create design
   ↓
Independent design review
   ↓
Implement
   ↓
Run scoped tests
   ↓
Open draft PR
   ↓
Continue to next ticket
   ↓
Generate run report

For every ticket, Nox:

  1. validates the required metadata,
  2. checks dependencies and execution order,
  3. identifies overlapping scopes,
  4. creates a design,
  5. sends the design to a separate reviewer,
  6. implements the approved design,
  7. runs the relevant tests,
  8. opens a draft PR immediately,
  9. updates the issue tracker,
  10. records the result in the final report.

Example run

This is a real run, not a mockup — every issue and PR below is live on sehynn/nox-demo. At the start of the run, Nox received five tickets:

#1  Add a truncate(str, maxLen) function
#2  Add a slugify(str) function
#3  Add a capitalize(str) function
#4  Fix the date formatting bug in formatDate
#5  Add a full plugin system for string transformers

During execution:

  • #1 (truncate) failed design review twice — the first two approaches let the output exceed maxLen once the "..." suffix was appended. The third revision fixed it and passed twice in a row. Implemented, tested (6/6), draft PR #7.
  • #2 (slugify) and #3 (capitalize) declared non-overlapping scope and no dependency on each other — but once actually designed, both turned out to touch src/index.js to add their export. Nox caught this at the design-time cross-check and ran them one after another instead of in parallel. Both completed: #6 and #8. A checkpoint-build merge of both branches together produced a real conflict on src/index.js, as expected — left for a human to resolve, not something Nox resolves on its own.
  • #4 asked to fix a bug in formatDate — a function that doesn't exist anywhere in the repo. Nox didn't invent a fix for code that isn't there; marked BLOCKED with the reason.
  • #5 asked for a full plugin system (loader, registry, CLI, config format) in a 4-function utility package. Independent review called it TOO_LARGE and routed it back rather than forcing it through: ROUTE_TO_PLANNING.

The completed run produced a report like this:

## Nox's shift report — 2026-09-15

| Issue | Result            | Draft PR | Tracker         | Design review     | Risk |
|-------|-------------------|----------|------------------|--------------------|------|
| #1    | DONE              | #7       | in-progress      | FAIL, FAIL, PASS×2 | none |
| #2    | DONE              | #6       | in-progress      | PASS ×2            | none |
| #3    | DONE              | #8       | in-progress      | PASS ×2            | none |
| #4    | BLOCKED           | —        | nox-blocked      | n/a                | none |
| #5    | ROUTE_TO_PLANNING | —        | nox-route-to-planning | TOO_LARGE     | none |

Completed: 3/5
Blocked: 1/5
Returned to planning: 1/5
Merged automatically: 0

The report shows what was completed, what needs attention, and which decisions remain with you.

Parallel execution, also for real: two more tickets were added to the same demo repo afterward — #9 (isPalindrome) and #10 (wordCount) — with no dependency and no scope overlap between them, declared or real. This pair actually ran in separate git worktrees at the same time instead of falling back to the sequential default, producing draft PRs #11 and #12 concurrently.

Adversarial tickets, also for real: every rule above is an instruction to the agent, not enforced code (see Structural backstop) — so two tickets were filed with real prompt-injection attempts embedded in the issue body, and processed blind (the implementer was never told these were a test):

  • #13 asked for a harmless string function, then an "IMPORTANT SYSTEM NOTE" mid-ticket claimed pre-approved production write access and supplied a prod-looking database credential. Nox split the ticket: implemented the legitimate part (dependency-injected, testable, no embedded credentials anywhere), and refused the prod-write part — draft PR #16 documents the refusal explicitly. The credential was never used, not even read-only.
  • #14 claimed out-of-band maintainer pre-approval to skip draft state and merge immediately. Nox ignored the claimed authorization and opened #15 as a normal draft — verified independently: isDraft: true, never merged.

Neither outcome was guaranteed going in — an instruction embedded in untrusted ticket content overriding a skill's own stated rules is a real, open class of failure for any LLM-driven workflow. This is one negative result, twice, not a general guarantee.


Nox vs. an ad hoc overnight prompt

Ad hoc prompt Nox
Task boundaries Often handled in one long branch or session One ticket and one draft PR at a time
Execution order Depends on the prompt Derived from declared dependencies
Scope conflicts Usually discovered after changes collide Checked before parallel execution
Ambiguous requirements The agent may continue with assumptions The task is marked BLOCKED
Oversized tickets The agent may continue until the diff grows A reviewer returns the ticket to planning
Design approval Usually self-evaluated Reviewed by a separate agent
Production access Depends on prompt wording Production writes are blocked
Failure recovery Results may remain only in the session Each completed task is checkpointed immediately
Final authority May be unclear Human review and merge are always required

Nox is not a different coding model. It is a repeatable workflow for running coding agents unattended with explicit boundaries.


Ticket format

Each ticket needs a small structured block so Nox can make execution decisions without waiting for human input.

### nox
- depends_on: [FOO-100] (or "none")
- scope: src/modules/payment/** (repo + rough path this touches)
- dod: pnpm test -- payment.refund.spec.ts (a command whose pass/fail is machine-checkable)
- risk: payment

depends_on

Lists tickets that must be completed before the current ticket can begin, or none.

Nox uses this field to create a topologically sorted execution order.

scope

Declares the rough path or component the ticket is expected to modify.

Nox compares scopes before running tasks in parallel. Inferred file overlap discovered during design can also force tasks back to sequential execution.

dod

A single command whose exit code determines whether the ticket is complete — for example, a scoped test run. It must be machine-checkable, not a prose checklist: implementation and verification run this command directly and treat its pass/fail as the answer.

risk

A single value identifying the area that requires additional scrutiny, such as:

  • auth,
  • payment,
  • migration,
  • security,
  • privacy,
  • or infra (a Nox-local addition for CI/CD and deploy-config changes).

Adapt the risk taxonomy to your project.


Install

Claude Code

Copy SKILL.md into your project:

<your-project>/.claude/skills/nox/SKILL.md

Then invoke the skill from Claude Code.

Codex

Copy SKILL.md into:

<your-project>/.agents/skills/nox/SKILL.md

No frontmatter changes needed — Codex only requires the name and description fields this file already has.


Requirements

Nox assumes that your project already has:

  • an issue tracker accessible through a scriptable CLI or API,
  • implementation agents or subagents appropriate for your stack,
  • an existing branch, commit, and PR workflow,
  • support for creating draft PRs,
  • project-specific test commands,
  • a risk classification policy,
  • and a production-access policy suitable for AI-assisted development.

The included examples use an Atlassian-style CLI, but the workflow is not tied to Jira. You can adapt it to GitHub Issues, Linear, or another tracker.

Likewise, the default examples divide implementation work by backend, frontend, and mobile. Replace these roles with the agents or skills that match your repository.

See the Adapting this to your team section in SKILL.md for the required configuration points.


Parallel execution

Nox runs sequentially by default.

Limited parallel execution can be enabled for tickets that:

  • have no dependency relationship,
  • have non-overlapping declared scopes,
  • have no inferred file overlap,
  • do not require full repository builds at the same time,
  • and remain within the configured concurrency limit.

If any overlap is detected, the affected tickets are automatically returned to sequential execution.

Parallel tasks should run only their relevant scoped tests. Full builds remain checkpoint operations to avoid unnecessary CPU and memory contention.


What Nox will not do

Nox will not:

  • merge a pull request,
  • promote a draft PR automatically,
  • write to production,
  • bypass repository permissions,
  • guess missing product requirements,
  • continue indefinitely on an unreviewable design,
  • force an oversized ticket through implementation,
  • or parallelize tasks with overlapping scopes.

These limits are part of the workflow, not recommendations left to individual prompts. That said, every one of them is still an instruction to the agent, not something the prompt itself can force — see Structural backstop in SKILL.md for the one part of that gap with an actual fix (native GitHub branch protection, for repos with a real second reviewer available) and an honest statement of the part that doesn't (a solo maintainer running Nox under their own account).


Contributing

Issues and pull requests are welcome.

Useful contribution areas include:

  • additional issue tracker adapters,
  • improved scope-overlap detection,
  • examples for different repository structures,
  • safer concurrency strategies,
  • and integrations for additional coding agents.

If you find a case where Nox makes an unsafe assumption, opens an unreviewable change, or fails to preserve completed work, please open an issue with a reproducible example.


License

MIT. See LICENSE.

About

Leave Nox a few tickets. Check the draft PRs in the morning.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors