Skip to content

feat: add Hermes-inspired continuity and autonomy tools - #19

Merged
Clondin merged 1 commit into
mainfrom
codex/hermes-harvest
Aug 21, 2026
Merged

feat: add Hermes-inspired continuity and autonomy tools#19
Clondin merged 1 commit into
mainfrom
codex/hermes-harvest

Conversation

@Clondin

@Clondin Clondin commented Aug 21, 2026

Copy link
Copy Markdown
Owner

Summary

  • add persistent conversation continuity with Context Vault search, snapshots, and references
  • add Workspace Time Machine checkpoints, diffs, rollback, and undo
  • add governed tool programs, deterministic routines, workrooms, delegation trees, and skill lifecycle controls
  • add import/exportable bot bundles and a continuity workspace UI
  • add database schema, migration, tests, architecture notes, and fork documentation

Validation

  • bun run typecheck
  • bun run build
  • biome format .
  • changed-file lint
  • 18 focused tests for compose state, context references, routine safeguards, workspace checkpoints, and workroom limits
  • drizzle-kit generate reported no schema drift
  • git diff --check

Full lint completed with 24 pre-existing warnings in unrelated files. The full test run reached 780 passing and 5 skipped; 83 environment-dependent failures require PostgreSQL, Windows symlink privileges, or hit an existing Windows path-normalization case.

@vercel

vercel Bot commented Aug 21, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
openbot Ready Ready Preview Aug 21, 2026 3:21pm

@Clondin
Clondin merged commit d9d80fd into main Aug 21, 2026
16 checks passed

@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: 489ceab43e

ℹ️ 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".

channelId: targetChannel.id,
agentId: input.targetAgentId,
title,
...(parent ? { parentRunId: parent.taskRunId } : {}),

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Allow child runs to reference parents across channels

Every nested delegation passes the parent task as parentRunId, but channels.create always creates a fresh target channel while RunStore.create requires the parent run to belong to that same channel (server/src/runs/store.ts lines 512-523). Consequently, creating any delegation with parentDelegationId fails before the delegation is inserted, so the advertised nested-handoff flow cannot create a child run.

Useful? React with 👍 / 👎.

Comment thread server/src/index.ts
Comment on lines +510 to +512
...(await governedProgramTools({
tools: granted,
actor,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Apply routine allowlists inside governed programs

For a non-deterministic routine whose allowedTools includes openbot_run_tool_program, the wrapper is constructed over the complete granted set here and only the wrapper's outer name is filtered later. An approved program can therefore invoke granted tools omitted from the routine allowlist, bypassing the routine safeguard; build the wrapper from the filtered grants or reject programs containing excluded steps.

AGENTS.md reference: AGENTS.md:L84-L84

Useful? React with 👍 / 👎.

const id = `${Date.now().toString(36)}-${crypto.randomUUID()}`;
const directory = checkpointDirectory(rootPath);
await mkdir(directory, { recursive: true });
if (info) await copyFile(full, checkpointBlob(rootPath, id));

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Reject symlinked checkpoint sources

When a workspace contains a file symlink pointing outside its root, write-path resolution validates only the parent directory, and this copyFile follows the symlink and saves the external target's contents as a checkpoint blob. The subsequently exposed checkpoint-diff endpoint returns that blob, creating a read/exfiltration path for host or container files that ordinary workspace reads correctly reject.

AGENTS.md reference: AGENTS.md:L84-L84

Useful? React with 👍 / 👎.

Comment on lines +553 to +560
if (safeguards.deterministic === true) {
const program = safeguards.toolProgramId;
if (typeof program !== "string" || !program.trim()) {
return {
ok: false,
message: "A deterministic routine requires a reviewed tool program.",
};
}

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 Verify deterministic programs during routine preflight

For a deterministic routine, preflight only checks that toolProgramId is a nonempty string, so nonexistent, draft, another coworker's, or another owner's program is accepted and stored with preflightStatus: "passed". Every dispatch then fails in executeApprovedProgram; creation/update should verify that the referenced program is currently approved for this owner and routine agent while retaining the runtime recheck for later revocation.

Useful? React with 👍 / 👎.

Comment on lines +133 to +140
if (Number(counts?.total ?? 0) >= parent.maxChildren) {
throw new WorkConflictError(
`This handoff already has its maximum of ${parent.maxChildren} children.`,
);
}
if (Number(counts?.active ?? 0) >= parent.maxParallel) {
throw new WorkConflictError(
`This handoff already has ${parent.maxParallel} children running in parallel.`,

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 Serialize child-limit checks with child creation

When two child-delegation requests for the same parent execute concurrently, both can observe counts below maxChildren and maxParallel here and then both insert after the check. This permits the bounded handoff tree to exceed either configured limit; the count check and insertion need a shared transaction/parent lock or another atomic database constraint.

Useful? React with 👍 / 👎.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant