Release history and upgrade notes for @jeger-ai/opengantry. Adopter runbooks describe current behavior without version tags — see index.md.
Install: npm install -g @jeger-ai/opengantry or pin a specific release from this table.
Release highlights
| Release | Highlights |
|---|---|
| v3.8.3 | The standalone cage command is gantry-cage. It matches gantry cage and the CLI’s gantry naming. In @jeger-ai/opengantry, opengantry-cage stays as a silent alias for the same entry point, like gapman for gantry. The slim @jeger-ai/opengantry-cage package exposes only gantry-cage; npx @jeger-ai/opengantry-cage -- <cmd> is unchanged because npx runs a package’s single bin. Help and --version name gantry-cage. Package names and behaviour are unchanged (MSN-0258). Dependencies: zod 4.6.5 (from 3.25.76; used only by the MCP server’s tool registration, not by the ./kernel export), eslint 10.12.0 and typescript-eslint 8.71.1 for development, and iii-sdk 0.24.4, acorn 8.19.0 and acorn-walk 8.3.5 in the iii integration example (MSN-0249). Publishing: releases are published through npm trusted publishing (GitHub Actions OIDC, no stored npm token) with provenance for both packages, including @jeger-ai/opengantry-cage, whose 3.8.2 was published by hand without it; a publish skips any version already on npm, so a partial release can be finished from main (MSN-0257, MSN-0259). Release (MSN-0260). |
| v3.8.2 | Cage survives being stopped, refuses protected files it cannot restore, and ships on its own. Signals: SIGTERM, SIGHUP, and SIGINT off a terminal now terminate the command and every process it started (SIGTERM, grace, SIGKILL; no detached process group), then cage restores and exits; the report gains trapped_signal. kill -9 recovery: a hash-verified journal under <git dir>/gantry-cage-journal/ lets the next cage run kill orphans, restore the protected set and report recovery before it starts; a live earlier session or a corrupt journal fails closed with exit 2 (GXT_CAGE_SESSION_ACTIVE, GXT_CAGE_JOURNAL_CORRUPT) (MSN-0253). Fail-closed caps: a revert-rule file over --max-file-bytes or a set over the 64 MiB snapshot budget now stops cage before the command runs (exit 2, GXT_CAGE_FILE_TOO_LARGE / GXT_CAGE_SNAPSHOT_BUDGET_EXCEEDED) instead of running with it detect_only; ADR-0048 decision 8 (MSN-0254). Slim package: npx @jeger-ai/opengantry-cage -- claude installs only the cage (bundled from the same sources, commander as its only dependency, no native modules, no install scripts), published by the release workflow alongside @jeger-ai/opengantry (MSN-0252). Governance: ADR-0049 maps the technical flight levels onto the tighten-only artifact chain and keeps product management outside the substrate (MSN-0250). Help text, FEATURES and these notes (MSN-0255); release (MSN-0256). Behaviour changes in a patch release: see the upgrade notes. |
| v3.8.1 | Cage halts an agent that keeps rewriting a protected path. When a revert-rule path is rewritten again after the contest limit of live restores (default 3), cage restores it once more and terminates the command and everything it spawned (SIGTERM, then SIGKILL after a short grace). The run ends with status halted and exit 4, the report carries watch.halt and watch.contest_limit, and the session log a halt event. Before, cage gave up on the path, marked it contested and restored it only at exit, so the agent kept running against the tampered file. Set the limit with --contest-limit <n> or .cage.yaml contest_limit:; 0 keeps the old behaviour. .cage.yaml also takes a top-level mode: default for its own protect: entries, never for built-in rules (MSN-0244). ADR-0048 amended with decision 7; README and FEATURES updated (MSN-0245). Behaviour change in a patch release: see the upgrade notes. |
| v3.8.0 | Per-project cage rules: optional .cage.yaml at the cage root adds protect: paths and globs (mode: revert|report) on top of the built-in set. It can only add: unknown or subtractive keys, aliases, .. paths and report mode on a built-in path fail closed before the command runs (GXT_CAGE_CONFIG_INVALID); the file protects itself; baseline caps 5,000 files / 64 MiB (GXT_CAGE_LIMITS_EXCEEDED); cage warns when it is untracked or uncommitted. --allow-override <path> reports instead of restoring a path for one run, never for git control or .cage.yaml, always announced on stderr and in the report. The push guard checks the plan the session started with (MSN-0239). gantry cage suggest proposes rules (migrations, IaC, Docker, registry config, CODEOWNERS, other CI, git hook config, key files) to stdout or .cage.yaml.suggested, never .cage.yaml, and refuses inside a cage session (MSN-0240, MSN-0242). Trust model recorded in ADR-0048 (MSN-0243). |
| v3.7.1 | Cage for interactive sessions: gantry cage now restores protected paths live while the command runs (default; --watch-interval-ms, --no-watch for exit-only), marks a path contested after 3 live restores and restores it once at exit, and prints nothing into the agent’s screen beyond one start line and a bell per event (JSONL session log in the OS temp dir). Session push guard: the caged process tree gets a temporary core.hooksPath whose pre-push refuses outgoing commits touching protected paths and chains to the repo’s own hooks; nothing is written to the repo. The report gains watch and push_guard summaries; change rows are unchanged (MSN-0237). Docs move from one-shot claude -p recipes to interactive sessions (MSN-0238). Restore, not blocking: committed changes stay in local history; --no-verify skips the guard. |
| v3.7.0 | Zero-config cage: gantry cage -- <cmd> and standalone opengantry-cage bin (npx -p @jeger-ai/opengantry opengantry-cage -- <cmd>) snapshot CI configs, .env*, .git/config / hooks / core.hooksPath and manifest forbidden_zones in memory, run the command with inherited stdio, then restore protected changes and exit 3. Lockfiles are reported, not reverted; over-cap or over-budget files are detect_only; --json emits a digest-only gantry.cage-report.v1; --report-only skips restore (MSN-0233). Violation reports end with a gantry init upgrade footer and a one-line limits summary (MSN-0235). Docs: README “Try it in 60 seconds”, FEATURES reference, ADOPTION step zero (MSN-0234). Detect-after-exit only: no read, network, or in-flight interception; use for one-shot headless runs. |
| v3.6.0 | Typed adapter gates fail closed: gate_adapter: tsc|eslint rejects a gate_command with unquoted &&, ` |
| v3.5.0 | Cursor MCP launcher: specimen and adopters share byte-identical .cursor/mcp.json (./scripts/mcp-launcher.sh; no mcp.json parity exemption). Verify exports: --format sarif|junit writes the document only on stdout and diagnostics on stderr (CI.md). Experimental contract preflight: gantry contract preflight / gxt_preflight_contract catalogs every MANIFEST.json skill; Jev 2000ms timeout or non-OK HTTP (including 500) falls open to the heuristic (ADR-0046). |
| v3.4.0 | Mission contracts (ADR-0045): Planner-sealed inline contract + contract_sha256 (tighten-only TMVC / forbidden / import cage). gantry contract propose|check|show, gantry legislate --from-intent, MCP gxt_propose_contract, draft token v3 (v2 still accepted). Verify contract phase (tamper + import sites including import() / require() / export … from). Runtime exports GXT_ALLOWED_IMPORTS / GXT_BANNED_IMPORTS; runtime exec reports contract_violation. Empty TMVC roots scan git-dirty sources (not the whole tree). |
| v3.3.0 | Breaking (kernel): verifyMission is async. Git-native org control plane — tighten-only org policy floor (gantry policy pull|status|diff, ADR-0042); compliance ledger on refs/gxt/ledger with CAS append + soc2-pack export (ADR-0043); cross-repo depends_on + gantry deps / release check (ADR-0044). Receipt schema stays 0.2.0. Doctor/verify stay offline. |
| v3.2.6 | gantry report localhost inspection dashboard (overview git metrics, mission timeline, capped verify-run ring, /verify drill-down); ADR-0040 findings blame schema v3 in CLI (MSN-0179); pluggable gateExecAdapter on verifyMission (MSN-0177); verify-run ring persistence + phase-clock remediation (MSN-0181) |
| v3.2.3 | Docs — North Star MANIFESTO.md; loop→graph terminology (AGENT-GRAPH.md rename, mission/verify graph language, retry edges); CLI onboarding UX strings |
| v3.2.2 | Breaking: package.json exports map — public entrypoints . (CLI) and ./kernel only; deep dist/cli/lib/* imports no longer resolve. Kernel library (evaluateScope, verifyMission, verifyVerdictToken); verdict HMAC tokens; GIT_OPTIONAL_LOCKS=0 on git spawns; receipt-signing temp path collision fix |
| v3.2.1 | Docs — gantry legislate as single entry point (gap analysis built in); gxt_interrogate documented for multi-turn halt only |
| v3.2.0 | Interrogation gate (ADR-0039 / MSN-0149) — gap analysis built into gantry legislate (gxt_interrogate for multi-turn halt); first-class verify interrogation phase (GXT_INTERROGATION_* SARIF/JUnit); receipt v0.2.0 signed attribution + CI export (MSN-0143–0145); auditor pepper keyring (MSN-0148); MANIFEST gate_commands allowlists |
| v3.1.1 | Local DX — flag→pin mission defaults (gantry pin / unpin), active-mission banner, gantry receipt list|show, verify --receipt path feedback; thermo cleanups (verify context, command boundary) |
| v3.1.0 | Hybrid hub/spoke readiness — flight_telemetry hash_only, gantry attest / verify --receipt, doctor --policy (ADR-0034); bounded_content trusted automation; advisory performance judge (#62) via PERFORMANCE_RUBRIC + BYO llm_verifiers (ADR-0035); structured advisory findings[] on verify PASS |
| v3.0.1 | Docs cleanup + thermo remediation; discovery scanner hardening; npm 3.0.1 |
| v3.0.0 | Domain-agnostic governance layer — gantry init --discover, gantry blueprint, gantry perimeter check, content adapter (regex perimeter), standardized findings[] failure envelope for external executors |
| v2.7.0 | Quality & governance consolidation — audit-severity net_loc verify bugfix, discriminated VerifyPhaseFailure union, typed trace failure kinds, verify pipeline collapse, shared command error boundary, GantryUserError naming (deprecated Gapman* aliases), governance backfill + release-squash policy |
| v2.6.0 | Defensive profile completion — presets + severity tiers, file-scope / churn / test-to-code guards (#88–#91), gantry init profile onboarding (#86) |
| v2.5.0 | Adopter-ready cage — generic arch check roots (#114), TARGET_ARCHITECTURE.yaml init scaffold (#115), schema 0.2.0 (#116), defensive profile + net LOC guard (#87, #90) |
| v2.4.0 | Architecture cage — gantry arch fetch (#34), gantry verify --format sarif|junit (#36), TARGET_ARCHITECTURE.yaml + gantry arch check (#15), ARCHITECTURE_RUBRIC advisory judge (#16) |
| v2.3.1 | Breaking: Planner/Executor rename (#110) — gantry planner, .gitagent/planner/, EXECUTOR_LOG.md, GXT_PLANNER_* / GXT_EXECUTOR_* env vars (no aliases). ADR-gated cage: MCP write guard (#14), break-glass ADR (#17), optional planner_signature tier (#37) |
| v2.3.0 | Cage hardening — gen:dogfood (#105), typed kpiKind (#103), audience-tagged start (#104), doctor EXECUTOR_LOG checks (#38), TS/mjs parity (#106), verify failure contract (#102), legislate forbidden-zone warn (#35); removed deprecated upgrade --apply/--dry-run parent flags |
| v2.2.5 | Quality remediation — recursive test glob (#99), dead code prune (#100–#101), mechanical cleanups (#107) |
| v2.2.4 | Unified gantry naming (#94); docs positioning — Gantry.io disambiguation, vendor-neutral local governance (#95–#97) |
| v2.2.3 | Declarative trusted_automation policy (.gitagent/config.json, max_net_loc <= 5, git-derived eval) (#92) |
| v2.2.2 | Time-to-Scaffold public benchmark (examples/benchmark-agent/, measured LOC matrix, adoption discovery docs) |
| v2.2.1 | Verify-failure contract unification (verify-failure-normalize), race-safe context-feed writes, canonical verify presentation entrypoint |
| v2.2.0 | gantry context-feed, gantry audit-rigor, virtual_capture, adoption UX (#30–#33), product positioning (#69), docs map (#76) |
| v1.1.0 | Mission isolation (MSN-0024–0026), stale trace evidence, verify --json, doctor substrate drift; MSN-0031 fail-closed stale evidence + verify orchestration unification |
| v1.0.0 | gantry init --tutorial, global --audience, adoption-first docs |
| v0.9.0 | gantry start, verify --fix, status --json, onboarding, GXT error codes |
Current substrate notes
- Substrate law:
MANIFEST.jsonschema_version0.5.0; CLI 3.8.3 (seepackage.json). - Architecture boundaries: maintain
TARGET_ARCHITECTURE.yamlat repo root; rungantry arch check <files…>in mission gates. - Verify exports:
gantry verify --format sarif|junitfor enterprise CI dashboards (--jsonalias unchanged). Diagnostics go to stderr; the document is the only stdout payload. GitHub Code Scanning and GitLab JUnit wiring:CI.md. - Typed adapter gates:
gate_adapter: tsc|eslintrequires a single command. Unquoted&&,||,;, or line breaks fail closed withGXT_GATE_ADAPTER_MISCONFIG(ADR-0041). - Contract drift index: optional, local, and advisory.
better-sqlite3andsqlite-vecload only when an embedding is supplied. - Experimental contract preflight:
gantry contract preflight/ MCPgxt_preflight_contract(heuristic default; optional Jev). Jev reads every skill fromMANIFEST.json. A 2000ms timeout or non-OK HTTP status (including 500) falls open to the offline heuristic. Advisory only — does not seal a contract (ADR-0046). - External architecture docs:
gantry arch fetchforkind: externalpointers (doctor stays offline). - Config file format: humans write YAML (missions,
TARGET_ARCHITECTURE.yaml,.cage.yaml); the CLI writes JSON (receipts, ledger, KPI, tokens viacanonicalJson); third-party formats stay native.MANIFEST.json,config.jsonand the pointer files stay JSON until a dedicated dual-read migration (ADR-0047).
Upgrade notes
From v3.8.2 (gantry-cage command, zod 4, trusted publishing — v3.8.3)
npm install @jeger-ai/opengantry@3.8.3
npx @jeger-ai/opengantry-cage@3.8.3 -- claude # the slim cage; its command is now gantry-cage
- Full package:
gantry-cageis new;opengantry-cagekeeps working as an alias of the same entry point. Nothing to change in scripts, though new docs and examples usegantry-cage. - Slim package: a global install of
@jeger-ai/opengantry-cagenow providesgantry-cageinstead ofopengantry-cage.npx @jeger-ai/opengantry-cage -- <cmd>works as before. npx -p @jeger-ai/opengantry opengantry-cagestill works; the documented form is nownpx -p @jeger-ai/opengantry gantry-cage.- zod 4: the CLI now depends on zod 4.6.5 instead of 3.25.76. It is used only inside the MCP server and is not part of the
./kernelAPI, so nothing changes for code that imports@jeger-ai/opengantry/kernel; a project that uses its own zod 3 keeps it, npm installs both side by side. - Provenance: both packages carry npm provenance again from this release on; verify with
npm audit signatures.
From v3.8.1 (cage signals, kill -9 recovery, fail-closed caps, slim package — v3.8.2)
npm install @jeger-ai/opengantry@3.8.2
npx @jeger-ai/opengantry-cage@3.8.2 -- claude # the slim cage, new in this release
- Behaviour change, signals: SIGTERM or SIGHUP sent to cage, or SIGINT when its stdin is not a terminal, used to be forwarded to the command while cage waited; background jobs of a nested shell kept running. Cage now terminates the whole enumerated tree, restores, and exits
3if anything was restored, otherwise with the command’s own exit code (128 + Nwhen the signal killed it). Ctrl-C on a terminal is unchanged: it reaches the agent and cage keeps running. - Behaviour change, caps: a revert-rule file over
--max-file-bytes(default 5 MiB), or revert-rule bytes over the 64 MiB snapshot budget, now exit2before the command runs (GXT_CAGE_FILE_TOO_LARGElists every path and size;GXT_CAGE_SNAPSHOT_BUDGET_EXCEEDEDgives the total). Before, the run started and the file wasdetect_only: reported, never restored. Raise--max-file-bytes, or pass--allow-override <path>to report that path instead (announced in every report).--report-onlyis unaffected. - New journal: each session writes
<git dir>/gantry-cage-journal/(files0600, with copies of protected file bytes such as.env) and removes it at a clean exit. After akill -9on cage, the next cage run in that repo recovers it first. Two new exit-2 cases: an earlier cage session still running (GXT_CAGE_SESSION_ACTIVE) and a journal that fails its hash check (GXT_CAGE_JOURNAL_CORRUPT; inspect it, then remove the directory). - Report additions:
trapped_signalandrecovery;detect_onlyis no longer produced for revert-rule files. Existing fields are unchanged andreport_schemastaysgantry.cage-report.v1. - New package:
@jeger-ai/opengantry-cageis published frompackages/opengantry-cage/with v3.8.2, at the same version as@jeger-ai/opengantry.npx -p @jeger-ai/opengantry opengantry-cagekeeps working.
From v3.8.0 (cage contested-file halt — v3.8.1)
npm install @jeger-ai/opengantry@3.8.1
- Behaviour change: a protected path rewritten again after 3 live restores now terminates the wrapped command and every process it started, and cage exits
4instead of3. Scripts and CI that treat any non-zero cage exit as failure need no change; scripts that check for exactly3should also accept4. - Keep the old behaviour: pass
--contest-limit 0or setcontest_limit: 0in.cage.yaml. The path is then marked contested and restored once at exit, as in v3.8.0. - Legitimate rewriters: a dev server or tool that rewrites a protected file (for example
.env.local) will now halt the session. Run it with--allow-override <path>for that run; overridden and report-mode paths never halt. - Report additions:
watch.contest_limitandwatch.halt(path,rule,live_restores, or null); statushalted. Existing fields are unchanged andreport_schemastaysgantry.cage-report.v1. - New
.cage.yamlkeys: top-levelmode:(default for the file’s own entries only) andcontest_limit:. Both fail closed when invalid (GXT_CAGE_CONFIG_INVALID, exit 2).
From v3.7.1 (per-project cage rules — v3.8.0)
npm install @jeger-ai/opengantry@3.8.0
- No behavior change without
.cage.yaml: the built-in protected set, live restore and the push guard work as in v3.7.1. - New built-in target:
.cage.yamlis now always protected (cage_config). An agent that creates or edits it during a session sees the change restored. - New exit-2 cases: an invalid
.cage.yaml, an invalid--allow-override, or a protected set over 5,000 files / 64 MiB aborts before the command runs. - Report additions: change rows gain
sourceandoverridden; the report gainscage_configandoverrides. Existing fields are unchanged andreport_schemastaysgantry.cage-report.v1. - Wrapped command
suggest:gantry cage suggestis now a subcommand. To run a program namedsuggestinside the cage, usegantry cage -- suggest.
From v3.7.0 (cage live restore and push guard — v3.7.1)
npm install @jeger-ai/opengantry@3.7.1
- Behavior change (cage only): live restore is now the default. Protected files are restored while the command runs, not only at exit. Pass
--no-watchto keep the v3.7.0 exit-only behavior (for example in scripted runs that inspect protected files mid-run). - Push guard:
git pushrun inside a cage session is refused when outgoing commits touch CI configs, secrets or manifest forbidden zones. Your repo hooks still run (chained).--no-verifyskips it. - Report additions:
--jsongainswatchandpush_guardobjects; existing fields and change-row keys are unchanged,report_schemastaysgantry.cage-report.v1.
From v3.6.0 (zero-config cage — v3.7.0)
npm install @jeger-ai/opengantry@3.7.0
- New command, no behavior change elsewhere:
gantry cage -- <command...>and theopengantry-cagebin are additive. Existing missions, verify, and hooks are unchanged. - Cage checks once, after the command exits. Use it for one-shot, headless agent runs (
claude -p …,aider --message … --no-auto-commits --yes-always), not interactive sessions. It restores the working tree, not git history or a remote. - Exit code 3 means protected files changed (reverted, or
detect_only/revert_failed). Wrappers that treat any non-zero exit as failure will see it. .git/configis protected: an agent’sgit push -uupstream entry is reverted after the run.
From v3.5.0 (typed-adapter guard, pre-commit TMVC gate, contract index — v3.6.0)
npm install @jeger-ai/opengantry@3.6.0
- Behavior change (fail-closed): missions with
gate_adapter: tscorgate_adapter: eslintwhosegate_commandcontains an unquoted&&,||,;, or line break are now rejected atgantry legislateand whengantry verifyloads the mission (GXT_GATE_ADAPTER_MISCONFIG). Typed adapters parse one tool’s stdout, so chained commands never produced reliable findings. Fix: wrap the sequence in one script (for examplenpm run lint:json), or setgate_adapter: generic. Pipes (|), quoted operators, backslash-newline continuations, and trailing newlines from YAML block scalars are still accepted. Check before upgrading:grep -l "gate_adapter: \(tsc\|eslint\)" .gitagent/missions/*.yaml. - Pre-commit TMVC gate (opt-in):
gantry hooks installsets localgxt.tmvcGuardStrictso the tracked.githooks/pre-commitblocks staged paths outside the pinned mission.gantry hooks uninstallclears it.git commit --no-verifyis the only bypass. Rungantry upgradeto stage the updatedtemplates/.githooks/pre-commit. - Contract drift index (optional): new dependencies
better-sqlite3(native module, prebuilt binaries for common platforms) andsqlite-vec. They are loaded lazily and only when you pass--embedding-file/--auto-embed; other commands never import them.--auto-embedandgantry contract embedcall OpenAI and needOPENAI_API_KEY. The index file.gitagent/planner/contracts.sqliteshould be gitignored. - No public API change: the
src/cli/libfolder restructure (MSN-0228) only moves internal files. Deepdist/cli/lib/*imports have not resolved through theexportsmap since v3.2.2.
From v3.4.0 (launcher, verify exports, preflight — v3.5.0)
npm install @jeger-ai/opengantry@3.5.0
- Not breaking for callers that already treat
gantry verify --jsonas the only stdout payload.--format sarifand--format junitnow do the same: the document is the only stdout payload; diagnostics stay on stderr. Scripts that parsed mixed stdout from those formats need to read stderr separately. Do not pipe stderr into the SARIF or JUnit file. - Cursor MCP:
.cursor/mcp.jsoncommandis./scripts/mcp-launcher.shfor the specimen and for adopters. There is no parity exemption for that file. Do not point Cursor at a rawnodebinary. The launcher usesnode dist/cli/index.js mcp servewhen a local build exists; otherwisegantry mcp servefromPATH. - Experimental:
gantry contract preflight(MCPgxt_preflight_contract) is advisory. Jev reads every skill fromMANIFEST.json. A 2000ms timeout or any non-OK HTTP status, including 500, falls open to the offline heuristic. A missingTYPESAFE_API_KEYis an explicit error before fetch. Wiring:CI.md.
From v3.3.0 (mission contracts — v3.4.0)
npm install @jeger-ai/opengantry@3.4.0
gantry upgrade # pulls MISSION.schema.yaml contract + contract_sha256 fields
- Not breaking. Draft token v2 remains accepted; v3 is required when the token carries a
contractblock. Live Cursor MCP servers that still rejectcontractongxt_draft_legislationshould usegantry legislate --from-intent --yes --contract-file. - CLI:
gantry contract propose|check|show;gantry legislate --from-intent(optional--contract-file). - MCP:
gxt_propose_contract(autoformalize the cage before draft). - Verify: new
contractphase aftergit_proof— tamper (GXT_CONTRACT_TAMPERED) plus import-site scan (GXT_CONTRACT_IMPORT_*). - Runtime:
gantry runtime envexportsGXT_ALLOWED_IMPORTS/GXT_BANNED_IMPORTS.gantry runtime execends the flight ascontract_violation(exit 3) on import-site breaches. - Empty TMVC roots: check / verify / runtime scan git-dirty scannable sources (not the whole tree, not nothing); missing/deleted paths are skipped; a repo with no
HEADstill includes the index and untracked files.
From v3.2.6 (org control plane — v3.3.0)
npm install @jeger-ai/opengantry@3.3.0
gantry upgrade # pulls ORG-POLICY.schema.yaml (managed_strict) + POLICY.pointer.json scaffold
- Breaking (kernel):
verifyMissionnow returnsPromise<VerifyResultPayload>. TypeScript consumers fail at compile time until theyawait. A plain-JS sync caller cannot be warned at runtime.verifyMissionAsyncremains as a@deprecatedalias and emits oneDeprecationWarningwith codeGXT_DEP_VERIFY_MISSION_ASYNC(honours--no-deprecation/--throw-deprecation; never writes to--jsonstdout). The alias will be removed in 4.0. CLI--json-outis kept. - Adapters:
GateSpec.adapteris required in memory; Commander--gate-adapteruses.choices(). Success-substring is a post-close logincludescheck (no stream scanner). - Ledger / deps: ledger commits use
hash-object --stdin+mktree+commit-tree. Unreadable tip isGXT_LEDGER_CHAIN_BROKEN(fail-closed).gantry release checkexits non-zero on faileddepends_on. - Policy:
resolveOrgPolicyreturnsok | fail{code}. Onlyconfig_flooris enforced in 3.3.0 (ADR-0042). - Opt-in policy floor: add
.gitagent/foreman/POLICY.pointer.json, thengantry policy pull. Doctor and verify never fetch. Merge is tighten-only (ADR-0042). Do not pin a pointer on a repo until the cache is populated or verify will fail closed. - Opt-in ledger:
.gitagent/config.jsonledger.mode: local(default remainsoff).strict_enterprisedefensive preset defaults ledger mode tolocalwhenledger.modeis unset. Unsigned entries are checksums, not proofs. - Cross-repo deps: add mission
depends_on[], rungantry deps fetchin CI before verify, thengantry release check --tag <prev>. - Receipts: schema stays 0.2.0. Policy/findings digests live in ledger entries, not receipts (ADR-0036/0037).
- MCP: read-only
gxt_policy_status,gxt_ledger_verify,gxt_deps_check.gxt_verifyremains the mutating verify path.
From v3.2.5 (gantry report + ADR-0040 — v3.2.6)
npm install @jeger-ai/opengantry@3.2.6
gantry report: localhost overview athttp://127.0.0.1:3134/(port walks onEADDRINUSE) — repo git metrics, mission timeline, last verify status, drill-down at/verify. Use--jsonfor the same view models.- Findings blame v3: verify failures may include semantic fingerprints and a capped verify-run ring under
.gitagent/verify-runs/(replacesverify-last.json). - Kernel: optional
gateExecAdapteronverifyMissionfor in-process gate execution (iii worker pattern).
From v3.2.2 (docs — v3.2.3)
npm install @jeger-ai/opengantry@3.2.3
- Docs:
MANIFESTO.md(North Star positioning);AGENT-LOOP.mdrenamed toAGENT-GRAPH.md— update inbound links and site slugs (agent-graph). - Terminology: user-facing copy uses mission/verify graph and retry edge; manifesto Inner/Outer Loop titles unchanged (DevEx locus only).
From v3.2.1 (breaking kernel exports — v3.2.2)
npm install @jeger-ai/opengantry@3.2.2
gantry upgrade apply # or gantry init --force for managed CI assets
- Programmatic imports: use
@jeger-ai/opengantry/kernelonly — deep imports such as@jeger-ai/opengantry/dist/cli/lib/...no longer resolve. - Public API:
evaluateScope,verifyMission,mintVerdictToken,verifyVerdictToken(seeexamples/iii-integration/). - Git subprocesses: gantry sets
GIT_OPTIONAL_LOCKS=0on all git spawns (concurrency-safe verify on shared repos).
From v2.3.0 (breaking Planner/Executor rename)
npm install @jeger-ai/opengantry@2.3.1
gantry init --force # or gantry upgrade apply with a signed substrate mission
gantry planner set "$(git config user.email)"
Old gantry teacher, WORKER_LOG.md, GXT_TEACHER_EMAILS, and GXT_WORKER_LOG no longer work — update scripts and CI env vars.
From v1.x
npm install @jeger-ai/opengantry@latest
gantry upgrade apply # or gantry init --force for managed CI assets
Pulls pr_governance, verify-pr-missions.sh, stale-evidence verify, and updated workflow.
PR and validate base ref
- PR policy: one mission per PR; target your repo integration branch only. CI
pr_governancecompares the PR base togithub.event.repository.default_branchby default. When your integration branch differs (e.g. GitFlow withdevelop), set repository variableGXT_INTEGRATION_BRANCH. Stacked PRs failpr_governanceand localverify-pr-missions.shpurity when rebased onto the integration branch. - Local validate base ref:
npm run validate/./scripts/dev-validate.shdefault toorigin/main; pass your integration ref explicitly when it differs (e.g../scripts/dev-validate.sh origin/develop).
Maintainers
npm publish: push an annotated tag v<semver> on main after CI is green — .github/workflows/npm-publish.yml runs npm run validate then npm publish --provenance --access public (requires NPM_TOKEN repo secret).
Release-squash policy: a release MUST NOT ship under an MSN that has no committed mission file. When multiple planned missions consolidate into one release mission, the surviving mission file MUST name the squashed MSN range, EXECUTOR_LOG.md trace quotes MUST reference the surviving MSN-XXXX id, and the release MUST pass gantry verify --mission before tagging.
Historical maintainer backlog: archive/BACKLOG.md.