Skip to content

docs(catalog): admit gerrit-axi at v0.4.0 - #222

Closed
slnkjthien wants to merge 1 commit into
kunchenguid:mainfrom
slnkjthien:fm/ga-axi-catalog-v040
Closed

slnkjthien wants to merge 1 commit into
kunchenguid:mainfrom
slnkjthien:fm/ga-axi-catalog-v040

Conversation

@slnkjthien

Copy link
Copy Markdown
Contributor

Intent

gerrit-axi was added to the axi community catalog in #215 with admission status exception, reviewed at its v0.2.0 release (revision 047541439990d18c000858813fff0cebf7bd0dc4). The exception listed eight gaps against the AXI principles: errors on stderr, unknown-flag errors not listing valid flags, no live home view with no arguments, no help next-step hints, untruncated bodies, subcommand --help printing full usage, --version format and load cost, and no setup command or installable skill for session integration.

gerrit-axi v0.4.0 (https://github.com/slnkjthien/gerrit-axi/releases/tag/v0.4.0) claims to close all of those, plus three more found in a v0.3.0 re-review: no bin and description on the bare home view, 17-field status rows with no --fields, and submit on an already-merged change exiting 5.

This updates the catalog entry to match: re-review the source at the v0.4.0 tag by someone who did not build those changes, refresh the description and the admission record, and move the entry from exception to admitted if nothing remains.

What Changed

  • Moves the gerrit-axi entry in catalog.yaml from exception to admitted. It was reviewed at revision 7fb81b92e41f2a1f213b835c1337f4333f5a2c82 (the v0.4.0 release). The old exception text is gone. The list of reviewed components now also covers src/axi/version.js, help.js, hints.js, setup.js, src/core/message.js, rest.js, ssh.js, skills/gerrit-axi/SKILL.md, and test/axi.test.js.
  • Rewrites the source observations for v0.4.0. They cover:
    • a fast-path bare --version and -v
    • errors written to stdout as typed records
    • unknown-flag errors that list the valid flags, and per-command --help
    • a live dashboard when the tool runs with no arguments, with bin, description, and help[] hints
    • status rows cut to four fields by default, with --fields to add more
    • body truncation with a --full hint
    • setup hooks and the installable skill for session integration
    • submitting an already-merged change now exits 0
    • the new message write
  • Updates the gerrit-axi description to mention the sectioned dashboard and posting a change message. The new text is in catalog.yaml, in the generated catalog region of README.md, and in docs/index.html.

🤖 Generated with Claude Code

Risk Assessment

✅ Low: Only catalog metadata changed. The new reviewed_revision (7fb81b9) is the v0.4.0 tag commit, and every source observation checked against that tag holds. The description matches across catalog.yaml, README.md and docs/index.html, and moving the entry to admitted with the exception field dropped is what the intent asks for.

Testing

Installed the repo's dev dependencies and ran the docs generator check and its tests; both pass, so the README and docs/index.html regions match the new catalog entry. Cloned gerrit-axi at the v0.4.0 tag, confirmed the tag SHA equals reviewed_revision and every reviewed component exists, then drove the real CLI in an isolated HOME and a scratch git repo. That confirmed the bare version output, stdout-only typed errors with distinct exit codes, unknown-flag and unknown-field remedies that list the valid options, per-command help pages, the ambient home view with bin and description, and setup hooks install, idempotent rerun and remove, where remove kept a foreign hook. The dashboard success path, body truncation and already-merged submit need a live Gerrit server. They were checked only through the upstream fake-runner suite, which passes, and I did not query the user's internal Gerrit because its data would end up in a public PR. No screenshot of the docs table: the change is a text-only cell in generated HTML, and no Chrome binary was available (chrome-devtools-axi opened no pages). I removed the node_modules I installed and the temp clone.

  • Live validation: ✅ go - 7 of 10 scenarios driven live against the product
Scenario Result Live Evidence
Catalog entry regenerates cleanly: README and docs/index.html gerrit-axi rows match catalog.yaml ✅ pass live docs-check.txt; docs-test.txt
Admission pin is real: v0.4.0 tag resolves to reviewed_revision 7fb81b9 and every reviewed_components path exists there ✅ pass live tag.txt; path existence check on the v0.4.0 clone
--version gap closed: --version, -v, -V print the bare 0.4.0 and exit 0 ✅ pass live gerrit-axi-v0.4.0-transcript.txt
Errors on stdout: failing commands write a typed record (ok false, code, kind, remedy) to stdout, nothing to stderr, and exit 2/3/5 by kind ✅ pass live gerrit-axi-v0.4.0-transcript.txt; gerrit-axi-v0.4.0-host-transcript.txt
Adversarial unknown flag/field: status --bogus and --limt list the valid flags and suggest --limit; --fields nope lists the valid fields; all exit 2 ✅ pass live gerrit-axi-v0.4.0-transcript.txt; gerrit-axi-v0.4.0-host-transcript.txt
Subcommand help: status --help and setup --help print that command's page, not the full top-level usage ✅ pass live gerrit-axi-v0.4.0-transcript.txt; gerrit-axi-v0.4.0-setup-transcript.txt
Session integration: setup hooks installs Claude/Codex/OpenCode hooks, a rerun reports unchanged, --remove takes out only its own entries (a foreign hook survives), and dashboard --ambient print… ✅ pass live gerrit-axi-v0.4.0-setup-transcript.txt; gerrit-axi-v0.4.0-foreign-hook.txt; gerrit-axi-v0.4.0-transcript.txt
Bare invocation with a reachable Gerrit shows the sectioned dashboard: bin, description, five sections with counts, help[] next steps ⏸️ untested no Needs a reachable Gerrit server with SSH credentials. The only one available is the user's internal Gerrit, and its change data would end up in evidence on a public PR. To drive it, run gerrit-axi i…
Body truncation and 4-column default status rows against real review data ⏸️ untested no Needs a Gerrit server holding changes with long messages; same credential limit as above.
Submit on an already-merged change exits 0 with already_merged true ⏸️ untested no Needs a Gerrit server and a merged change the operator is allowed to submit against; a live submit is an outward-facing write I would not run without authorization.
Evidence: gerrit-axi v0.4.0 CLI transcript (version, bare, flags, help, ambient)
$ gerrit-axi --version
--- stdout
0.4.0
--- stderr (0 bytes)
--- exit=0

$ gerrit-axi -v
--- stdout
0.4.0
--- stderr (0 bytes)
--- exit=0

$ gerrit-axi -V
--- stdout
0.4.0
--- stderr (0 bytes)
--- exit=0

$ gerrit-axi 
--- stdout
ok: false
op: dashboard
error: cannot determine the Gerrit host
code: HOST_UNRESOLVED
kind: config
remedy: "Do one of the following:\n  * run this inside a repo whose 'origin' remote points at Gerrit\n        git remote -v   ->   ssh://<user>@<host>:29418/<project/path>\n  * export GERRIT_HOST=<host>   (optionally GERRIT_USER, GERRIT_PORT)\n  * create /tmp/gaxi.aPZd/home/.config/gerrit-axi/config.json containing\n        { \"host\": \"<host>\", \"user\": \"<user>\" }\n  * pass --host <host> on the command line"
help[1]: Run `gerrit-axi --host <host>`
--- stderr (0 bytes)
--- exit=3

$ gerrit-axi status --bogus
--- stdout
ok: false
op: status
error: "unknown option for status: --bogus"
code: BAD_USAGE
kind: usage
remedy: "Options for status: --query, --limit, --fields. Global options: --json, --host, --user, --port, --project, --rest-base, --help, --version."
--- stderr (0 bytes)
--- exit=2

$ gerrit-axi status --help
--- stdout
gerrit-axi status - one short row per change: what it is and whether it can submit

usage: gerrit-axi status [mine | <change>... | --query '<query>'] [options]

arguments (at most one form):
  (none)                  changes awaiting your attention ("your turn")
  mine                    your open changes
  <change>...             these change numbers
  --query '<query>'       an arbitrary Gerrit query, as one argument

options:
  --limit <n>             maximum changes to fetch (default 100)
  --fields <a,b>          add to the default columns (change, subject, status,
                          submit): project, branch, topic, owner, wip,
                          submittable, blocked_on, patch_set, revision, ref,
                          updated, created, url; labels or votes for that
                          table; all for every column and both tables

A row always has the default columns; show <change>... is the full review state.

global options: --json, --host <h>, --user <u>, --port <p>, --project <p>,
  --rest-base <u> (see gerrit-axi --help)

examples:
  gerrit-axi status
  gerrit-axi status mine
  gerrit-axi status --query 'status:open project:<project>' --limit 20
  gerrit-axi status mine --fields owner,blocked_on,labels
--- stderr (0 bytes)
--- exit=0

$ gerrit-axi status 123 --fields nope
--- stdout
ok: false
op: status
error: cannot determine the Gerrit host
code: HOST_UNRESOLVED
kind: config
remedy: "Do one of the following:\n  * run this inside a repo whose 'origin' remote points at Gerrit\n        git remote -v   ->   ssh://<user>@<host>:29418/<project/path>\n  * export GERRIT_HOST=<host>   (optionally GERRIT_USER, GERRIT_PORT)\n  * create /tmp/gaxi.aPZd/home/.config/gerrit-axi/config.json containing\n        { \"host\": \"<host>\", \"user\": \"<user>\" }\n  * pass --host <host> on the command line"
help[1]: Run `gerrit-axi status 123 --fields nope --host <host>`
--- stderr (0 bytes)
--- exit=3

$ gerrit-axi --host gerrit.invalid.example status 123
--- stdout
ok: false
op: dashboard
error: "options come after the command: gerrit-axi status --host gerrit.invalid.example 123"
code: BAD_USAGE
kind: usage
--- stderr (0 bytes)
--- exit=2

$ gerrit-axi dashboard --ambient
--- stdout
bin: /tmp/gaxi.aPZd/g/bin/gerrit-axi.js
description: "Gerrit code review for agents: what awaits you, change readiness and inline comments as records; publishes, posts change messages and submits, and cannot vote. Prefer it over raw `gerrit query` over ssh or Gerrit's REST API."
help[1]: Run `gerrit-axi` in a checkout whose origin is a Gerrit remote for your review dashboard
--- stderr (0 bytes)
--- exit=0

$ gerrit-axi --help
--- stdout
gerrit-axi - Gerrit for agents: your dashboard, review state as records, publish, message, and submit

usage: gerrit-axi [<command>] [options]
       gerrit-axi <command> --help     that command's options and examples

With no command it prints your dashboard: this binary and one line on what it
is, then the changes awaiting your attention, your work in progress, your
outgoing reviews, the reviews you were asked for and the changes you are CCed
on, grouped as Gerrit's own dashboard groups them, with a count per section and
the next step to run.

Records go to stdout: TOON by default, strict JSON with --json. A failure writes
a typed error record to stdout in that same format, with ok: false, writes
nothing to stderr, and exits non-zero, so a caller reads one stream and the
exit code says what it holds. An option a command does not take is refused
before anything is asked of git or the server (exit 2), and the record's remedy
lists the options that command does take, naming the nearest when a misspelling
is close.

A record ends with help[] -- the next steps, as complete commands carrying this
call's --host and its siblings -- only where the next step is not obvious: after
a list, after publish, submit or message, and whenever something was held back.
A detail view or a confirmation carries none. A failure's help[] is the command
that fixes or diagnoses it, when there is one.

commands, and the options each one takes:
  dashboard                   the home view above, by name
      --rows <n>              rows shown per section (default 10, max 100)
      --ambient               what a session-start hook prints: this binary,
                              one line on what it is, and a count per section,
                              asked of the server only in a Gerrit checkout;
                              never fails, exit 0
  status                      changes awaiting your attention ("your turn")
  status mine                 your open changes
  status <change>...          specific change numbers
  status --query '<query>'    an arbitrary Gerrit query
      --limit <n>             maximum changes to fetch (default 100)
      --fields <a,b>          columns to add to the default change, subject,
                              status, submit: any changes column of show,
                              labels or votes for that table, or all
  show <change>...            full review state, one record per change
      --messages <n|all>      also emit that man--- stderr (0 bytes)
--- exit=0
Evidence: gerrit-axi v0.4.0 transcript with a resolved but unreachable host
$ GERRIT_HOST=127.0.0.1 GERRIT_PORT=1 gerrit-axi 
--- stdout
ok: false
op: dashboard
error: "ssh to Gerrit failed: \"ssh: connect to host 127.0.0.1 port 1: Connection refused\""
code: SSH_FAILED
kind: transport
remedy: "Check that your SSH key is registered with Gerrit and that the host is reachable:\n    ssh -p 1 -- <user>@<host> gerrit version"
--- stderr (0 bytes)
--- exit=5

$ GERRIT_HOST=127.0.0.1 GERRIT_PORT=1 gerrit-axi status --limt 3
--- stdout
ok: false
op: status
error: "unknown option for status: --limt"
code: BAD_USAGE
kind: usage
remedy: "Did you mean --limit? Options for status: --query, --limit, --fields. Global options: --json, --host, --user, --port, --project, --rest-base, --help, --version."
--- stderr (0 bytes)
--- exit=2

$ GERRIT_HOST=127.0.0.1 GERRIT_PORT=1 gerrit-axi status 123 --fields nope
--- stdout
ok: false
op: status
error: "unknown field for status: nope"
code: BAD_USAGE
kind: usage
remedy: "Fields: change, subject, project, branch, topic, owner, status, wip, submit, submittable, blocked_on, patch_set, revision, ref, updated, created, url, labels, votes, all."
--- stderr (0 bytes)
--- exit=2

$ GERRIT_HOST=127.0.0.1 GERRIT_PORT=1 gerrit-axi status 123
--- stdout
ok: false
op: status
error: "ssh to Gerrit failed: \"ssh: connect to host 127.0.0.1 port 1: Connection refused\""
code: SSH_FAILED
kind: transport
remedy: "Check that your SSH key is registered with Gerrit and that the host is reachable:\n    ssh -p 1 -- <user>@<host> gerrit version"
--- stderr (0 bytes)
--- exit=5

$ GERRIT_HOST=127.0.0.1 GERRIT_PORT=1 gerrit-axi submit abc
--- stdout
ok: false
op: submit
error: "not a change number: abc"
code: BAD_USAGE
kind: usage
--- stderr (0 bytes)
--- exit=2
Evidence: gerrit-axi setup hooks install/unchanged/remove transcript
$ gerrit-axi setup --help
gerrit-axi setup - opt in to session integration, in your own user config

usage: gerrit-axi setup hooks [--remove]
       gerrit-axi setup config

arguments:
  hooks                   register gerrit-axi's ambient dashboard as a
                          session-start hook for Claude Code, Codex and
                          OpenCode; repeating it changes nothing, and it repairs
                          a moved binary. It first checks the connection and
                          sign-in, and names the human command that fixes what
                          is missing
  config                  save the host, port and user this checkout's origin
                          resolves to in the config file; never overwrites one

options:
  --remove                with hooks: take out only gerrit-axi's own hooks,
                          leaving every other hook and Codex's shared hooks
                          flag alone

Nothing is written to an agent's configuration unless you run this.

global options: --json, --host <h>, --user <u>, --port <p>, --project <p>,
  --rest-base <u> (see gerrit-axi --help)

examples:
  gerrit-axi setup hooks
  gerrit-axi setup hooks --remove
  gerrit-axi setup config
--- exit=0

$ gerrit-axi setup hooks
ok: true
op: setup hooks
status: installed
hook: /tmp/gaxi.aPZd/g/bin/gerrit-axi.js dashboard --ambient
targets[4]{agent,path,action}:
  claude,~/.claude/settings.json,installed
  codex,~/.codex/hooks.json,installed
  codex-feature,~/.codex/config.toml,installed
  opencode,~/.config/opencode/plugins/axi-gerrit-axi.js,installed
host: null
port: null
user: null
signed_in: null
help[3]: Restart your agent session to receive gerrit-axi ambient context,"No Gerrit host resolves here: run setup in a checkout whose origin is a Gerrit remote, or `export GERRIT_HOST=<host>`",Run `gerrit-axi setup hooks --remove` to take the hooks out again
--- exit=0

## files:
~/.claude/settings.json
~/.codex/config.toml
~/.codex/hooks.json
~/.config/opencode/plugins/axi-gerrit-axi.js
== /tmp/gaxi.aPZd/home/.claude/settings.json
{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "/tmp/gaxi.aPZd/g/bin/gerrit-axi.js dashboard --ambient",
            "timeout": 10
          }
        ]
      }
    ]
  }
}

== /tmp/gaxi.aPZd/home/.codex/config.toml
[features]
hooks = true

== /tmp/gaxi.aPZd/home/.codex/hooks.json
{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "/tmp/gaxi.aPZd/g/bin/gerrit-axi.js dashboard --ambient",
            "timeout": 10
          }
        ]
      }
    ]
  }
}

== /tmp/gaxi.aPZd/home/.config/opencode/plugins/axi-gerrit-axi.js
// gerrit-axi managed opencode plugin -- written by `gerrit-axi setup hooks`, removed by `gerrit-axi setup hooks --remove`.
import { execFile } from 'node:child_process';

const file = "/tmp/gaxi.aPZd/g/bin/gerrit-axi.js";
const args = ["dashboard","--ambient"];

function ambient(cwd) {
  return new Promise((resolve) => {
    execFile(file, args, { cwd, timeout: 10000 }, (error, stdout) => {
      resolve(error && !stdout ? 'gerrit-axi ambient context failed: ' + error.message : String(stdout).trim());
    });
  });
}

export const GerritAxiAmbientContextPlugin = async ({ directory }) => {
  const seen = new Map();
  return {
    'experimental.chat.system.transform': async (input, output) => {
      const key = input.sessionID ?? '';
      if (!seen.has(key)) seen.set(key, await ambient(directory || process.cwd()));
      const text = seen.get(key);
      if (text) output.system.push('## gerrit-axi ambient context\n' + text);
    },
  };
};

$ gerrit-axi setup hooks
ok: true
op: setup hooks
status: unchanged
hook: /tmp/gaxi.aPZd/g/bin/gerrit-axi.js dashboard --ambient
targets[4]{agent,path,action}:
  claude,~/.claude/settings.json,unchanged
  codex,~/.codex/hooks.json,unchanged
  codex-feature,~/.codex/config.toml,unchanged
  opencode,~/.config/opencode/plugins/axi-gerrit-axi.js,unchanged
host: null
port: null
user: null
signed_in: null
help[2]: "No Gerrit host resolves here: run setup in a checkout whose origin is a Gerrit remote, or `export GERRIT_HOST=<host>`",Run `gerrit-axi setup hooks --remove` to take the hooks out again
--- exit=0

$ gerrit-axi setup hooks --remove
ok: true
op: setup hooks --remove
status: removed
targets[4]{agent,path,action}:
  claude,~/.claude/settings.json,removed
  codex,~/.codex/hooks.json,removed
  codex-feature,~/.codex/config.toml,kept
  opencode,~/.config/opencode/plugins/axi-gerrit-axi.js,removed
help[1]: Restart your agent session to stop receiving gerrit-axi ambient context
--- exit=0
Evidence: setup hooks --remove keeps a foreign hook
after install:
{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "other-tool --ambient"
          }
        ]
      },
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "/tmp/gaxi.aPZd/g/bin/gerrit-axi.js dashboard --ambient",
            "timeout": 10
          }
        ]
      }
    ]
  }
}
after remove:
{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "other-tool --ambient"
          }
        ]
      }
    ]
  }
}
Evidence: gerrit-axi upstream axi/vote-ban tests at v0.4.0
✔ one invocation answers about a whole list of changes (23.338248ms)
✔ a label the server has grown adds a row and moves no column (2.998222ms)
✔ every vote carries its label, its value, who cast it and when (1.382947ms)
✔ the stack comes back with the staleness flag a stack watch exists to notice (1.394764ms)
✔ a change number the server did not return is reported missing, not as a failure (1.337758ms)
✔ cover messages are opt-in, and the query only asks for what will be emitted (3.943802ms)
✔ inline comments come back typed, per change, with the bot split explicit (3.527277ms)
✔ show --comments answers the whole watch in one invocation (1.411204ms)
✔ --json carries the same fields as strict JSON (1.00784ms)
✔ a failure is a typed record on stdout, never prose, and stderr stays empty (7.196804ms)
✔ an unknown option is refused by name, before any call, with the command's options listed (1.886856ms)
✔ a misspelt option is pointed at the nearest one (0.848082ms)
✔ the failure record distinguishes configuration, auth and transport (2.110295ms)
✔ no token can reach an error record (0.202851ms)
✔ status takes the same shapes the human CLI does (2.781763ms)
✔ an empty result set keeps the shape rather than printing nothing (1.585309ms)
✔ a status row is the few columns that pick a change, with no per-label tables (0.735891ms)
✔ status --fields adds columns in the row's own order, and tables by name (1.295693ms)
✔ status --fields all is the whole record: every column of show, and its labels and votes (1.505444ms)
✔ an unknown status field is refused before the server is asked, with the fields there are (1.035012ms)
✔ auth status reports the credential without a change to ask about (1.179841ms)
✔ help and version need no config, no credential and no network (0.472573ms)
✔ each command's --help is that command's page alone: its options, arguments and examples (0.878127ms)
✔ the fast path answers only a version flag that is the whole argv (0.232812ms)
✔ a version probe of the binary loads no module but the binary and the version leaf (370.734512ms)
✔ a bare invocation is the dashboard, not usage (3.86881ms)
✔ the dashboard answers to its name and to a bare option alike (2.606097ms)
✔ a change on two sections appears under each, and is counted once (1.18681ms)
✔ --rows caps every section, and the size hint names the query for the rest (1.20307ms)
✔ a page the server cut short is flagged, and its count is marked as a floor (1.093547ms)
✔ an option before a command is named as the problem, not read as the dashboard (0.271875ms)
✔ an empty section is stated, never omitted (2.779504ms)
✔ the dashboard under --json carries the same keys, typed (0.917202ms)
✔ with no host to resolve, the dashboard is an error record, not usage (0.62922ms)
✔ the top-level help lists every option every subcommand takes (0.322192ms)
✔ the package declares both binaries and leaves the human one alone (0.174331ms)
✔ publish --stack is one push, answered with the changes the server now holds (3.4487ms)
✔ submit asks the server and nothing else, and reports what it merged (0.958287ms)
✔ a submit the server refuses is an error record carrying the server's own words (0.809579ms)
✔ a submit of a change that has already merged is a no-op success, exit 0 (0.693198ms)
✔ a submit is asked first, and the change is read back only after a refusal (1.552902ms)
✔ TOON: a table declares its own field names, and every value round-trips (0.502962ms)
✔ TOON: a non-finite number is null, not a bareword (0.165688ms)
✔ TOON: a generated document decodes back to what was encoded (7.590092ms)
✔ the tier imports src/core and nothing from src/cli (0.632003ms)
✔ an origin remote whose username ssh would read as an option never reaches ssh (1.745507ms)
✔ no operation the agent tier drives sends a vote, over ssh, git or HTTP (40.217872ms)
ℹ tests 47
ℹ suites 0
ℹ pass 47
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 550.411928
exit=0
Evidence: docs:check output

docs:check ok — generated regions match their sources

docs:check ok — generated regions match their sources
exit=0
Evidence: v0.4.0 tag SHA

7fb81b92e41f2a1f213b835c1337f4333f5a2c82 refs/tags/v0.4.0

7fb81b92e41f2a1f213b835c1337f4333f5a2c82	refs/tags/v0.4.0

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

✅ **Review** - passed

✅ No issues found.

✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 7 of 10 scenarios driven live against the product
Scenario Result Live Evidence
Catalog entry regenerates cleanly: README and docs/index.html gerrit-axi rows match catalog.yaml ✅ pass live docs-check.txt; docs-test.txt
Admission pin is real: v0.4.0 tag resolves to reviewed_revision 7fb81b9 and every reviewed_components path exists there ✅ pass live tag.txt; path existence check on the v0.4.0 clone
--version gap closed: --version, -v, -V print the bare 0.4.0 and exit 0 ✅ pass live gerrit-axi-v0.4.0-transcript.txt
Errors on stdout: failing commands write a typed record (ok false, code, kind, remedy) to stdout, nothing to stderr, and exit 2/3/5 by kind ✅ pass live gerrit-axi-v0.4.0-transcript.txt; gerrit-axi-v0.4.0-host-transcript.txt
Adversarial unknown flag/field: status --bogus and --limt list the valid flags and suggest --limit; --fields nope lists the valid fields; all exit 2 ✅ pass live gerrit-axi-v0.4.0-transcript.txt; gerrit-axi-v0.4.0-host-transcript.txt
Subcommand help: status --help and setup --help print that command's page, not the full top-level usage ✅ pass live gerrit-axi-v0.4.0-transcript.txt; gerrit-axi-v0.4.0-setup-transcript.txt
Session integration: setup hooks installs Claude/Codex/OpenCode hooks, a rerun reports unchanged, --remove takes out only its own entries (a foreign hook survives), and dashboard --ambient print… ✅ pass live gerrit-axi-v0.4.0-setup-transcript.txt; gerrit-axi-v0.4.0-foreign-hook.txt; gerrit-axi-v0.4.0-transcript.txt
Bare invocation with a reachable Gerrit shows the sectioned dashboard: bin, description, five sections with counts, help[] next steps ⏸️ untested no Needs a reachable Gerrit server with SSH credentials. The only one available is the user's internal Gerrit, and its change data would end up in evidence on a public PR. To drive it, run gerrit-axi i…
Body truncation and 4-column default status rows against real review data ⏸️ untested no Needs a Gerrit server holding changes with long messages; same credential limit as above.
Submit on an already-merged change exits 0 with already_merged true ⏸️ untested no Needs a Gerrit server and a merged change the operator is allowed to submit against; a live submit is an outward-facing write I would not run without authorization.
  • node scripts/generate-docs.mjs --check (generated README/docs regions vs catalog.yaml)
  • node --test scripts/generate-docs.test.mjs
  • git ls-remote https://github.com/slnkjthien/gerrit-axi refs/tags/v0.4.0* (tag resolves to reviewed_revision)
  • Cloned gerrit-axi at v0.4.0 and checked that every reviewed_components path exists
  • gerrit-axi --version, -v, -V in isolated HOME
  • gerrit-axi bare, with no host and with an unreachable GERRIT_HOST
  • gerrit-axi status --bogus, status --limt 3, status 123 --fields nope, submit abc
  • gerrit-axi status --help, setup --help, --help
  • gerrit-axi dashboard --ambient outside a Gerrit checkout
  • gerrit-axi setup hooks, run again, then --remove, in isolated HOME; also with a pre-seeded foreign SessionStart hook
  • gerrit-axi upstream node --test test/axi.test.js test/vote-ban.test.js at v0.4.0
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

The v0.2.0 exception items were cleared in v0.3.0. The three gaps
still open there are closed in v0.4.0: the bare dashboard now shows
bin and description, status rows default to four fields with
--fields for more, and submit on a merged change exits 0 with
already_merged. No gap is left, so the entry moves to admitted.
@greptile-apps

greptile-apps Bot commented Sep 29, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

[Low risk] Updates catalog entry for a community code review tool.

The PR appears safe to merge; no actionable defect was established in the changed catalog files.

Reviews (1) · Last reviewed commit: "docs(catalog): admit gerrit-axi at v0.4...."

@slnkjthien

Copy link
Copy Markdown
Contributor Author

Duplicate of #221, which already merged; opened by mistake.

@slnkjthien slnkjthien closed this Sep 29, 2026
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