Estigia

io.github.asanabrial由 GitHub 帳號 asanabrial 發布v0.1.1更新於 Oct 31, 2026

Guardrails for AI coding agents: verified claims, reviews bound to exact commits, gated merges.

已驗證STDIO僅桌面效率與工作流開發者工具

概覽

AI 產生的概覽

一套本機護欄工具,讓 AI 編碼代理的認領、審查與合併都能對照本機工作流儲存與 git 鉤子獲得驗證。

可以做什麼
  • 驗證與追蹤認領:檢查有效認領、列出工作流狀態、讀取審查狀態與審查輸入、列出任務與工作階段。
  • 記錄工作流動作:認領議題、切換狀態、留言、標記受阻、管理任務、心跳與交接。
  • 執行審查:發布與重新發布審查、記錄發現與處置、升級審查、收集審查輸入並執行宣告的檢查。
  • 交付工作:起草並準備拉取請求、記錄花費、在已審查的提交處交付並發布。
  • 協調工作階段:透過本機儲存傳送訊息、提問、等待並讀取收件匣。
適用情境
當多個 AI 代理或工作階段同時寫入同一個儲存庫,而你希望推送、審查和合併都以已記錄的認領與綁定到確切提交的審查結論為前提時使用。適合需要確定性證據與依風險分級審查、而不願只信任代理自述的團隊。
執行需求
以本機執行檔運行,可透過安裝腳本、npm 套件或 cargo 安裝;Linux 封存檔需要 glibc 2.39+。setup 會寫入代理的指令檔與鉤子,推送守衛需在每個儲存庫個別安裝。GitHub 部分依賴 gh 命令列工具與 git 遠端儲存庫。
安裝前請注意
setup 與 guard 會修改代理指令檔和 git 鉤子,pre-push 鉤子可能拒絕推送。本機儲存 ~/.estigia/state.db 保存認領、審查結論、花費與工作階段歷史,刪除即遺失這些歷史。它可能啟動審查命令列工具並以獨立程序執行宣告的檢查,交付環節會在程式碼平台上合併與發布。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Estigia,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[estigIA — AI harness. Light. Local. Agentic.]

[CI] [License: MIT] [Rust 1.97+] [MCP: 37 tools] [Linux, macOS, Windows] [Glama MCP server]


estigIA — workflow authority for AI coding agents

Your agent says it claimed the issue, that the review passed, that the branch is current. Estigia turns those sentences into things that were checked: the claim lives in a local store (~/.estigia/state.db), every later write is measured against it, every step that cannot be undone re-verifies it, and a review verdict is bound to exact bytes, so a push invalidates it.

One binary, under whatever agent you already use; it does not run your model. Its only detached processes are a reviewer CLI and the declared checks (which).

El río del juramento. Lo que un agente promete, queda ligado a unos bytes exactos.

Leteo is the river of forgetting. Estigia is the river of the oath — the gods swore by its waters, and perjury cost nine years outside Olympus. Two rivers of the same underworld, opposite jobs: one makes you forget, the other holds you to it.

What it feels like

Mostly, nothing: a run that has claimed nothing works as before. When it refuses, it says what it read and what to do about it:

$ git push origin HEADestigia: git push: gh issue view failed (1): none of the git remotes ... (read-failed)  [world-action] the tracker could not be read; write nothing and retry the readerror: failed to push some refs

The tracker could not be read is a different answer from you may not push, and Estigia will not turn the first into the second. That distinction is most of the design.

FLOW — Focused, Lean, Outcome-driven, Witnessed

FLOW is Estigia's own methodology: how a run takes a piece of work from an issue to a merge.

  • Focused: small work stays small. Understood work is done directly, not planned, and exploration is in proportion.
  • Lean: one writer, the smallest topology that works, and review only as heavy as the risk.
  • Outcome-driven: done means the issue's acceptance criteria hold, with evidence, merged and verified.
  • Witnessed: deterministic evidence first, then review by a context that did not write the change, and the merge at the reviewed head.

It rests on two pillars: the claimed issue is the record of the work, and the publication is the review candidate. Four principles follow from them: small work stays small; review is sized by risk; a review lineage gets a bounded number of corrections (Corrections per lineage, default 3); and the heavyweight two-judge review (Judgment Day) runs only when asked for.

You start it with flow (analyse and build, choosing the next issue from the tracker), flow dev [issue] (build) or flow triage (analyse and file at most one evidenced issue). A run then goes through five steps, which may merge or repeat:

mermaid
flowchart LR    understand["Understand"] --> route["Route"] --> execute["Execute"] --> verify["Verify"] --> deliver["Deliver"]    verify -->|"finding"| execute
StepWhat happens
UnderstandRead only; explore in proportion; at most one product question and one challenge to a premise.
RouteDo it directly when it is understood; plan briefly only for real uncertainty; delegate only for a stated reason.
ExecuteBounded changes, Conventional Commits, test-first wherever a deterministic test applies.
VerifyDeterministic evidence first, then the review: none, one or four sealed lenses by risk tier, by a context that did not write the change.
Deliverdeliver records the verdict, waits for CI, merges at the reviewed head and closes with evidence — or hands the decision back.

Work that spans sessions or divides into units with their own acceptance keeps an ordered checklist on the claimed issue (task), never in a file. FLOW is how a run works; the workflow below is what Estigia enforces while it does.

The workflow

The workflow is the part a run cannot talk its way around: the states an issue moves through and the checks at each boundary. FLOW runs inside it.

mermaid
flowchart TD    analysis(["analysis"]) --> ready(["ready"])    ready --> claim["claim"]    claim --> inprogress(["in-progress"])    inprogress -.-> blocked(["blocked"])    blocked -.-> inprogress    inprogress --> publish["publish"]    publish --> review(["review by risk tier"])    review --> verdict["verdict on exact bytes"]    verdict -->|"push: republish"| publish    verdict --> deliver["deliver"]    deliver -->|"approved"| release["release"]    release --> done(["done"])    deliver -.->|"needs a person"| person["hand-back"]    person -.-> deliver
    classDef state fill:none,stroke:gray,stroke-width:2px    classDef action fill:none,stroke:gray,stroke-dasharray:4 3    class analysis,ready,inprogress,blocked,review,done state    class claim,publish,verdict,deliver,person,release action

Rounded nodes are states, square nodes are actions; dotted edges are the exceptions. What the gate holds at each boundary:

  • One state at a time, in the local store; labels are a projection, written and read back. blocked names an exact exit condition and who discharges it.
  • A claim before the first write. The earliest live claim wins, and the gate re-verifies it on every write it sees and at every irreversible step.
  • A verdict bound to exact bytes — epoch, head, base and digest. Any push invalidates it: republish and ask again. A body says Refs #<n>, never a closing keyword.
  • Release last, after the evidence is posted (details).

The contract an agent reads is skill/SKILL.md; the GitHub half is delivery.md; review cost per tier is in review-cost.md.

Install

Pick one route. Each is copy-paste.

Linux, macOS:

sh
curl -fsSL https://raw.githubusercontent.com/asanabrial/estigia/main/scripts/install.sh | sh

Windows (PowerShell):

powershell
irm https://raw.githubusercontent.com/asanabrial/estigia/main/scripts/install.ps1 | iex

npm (installs and sets up in one step):

sh
npx -y @asanabrial/estigia setup --all

Cargo (needs Rust):

sh
cargo install estigia

Then register it in your agents, and check:

sh
estigia setup --all      # or: estigia tuiestigia statusestigia doctor

Linux archives need glibc 2.39+ (not Debian 12, Ubuntu 22.04, RHEL 9); there, use cargo install estigia. The installers check the archive against its published checksum and refuse a mismatch. The binary lands in ~/.local/bin/estigia (%LOCALAPPDATA%\estigia\bin\estigia.exe on Windows); ESTIGIA_INSTALL_DIR moves it and ESTIGIA_VERSION takes a tag other than the latest. The npm package carries no binary: it fetches the same archive, and it is what the MCP registry entry starts (mcp-name: io.github.asanabrial/estigia). A source build has no installer record, so the commands that write into your agents ask for --allow-source-build (why); cargo install --git https://github.com/asanabrial/estigia takes main. The Dockerfile builds a server-only image; none is published.

Set it up in your agents

Installing the binary changes nothing on its own.

  1. estigia tui opens the setup screen; s shows what it will write. Without it: estigia setup claude-code for one agent, estigia setup --all for all; --dry-run on either writes nothing.

  2. Optionally route a role to a model, the spelling the screen ends by printing:

    sh
    estigia config set "Model routing" "developer=inherit" --agent claude-code
  3. In a repository where any agent may write, estigia guard installs a pre-push hook that refuses a push no live claim authorises, whoever typed it.

setup installs the skill, a directive in the agent's instruction file and the hooks, which go into every agent with an event able to refuse — five of them, in a gate that reads five dialects. What else it writes is in what it writes.

Verify

  1. estigia status: what is installed, where, and whether each agent is told (tools on) and stopped (gate on).
  2. estigia doctor: skill, gh, remote, guard, prune, permission and the rest, read-only.
  3. estigia sessions, feed, where, needs-person and changes (uncommitted work) are read-only too.

Uninstall

Uninstall removes what Estigia created and nothing else: not another tool's block, not your notes, not a file of its own you have since edited, which it keeps and names. Run in this order:

sh
estigia uninstall --all --dry-run   # changes nothing; says what the next line will doestigia uninstall --all             # or: estigia uninstall claude-codeestigia guard --uninstall           # in each repository with the push guardestigia config forget               # in each checkoutcargo uninstall estigia             # source build only; otherwise delete the binaryrm -rf ~/.estigia                   # optional, read the warning first
  1. The dry run is safe to repeat; estigia uninstall claude-code leaves the other agents alone.
  2. uninstall --all takes Estigia out of every agent.
  3. guard --uninstall removes only a hook Estigia wrote, and must go before the binary, which the hook calls.
  4. config forget removes <checkout>/.git/estigia/, the repository settings every uninstall survives; it says which file it removed.
  5. Remove the binary by the route you installed with. Installer script or npm: delete ~/.local/bin/estigia (or $ESTIGIA_INSTALL_DIR/estigia); on Windows delete %LOCALAPPDATA%\estigia\bin\estigia.exe (or under %ESTIGIA_INSTALL_DIR%) and take that directory out of the user PATH. A source build: cargo uninstall estigia.

Before rm -rf ~/.estigia: state.db is the workflow store, one copy on this machine: claims, states, receipts, findings, verdicts, spend, tasks, the decision history, the session registry and the mailbox. Beside it: run pointers; jobs/; snapshots/ (up to three copies of the store); lifecycle/ (the binary's provenance records); workspaces/ and roots/; the screen's language; your checkouts list. The last uninstall --all takes the store and the run state and keeps the rest (per entry). Delete it only when you no longer want the history of what this machine's gate decided.

What REPLACE and OVERWRITE mean is in docs/what-it-writes.md.

A harness, not a document

The contract under skill/ is text an agent may ignore, so Estigia holds the tools: a PreToolUse gate, a Stop hook, a pre-push hook under git, and thirty-seven operations with schemas below. The local store is the authority; the tracker keeps a projection that never decides. The diagram, the loop plugins and the gate's rules are in what it writes.

The tools

Thirty-seven operations, table-driven. Thirty-one map to operations the binding must provide; send_message, ask, wait, inbox and list_sessions are answered by the local store and deliver composes the rest with the merge gate, outside the binding. tools/list carries each schema and a readOnlyHint. The seven delivery tools (claim, publish_review, collect_review_input, deliver, release, transition, review_status) carry _meta["anthropic/alwaysLoad"]; every tool takes compact (cost):

read   verify_claimread   list_stateread   review_statusread   review_readread   tasksread   list_sessionsWRITE  claimWRITE  handoffWRITE  heartbeatWRITE  transitionWRITE  commentWRITE  blocked_untilWRITE  taskWRITE  send_messageWRITE  askWRITE  waitWRITE  inboxWRITE  releaseWRITE  ensure_statesWRITE  start_branchWRITE  judge_workspacesWRITE  assistWRITE  pr_reviewWRITE  draft_prWRITE  ready_prWRITE  review_stagesWRITE  review_threadWRITE  createWRITE  publish_reviewWRITE  republish_reviewWRITE  handoff_reviewWRITE  record_review_findingWRITE  record_dispositionWRITE  collect_review_inputWRITE  escalate_reviewWRITE  record_spendWRITE  deliver

where, feed, status and flush are commands of estigia rather than tools; asking for one of them, or for a name the surface dropped, answers what replaces it. review_read also reads the review tier (view: tier) and the delivery target (view: target); collect_review_input also starts a reviewer (launch) and runs the declared checks (checks); deliver stops after the verdict or the CI release with until.

Thirty-seven tools. The contract names seventeen operations every binding must map; the tools absorbed some under a surviving name (why). Arguments are in each tool's schema.

Configuration

Thirty-two typed settings, in docs/configuration.md, grouped by theme and shown in one order by estigia config list, the setup screen and the reference alike. Each row says whose answer it is: this agent's, this repository's, every checkout's or this machine's.

The ratchet

A message may name a command only when running it discharges the block; a refusal carries a typed code and a runnable resolution (classes):

  run: estigia setup --all   # or one of: agents, claude-code, codex, opencode, pi, cursor, zcode, deepseek-harness

What this instrument does not measure

docs/honesty.md names what this crate does not check, each with the measurement that found it; docs/README.md maps the rest of the set.

Layout

src/harness/   the gate, the run pointer, the transport, the lifecycle protocol, doctorsrc/setup/     agent adapters, companions, dry-run, exact inversesrc/config/    typed model, the settings table as datasrc/cli/       dispatch, and the only place a refusal becomes an exit codeskill/         SKILL.md, bindings/, policies/, protocols/, references/, assets/, agents/ — not compileddocs/          the reference the sections above point at, one question eachscripts/       the two installers a release is fetched with, and the Windows source reinstall

AGENTS.md — which CLAUDE.md is a link to — is how an agent works here.

Exit codes

Four, and none of them means "something went wrong":

CodeMeaning
0the command did what it said
1the command refused; the refusal says whether anything had already been written
2the world may have changed and this process cannot tell
3the invocation could not be read: nothing was attempted, and nothing was decided

Why there are four: docs/refusal-classes.md.

Licence

MIT. Files derived from another MIT-licensed project carry its notice in THIRD_PARTY_NOTICES.md.

來源:README.md,提交 bb6bd66

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.1最新Oct 17, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分