Skip to content

Adversarial hardening + starter-kit harness (reconciled with Gemini) - #3

Open
soyerno wants to merge 4 commits into
mainfrom
reconcile/hardening
Open

Adversarial hardening + starter-kit harness (reconciled with Gemini)#3
soyerno wants to merge 4 commits into
mainfrom
reconcile/hardening

Conversation

@soyerno

@soyerno soyerno commented Jun 26, 2026

Copy link
Copy Markdown
Owner

What

Reconciles two lines of work off the shared rebrand base, preserving the Gemini/Antigravity integration already on main and adding:

1. Adversarial hardening (5-round devil's-advocate pass)

10 critic lenses → 3-skeptic majority verification → fix → re-analyze. Confirmed fixes:

Engine (atlantis.mjs)

  • Independent Judges + quorum. The three Judges are now distinct agents (config-driven CONFIG.judges pool), with the accuser excluded but kept as a last-resort domain judge. A crashed Judge counts as non-confirmation and never raises the bar; <2 valid votes ⇒ blocker is unjudged (surfaced, never silently refuted).
  • always-on Guardians never deduped — an independent safety net even when their profile was also a lane.
  • errored Guardian ≠ all-clear (re-associated by index; surfaced separately in the Decree).
  • New oracle-failed return shape (a crashed router no longer collapses into the legitimate "no lanes" case).
  • Truncation only when a real branch/worktree backup exists (else the full report passes).

Slack bridge (slack/)

  • Fail-closed allowlist (users/channels); default --permission-mode plan (read-only) instead of acceptEdits.
  • Untrusted petition wrapped as data (anti prompt-injection) on new + resume turns.
  • Thread→session map: owner-gated + TTL + LRU, with an in-flight (pending) guard.
  • Bot-loop + double-fire guards; errors logged locally, never leaked to Slack.
  • daily-report no longer dumps the raw git log if summarization fails.

2. Fixed broken main

README.md on main shipped with committed merge-conflict markers (<<<<<<< / >>>>>>>) from a prior PR merge — they render literally on GitHub. Resolved (kept the English side; Spanish lives in README.es.md).

3. Starter-kit harness (examples/)

So a newcomer can run Atlantis out of the box and adopt the surrounding harness:

  • examples/agents/ — the Artisans (front/back/docs/security) + a Guardian role + a Herald (kickoff) as Claude Code subagent files. The engine's default CONFIG routes to these.
  • examples/memory/ — an abstract, durable memory harness the agents read at session start and distill learnings into at close.
  • English architecture diagram, engines: node>=18, single-file honesty in the README.

Heads-up (not changed here)

atlantis.mjs on main now starts with import readline from 'readline' (from the interactive confirmLanes/confirmGuards). That makes it a Node module run via the Antigravity harness — but the sandboxed Workflow({scriptPath}) path can't import (no Node API in that sandbox). If you want the Claude Code Workflow path to keep working, the interactive bits need to be gated behind a runtime check or moved into the harness. Flagging, not touching — it's your Gemini direction.

🤖 Generated with Claude Code

soyerno and others added 4 commits June 26, 2026 15:04
Devil's-advocate loop (10 lenses → 3-skeptic majority verify → fix → re-analyze).
Confirmed fixes applied:

Engine (atlantis.mjs):
- Judges are now independent agents (config-driven judge pool, accuser excluded
  but kept as last-resort domain judge); distinct agentType per lens.
- Quorum: a crashed Judge counts as non-confirmation, never raises the bar;
  <2 valid votes ⇒ blocker is UNJUDGED (surfaced, never silently refuted).
- always-on Guardians never deduped (independent safety net even when their
  profile was a lane); errored Guardian ≠ all-clear (re-associated by index).
- Truncation only when a real branch/worktree backup exists; else full report.
- New return-shape guard for a failed Oracle; structs documented in both READMEs.

Slack bridge:
- Fail-closed allowlist (users/channels); default --permission-mode plan (read-only).
- Untrusted petition wrapped as DATA (anti prompt-injection) on new + resume.
- Thread→session map: owner-gated + TTL + LRU; in-flight (pending) guard.
- Bot-loop + double-fire guards; errors logged locally, never leaked to Slack.
- daily-report no longer dumps raw git log on summary failure.

Docs: synced README.es/en (struct + return shapes + sample Decree + troubleshooting),
English architecture diagram, engines:node>=18.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ation

Combines both lines of work off the shared rebrand base:
- KEPT (Gemini): per-lane model scoring, interactive confirmLanes()/confirmGuards(),
  Antigravity integration + skill, README.md/es restructure.
- KEPT (hardening): independent Judges + quorum (a crashed Judge never raises the
  bar; <2 votes ⇒ unjudged, never silently refuted), always-on Guardians never
  deduped, errored Guardian ≠ all-clear, oracle-failed guard, diff-backed clamp,
  Slack bridge security (allowlist, plan mode, prompt-injection wrapping, owner+TTL,
  bot-loop guard), daily-report no raw-log dump.
- FIXED: committed merge-conflict markers left in README.md (EN side kept; ES lives
  in README.es.md); engine single-file honesty.
So a newcomer can run Atlantis out of the box and adopt the surrounding harness:

- examples/agents/: the Artisans (front, back, docs, security) + a Guardian role
  + a Herald (kickoff) as Claude Code subagent files. The engine's default CONFIG
  routes to these, so copying them into .claude/agents/ makes it runnable as-is.
- examples/memory/: an abstract memory harness — a durable, versioned project
  memory the agents read at session start and distill learnings into at close
  (lightweight always-loaded index + one fact per file + prune-to-archive).
- examples/README.md: starter-kit index tying agents + memory + config together.

All project-agnostic; references only Atlantis.
…he antigravity harness

The Gemini integration added a top-level `import readline`, which crashes the
sandboxed `Workflow({scriptPath})` path at load (Workflow scripts get no Node API).
Move readline to a lazy dynamic import inside confirmLanes/confirmGuards and guard
`process` access: under the Workflow sandbox both functions auto-proceed (no import
evaluated); under the antigravity Node harness with a TTY they stay interactive.
Both paths now coexist.
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