Skip to content

feat(nano): add a standalone headless host - #111

Open
RomanEmreis wants to merge 4 commits into
mainfrom
feat/nano-standalone
Open

RomanEmreis wants to merge 4 commits into
mainfrom
feat/nano-standalone

Conversation

@RomanEmreis

@RomanEmreis RomanEmreis commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Add ferrus-nano for headless coding sessions in unregistered Git or non-Git workspaces, without HQ, task claims, or ferrus.db.

The standalone host shares Nano's engine, provider, native tools, instruction loader, and journal contracts. It uses private workspace-bound storage, guarded continuation, explicit local graph/read-only memory context, and optional external MCP peers. Release archives and installers include the companion binary; default Cargo features remain unchanged.

Closes #87.

Type

  • Bug fix
  • Feature
  • Enhancement
  • Performance
  • Documentation
  • Refactor
  • Security
  • Breaking change

Workflow impact (if applicable)

  • No impact
  • Minor change (does not alter lifecycle semantics)
  • Changes behavior of an existing step
  • Introduces new state/transition

Standalone completion is independent of managed submit/approval. Existing managed roles, task transitions, and registration behavior are preserved.

Checklist

  • I added/updated tests where it makes sense
  • I updated docs/examples if needed
  • This change is backwards-compatible (or clearly marked as breaking)
  • I ran formatting/lints locally (if applicable)

Notes for reviewers

  • Review workspace identity/locking, storage isolation, unknown-effect recovery, and taskless MCP filtering. No operation is replayed during continuation; cumulative usage is retained with a fresh per-attempt elapsed deadline.
  • Execution is explicitly trusted-local, without an OS sandbox or approval UI. Standalone locks coordinate standalone writers only; they do not coordinate with HQ or other harnesses.
  • Graph indexing is explicit. Known mutations leave a durable stale marker; external changes report unknown freshness. Memory access is structural and read-only; verified memory snippets and standalone interactive UI (Nano: reuse the conversation UI in the standalone executable #88) remain deferred.
  • Local validation: default and nano-openai,nano-mcp test suites; 11 standalone E2E tests; nano-openai-only E2E; formatting and Clippy across default/no-default/provider/MCP combinations. macOS dist packaging passed checksums, both binary smoke tests, arm64/deployment-target checks, and init/doctor.
  • Windows standalone E2E coverage is added to CI. Windows runtime and live model inference were not validated locally.

@RomanEmreis RomanEmreis added this to the Ferrus nano-agents milestone Oct 8, 2026
@RomanEmreis RomanEmreis self-assigned this Oct 8, 2026
@RomanEmreis RomanEmreis changed the title feat: nano standalone feat(nano): add a standalone headless host Oct 8, 2026
@RomanEmreis

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-09T07:32:21.437411Z 8cb9195 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e9693ab4aa

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/nano/standalone/context.rs Outdated
Comment thread src/nano/standalone/context.rs Outdated
Route recognized memory kinds to memory queries and return NotBuilt graph
availability with an index recommendation before standalone indexing.

Use Windows Known Folder paths in standalone fixtures and select workspace
locks by their persisted identity instead of scanning a shared directory.
@RomanEmreis

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f81bad794f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/nano/standalone/tools.rs
@RomanEmreis

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7838945a82

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/nano/standalone/context.rs Outdated
Comment thread src/nano/standalone/storage.rs Outdated
Comment thread install.sh
@RomanEmreis

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8cb9195390

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +327 to +329
let memory = memory::query::MemoryRevisionSelector::Revision(
status.revision_id.context("Memory has no publication")?,
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Pin memory only for requested domains

When a valid configured memory sidecar has no published project revision, such as immediately after creation but before indexing, a project_context_search or project_context call with domain: "repository" still reaches this unconditional unwrap and fails as generic context_unavailable before querying the otherwise available graph. Pin the memory revision only for memory and all requests so repository-domain retrieval remains independent of memory publication state.

AGENTS.md reference: AGENTS.md:L207-L211

Useful? React with 👍 / 👎.

Comment on lines +151 to +154
match graph::sqlite::open_for_query_at(&self.sidecar)? {
graph::sqlite::OpenQuerySidecarResult::Ready(sidecar) => Ok(Some(sidecar)),
graph::sqlite::OpenQuerySidecarResult::Absent => Ok(None),
_ => anyhow::bail!("Standalone graph sidecar requires migration or rebuild"),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Return structured status for incompatible graph stores

When repo-graph.db uses an older schema needing migration or an incompatible newer schema, this branch aborts before repository_graph_status can construct a response, and StandaloneTools collapses the failure to generic context_unavailable. Although the absent-sidecar case is now handled, this remaining state prevents the status tool from reporting Availability::Incompatible with the appropriate Index or Rebuild action, and its generic refresh suggestion may repeatedly fail.

Useful? React with 👍 / 👎.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Nano: add a standalone host and ferrus-nano executable

1 participant