diff --git a/README.md b/README.md index fced17c..d2a4b47 100644 --- a/README.md +++ b/README.md @@ -38,12 +38,12 @@ Three install paths depending on your stack. qa.fanar fanar-core - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT qa.fanar fanar-json-jackson3 - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT ``` @@ -64,7 +64,7 @@ try (FanarClient client = FanarClient.builder().apiKey(System.getenv("FANAR_API_ qa.fanar fanar-spring-boot-4-starter - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT ``` @@ -88,7 +88,7 @@ class MyController { qa.fanar fanar-spring-ai-starter - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT ``` diff --git a/bom/pom.xml b/bom/pom.xml index 25ca91e..5e3f605 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/core/pom.xml b/core/pom.xml index 1f25e5e..12223cd 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/docs/PROJECT_STATE.md b/docs/PROJECT_STATE.md index b93b91d..119d7f2 100644 --- a/docs/PROJECT_STATE.md +++ b/docs/PROJECT_STATE.md @@ -1,32 +1,25 @@ # Project state -> **Snapshot — 2026-08-29.** Updated on every milestone. If this looks wrong or stale, that is +> **Snapshot — 2026-08-30.** Updated on every milestone. If this looks wrong or stale, that is > the signal — update it in the same PR as whatever moved. ## Phase -**0.3.0 released 2026-08-29** ([v0.3.0](https://github.com/omahjoub/fanar-java/releases/tag/v0.3.0), -GitHub Release, 10 artifacts). The release adds the -rate-limit response-header contract and the retry fix it exposed — HTTP-status retry never fired -through 0.2.0 because the facades mapped errors *after* the interceptor chain; mapping now happens -at the retry boundary inside the chain, with `Retry-After` semantics per ADR-025 and a -`fanar.retry.max-delay` knob in the starter. See [CHANGELOG](../CHANGELOG.md). - -Unreleased on `main` (0.4.0-SNAPSHOT) — the 0.4.0 "proof over coverage" cycle. Landed so far: the -seam-crossing `*IntegrationTest` layer (core retry/streaming/async, starter, Spring AI, the three -observability adapters, wire logging), the unpublished `test-support` fixture module, a JUnit timeout -backstop, the contributor rule that an ADR's consumer-observable promise is proved by a named -integration test, and the dated [wire-observations ledger](WIRE_OBSERVATIONS.md) — what the live API -does where it differs from the spec, each row pinned by a live test, plus the live-suite budget — and -the wire-log throw path (a `<-- failed` line when the chain throws, exception rethrown unchanged; -ADR-012 amended), and rate-limit visibility (ADR-026: the `fanar.ratelimit.*` observation attributes -on every response that carries the headers, `RateLimitInfo` via `rateLimit()` on both 429 exceptions, -Micrometer's cardinality rule), and the `RetryPolicy` total sleep budget + builder (ADR-027: -`maxTotalDelay`, `fanar.retry.max-total-delay`; the canonical constructor's arity changed — the -cycle's one breaking change), and the facade plumbing consolidation (the eight domain facades delegate -chain assembly, transport attributes and the transport call to one internal `Dispatcher` — no behaviour -change, ADR-018). Still to come in 0.4.0: live-suite budget hygiene + nightly run, Maven Central -readiness. +**0.4.0 released 2026-08-30** ([v0.4.0](https://github.com/omahjoub/fanar-java/releases/tag/v0.4.0), +GitHub Release, 10 artifacts) — "proof over coverage". Every behaviour an ADR promises to a consumer +is proved through the public API by a named seam-crossing `*IntegrationTest` (a rule in CONTRIBUTING, +backed by the unpublished `test-support` fixture); what the live API actually does is recorded, dated +and pinned by tests, in the [wire-observations ledger](WIRE_OBSERVATIONS.md); the wire log keeps +failures; the retry boundary publishes the server's rate-limit window (`fanar.ratelimit.*` attributes, +`RateLimitInfo` on both 429s — ADR-026) and stops sleeping past a total budget (`maxTotalDelay`, +`RetryPolicy.builder()`, `fanar.retry.max-total-delay` — ADR-027, the release's one breaking change); +the eight facades share one internal `Dispatcher`. See [CHANGELOG](../CHANGELOG.md). + +Unreleased on `main` (0.5.0-SNAPSHOT) — nothing yet. Two items from the 0.4.0 plan were deliberately +left out and carry into the next cycle: the live-suite budget hygiene + nightly run (parked 2026-08-30 +pending a higher-quota API key requested from the Fanar team — if granted, only the nightly remains +worth doing) and Maven Central readiness (blocked on the `qa.fanar` namespace, a Fanar-team question +too; fallback `io.github.omahjoub`). ## Planned @@ -34,7 +27,7 @@ readiness. - **Spring Boot 3 starter** — `fanar-spring-boot-3-starter` with the Jackson 2 codec; mechanical port of the SB4 starter. - **LangChain4j adapter** — `fanar-langchain4j` exposing the equivalent of Spring AI's adapters against LangChain4j's `ChatLanguageModel`. - **Quarkus extension** — CDI beans, build-time wiring, native-image friendliness. -- **Nightly live e2e on CI** — scheduled job runs `fanar-java-e2e` with `FANAR_API_KEY` injected as a secret; PR builds stay offline. Budget constraint (observed 2026-08-28/29): `Fanar-Aura-TTS-2` allows 20 requests in any trailing 24 h (sliding window) and a full run spends 11 ([budget table](WIRE_OBSERVATIONS.md#live-suite-budget)), so the nightly must be the only full run within 24 h on that key. +- **Nightly live e2e on CI** — scheduled job runs `fanar-java-e2e` with the `FANAR_API_KEY` secret (it exists; today only `graalvm.yml`'s manual bootstrap job uses it); PR builds stay offline. Parked 2026-08-30 pending a higher-quota key from the Fanar team: on the standard key a full run spends 11 of `Fanar-Aura-TTS-2`'s 20 per trailing 24 h ([budget table](WIRE_OBSERVATIONS.md#live-suite-budget)), so the nightly would have to be the only full run within 24 h, and it must exclude the six known-gated cases or stay red every night. ## Deferred (won't fit cleanly) diff --git a/e2e-graalvm/pom.xml b/e2e-graalvm/pom.xml index e67abdd..bfa62fe 100644 --- a/e2e-graalvm/pom.xml +++ b/e2e-graalvm/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/e2e/pom.xml b/e2e/pom.xml index 11ffe20..63a564d 100644 --- a/e2e/pom.xml +++ b/e2e/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/interceptor-logging/pom.xml b/interceptor-logging/pom.xml index f3cbd52..15575cb 100644 --- a/interceptor-logging/pom.xml +++ b/interceptor-logging/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/json-jackson2/pom.xml b/json-jackson2/pom.xml index 76c9a92..cb1cfbf 100644 --- a/json-jackson2/pom.xml +++ b/json-jackson2/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/json-jackson3/pom.xml b/json-jackson3/pom.xml index 3cd052e..0a289e0 100644 --- a/json-jackson3/pom.xml +++ b/json-jackson3/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/obs-micrometer/pom.xml b/obs-micrometer/pom.xml index 6f7be64..28d112b 100644 --- a/obs-micrometer/pom.xml +++ b/obs-micrometer/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/obs-otel/pom.xml b/obs-otel/pom.xml index 3229a84..bd29fc8 100644 --- a/obs-otel/pom.xml +++ b/obs-otel/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/obs-slf4j/pom.xml b/obs-slf4j/pom.xml index f5fb7d2..42d7040 100644 --- a/obs-slf4j/pom.xml +++ b/obs-slf4j/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/pom.xml b/pom.xml index 667d00f..dd728c7 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT pom Fanar Java SDK diff --git a/spring-ai-sample/pom.xml b/spring-ai-sample/pom.xml index 03f52d5..07cd852 100644 --- a/spring-ai-sample/pom.xml +++ b/spring-ai-sample/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/spring-ai-starter/pom.xml b/spring-ai-starter/pom.xml index e833ad0..e69906f 100644 --- a/spring-ai-starter/pom.xml +++ b/spring-ai-starter/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/spring-boot-4-sample/pom.xml b/spring-boot-4-sample/pom.xml index 30c7d19..4d1317e 100644 --- a/spring-boot-4-sample/pom.xml +++ b/spring-boot-4-sample/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/spring-boot-4-starter/pom.xml b/spring-boot-4-starter/pom.xml index 45bfd7e..74b7475 100644 --- a/spring-boot-4-starter/pom.xml +++ b/spring-boot-4-starter/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml diff --git a/test-support/pom.xml b/test-support/pom.xml index 918504f..bd38119 100644 --- a/test-support/pom.xml +++ b/test-support/pom.xml @@ -7,7 +7,7 @@ qa.fanar fanar-java - 0.4.0 + 0.5.0-SNAPSHOT ../pom.xml