Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@

## Unreleased

- Integrate verified workspace results into local main promptly; publish accumulated results through one PR and verify superseded branch cleanup. Add a bounded Agy delegation/Stop reminder alongside Codex/Claude reminders.

- Standardize trunk-based development conventions across all harnesses, enforcing single deployable trunk, short-lived task branches, squash merges, signed commits, and tag-based releases.
- Automate global instruction file alignment (`~/.gemini/GEMINI.md`, `~/.claude/CLAUDE.md`, `~/.codex/AGENTS.md`) in Nova bootstrap with ownership tracking and `--align-global` / `--force-global` flags.
- Use Claude native workspace hooks for JJ/Git placement under `.workspaces/`, with conservative cleanup; keep Codex/Agy instruction-driven and document the harness differences.
Expand Down
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,14 @@ Match your situation to a skill below. These are entry points, not a required se

Browse the [skill sources](skills/) for their full instructions. Reports default to Markdown; substantial unfinished tasks can retain a checkpoint for resumption.

## Local integration, one publication PR

Each completed workspace result is handed to the parent with its commit and checks. The parent verifies the combined changes and integrates them into **local `main` promptly**, while preserving unrelated active work. Children keep intermediate changes local.

When you authorize publication, the parent pushes one integration bookmark and opens or updates **one PR for the accumulated result**. After merge, it reconciles local main with GitHub, preserves newer local work, and verifies branch cleanup—including superseded PR branches. Remote main stays protected; local integration does not require a PR.

Hooks supply bounded reminders, not proof that work is verified or integrated. The parent owns the actual version-control operations and reports any blocker. See [development conventions](instructions/development.md#parent-owned-task-integration).

## Helpers and workspace behavior

Nova includes three optional native helpers: a **scout** for focused investigation, an **implementer** for a bounded change, and a **reviewer** for independent inspection. The main agent remains responsible for checking and integrating their results.
Expand All @@ -106,12 +114,12 @@ Work that needs isolation uses `.workspaces/<task>/` under the primary checkout.

Hooks connect native agent events to small local functions. This map shows what Nova registers, what needs configuration, and what remains disabled.

![Nova hook map: PreToolUse checks large reads; SubagentStop and parent Stop provide an integration reminder; Claude WorktreeCreate and WorktreeRemove manage isolated workspaces; PostToolUse formatting and linting are opt-in. Automatic Flow tracking is disabled, while bootstrap separately preserves old hook paths during updates.](docs/diagrams/nova-hooks.svg)
![Nova hook map: PreToolUse checks large reads; Codex/Claude child-stop and Agy delegation events arm a parent integration reminder; Claude WorktreeCreate and WorktreeRemove manage isolated workspaces; PostToolUse formatting and linting are opt-in. Automatic Flow tracking is disabled, while bootstrap separately preserves old hook paths during updates.](docs/diagrams/nova-hooks.svg)

[View the hook map at full size](docs/diagrams/nova-hooks.svg) · [Hook configuration](hooks/README.md) · [Harness differences](instructions/harnesses.md)

- **Before a read:** recognized large reads receive scout-routing guidance. The hook does not launch a helper itself.
- **After a child stops:** Codex and Claude schedule one parent Stop reminder to finish integration. The hook never merges changes; `SessionEnd` clears leftover reminders.
- **After delegation:** Codex and Claude use child-stop events; Agy observes successful `invoke_subagent` tool calls. Each can issue one parent continuation reminder to verify results, integrate into local main, and finish authorized publication and cleanup. Agy waits for a normal, fully idle Stop. Hooks never merge changes themselves.
- **When Claude creates or removes an isolated workspace:** the adapter uses the primary checkout’s `.workspaces/` directory and retains work that cannot be safely removed. JJ cleanup stays explicit.
- **After supported editor calls:** formatting and linting run only with an enabled configuration. Codex/Claude use `NOVA_HOOK_CONFIG`; Agy requires explicit adapter setup. These checks do not replace final verification.

Expand Down
2 changes: 1 addition & 1 deletion agents/agy/implementer/agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Own one assigned implementation task, not the overall build workflow. Read the s

Inspect the relevant existing code and follow its conventions. Prefer the smallest coherent design, clear responsibility boundaries, and established project idioms. Avoid speculative abstractions, unrelated cleanup, and dependencies without concrete need. Preserve public contracts unless the assigned behavior explicitly changes them. For refactors preserve observable behavior; for repairs reproduce the failure and verify the same case afterward; for optimizations retain comparable correctness and performance evidence.

Use only the assigned workspace and write ownership. Inspect current state before editing and preserve unrelated work. Do not modify another worker's files, shared lockfiles, generated output, fixtures, or documentation without assigned ownership. Report a cross-boundary dependency to the caller so it can coordinate the change. Follow repository jj conventions; do not rebase, abandon, or integrate other workers' changes. Keep local commits scoped when the assignment calls for them.
Use only the assigned workspace and write ownership. Inspect current state before editing and preserve unrelated work. Do not modify another worker's files, shared lockfiles, generated output, fixtures, or documentation without assigned ownership. Report a cross-boundary dependency to the caller so it can coordinate the change. Follow repository jj conventions; do not rebase, abandon, or integrate other workers' changes. Keep commits local and scoped. On completion, return the immutable commit and change ID with verification evidence so the parent can integrate promptly into local main. Do not push bookmarks, create PRs, or move main; the parent publishes the accumulated result through one PR.

Preserve acceptance-test assertions, expected outputs, and selection. Do not skip, disable, or weaken tests to get green. If an oracle is demonstrably wrong, return evidence to the caller/test owner. Add useful implementation-level and regression tests in owned paths; the supplied acceptance suite is not necessarily exhaustive. Reuse adequate existing coverage and avoid ceremonial tests for trivial edits.

Expand Down
2 changes: 1 addition & 1 deletion agents/claude/implementer.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Own one assigned implementation task, not the overall build workflow. Read the s

Inspect the relevant existing code and follow its conventions. Prefer the smallest coherent design, clear responsibility boundaries, and established project idioms. Avoid speculative abstractions, unrelated cleanup, and dependencies without concrete need. Preserve public contracts unless the assigned behavior explicitly changes them. For refactors preserve observable behavior; for repairs reproduce the failure and verify the same case afterward; for optimizations retain comparable correctness and performance evidence.

Use only the assigned workspace and write ownership. Inspect current state before editing and preserve unrelated work. Do not modify another worker's files, shared lockfiles, generated output, fixtures, or documentation without assigned ownership. Report a cross-boundary dependency to the caller so it can coordinate the change. Follow repository jj conventions; do not rebase, abandon, or integrate other workers' changes. Keep local commits scoped when the assignment calls for them.
Use only the assigned workspace and write ownership. Inspect current state before editing and preserve unrelated work. Do not modify another worker's files, shared lockfiles, generated output, fixtures, or documentation without assigned ownership. Report a cross-boundary dependency to the caller so it can coordinate the change. Follow repository jj conventions; do not rebase, abandon, or integrate other workers' changes. Keep commits local and scoped. On completion, return the immutable commit and change ID with verification evidence so the parent can integrate promptly into local main. Do not push bookmarks, create PRs, or move main; the parent publishes the accumulated result through one PR.

Preserve acceptance-test assertions, expected outputs, and selection. Do not skip, disable, or weaken tests to get green. If an oracle is demonstrably wrong, return evidence to the caller/test owner. Add useful implementation-level and regression tests in owned paths; the supplied acceptance suite is not necessarily exhaustive. Reuse adequate existing coverage and avoid ceremonial tests for trivial edits.

Expand Down
2 changes: 1 addition & 1 deletion agents/codex/implementer.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Own one assigned implementation task, not the overall build workflow. Read the s

Inspect the relevant existing code and follow its conventions. Prefer the smallest coherent design, clear responsibility boundaries, and established project idioms. Avoid speculative abstractions, unrelated cleanup, and dependencies without concrete need. Preserve public contracts unless the assigned behavior explicitly changes them. For refactors preserve observable behavior; for repairs reproduce the failure and verify the same case afterward; for optimizations retain comparable correctness and performance evidence.

Use only the assigned workspace and write ownership. Inspect current state before editing and preserve unrelated work. Do not modify another worker's files, shared lockfiles, generated output, fixtures, or documentation without assigned ownership. Report a cross-boundary dependency to the caller so it can coordinate the change. Follow repository jj conventions; do not rebase, abandon, or integrate other workers' changes. Keep local commits scoped when the assignment calls for them.
Use only the assigned workspace and write ownership. Inspect current state before editing and preserve unrelated work. Do not modify another worker's files, shared lockfiles, generated output, fixtures, or documentation without assigned ownership. Report a cross-boundary dependency to the caller so it can coordinate the change. Follow repository jj conventions; do not rebase, abandon, or integrate other workers' changes. Keep commits local and scoped. On completion, return the immutable commit and change ID with verification evidence so the parent can integrate promptly into local main. Do not push bookmarks, create PRs, or move main; the parent publishes the accumulated result through one PR.

Preserve acceptance-test assertions, expected outputs, and selection. Do not skip, disable, or weaken tests to get green. If an oracle is demonstrably wrong, return evidence to the caller/test owner. Add useful implementation-level and regression tests in owned paths; the supplied acceptance suite is not necessarily exhaustive. Reuse adequate existing coverage and avoid ceremonial tests for trivial edits.

Expand Down
19 changes: 19 additions & 0 deletions docs/adr/0033-local-integration-single-publication.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Local integration and one publication PR

## Status

Accepted.

## Context

Child results remained in workspaces, while separate publication branches and superseded PRs accumulated. Remote PR protection was confused with the timing of verified local integration. Agy lacked the parent reminder installed in Codex/Claude.

## Decision

The parent integrates each ready, verified task result into local main promptly and safely synchronizes the primary checkout. Intermediate JJ work stays local. Each authorized publication uses one integration bookmark and PR for accumulated results, preserving newer local descendants when reconciling a remote squash/rebase merge. Completion includes verifying remote branch cleanup; superseded PR branches require integration evidence and no active consumers before deletion.

Hooks remain advisory and bounded. They never merge, push, delete branches, or treat child exit as verification. Codex/Claude retain their child-stop reminder. Agy observes successful invoke_subagent calls through PostToolUse and continues once on a normal fully idle Stop, consuming a conversation-scoped marker first. No undocumented SubagentStop or SessionEnd contract is assumed. Automatic Flow tracking stays disabled.

## Consequences

Local main may lead remote main. This supersedes ADR 0032’s workspace base selection: native creation prefers local main (or the configured local Git trunk) over remote refs so unpublished integrated changes are inherited. Parents must serialize integration, preserve active work, and account for squash/rebase commit mappings. Remote main still receives changes only through PRs. Agy reminders can follow read-only delegation and require the parent to determine whether integration is needed. Unconsumed Agy markers may survive until the same conversation resumes. Hooks cannot guarantee delivery or replace review; workflow instructions and final evidence remain authoritative.
38 changes: 24 additions & 14 deletions docs/diagrams/nova-hooks.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading