docs(tropkod): poll jobs by status #61

Merged
jercik merged 4 commits from docs/tropkod-status-contract into main 2026-08-26 13:39:24 +00:00
Owner

Updates the Tropkod skill to poll .job.status, preserve paid-job retry safety, and distinguish process exit 4 from its HTTP status. Merge only after tropkod-client#13 is published; older clients still return exit 2 for pending work.

Updates the Tropkod skill to poll `.job.status`, preserve paid-job retry safety, and distinguish process exit `4` from its HTTP status. Merge only after [tropkod-client#13](https://code.j4k.dev/j4k-oss/tropkod-client/pulls/13) is published; older clients still return exit `2` for pending work.
docs(tropkod): use job status for polling
All checks were successful
PR Review / Prepare immutable review tools (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna-3 generator (pull_request_target) Has been skipped
PR Review / Dispatch and observe exact review writers (pull_request_target) Has been skipped
PR Review / Request trusted main review (pull_request_target) Successful in 6s
commit-msg / commitlint (pull_request) Successful in 30s
Node tests / node:test (pull_request) Successful in 36s
393dce4182
forgejo-actions left a comment

Approach review: The approach looks good.

Approach review by Codex CLI · Personal 01 (gpt-5.6-sol)

**Approach review:** The approach looks good. _Approach review by Codex CLI · Personal 01 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjM5M2RjZTQxODI4OTVlMTBjZmZkZjNlZDk2ZTlhNzRiNWQyMWEzMzMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtbHVuYS0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMyOTk0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImZiMjE3ODNmLTU1NWQtNGFjNC05ODgzLTNkM2RkMGEzODY0NiJ9 -->
forgejo-actions left a comment

Approach review: The approach looks good. Using .job.status as the authoritative lifecycle signal matches the client’s new successful-exit semantics, and retaining explicit submit-versus-poll retry guidance preserves the paid-job safety constraint without introducing another abstraction.

Approach review by Codex CLI · Personal 01 (gpt-5.6-sol)

**Approach review:** The approach looks good. Using `.job.status` as the authoritative lifecycle signal matches the client’s new successful-exit semantics, and retaining explicit submit-versus-poll retry guidance preserves the paid-job safety constraint without introducing another abstraction. _Approach review by Codex CLI · Personal 01 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjM5M2RjZTQxODI4OTVlMTBjZmZkZjNlZDk2ZTlhNzRiNWQyMWEzMzMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtbHVuYS0yIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMyOTk0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImJkYTA3YWU1LTQ1Y2EtNDRlZC1iNzQ3LWE2YzlmZGVkYjc3NSJ9 -->
forgejo-actions left a comment

Approach review: Moving the polling contract onto .job.status is the right call — job status is the durable fact about the analysis, exit codes are facts about the invocation, and the old text overloaded exit 2 to mean both. The paid-job safety invariant survives the rewrite intact. Three approach-level notes: the frontmatter description now carries protocol detail that this repo's own ai-facing-writing-style skill rules out for capability descriptions; the body silently assumes a tropkod-client new enough to report exit 0 for pending work; and the retry paragraphs re-encode more of the client README's exit-code table than before, across repos, which is the same drift this PR is repairing.

Approach review by Claude Code · Personal 03 (opus)

**Approach review:** Moving the polling contract onto `.job.status` is the right call — job status is the durable fact about the analysis, exit codes are facts about the invocation, and the old text overloaded exit `2` to mean both. The paid-job safety invariant survives the rewrite intact. Three approach-level notes: the frontmatter description now carries protocol detail that this repo's own `ai-facing-writing-style` skill rules out for capability descriptions; the body silently assumes a `tropkod-client` new enough to report exit `0` for pending work; and the retry paragraphs re-encode more of the client README's exit-code table than before, across repos, which is the same drift this PR is repairing. _Approach review by Claude Code · Personal 03 (opus)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjM5M2RjZTQxODI4OTVlMTBjZmZkZjNlZDk2ZTlhNzRiNWQyMWEzMzMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtc21hcnQtMSIsInNvdXJjZVdvcmtmbG93UnVuSWQiOiIzMjk5NCIsInNvdXJjZUdlbmVyYXRvckF0dGVtcHQiOiIxIiwicmVzdWx0SWQiOiI2YjdmODdjMC1hMmU3LTQzMzQtYjUwNi03NGZlMjc3ODQwMTQifQ== -->
@ -1,6 +1,6 @@
---
name: tropkod
description: Use when checking an API, export, option, type, default, runtime behavior, compatibility claim, migration path, or implementation detail of a public npm package or crates.io crate; debugging dependency behavior; reviewing dependency-sensitive code; verifying an assumption about a specific package version; or whenever dependency research could improve accuracy or quality. Also use when the user mentions Tropkod.
description: "Use when checking an API, export, option, type, default, runtime behavior, compatibility claim, migration path, or implementation detail of a public npm package or crates.io crate; debugging dependency behavior; reviewing dependency-sensitive code; verifying a package-version assumption; or when the user mentions Tropkod. Query only with `tropkod-client --json`: it submits non-blocking, reports `pending`/`running`/`completed` in `.job.status` with exit 0, and polls `.job.id` through `tropkod-client --json --job <id>`."

The description now ends with method detail: which command to run, which statuses appear, which exit code, how to poll. skills/ai-facing-writing-style/SKILL.md:130 makes this a convention for this repo — a capability description is a trigger, not a summary, every clause must distinguish a matching request from a non-matching one, and "Never state the skill's capabilities, method, or body contents." Beyond the convention, that text spends always-loaded catalog budget on instructions the agent cannot act on until it loads the body, and it makes the exit-code contract live in two places — this PR already had to edit both, which is exactly the drift cost.

If the intent is a pre-load guard against reaching the service with curl (the way agent-browser ends its description with a tool-preference directive), a single short clause does that job; the pending/running/completed, exit 0, and --job mechanics change no routing decision and belong only in the body.

The description now ends with method detail: which command to run, which statuses appear, which exit code, how to poll. `skills/ai-facing-writing-style/SKILL.md:130` makes this a convention for this repo — a capability description is a trigger, not a summary, every clause must distinguish a matching request from a non-matching one, and "Never state the skill's capabilities, method, or body contents." Beyond the convention, that text spends always-loaded catalog budget on instructions the agent cannot act on until it loads the body, and it makes the exit-code contract live in two places — this PR already had to edit both, which is exactly the drift cost. If the intent is a pre-load guard against reaching the service with `curl` (the way `agent-browser` ends its description with a tool-preference directive), a single short clause does that job; the `pending`/`running`/`completed`, exit `0`, and `--job` mechanics change no routing decision and belong only in the body.
Author
Owner

Fixed in 161fcec: frontmatter is routing-only; protocol details live in the skill body.

<!-- gh-feedback:reply-to:69867 --> Fixed in 161fcec: frontmatter is routing-only; protocol details live in the skill body.
jercik marked this conversation as resolved
@ -21,3 +20,1 @@
`.job.id`. Keep it non-blocking — a synchronous `--wait-ms` wait killed by the harness loses the
id while the paid analysis runs on. While the exit code stays `2`, poll about 30 seconds apart,
bounding the whole loop at about 35 minutes (the server's own analysis budget is 30):
The default submit does not wait. It prints a job envelope with the id in `.job.id`; an exit of

Exit 0 for pending work is a client-version-dependent contract — the PR description notes older clients return exit 2 — but the skill text never names the version it assumes, and exit 2 no longer appears anywhere in the body. Merge ordering fixes publication order, not installed-version skew: axskills delivers this skill into environments whose tropkod-client binary this repo does not control, so an older client produces a code the skill leaves entirely undefined (it says only 3–7 are invocation failures).

A version floor stated where the CLI and its environment variables are introduced above — "needs tropkod-client >= " — is a durable fact rather than change narrative, keeps the doc self-describing, and turns a silent misread of the envelope into a precondition the agent can check.

Exit `0` for pending work is a client-version-dependent contract — the PR description notes older clients return exit `2` — but the skill text never names the version it assumes, and exit `2` no longer appears anywhere in the body. Merge ordering fixes publication order, not installed-version skew: axskills delivers this skill into environments whose `tropkod-client` binary this repo does not control, so an older client produces a code the skill leaves entirely undefined (it says only `3`–`7` are invocation failures). A version floor stated where the CLI and its environment variables are introduced above — "needs `tropkod-client` >= <version>" — is a durable fact rather than change narrative, keeps the doc self-describing, and turns a silent misread of the envelope into a precondition the agent can check.
Author
Owner

Fixed in 161fcec: a brief opening note identifies tropkod-client 3.x as a discrepancy-debugging hint.

<!-- gh-feedback:reply-to:69868 --> Fixed in 161fcec: a brief opening note identifies tropkod-client 3.x as a discrepancy-debugging hint.
jercik marked this conversation as resolved
@ -32,2 +32,2 @@
job — branch per the exit-code table in the client README, which also names the transient poll
failures to poll through and says when a failed submit may be retried.
Do not infer a completed verdict from exit `0`. A terminal `failed` job exits `1` with its job
envelope. Empty stdout is a crashed client, never a verdict. Codes `3`–`7` are invocation failures,

This paragraph and the two below now re-encode a large share of the client README's exit-code table — per-code retry safety, and per-status branching on .error.status for 401/403/404/408/429/5xx — while still naming that table as the source of truth. Two copies in two repositories is the drift this PR exists to repair, and the duplicated half is the part most likely to change again.

An alternative that keeps the safety-critical content inline: state here only the invariants the agent must never get wrong — a poll is a GET and never authorizes a resubmit; resubmit only with positive proof no job was created; otherwise report and stop — and delegate the per-code and per-HTTP-status detail to the README table. A client-side change then stays a one-repository edit, and the skill keeps the guarantee that actually protects the paid single-slot service.

This paragraph and the two below now re-encode a large share of the client README's exit-code table — per-code retry safety, and per-status branching on `.error.status` for `401`/`403`/`404`/`408`/`429`/5xx — while still naming that table as the source of truth. Two copies in two repositories is the drift this PR exists to repair, and the duplicated half is the part most likely to change again. An alternative that keeps the safety-critical content inline: state here only the invariants the agent must never get wrong — a poll is a GET and never authorizes a resubmit; resubmit only with positive proof no job was created; otherwise report and stop — and delegate the per-code and per-HTTP-status detail to the README table. A client-side change then stays a one-repository edit, and the skill keeps the guarantee that actually protects the paid single-slot service.
Author
Owner

Fixed in 161fcec: only the paid-work safety invariants remain here; exit-specific recovery delegates to the matching client README.

<!-- gh-feedback:reply-to:69869 --> Fixed in 161fcec: only the paid-work safety invariants remain here; exit-specific recovery delegates to the matching client README.
jercik marked this conversation as resolved
forgejo-actions left a comment

Approach review: The approach looks good.

Approach review by Codex CLI · Personal 01 (gpt-5.6-sol)

**Approach review:** The approach looks good. _Approach review by Codex CLI · Personal 01 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjM5M2RjZTQxODI4OTVlMTBjZmZkZjNlZDk2ZTlhNzRiNWQyMWEzMzMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctYXBwcm9hY2gtbHVuYS0zIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMyOTk0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImRhZWY1Y2I1LTNiZGYtNGE2ZC05MzRhLTJiYzA0ZDU5MjQxYiJ9 -->
forgejo-actions left a comment

Summary: No actionable issues found.

Code review by Codex CLI · Personal 01 (gpt-5.6-sol)

**Summary:** No actionable issues found. _Code review by Codex CLI · Personal 01 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjM5M2RjZTQxODI4OTVlMTBjZmZkZjNlZDk2ZTlhNzRiNWQyMWEzMzMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMyOTk0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImViOTA5ZGQyLTQzOGYtNDAzOS1iN2I0LTFmYTRhYjAxODE2OSJ9 -->
forgejo-actions left a comment

Summary: Found 1 medium integration issue: existing clients can still return the now-unhandled pending exit code.

Code review by Codex CLI · Personal 01 (gpt-5.6-sol)

**Summary:** Found 1 medium integration issue: existing clients can still return the now-unhandled pending exit code. _Code review by Codex CLI · Personal 01 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjM5M2RjZTQxODI4OTVlMTBjZmZkZjNlZDk2ZTlhNzRiNWQyMWEzMzMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hLTIiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMzI5OTQiLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiOTNmY2Q2MTgtZjJiNi00MGMxLTk1NGUtNzU0ZWIwZmJmMWUwIn0= -->
@ -22,2 +20,2 @@
id while the paid analysis runs on. While the exit code stays `2`, poll about 30 seconds apart,
bounding the whole loop at about 35 minutes (the server's own analysis budget is 30):
The default submit does not wait. It prints a job envelope with the id in `.job.id`; an exit of
`0` means the invocation succeeded, not that the analysis has a verdict. Keep it non-blocking — a

🟡 Medium: This assumes exit 0 without constraining the version of the globally installed tropkod-client. The PR body confirms that older clients return 2 for pending/running, and publishing the new release will not upgrade existing installations. In those environments the initial paid submit returns an unhandled 2, so an agent following the revised instructions can stop instead of polling the id it just received. Require/check a minimum client version before the first submit, or retain a compatibility branch that accepts exit 2 when stdout contains a pending/running job envelope and continues polling that id.

🟡 **Medium:** This assumes exit `0` without constraining the version of the globally installed `tropkod-client`. The PR body confirms that older clients return `2` for pending/running, and publishing the new release will not upgrade existing installations. In those environments the initial paid submit returns an unhandled `2`, so an agent following the revised instructions can stop instead of polling the id it just received. Require/check a minimum client version before the first submit, or retain a compatibility branch that accepts exit `2` when stdout contains a `pending`/`running` job envelope and continues polling that id.
Author
Owner

Declining a runtime version preflight or legacy exit-2 branch by user decision. The skill assumes a correct environment and includes only a brief 3.x discrepancy hint.

<!-- gh-feedback:reply-to:69879 --> Declining a runtime version preflight or legacy exit-2 branch by user decision. The skill assumes a correct environment and includes only a brief 3.x discrepancy hint.
forgejo-actions left a comment

Summary: No actionable issues found.

Code review by Codex CLI · Personal 02 (gpt-5.6-sol)

**Summary:** No actionable issues found. _Code review by Codex CLI · Personal 02 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjM5M2RjZTQxODI4OTVlMTBjZmZkZjNlZDk2ZTlhNzRiNWQyMWEzMzMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMyOTk0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjJhMjBmZTAyLTZhYTItNGVkMC04OGY0LTU5MzRkNDA2MTcwZCJ9 -->
forgejo-actions left a comment

Summary: Found 1 medium issue.

Code review by Codex CLI · Personal 01 (gpt-5.6-sol)

**Summary:** Found 1 medium issue. _Code review by Codex CLI · Personal 01 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjM5M2RjZTQxODI4OTVlMTBjZmZkZjNlZDk2ZTlhNzRiNWQyMWEzMzMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hLTMiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMzI5OTQiLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiMzdmMGU4YmEtZmM5My00YTI1LTg4YmMtNzMzMmI4YzA2OTE4In0= -->
@ -22,2 +20,2 @@
id while the paid analysis runs on. While the exit code stays `2`, poll about 30 seconds apart,
bounding the whole loop at about 35 minutes (the server's own analysis budget is 30):
The default submit does not wait. It prints a job envelope with the id in `.job.id`; an exit of
`0` means the invocation succeeded, not that the analysis has a verdict. Keep it non-blocking — a

🟡 Medium: This assumes the newly published client is also the binary already installed wherever the independently delivered skill runs. The PR body notes that older clients return exit 2 for a normal pending/running envelope, but this version removes that branch and provides no minimum-version check; a stale installation can therefore queue the paid job and then surface an undocumented nonzero result before the agent starts polling. Check tropkod-client --version/--help before submitting and require the new release, or explicitly accept legacy exit 2 when its JSON envelope has a pending/running .job.status. Publishing the client alone does not upgrade existing installations.

🟡 **Medium:** This assumes the newly published client is also the binary already installed wherever the independently delivered skill runs. The PR body notes that older clients return exit `2` for a normal pending/running envelope, but this version removes that branch and provides no minimum-version check; a stale installation can therefore queue the paid job and then surface an undocumented nonzero result before the agent starts polling. Check `tropkod-client --version`/`--help` before submitting and require the new release, or explicitly accept legacy exit `2` when its JSON envelope has a pending/running `.job.status`. Publishing the client alone does not upgrade existing installations.
Author
Owner

Declining a runtime version preflight or legacy exit-2 branch by user decision. The skill assumes a correct environment and includes only a brief 3.x discrepancy hint.

<!-- gh-feedback:reply-to:69884 --> Declining a runtime version preflight or legacy exit-2 branch by user decision. The skill assumes a correct environment and includes only a brief 3.x discrepancy hint.
docs(tropkod): clarify status-based polling
All checks were successful
PR Review / Prepare immutable review tools (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna-3 generator (pull_request_target) Has been skipped
PR Review / Dispatch and observe exact review writers (pull_request_target) Has been skipped
PR Review / Request trusted main review (pull_request_target) Successful in 6s
commit-msg / commitlint (pull_request) Successful in 23s
Node tests / node:test (pull_request) Successful in 30s
161fcecf78
Author
Owner

Replying to review #16511

Acknowledged; the approach remains status-driven.

> Replying to review #16511 Acknowledged; the approach remains status-driven.
Author
Owner

Replying to review #16513

Acknowledged; status-driven polling and paid-job safety remain intact.

> Replying to review #16513 Acknowledged; status-driven polling and paid-job safety remain intact.
Author
Owner

Replying to review #16515

Applied the routing and duplication recommendations in 161fcec. By user decision, the skill assumes a correct environment and carries only a brief tropkod-client 3.x discrepancy hint, not a runtime preflight.

> Replying to review #16515 Applied the routing and duplication recommendations in 161fcec. By user decision, the skill assumes a correct environment and carries only a brief tropkod-client 3.x discrepancy hint, not a runtime preflight.
Author
Owner

Replying to review #16519

Acknowledged; the approach remains status-driven.

> Replying to review #16519 Acknowledged; the approach remains status-driven.
Author
Owner

Replying to review #16520

Acknowledged; no actionable finding was reported.

> Replying to review #16520 Acknowledged; no actionable finding was reported.
Author
Owner

Replying to review #16521

Declined a runtime version preflight or legacy exit-2 branch by user decision. Commit 161fcec adds only a brief 3.x discrepancy hint.

> Replying to review #16521 Declined a runtime version preflight or legacy exit-2 branch by user decision. Commit 161fcec adds only a brief 3.x discrepancy hint.
Author
Owner

Replying to review #16522

Acknowledged; no actionable finding was reported.

> Replying to review #16522 Acknowledged; no actionable finding was reported.
Author
Owner

Replying to review #16524

Declined a runtime version preflight or legacy exit-2 branch by user decision. Commit 161fcec adds only a brief 3.x discrepancy hint.

> Replying to review #16524 Declined a runtime version preflight or legacy exit-2 branch by user decision. Commit 161fcec adds only a brief 3.x discrepancy hint.
forgejo-actions left a comment

Summary: Found 2 medium issues.

Code review by Codex CLI · Personal 01 (gpt-5.6-sol)

**Summary:** Found 2 medium issues. _Code review by Codex CLI · Personal 01 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjE2MWZjZWNmNzgzYTM5ZGJkYzIzMzg1NTk3MjIwMzcyMzdiYzliOTMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMzMDg3Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjdlOTZmNTg1LTYyMzctNGMxOC05OGI4LWQzNzBlM2UyNGQ1MSJ9 -->
@ -22,2 +21,2 @@
id while the paid analysis runs on. While the exit code stays `2`, poll about 30 seconds apart,
bounding the whole loop at about 35 minutes (the server's own analysis budget is 30):
The default submission is non-blocking. Capture `.job.id`; exit `0` only confirms the invocation,
not an analysis verdict. Poll that id with `tropkod-client --json --job <job-id>` while

🟡 Medium: The status-based loop drops the previous 30-second cadence and 35-minute overall bound. A pending/running job can therefore make an agent poll in a tight or unbounded loop; the v3 client README explicitly warns that tight polling earns a 429 and says to stop after about 35 minutes. Keep the .job.status condition, but restore both limits and report the job id when the bound expires.

🟡 **Medium:** The status-based loop drops the previous 30-second cadence and 35-minute overall bound. A pending/running job can therefore make an agent poll in a tight or unbounded loop; the v3 client README explicitly warns that tight polling earns a 429 and says to stop after about 35 minutes. Keep the `.job.status` condition, but restore both limits and report the job id when the bound expires.
Author
Owner

Fixed in 1de8ec0: polling waits about 30 seconds, stops after about 35 minutes, and reports the job id.

<!-- gh-feedback:reply-to:70137 --> Fixed in 1de8ec0: polling waits about 30 seconds, stops after about 35 minutes, and reports the job id.
jercik marked this conversation as resolved
@ -37,2 +26,2 @@
failure, an unparseable response with no recoverable id, a crash — report it and stop: the id is
unrecoverable, and resubmitting would queue a second paid run behind the invisible first.
Every submission queues paid work on a single-slot service. Keep at most one question outstanding.
If a submission ends without a usable job id, report it and stop: never resubmit, because the

🟡 Medium: This unconditional never resubmit rule also covers failures that prove the POST was never accepted. In v3, exit 3 dispatches no request, and exit 4 is safe to retry when .error.status is a non-408 4xx; treating a missing URL or a 401 as a possible orphan unnecessarily makes a recoverable invocation terminal. Limit the stop rule to outcomes where job creation is possible or unknown, and preserve the README's documented exit-code/status exceptions.

🟡 **Medium:** This unconditional `never resubmit` rule also covers failures that prove the POST was never accepted. In v3, exit `3` dispatches no request, and exit `4` is safe to retry when `.error.status` is a non-408 4xx; treating a missing URL or a 401 as a possible orphan unnecessarily makes a recoverable invocation terminal. Limit the stop rule to outcomes where job creation is possible or unknown, and preserve the README's documented exit-code/status exceptions.
Author
Owner

Fixed in 1de8ec0: resubmission is allowed only for the two client outcomes that prove no job was created.

<!-- gh-feedback:reply-to:70138 --> Fixed in 1de8ec0: resubmission is allowed only for the two client outcomes that prove no job was created.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Found 3 medium documentation issues: the exit-0 description misstates completed jobs, polling lacks the required cadence and timeout, and retry guidance forbids retries that the client can prove safe.

Code review by Codex CLI · Personal 01 (gpt-5.6-luna)

**Summary:** Found 3 medium documentation issues: the exit-0 description misstates completed jobs, polling lacks the required cadence and timeout, and retry guidance forbids retries that the client can prove safe. _Code review by Codex CLI · Personal 01 (gpt-5.6-luna)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjE2MWZjZWNmNzgzYTM5ZGJkYzIzMzg1NTk3MjIwMzcyMzdiYzliOTMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hLTMiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMzMwODciLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiZjJkYjllMDEtYjQ2Zi00MzNhLTlkYTMtMjZhYmQwY2RiZGNiIn0= -->
@ -21,3 +21,1 @@
`.job.id`. Keep it non-blocking — a synchronous `--wait-ms` wait killed by the harness loses the
id while the paid analysis runs on. While the exit code stays `2`, poll about 30 seconds apart,
bounding the whole loop at about 35 minutes (the server's own analysis budget is 30):
The default submission is non-blocking. Capture `.job.id`; exit `0` only confirms the invocation,

🟡 Medium: This overstates the exit-0 contract. In the 3.x client, pending/running and completed jobs all return exit 0; a completed response includes the analysis verdict (and --wait-ms can also complete). Say exit 0 is non-failure, then require inspecting .job.status and consuming .analysis when it is completed, so agents do not discard a valid answer.

🟡 **Medium:** This overstates the exit-0 contract. In the 3.x client, pending/running and completed jobs all return exit 0; a completed response includes the analysis verdict (and `--wait-ms` can also complete). Say exit 0 is non-failure, then require inspecting `.job.status` and consuming `.analysis` when it is `completed`, so agents do not discard a valid answer.
Author
Owner

Fixed in 1de8ec0: exit 0 is a valid nonfailed envelope; callers inspect status and consume analysis when completed.

<!-- gh-feedback:reply-to:70148 --> Fixed in 1de8ec0: exit 0 is a valid nonfailed envelope; callers inspect status and consume analysis when completed.
jercik marked this conversation as resolved
@ -22,2 +21,2 @@
id while the paid analysis runs on. While the exit code stays `2`, poll about 30 seconds apart,
bounding the whole loop at about 35 minutes (the server's own analysis budget is 30):
The default submission is non-blocking. Capture `.job.id`; exit `0` only confirms the invocation,
not an analysis verdict. Poll that id with `tropkod-client --json --job <job-id>` while

🟡 Medium: The polling instructions omit both the required cadence and an overall stop bound. The client documents polling about every 30 seconds because tight loops can receive 429, and the service's analysis budget is about 30 minutes; without these limits an agent can hammer the service or loop indefinitely on a stuck job. Retain the interval and ~35-minute bound, reporting the job id when the bound expires.

🟡 **Medium:** The polling instructions omit both the required cadence and an overall stop bound. The client documents polling about every 30 seconds because tight loops can receive 429, and the service's analysis budget is about 30 minutes; without these limits an agent can hammer the service or loop indefinitely on a stuck job. Retain the interval and ~35-minute bound, reporting the job id when the bound expires.
Author
Owner

Fixed in 1de8ec0: polling now has the documented cadence, bound, and job-id report.

<!-- gh-feedback:reply-to:70149 --> Fixed in 1de8ec0: polling now has the documented cadence, bound, and job-id report.
jercik marked this conversation as resolved
@ -37,2 +26,2 @@
failure, an unparseable response with no recoverable id, a crash — report it and stop: the id is
unrecoverable, and resubmitting would queue a second paid run behind the invisible first.
Every submission queues paid work on a single-slot service. Keep at most one question outstanding.
If a submission ends without a usable job id, report it and stop: never resubmit, because the

🟡 Medium: “Never resubmit” is too broad and contradicts the client’s exit contract: exit 3 proves no request was dispatched, and exit 4 with a non-408 4xx proves no job was created, so after fixing the input or credentials a retry is safe. Reserve the no-resubmit rule for ambiguous outcomes (408, 5xx, transport, crash, or an unparseable response without a recoverable id), and require accounting for earlier submissions.

🟡 **Medium:** “Never resubmit” is too broad and contradicts the client’s exit contract: exit 3 proves no request was dispatched, and exit 4 with a non-408 4xx proves no job was created, so after fixing the input or credentials a retry is safe. Reserve the no-resubmit rule for ambiguous outcomes (408, 5xx, transport, crash, or an unparseable response without a recoverable id), and require accounting for earlier submissions.
Author
Owner

Fixed in 1de8ec0: ambiguous outcomes stop, while proven no-job outcomes may be corrected and retried.

<!-- gh-feedback:reply-to:70150 --> Fixed in 1de8ec0: ambiguous outcomes stop, while proven no-job outcomes may be corrected and retried.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Found 2 medium issues.

Code review by Codex CLI · Personal 01 (gpt-5.6-luna)

**Summary:** Found 2 medium issues. _Code review by Codex CLI · Personal 01 (gpt-5.6-luna)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjE2MWZjZWNmNzgzYTM5ZGJkYzIzMzg1NTk3MjIwMzcyMzdiYzliOTMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMzMDg3Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImU3ZDU3OWMwLWQyOGItNDdkOS1hOTQwLTIxYzMzYTk3YTVmZCJ9 -->
@ -22,2 +21,2 @@
id while the paid analysis runs on. While the exit code stays `2`, poll about 30 seconds apart,
bounding the whole loop at about 35 minutes (the server's own analysis budget is 30):
The default submission is non-blocking. Capture `.job.id`; exit `0` only confirms the invocation,
not an analysis verdict. Poll that id with `tropkod-client --json --job <job-id>` while

🟡 Medium: The status loop omits the required polling cadence and termination bound. Pending/running polls should be about 30 seconds apart and bounded at about 35 minutes; following this text literally can tight-loop into 429s or poll forever after repeated transient failures. Document the cadence, bound, and same-job retry handling for transient poll errors.

🟡 **Medium:** The status loop omits the required polling cadence and termination bound. Pending/running polls should be about 30 seconds apart and bounded at about 35 minutes; following this text literally can tight-loop into 429s or poll forever after repeated transient failures. Document the cadence, bound, and same-job retry handling for transient poll errors.
Author
Owner

Fixed in 1de8ec0: the loop is spaced, bounded, and delegates transient recovery to the matching client README.

<!-- gh-feedback:reply-to:70157 --> Fixed in 1de8ec0: the loop is spaced, bounded, and delegates transient recovery to the matching client README.
jercik marked this conversation as resolved
@ -37,2 +26,2 @@
failure, an unparseable response with no recoverable id, a crash — report it and stop: the id is
unrecoverable, and resubmitting would queue a second paid run behind the invisible first.
Every submission queues paid work on a single-slot service. Keep at most one question outstanding.
If a submission ends without a usable job id, report it and stop: never resubmit, because the

🟡 Medium: The blanket never resubmit rule is too broad for the 3.x submit contract. Exit 3 means no HTTP request was sent, and exit 4 with a non-408 4xx proves no job was created, so those cases are safe to retry after fixing the input or credentials. Restore the exit/status branches while retaining the no-resubmit rule for outcomes where creation is unknown.

🟡 **Medium:** The blanket `never resubmit` rule is too broad for the 3.x submit contract. Exit `3` means no HTTP request was sent, and exit `4` with a non-408 4xx proves no job was created, so those cases are safe to retry after fixing the input or credentials. Restore the exit/status branches while retaining the no-resubmit rule for outcomes where creation is unknown.
Author
Owner

Fixed in 1de8ec0: the two proven no-job outcomes are the only submit retries permitted.

<!-- gh-feedback:reply-to:70158 --> Fixed in 1de8ec0: the two proven no-job outcomes are the only submit retries permitted.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Found 3 medium issues: the guidance suppresses safe submit retries, leaves polling unbounded, and omits defined transient poll recovery.

Code review by Codex CLI · Personal 02 (gpt-5.6-luna)

**Summary:** Found 3 medium issues: the guidance suppresses safe submit retries, leaves polling unbounded, and omits defined transient poll recovery. _Code review by Codex CLI · Personal 02 (gpt-5.6-luna)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjE2MWZjZWNmNzgzYTM5ZGJkYzIzMzg1NTk3MjIwMzcyMzdiYzliOTMiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hLTIiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMzMwODciLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiYjU3MjgxZWMtZThhOC00MjVlLTg0ZTYtMzRkNDk3MDEzOTU0In0= -->
@ -22,2 +21,2 @@
id while the paid analysis runs on. While the exit code stays `2`, poll about 30 seconds apart,
bounding the whole loop at about 35 minutes (the server's own analysis budget is 30):
The default submission is non-blocking. Capture `.job.id`; exit `0` only confirms the invocation,
not an analysis verdict. Poll that id with `tropkod-client --json --job <job-id>` while

🟡 Medium: The polling recipe no longer specifies the required roughly 30-second cadence or the roughly 35-minute overall bound. An agent following only this skill can tight-loop until it triggers 429 responses, or poll a permanently pending/running job indefinitely. Keep the status-based loop, but retain a bounded cadence and a terminal timeout that reports the job id.

🟡 **Medium:** The polling recipe no longer specifies the required roughly 30-second cadence or the roughly 35-minute overall bound. An agent following only this skill can tight-loop until it triggers `429` responses, or poll a permanently `pending`/`running` job indefinitely. Keep the status-based loop, but retain a bounded cadence and a terminal timeout that reports the job id.
Author
Owner

Fixed in 1de8ec0: polls are about 30 seconds apart and stop after about 35 minutes with the job id reported.

<!-- gh-feedback:reply-to:70163 --> Fixed in 1de8ec0: polls are about 30 seconds apart and stop after about 35 minutes with the job id reported.
jercik marked this conversation as resolved
@ -37,2 +26,2 @@
failure, an unparseable response with no recoverable id, a crash — report it and stop: the id is
unrecoverable, and resubmitting would queue a second paid run behind the invisible first.
Every submission queues paid work on a single-slot service. Keep at most one question outstanding.
If a submission ends without a usable job id, report it and stop: never resubmit, because the

🟡 Medium: The blanket “never resubmit” rule is stricter than the target client’s contract: submit exit 3 (no request dispatched) and exit 4 for a non-408 4xx prove that no job was created, so after correcting the input/credentials those cases are safe to retry. Following this text makes fixable usage errors terminal and prevents a valid question from being retried; reserve the no-resubmit rule for outcomes where creation is unknown.

🟡 **Medium:** The blanket “never resubmit” rule is stricter than the target client’s contract: submit exit `3` (no request dispatched) and exit `4` for a non-`408` 4xx prove that no job was created, so after correcting the input/credentials those cases are safe to retry. Following this text makes fixable usage errors terminal and prevents a valid question from being retried; reserve the no-resubmit rule for outcomes where creation is unknown.
Author
Owner

Fixed in 1de8ec0: usage and non-408 4xx failures may be corrected and retried when prior submits are accounted for.

<!-- gh-feedback:reply-to:70162 --> Fixed in 1de8ec0: usage and non-408 4xx failures may be corrected and retried when prior submits are accounted for.
jercik marked this conversation as resolved
@ -38,1 +26,3 @@
unrecoverable, and resubmitting would queue a second paid run behind the invisible first.
Every submission queues paid work on a single-slot service. Keep at most one question outstanding.
If a submission ends without a usable job id, report it and stop: never resubmit, because the
original job may have been created. A polling-command failure never authorizes a new submission;

🟡 Medium: “Recover only against the same job id” does not tell the caller how to handle normal poll failures. For this client, poll exit 4 on 408/429/5xx and exit 5 are retryable, exit 3 should resume after fixing input, and exit 6 is retryable once or twice before a repeated identical error is terminal. Without that mapping, an agent may stop on a transient failure and abandon the paid job; retain the mapping or provide a version-pinned, discoverable reference.

🟡 **Medium:** “Recover only against the same job id” does not tell the caller how to handle normal poll failures. For this client, poll exit `4` on `408`/`429`/5xx and exit `5` are retryable, exit `3` should resume after fixing input, and exit `6` is retryable once or twice before a repeated identical error is terminal. Without that mapping, an agent may stop on a transient failure and abandon the paid job; retain the mapping or provide a version-pinned, discoverable reference.
Author
Owner

Fixed in 1de8ec0: transient poll recovery is explicitly delegated to the matching client README while preserving the same job id.

<!-- gh-feedback:reply-to:70164 --> Fixed in 1de8ec0: transient poll recovery is explicitly delegated to the matching client README while preserving the same job id.
jercik marked this conversation as resolved
docs(tropkod): restore bounded recovery guidance
All checks were successful
PR Review / Prepare immutable review tools (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna-3 generator (pull_request_target) Has been skipped
PR Review / Dispatch and observe exact review writers (pull_request_target) Has been skipped
PR Review / Request trusted main review (pull_request_target) Successful in 5s
commit-msg / commitlint (pull_request) Successful in 27s
Node tests / node:test (pull_request) Successful in 34s
1de8ec0f34
Author
Owner

Replying to review #16559

Fixed both findings in 1de8ec0: bounded polling and retry only after proof that no job was created.

> Replying to review #16559 Fixed both findings in 1de8ec0: bounded polling and retry only after proof that no job was created.
Author
Owner

Replying to review #16562

Fixed all three findings in 1de8ec0: completed analysis handling, bounded polling, and safe proven-no-job retries.

> Replying to review #16562 Fixed all three findings in 1de8ec0: completed analysis handling, bounded polling, and safe proven-no-job retries.
Author
Owner

Replying to review #16565

Fixed both findings in 1de8ec0: bounded same-job polling and safe proven-no-job retries.

> Replying to review #16565 Fixed both findings in 1de8ec0: bounded same-job polling and safe proven-no-job retries.
Author
Owner

Replying to review #16567

Fixed all three findings in 1de8ec0: bounded polling, proven-no-job submit retries, and discoverable transient poll recovery.

> Replying to review #16567 Fixed all three findings in 1de8ec0: bounded polling, proven-no-job submit retries, and discoverable transient poll recovery.
forgejo-actions left a comment

Summary: No actionable issues found.

Code review by Codex CLI · Personal 01 (gpt-5.6-luna)

**Summary:** No actionable issues found. _Code review by Codex CLI · Personal 01 (gpt-5.6-luna)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjFkZThlYzBmMzQ4YzcwMjk0YTg4YzMyYzk1N2Q2ZTc2ZTgwNWIzNjIiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMzMTA0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImRmOGVmZThmLTBkNDctNDNkOS05NzkwLTk0MjQ1MGE5YzA4OCJ9 -->
forgejo-actions left a comment

Summary: No actionable issues found.

Code review by Codex CLI · Personal 02 (gpt-5.6-luna)

**Summary:** No actionable issues found. _Code review by Codex CLI · Personal 02 (gpt-5.6-luna)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjFkZThlYzBmMzQ4YzcwMjk0YTg4YzMyYzk1N2Q2ZTc2ZTgwNWIzNjIiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hLTMiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMzMxMDQiLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiY2Y5ZTcyZTAtYjIwMi00MmIwLWJjZmMtMGE3YjMwMGRmNTExIn0= -->
forgejo-actions left a comment

Summary: Found 1 medium issue.

Code review by Codex CLI · Personal 01 (gpt-5.6-sol)

**Summary:** Found 1 medium issue. _Code review by Codex CLI · Personal 01 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjFkZThlYzBmMzQ4YzcwMjk0YTg4YzMyYzk1N2Q2ZTc2ZTgwNWIzNjIiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMzMTA0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6ImIwMmEyMGI1LWY5MzAtNDg1MS04OTAyLThjY2FjY2FhZDZiNCJ9 -->
@ -24,0 +21,4 @@
The default submission is non-blocking. Exit `0` returns a valid nonfailed job envelope; inspect
`.job.status` rather than assuming the analysis is still pending. Capture `.job.id`, poll it with
`tropkod-client --json --job <job-id>` while the status is `pending` or `running`, and consume
`.analysis` when it is `completed`. A `failed` job is terminal. Wait about 30 seconds between polls

🟡 Medium: A completed job does not necessarily answer the question: the 3.x schema also permits .analysis.status == "unresolved", which provides no evidence for the dependency claim. Replacing the previous .analysis.status guidance with “consume .analysis” can make an agent treat a terminal unresolved result as a verdict. Please require branching on .analysis.status, using only answered as evidence and reporting unresolved as no evidence.

🟡 **Medium:** A `completed` job does not necessarily answer the question: the 3.x schema also permits `.analysis.status == "unresolved"`, which provides no evidence for the dependency claim. Replacing the previous `.analysis.status` guidance with “consume `.analysis`” can make an agent treat a terminal unresolved result as a verdict. Please require branching on `.analysis.status`, using only `answered` as evidence and reporting `unresolved` as no evidence.
Author
Owner

Fixed in 7fcca53: answered is usable evidence; unresolved is explicitly reported as no evidence.

<!-- gh-feedback:reply-to:70215 --> Fixed in 7fcca53: answered is usable evidence; unresolved is explicitly reported as no evidence.
jercik marked this conversation as resolved
forgejo-actions left a comment

Summary: Found 1 medium issue.

Code review by Codex CLI · Personal 01 (gpt-5.6-luna)

**Summary:** Found 1 medium issue. _Code review by Codex CLI · Personal 01 (gpt-5.6-luna)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjFkZThlYzBmMzQ4YzcwMjk0YTg4YzMyYzk1N2Q2ZTc2ZTgwNWIzNjIiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hLTIiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMzMxMDQiLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiMGNkYmMxNGItNGM5My00NzU2LWFjYWUtNjQzM2U4YjhlMmFkIn0= -->
@ -24,0 +21,4 @@
The default submission is non-blocking. Exit `0` returns a valid nonfailed job envelope; inspect
`.job.status` rather than assuming the analysis is still pending. Capture `.job.id`, poll it with
`tropkod-client --json --job <job-id>` while the status is `pending` or `running`, and consume
`.analysis` when it is `completed`. A `failed` job is terminal. Wait about 30 seconds between polls

🟡 Medium: A completed job can yield .analysis.status: "unresolved", which is not evidence either way. Please state that agents must inspect .analysis.status and must not use an unresolved result to support the dependency claim; otherwise this shorter instruction can cause unsupported conclusions.

🟡 **Medium:** A completed job can yield `.analysis.status: "unresolved"`, which is not evidence either way. Please state that agents must inspect `.analysis.status` and must not use an unresolved result to support the dependency claim; otherwise this shorter instruction can cause unsupported conclusions.
Author
Owner

Fixed in 7fcca53: completed analyses branch on analysis.status and never use unresolved as support.

<!-- gh-feedback:reply-to:70225 --> Fixed in 7fcca53: completed analyses branch on analysis.status and never use unresolved as support.
jercik marked this conversation as resolved
docs(tropkod): distinguish unresolved analyses
All checks were successful
PR Review / Prepare immutable review tools (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-approach-luna-3 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-smart-1 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna-2 generator (pull_request_target) Has been skipped
PR Review / forgejo-review-code-luna-3 generator (pull_request_target) Has been skipped
PR Review / Dispatch and observe exact review writers (pull_request_target) Has been skipped
PR Review / Request trusted main review (pull_request_target) Successful in 2s
commit-msg / commitlint (pull_request) Successful in 20s
Node tests / node:test (pull_request) Successful in 35s
7fcca53032
Author
Owner

Replying to review #16577

Acknowledged; no actionable finding was reported.

> Replying to review #16577 Acknowledged; no actionable finding was reported.
Author
Owner

Replying to review #16579

Acknowledged; no actionable finding was reported.

> Replying to review #16579 Acknowledged; no actionable finding was reported.
Author
Owner

Replying to review #16580

Fixed the unresolved-analysis evidence finding in 7fcca53.

> Replying to review #16580 Fixed the unresolved-analysis evidence finding in 7fcca53.
Author
Owner

Replying to review #16582

Fixed the unresolved-analysis evidence finding in 7fcca53.

> Replying to review #16582 Fixed the unresolved-analysis evidence finding in 7fcca53.
forgejo-actions left a comment

Summary: Found 1 medium issue.

Code review by Codex CLI · Personal 01 (gpt-5.6-luna)

**Summary:** Found 1 medium issue. _Code review by Codex CLI · Personal 01 (gpt-5.6-luna)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjdmY2NhNTMwMzIxNTcwMmRmNzgwYTZkZjQ3ZTU4MTA5OTM0ODIzZTYiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hLTMiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMzMxNDQiLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiOTM0NDYxZDEtZDdlMy00YWQ3LWE3OGYtMDFiZmI5MjNhNmY1In0= -->
@ -21,3 +21,1 @@
`.job.id`. Keep it non-blocking — a synchronous `--wait-ms` wait killed by the harness loses the
id while the paid analysis runs on. While the exit code stays `2`, poll about 30 seconds apart,
bounding the whole loop at about 35 minutes (the server's own analysis budget is 30):
The default submission is non-blocking. Exit `0` returns a valid nonfailed job envelope; inspect

🟡 Medium: The default tropkod-client --json submission exits 2 when the job is pending or running; exit 0 is reserved for a completed answered or unresolved verdict. This wording omits the normal submit exit and foregrounds exit 0, so an agent may treat the expected submit result as a failure (for example under shell errexit) or fail to distinguish a completed verdict from submission success. State the exit-2 behavior explicitly and reserve exit 0 for completed jobs.

🟡 **Medium:** The default `tropkod-client --json` submission exits `2` when the job is `pending` or `running`; exit `0` is reserved for a completed `answered` or `unresolved` verdict. This wording omits the normal submit exit and foregrounds exit `0`, so an agent may treat the expected submit result as a failure (for example under shell `errexit`) or fail to distinguish a completed verdict from submission success. State the exit-`2` behavior explicitly and reserve exit `0` for completed jobs.
Author
Owner

This PR targets tropkod-client 3.x, whose nonfailed pending, running, and completed envelopes exit 0. Exit 2 is the superseded client behavior that caused the original failure; restoring it here would contradict the client PR. The opening 3.x note is retained only as the requested discrepancy-debugging hint.

<!-- gh-feedback:reply-to:70270 --> This PR targets tropkod-client 3.x, whose nonfailed pending, running, and completed envelopes exit 0. Exit 2 is the superseded client behavior that caused the original failure; restoring it here would contradict the client PR. The opening 3.x note is retained only as the requested discrepancy-debugging hint.
forgejo-actions left a comment

Summary: Found 1 medium issue.

Code review by Codex CLI · Personal 02 (gpt-5.6-luna)

**Summary:** Found 1 medium issue. _Code review by Codex CLI · Personal 02 (gpt-5.6-luna)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjdmY2NhNTMwMzIxNTcwMmRmNzgwYTZkZjQ3ZTU4MTA5OTM0ODIzZTYiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMzMTQ0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjQ4NmMzMTk2LThhMzYtNDFiNi04ZGZmLTI4Zjc3MjIwMjJhZCJ9 -->
@ -1,38 +1,34 @@
---
name: tropkod
description: Use when checking an API, export, option, type, default, runtime behavior, compatibility claim, migration path, or implementation detail of a public npm package or crates.io crate; debugging dependency behavior; reviewing dependency-sensitive code; verifying an assumption about a specific package version; or whenever dependency research could improve accuracy or quality. Also use when the user mentions Tropkod.
description: Use when checking an API, export, option, type, default, runtime behavior, compatibility claim, migration path, or implementation detail of a public npm package or crates.io crate; debugging dependency behavior; reviewing dependency-sensitive code; verifying a package-version assumption; or when the user mentions Tropkod.

🟡 Medium: This removes the or whenever dependency research could improve accuracy or quality trigger from the frontmatter, even though the body still says to use Tropkod proactively. The frontmatter is the routing text available before a skill is loaded, so automatic selection will now miss generic dependency-research tasks and the polling contract will not be delivered. Preserve that broad trigger (or equivalent routing wording) while updating the client semantics.

🟡 **Medium:** This removes the `or whenever dependency research could improve accuracy or quality` trigger from the frontmatter, even though the body still says to use Tropkod proactively. The frontmatter is the routing text available before a skill is loaded, so automatic selection will now miss generic dependency-research tasks and the polling contract will not be delivered. Preserve that broad trigger (or equivalent routing wording) while updating the client semantics.
Author
Owner

The routing description still selects API, export, option, type, default, runtime-behavior, compatibility, migration, implementation-detail, debugging, review, and version-assumption dependency work. The removed catch-all did not distinguish a matching request from a non-matching one, and the repository's skill-writing rule requires routing-only, discriminative frontmatter. This late-round medium suggestion does not establish a severe routing defect.

<!-- gh-feedback:reply-to:70273 --> The routing description still selects API, export, option, type, default, runtime-behavior, compatibility, migration, implementation-detail, debugging, review, and version-assumption dependency work. The removed catch-all did not distinguish a matching request from a non-matching one, and the repository's skill-writing rule requires routing-only, discriminative frontmatter. This late-round medium suggestion does not establish a severe routing defect.
forgejo-actions left a comment

Summary: No actionable issues found.

Code review by Codex CLI · Personal 02 (gpt-5.6-sol)

**Summary:** No actionable issues found. _Code review by Codex CLI · Personal 02 (gpt-5.6-sol)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjdmY2NhNTMwMzIxNTcwMmRmNzgwYTZkZjQ3ZTU4MTA5OTM0ODIzZTYiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1zbWFydC0xIiwic291cmNlV29ya2Zsb3dSdW5JZCI6IjMzMTQ0Iiwic291cmNlR2VuZXJhdG9yQXR0ZW1wdCI6IjEiLCJyZXN1bHRJZCI6IjNiNTY2YjYxLTc2M2QtNGU3OC1hMTc3LWU1NTMzZWZkOWE0MCJ9 -->
forgejo-actions left a comment

Summary: Found 1 medium issue.

Code review by Codex CLI · Personal 02 (gpt-5.6-luna)

**Summary:** Found 1 medium issue. _Code review by Codex CLI · Personal 02 (gpt-5.6-luna)_ <!-- axrecipe-review:v2:eyJzY2hlbWFWZXJzaW9uIjoyLCJzdGF0ZSI6InB1Ymxpc2hlZCIsInJlcG9zaXRvcnkiOiJqNGstb3NzL2FnZW50LXNraWxscyIsIm51bWJlciI6IjYxIiwiYmFzZVJlZiI6Im1haW4iLCJtZXJnZUJhc2VTaGEiOiI1YzJiOGU3NWExZjhmNDBjNmU5MmIzNWZhOWQ4Y2M4YWNiMjZiNGFhIiwiaGVhZFNoYSI6IjdmY2NhNTMwMzIxNTcwMmRmNzgwYTZkZjQ3ZTU4MTA5OTM0ODIzZTYiLCJzbG90IjoiZm9yZ2Vqby1yZXZpZXctY29kZS1sdW5hLTIiLCJzb3VyY2VXb3JrZmxvd1J1bklkIjoiMzMxNDQiLCJzb3VyY2VHZW5lcmF0b3JBdHRlbXB0IjoiMSIsInJlc3VsdElkIjoiNGFkMmEyNTktMzk4Zi00N2RkLWJkNjktMTAzMTg0MDkyYTM5In0= -->
@ -1,38 +1,34 @@
---
name: tropkod
description: Use when checking an API, export, option, type, default, runtime behavior, compatibility claim, migration path, or implementation detail of a public npm package or crates.io crate; debugging dependency behavior; reviewing dependency-sensitive code; verifying an assumption about a specific package version; or whenever dependency research could improve accuracy or quality. Also use when the user mentions Tropkod.
description: Use when checking an API, export, option, type, default, runtime behavior, compatibility claim, migration path, or implementation detail of a public npm package or crates.io crate; debugging dependency behavior; reviewing dependency-sensitive code; verifying a package-version assumption; or when the user mentions Tropkod.

🟡 Medium: Removing the whenever dependency research could improve accuracy or quality trigger changes when this skill is selected. The frontmatter description is the routing catalog, while the body (including the proactive-use instruction) is unavailable until after selection, so generic dependency investigations that do not name a package can now skip Tropkod entirely. Preserve the broad trigger or update the intended invocation contract.

🟡 **Medium:** Removing the `whenever dependency research could improve accuracy or quality` trigger changes when this skill is selected. The frontmatter description is the routing catalog, while the body (including the proactive-use instruction) is unavailable until after selection, so generic dependency investigations that do not name a package can now skip Tropkod entirely. Preserve the broad trigger or update the intended invocation contract.
Author
Owner

The routing description still selects API, export, option, type, default, runtime-behavior, compatibility, migration, implementation-detail, debugging, review, and version-assumption dependency work. The removed catch-all did not distinguish a matching request from a non-matching one, and the repository's skill-writing rule requires routing-only, discriminative frontmatter. This late-round medium suggestion does not establish a severe routing defect.

<!-- gh-feedback:reply-to:70277 --> The routing description still selects API, export, option, type, default, runtime-behavior, compatibility, migration, implementation-detail, debugging, review, and version-assumption dependency work. The removed catch-all did not distinguish a matching request from a non-matching one, and the repository's skill-writing rule requires routing-only, discriminative frontmatter. This late-round medium suggestion does not establish a severe routing defect.
Author
Owner

Replying to review #16592

Disagreed: the finding describes the superseded exit-2 client contract; this skill targets the new 3.x exit-0 nonfailed contract.

> Replying to review #16592 Disagreed: the finding describes the superseded exit-2 client contract; this skill targets the new 3.x exit-0 nonfailed contract.
Author
Owner

Replying to review #16594

Disagreed: current frontmatter remains broad but discriminative; the removed catch-all violated this repository’s routing-text rule and the late-round medium finding does not demonstrate a severe defect.

> Replying to review #16594 Disagreed: current frontmatter remains broad but discriminative; the removed catch-all violated this repository’s routing-text rule and the late-round medium finding does not demonstrate a severe defect.
Author
Owner

Replying to review #16596

Acknowledged; no actionable finding was reported.

> Replying to review #16596 Acknowledged; no actionable finding was reported.
Author
Owner

Replying to review #16597

Disagreed: current frontmatter remains broad but discriminative; the removed catch-all violated this repository’s routing-text rule and the late-round medium finding does not demonstrate a severe defect.

> Replying to review #16597 Disagreed: current frontmatter remains broad but discriminative; the removed catch-all violated this repository’s routing-text rule and the late-round medium finding does not demonstrate a severe defect.
jercik merged commit ce846aa0ef into main 2026-08-26 13:39:24 +00:00
jercik deleted branch docs/tropkod-status-contract 2026-08-26 13:39:24 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
j4k-oss/agent-skills!61
No description provided.