infiquetra/fleet-core
Portable Fleet Core slice carrying three modules and one data registry: the shared 429 rate-limit retry and backoff primitive with its circuit breaker, the IntentEnvelope run-start posture schema ported under the resolve-fleet-commons-sibling deterministic transform, and the tier palette with the models.json model/effort registry it reads. This is a single vertical slice of the upstream Fleet Core library, not the whole library.
Changelog
All notable changes to the portable Fleet Core package are documented in this file.
The format is based on Keep a Changelog.
The version is not an independent number: it tracks the upstream Fleet Core
version this package is derived from, because custody of the ported module stays
in infiquetra-claude-plugins and a parallel numbering would imply a second
writable source. When upstream releases a Fleet Core version that changes a
ported module, this package is re-synchronized and takes that version.
Unreleased
The entries under Changed record catalog-level contract changes that moved no
ported bytes; they carry no release tag. The entries under Added record the
slice expansion of 2026-08-24, which added ported files at the existing pin
without moving any byte already here. Neither group advances the package
version: this package's version tracks the upstream Fleet Core version its
bytes derive from (0.25.2 at commit 3b5faa6c), and upstream's 0.25.3 release
of 2026-08-24 changed retry_backoff.py, which this pin deliberately does not
take — a repin would churn UniFi's bundles and invalidate its committed
matrix. Naming this package "0.25.3" while it still carries 0.25.2's
retry_backoff bytes would collide with the real upstream release, and
inventing any other number would imply the second writable source this
changelog's convention exists to prevent.
Changed
-
The portable UniFi package no longer pins the same upstream revision as this package, and no Fleet Core byte moved. UniFi
2.0.1, at upstream commit0d81dd9a, repaired the caller half of theRetry-Afterdefect this package's0.25.1release fixed in the primitive: both UniFi clients converted the raw header withint()before raising, so the repaired primitive never received a header it could read.plugins/unifi/PROVENANCE.jsontherefore pins0d81dd9a, while this package still pinsed72f439. The upstreamplugins/fleet-coresubtree is byte-identical between those two revisions, so the two pins name one consistent upstream state, not two competing answers. The[0.25.1]entry below says the two packages pin the same revision; that sentence describes what was true at that release and is left standing rather than rewritten. -
The catalog's minimum supported Python is
python>=3.12. It is a minimum and not a pin: every later interpreter stays in contract. The floor is now the one the authoritative source declares and tests.infiquetra-claude-pluginssetsrequires-python = ">=3.12"in its project file and pins3.12in every continuous-integration job, at the same commited72f439this package is derived from. A derived catalog must not promise more compatibility than the source it is derived from, so the lower floor this catalog used to document was a promise nothing upstream was keeping. The decision and its reasoning are recorded in the repository's engineering journal.
Added
- The mission-control closure joins the slice: three files at the same pin.
scripts/fleet_commons/intent_envelope.py,scripts/fleet_commons/tier_palette.py, and thescripts/fleet_commons/models.jsonregistry are ported at fleet-core pin3b5faa6c. Mission-control's shipped surface reaches exactly this closure: its issue-capture path loads the envelope module's parse/render surface, andIntentEnvelope.validate()reaches the tier palette whenever a parsed envelope carriesspend_envelope.tier_ceiling; the palette reads its sibling registry at import time, so the data file rides the slice. The resolver leg behindrecommend_tierhas zero callers in either consumer and stays deferred. tier_palette.pyandmodels.jsonare pure byte copies; the repository validator recomputes their digests againstPROVENANCE.jsonon every run.intent_envelope.pyports under this package's existingdeterministic-transformcustody class with the new named ruleresolve-fleet-commons-siblingversion 1: the module's Claude-Code-specific discovery-shim import block and its two shim load call sites become same-directory sibling resolution — placement-independent, so the identical file works in this package and in any generated_bundled/copy a consuming plugin carries. A deferred name (tier_resolver) fails at call time naming the missing sibling path, never at import. Every other line is a byte copy.- The deferred inventory is regenerated, so exactly the three rows move
from deferred to ported and every other deferral stays explicit; the
provenance manifest classifies all three files and names them, with the two
new target-owned tests, in the release surface. The decision is KTD8 in
docs/plans/2026-08-24-mission-control-port-run-plan.md.
[0.25.2] - 2026-08-22
Re-synchronized from Fleet Core 0.25.2 in infiquetra-claude-plugins at commit
3b5faa6c. Custody did not move. The repair was authored, reviewed, and
released upstream and taken here by re-synchronization, which is the second
exercise of this slice's rule.
Fixed
- A non-finite
Retry-Afterno longer costs the caller its typed rate-limit surface.float()acceptsinf,-inf,nan, and any overlarge literal such as1e400, soparse_retry_afterreduced a header carrying one of those to a non-finite "delay" and returned it as though the server had given a usable hint. The sleep path hid it:infclamped tomax_delayandnanfailed its> 0test, so every retry behaved correctly. The damage landed only once retries were exhausted, where a caller reduces the hint to whole seconds to say how long to wait —math.ceil(inf)raisesOverflowErrorandmath.ceil(nan)raisesValueError. Both UniFi clients catch that in a broad handler, so the operator was toldUnexpected error: cannot convert float infinity to integerinstead of a wait time, and the typed 429 surface that 0.25.1 exists to preserve was destroyed at exactly the moment it was needed.1e400is the shape that matters in practice: an ordinary overlarge integer in a header, nothing exotic. - A non-finite value is now the "no usable hint" case the function already
documented, so it yields
Noneand the caller falls back to computed jittered backoff. The rule covers the numeric path as well as the string one, because a caller that parses its own header hands the number straight in.
0.25.1 - 2026-08-22
Re-synchronized from Fleet Core 0.25.1 in infiquetra-claude-plugins at commit
ed72f439. Custody did not move. The repair was authored, reviewed, and
released upstream, and this package took it by re-synchronization rather than by
an edit to the ported bytes, which is the rule this slice was created under and
the first time that rule has been exercised.
Fixed
- A
Retry-AfterHTTP-date now backs the request off instead of killing the call. RFC 7231 section 7.1.3 allows the header in two forms, a count of seconds and an absolute date, and real controllers send the date form.scripts/fleet_commons/retry_backoff.pyunderstood only the number, so a caller that converted the header withint()raisedValueErrorinside the retried call. AValueErrorcarries no status code, so the primitive judged it non-retryable and re-raised it on the first attempt: one request, no backoff, and a generic error in place of a rate-limit error. The new publicparse_retry_after(value, *, now=time.time)reduces either form to a non-negative delay in seconds, and returnsNonefor an absent, empty, or unparseable value, which the caller reads as "no usable hint" and answers with computed jittered backoff. A date already in the past parses to0.0, never a negative delay. Clamping and jitter are untouched, so an absurd date and an absurd number are bounded identically.retry_with_backoffgains a keyword-onlynowseam so a date resolves deterministically under test, and theretry_aftercallable's type widens tofloat | str | None, which is additive.
Changed
- The pinned source revision.
PROVENANCE.jsonandDEFERRED.mdnow name commited72f439and Fleet Core0.25.1. The portable UniFi package pins the same revision, so one commit names the corrected state of the whole port. - The ported test suite grew from ten test functions to eighteen, and its
guard-pytest-importtransform moved to version 2. Upstream's new coverage includes two tests carrying@pytest.mark.parametrize, and a decorator is evaluated when the module is imported. Version 1 boundpytesttoNonewhen the dependency was absent, which would have made the dependency-free baseline job raiseAttributeErroron a module it never runs. Version 2 raisesunittest.SkipTestinstead, whichunittestrecords as one skipped test, so the baseline job stays green and says out loud why it collected nothing here. - The bundled copies shipped to consuming plugins carry the new stamp:
source version
0.25.1, source commited72f439, and the new source digest.
Known issues
-
Resolved on 2026-08-22, after this release. The catalog's floor moved to
python>=3.12, which is above what this release needs, so this release is no longer out of contract with the catalog that carries it. The floor moved for a reason larger than this one import: it now matches the floor the authoritative source declares and tests. See the Unreleased section above. The entry is preserved as written:This release needs Python 3.11 or newer, which is above the Python 3.10 floor this catalog documents. The corrected module imports
UTCfromdatetime, an alias that exists only in Python 3.11 and newer, so importing it under Python 3.10 raisesImportError. The byte-copy rule forbids repairing that here: a downstream edit would make this path diverge from its source and would giveretry_backoffa second writable source. Either the repair is authored upstream or the declared floor moves to 3.11. The decision is open and recorded in the repository's engineering journal.
0.25.0 - 2026-08-22
Initial portable slice, derived from Fleet Core 0.25.0 in
infiquetra-claude-plugins at commit 13b0234.
Added
- The shared 429 retry and backoff primitive, as an upstream byte copy.
scripts/fleet_commons/retry_backoff.pycarriesretry_with_backoff,CircuitBreaker,bridge_call, andCircuitOpenError. It is standard library only and pure over injectedsleep,rng, andclockseams, so its tests are deterministic and no real time passes. The file is byte-identical to its source; the repository validator recomputes its digest againstPROVENANCE.jsonon every run, so a hand edit here fails validation rather than surviving as silent divergence. - The upstream test suite, ported with its ten tests unchanged.
tests/test_retry_backoff.pyat the repository root. Every line fromclass RateError(Exception):onward is a byte copy. The single deviation is a guardedpytestimport, recorded inPROVENANCE.jsonas deterministic transformguard-pytest-importversion 1, which lets the repository's dependency-free baseline job import the module without pytest installed while the ported plugin job still runs all ten tests. - A generated inventory of everything this slice does not carry.
DEFERRED.mdnames each upstream item absent from this package: fifteen Python modules, three data files, and the Claude-specific shim module. It is derived from the pinned source tree byscripts/generate_deferred_inventory.pyas a set difference rather than typed, so a module added upstream fails the check until the file is regenerated. - A provenance manifest pinning the derivation.
PROVENANCE.jsonrecords the source repository, the source commit, the Fleet Core version, and a per-file classification and digest.
Notes
- This package is one vertical slice and claims no Fleet Core parity. Consuming plugins receive the module as a generated, stamped, read-only bundle produced at build time, so no user installs Fleet Core separately.
- The portable catalog documented a 3.10 floor at this release. That floor was
superseded on 2026-08-22; the catalog's contract is now
python>=3.12, as the Unreleased section above records. The ported module itself carriesfrom __future__ import annotationsand needs nothing beyond the standard library.