Repository navigation
v0.55.0
Highlights
Jira gets a reworked setup in this release, and it changes on upgrade. Connection and poll settings now live under tracker.jira (base_url and project are required), and fullsend repos install manages Jira polling on GitHub and GitLab and migrates managed config for you. Every Jira call now goes through the Atlassian API gateway at https://api.atlassian.com. Credentials come from FULLSEND_JIRA_TOKEN (with FULLSEND_JIRA_EMAIL); JIRA_TOKEN is no longer read, and Jira secrets must be declared under env.runner. Before upgrading, confirm your Jira credential works through https://api.atlassian.com (a scoped token or a service-account token); there is no site-URL mode. Jira-sourced runs take JIRA_BASE_URL and JIRA_API_URL from config only, and fail closed before the sandbox starts when the Jira settings are missing or invalid, or with --offline.
CEL triggers can use event.actor.is_entity_assignee to let the issue's assignee start an agent (applies to Jira and GitHub custom agents). Claude Workflow progress now shows up in run output, so long workflow runs report where they are. pi transcripts now record tool call ids, arguments and results, and report calls that were cut off before they finished.
fullsend self-update replaces the CLI with the latest release, or the one --version names, after verifying the release's Sigstore signature; --dry-run reports what it would do without changing anything. This is the first release with the command, so get v0.55.0 from the release page once; later upgrades can use fullsend self-update.
The sandbox images ship pi 1.5.0 with updated pi extensions (pi-anthropic-vertex 0.2.1, pi-xai-vertex 0.3.1, pi-inference-gateway 0.2.0) and Codex 0.166.0; the agents fleet is pinned to these images. If you install the pi extensions on their own, they need pi 1.3.0 or later.
A few other changes need attention on upgrade. Retro now starts on a PR close or merge only for actors with write access, and skips the run on a CEL routing error or, on GitLab, when the event has no actor. fullsend lint --format json emits schema_version 2, with a required diagnostics[].code. A harness with an invalid schema_version now fails to load; harnesses without one are unchanged. On GitLab, head_sha is filled in for every merge request event.
Changelog
Breaking Changes
- 7bdd8fe: feat(#235)!: implement harness schema_version (ADR 0127 Decision 1) (@jflowers)
- a02c410: feat(#9074)!: replace create_issues with tracking allowed_targets (@fullsend-ai-coder[bot])
- 2fe3f6c: feat(#9075)!: migrate legacy tracker config in repos install (@fullsend-ai-coder[bot])
- 921a435: feat(#9077)!: load jira-poll settings from tracker.jira config (@fullsend-ai-coder[bot])
- 270c8ad: feat(#9078)!: build Jira issue and status clients from tracker.jira (@ggallen)
- 324a17f: feat(#9079)!: scope Jira secret access in agent runs (@ggallen)
- cbe1a72: feat(cli)!: add stable diagnostic codes to lint JSON output (@Benkapner)
- 5f54192: fix(#8912)!: close retro authorization gaps (@ralphbean)
- 951b1f8: fix(#8912)!: fail closed on missing GitLab actors (@ralphbean)
- c5c584e: fix(#8912)!: gate close-event retro by write access (@ralphbean)
- 40aba93: fix(#8912)!: require write access for PR-close retro (@ralphbean)
- a2519de: fix(#9074)!: use tracker as the single provider-discriminated key (@fullsend-ai-coder[bot])
Features
- 48d92ac: feat(#6842): record forge and CI pointers on the root run span (@AshwinUgale)
- d1fad50: feat(#7414): pass pi tool call ids, arguments and results through (@AshwinUgale)
- 355b8c3: feat(#7414): report pi calls cut off before they end as unanswered (@AshwinUgale)
- a1c6acd: feat(#9035): add Jira connection and poll settings under tracker.jira (@fullsend-ai-coder[bot])
- d31dbcb: feat(#9071): fill head_sha for every GitLab merge request event (@fullsend-ai-coder[bot])
- 30feb30: feat(#9076): converge Jira polling credentials in repos install (@fullsend-ai-coder[bot])
- cf606bd: feat(#9108): manage the GitLab Jira poll schedule in repos install (@fullsend-ai-coder[bot])
- e2dbc54: feat(#9109): manage GitHub Jira polling workflow (@ggallen)
- 8f3edbf: feat(#9116): add actor.is_entity_assignee to NormalizedEvent v1 (@fullsend-ai-coder[bot])
- 0efd2bd: feat(#9176): accept Jira OAuth 2.0 client credentials (@ggallen)
- 429d994: feat(#9218): set JIRA_API_URL and JIRA_BASE_URL for Jira-sourced runs (@fullsend-ai-coder[bot])
- 3f4cc2c: feat(cli): add self-update command (@gwenneg)
Bug Fixes
- a825de7: fix(#6702): surface rate-limit state in harness-wait timeouts (@jflowers)
- 0d6c2b5: fix(#6842): keep a GitLab relative-URL prefix in the repository URL (@AshwinUgale)
- 70afed2: fix(#6842): omit Jira repository URL and keep linked PR ids in forge pointers (@AshwinUgale)
- f43841e: fix(#7414): answer a pi call whose end line exceeds the buffer (@AshwinUgale)
- fddeded: fix(#7414): mark a pi result with no start as unmatched, correct the docs (@AshwinUgale)
- ab374d1: fix(#7414): treat a pi result with no content list as empty (@AshwinUgale)
- cf7d4e2: fix(#8731): accept own rules over included extends targets (@fullsend-ai-coder[bot])
- 9a20f47: fix(#8908): address review findings on progress redaction and naming (@jctanner)
- d7f048d: fix(#8908): derive Workflow agent status from producer metadata (@jctanner)
- 2f8dba3: fix(#8908): keep Workflow agent rows stable by index (@jctanner)
- a9174e8: fix(#8908): keep status history when updating an existing key at capacity (@jctanner)
- 798c51f: fix(#8908): mask overlapping credentials longest-first and settle tool row churn (@jctanner)
- d667f93: fix(#8908): mask the assembled task row against split credentials (@jctanner)
- 81af21d: fix(#8908): merge literal match spans and mask the joined row with the caller callback (@jctanner)
- a5dbc8d: fix(#8908): preserve sparse agent state and bound cache allocations (@jctanner)
- 498385e: fix(#8908): preserve sparse progress metadata (@jctanner)
- b29ac36: fix(#8908): redact normalized runtime secrets in the fallback pass (@jctanner)
- b0066f6: fix(#8908): redact secrets reconstructed by progress cleanup (@jctanner)
- 528416d: fix(#8908): reject progress from superseded task runs (@jctanner)
- 1a142d5: fix(#8908): render Claude Workflow progress (@jctanner)
- acf1254: fix(#8908): retain workflow controls and sparse task metadata (@jctanner)
- 55dde5e: fix(#8908): sanitize Unicode progress in a dedicated reconciler (@jctanner)
- b7ee337: fix(#8912): address review feedback (@ralphbean)
- 2f2511f: fix(#8912): enforce write floor in CEL close routing (@ralphbean)
- 2dd76a3: fix(#8912): preserve retro on merge queue closes (@ralphbean)
- 76d1b6c: fix(#8961): address review feedback on PR #9003 (@fullsend-ai-coder[bot])
- 8a0ccfd: fix(#8961): fail when repeated-agent run completion is unconfirmed (@fullsend-ai-coder[bot])
- 879f2a0: fix(#8961): keep agent artifact downloads off the ci.Driver interface (@fullsend-ai-coder[bot])
- 40547c4: fix(#8961): prevent repeated-agent artifact collisions (@ggallen)
- d61f6bb: fix(#8961): resolve default triage artifacts by logical agent (@fullsend-ai-coder[bot])
- ba24a02: fix(#8961): wait for run completion before downloading repeated-agent artifacts (@fullsend-ai-coder[bot])
- 393618f: fix(#9023): skip redundant Jira sticky-marker property writes (@fullsend-ai-coder[bot])
- 9e62382: fix(#9035): address review feedback on tracker.jira settings (@fullsend-ai-coder[bot])
- 4fd9280: fix(#9044): skip local sandbox host setup for remote OpenShell gateway (@jctanner)
- 877c381: fix(#9046): load harness .env in dummy runtime behaviour ops (@fullsend-ai-coder[bot])
- ea400d8: fix(#9048): remove the build-time gopls cache from the code image (@Benkapner)
- 8886bbe: fix(#9068): upgrade previous-contract GitLab root inputs (@fullsend-ai-coder[bot])
- e5d242d: fix(#9074): address review feedback on tracking allowed_targets (@fullsend-ai-coder[bot])
- f9913d8: fix(#9074): align ConfigTracker with legacy barrier and fail closed on ambiguous tracker (@fullsend-ai-coder[bot])
- 38fb7d6: fix(#9074): fail runtime config load on legacy create_issues key (@fullsend-ai-coder[bot])
- 93a0c4c: fix(#9075): count comments in alias budget and follow YAML merge keys (@fullsend-ai-coder[bot])
- 2c654bb: fix(#9075): keep legacy tracker migration layers independent (@fullsend-ai-coder[bot])
- 447d567: fix(#9075): reject duplicate keys inside a merged YAML mapping (@fullsend-ai-coder[bot])
- 2ed0f08: fix(#9075): reject malformed forge config and bound alias expansion bytes (@fullsend-ai-coder[bot])
- 1ecd5ca: fix(#9076): address review feedback on Jira credential convergence (@fullsend-ai-coder[bot])
- 3503373: fix(#9076): address review feedback on Jira credential handling (@fullsend-ai-coder[bot])
- 5562601: fix(#9077): assert tenant_info handler invocation in Jira client test (@fullsend-ai-coder[bot])
- 4d3461b: fix(#9078): pass Jira credentials to status finalizer step (@fullsend-ai-coder[bot])
- 28ab5d1: fix(#9098): post config load errors to the status comment (@fullsend-ai-coder[bot])
- a1a4ef7: fix(#9116): address review on is_entity_assignee (@waynesun09)
- db2fbe3: fix(#9176): check user Jira poll caller OAuth forwarding per job (@fullsend-ai-coder[bot])
- 1867ee6: fix(#9176): guard Jira client secret masking check to GitLab (@fullsend-ai-coder[bot])
- b7a8697: fix(#9176): omit Jira OAuth secrets from token-only poll caller (@fullsend-ai-coder[bot])
- ce87aaf: fix(#9176): require user-owned Jira poll caller to forward OAuth secrets (@fullsend-ai-coder[bot])
- 48a100a: fix(#9176): verify pinned GitLab scripts support Jira OAuth (@fullsend-ai-coder[bot])
- 5e4487d: fix(#9176): verify pinned workflows declare Jira OAuth secrets (@fullsend-ai-coder[bot])
- 90a380f: fix(#9176): verify user Jira poll caller's pinned workflows declare OAuth secrets (@fullsend-ai-coder[bot])
- ae3af55: fix(#9203): retry runtime dependency downloads with longer backoff (@fullsend-ai-coder[bot])
- 5b00554: fix(#9203): vendor retry-with-backoff.sh with the installers that source it (@fullsend-ai-coder[bot])
- 1941d8b: fix(#9218): fail closed when a Jira run's gateway URL can't be resolved (@waynesun09)
- 91d305a: fix(#9218): keep Jira run URLs config-only and validated (@waynesun09)
- 5ff68a4: fix(#9218): validate Jira run URLs with the config-layer rule (@waynesun09)
- 77219ca: fix(behaviourtest): check waiting runs for already-run agent jobs (@dhshah13)
- 72247c9: fix(behaviourtest): count completed agent jobs in waiting runs (@dhshah13)
- 89f0c04: fix(behaviourtest): fail the negative assertion on a waiting run's unreadable jobs listing (@dhshah13)
- 28b3c20: fix(behaviourtest): report the Actions readiness poll error (@dhshah13)
- fc0e995: fix(behaviourtest): skip the jobs read for runs that have not started (@dhshah13)
- 2fd281e: fix(behaviourtest): tolerate only first-page jobs listing absence (@dhshah13)
- 1aa982b: fix(cli): report invalid config forge as a lint diagnostic (@Benkapner)
- 26b93e5: fix(cli): respect cancellation in fetch-skill (@Benkapner)
- 51a6e54: fix(cli): tighten lint diagnostic code pattern to kebab-case (@fullsend-ai-coder[bot])
- 068e633: fix(e2e-health): bound --runs on its decimal string, not arithmetic (@jflowers)
- 2f625dc: fix(e2eauth): address PR 8668 gate and forge review feedback (@mfrancisc)
- 9d79647: fix(e2eauth): treat empty ok-to-test label actor as ambiguous (@mfrancisc)
- 7130c96: fix(envmanifest): match runner reserved-key and hook-env semantics in schemas (@jflowers)
- f536adc: fix(github): preserve created PRs with unresolved database IDs (@dhshah13)
- 8603100: fix(github): restore collaborator permission error wrapping (@mfrancisc)
- 59e9cce: fix(github): retry delayed workflow job visibility (@dhshah13)
- 98467f2: fix(github): return workflow jobs errors without speculative retries (@dhshah13)
- 6d2ffd7: fix(harness): keep child's own schema_version in base composition (@jflowers)
- 7456ff3: fix(harness): quote base layer label in schema version error (@jflowers)
- 0895461: fix(harness): refuse shadowed .event/.runtime in the secret guard (@tpouyer)
- 0dba61f: fix(harness): simplify unsupported schema_version error remedy (@jflowers)
- 99038e0: fix(semgrep): address latest review feedback (@ralphbean)
- 5c3e19a: fix(semgrep): address review findings (@ralphbean)
- f06f50a: fix(semgrep): address review follow-up (@ralphbean)
- 1b7b20f: fix(semgrep): reject corrupted cached rulesets (@ralphbean)
- 1322cdf: fix(telemetry): canonicalize empty and padded instance ports (@dhshah13)
- f16c077: fix(telemetry): canonicalize instance ports and IDN hosts (@dhshah13)
- 1681249: fix(telemetry): converge root-dot hosts and bound instance ports (@dhshah13)
- cd97e9f: fix(telemetry): keep pending admission on resolved identities (@dhshah13)
- fd6ebf4: fix(telemetry): make zero-value admission results fall back (@dhshah13)
- daa1ac5: fix(telemetry): reject mixed-escape instance paths and canonicalize IPv6 hosts (@dhshah13)
- 87c83d7: fix(telemetry): report unresolved identity before carrier diagnostics (@dhshah13)
- 18862ff: fix(telemetry): retain deployment prefixes in trace identity (@dhshah13)
- a76f0bf: fix: address review feedback on PR #8942 (@fullsend-ai-coder[bot])
- 75f552b: fix: address review feedback on PR #9125 (@fullsend-ai-coder[bot])
- ae9b740: fix: address review feedback on PR #9129 (@fullsend-ai-coder[bot])
- fe1b944: fix: address review feedback on PR #9175 (@fullsend-ai-coder[bot])
Refactoring
- 9743a92: refactor(#9007): add shared Jira client for scoped API tokens (@fullsend-ai-coder[bot])
- 4670f7c: refactor(#9100): tighten pi provenance comments (@waynesun09)
- 920f4db: refactor(behaviourtest): classify jobs listing errors in one place (@dhshah13)
- 7fae148: refactor(behaviourtest): restore main's dispatch assertions and jobs listing (@dhshah13)
- b84b520: refactor(codex): admit only a V1 parent in the delegation gate (@dhshah13)
- 1e41e78: refactor(codex): report every admitted multi-agent call as Agent in the manifest mirror and matcher (@dhshah13)
- 851bbeb: refactor(codex): resolve the parent's collaboration version and say why V2 stays off (@dhshah13)
- 60ca63c: refactor(e2eauth): add Go e2e gate policy and forge APIs (PR 1/3) (@mfrancisc)
- d71e182: refactor(envmanifest): add sandbox environment variable contract (@jflowers)
- 0f17e2d: refactor(envmanifest): publish sandbox env contract as JSON Schema (@jflowers)
- 5e12e97: refactor(forge): carry immutable IDs in models and fakes (@dhshah13)
- 0d541db: refactor(forge): name the first-page jobs 404 for its response shape (@dhshah13)
- 8c71bbf: refactor(github): preserve full-width immutable entity IDs (@dhshah13)
- 966e07a: refactor(gitlab): retain database IDs for issues and proposals (@dhshah13)
- e177ca1: refactor(harness): order schema-version compose helpers (base, child) (@jflowers)
- c622e52: refactor(harness): rename schema version helpers to convey composition (@jflowers)
- 00fcef3: refactor(randutil): remove redundant random prefixes (@ralphbean)
- f500bab: refactor(telemetry): add signed envelopes and trace admission (@dhshah13)
- 98df98c: refactor(telemetry): define immutable trace identity and fallback (@dhshah13)
- 6bc6703: refactor(telemetry): isolate and test zero-ID fallback guards (@dhshah13)
- 4db927e: refactor(telemetry): simplify and cover envelope bounds checks (@dhshah13)
- f6c0f31: refactor(tracker): propagate immutable issue and project identity (@dhshah13)
Agents changes
The fleet agents ship in fullsend-ai/agents v0.55.0; its release notes list the agents changes in this release.