Skip to content

Commit f26a17f

Browse files
Jose Agustin PuenteJose Agustin Puente
authored andcommitted
release: v26.5.12 — CI green + 4 ingestion fixes bumped
* ruff format on stages/parse.py + stages/reconcile.py (line-length rewraps caught by `task lint` on the 26.5.11 PR). No behaviour change. * Bump 26.5.11 → 26.5.12 across pyproject, pyfly.yaml, README badge, Taskfile SDK regen flags, app decorator, Python SDK (__init__/api_client/configuration/setup/pyproject), Java SDK pom, sdks/README install snippets. * CHANGELOG entry summarising the 4 ingestion fixes shipped under 26.5.11 (targeted re-upload section matching, rename agent settings threading, llm_rationale persistence, RENAMED_CANDIDATE ranking). PUT endpoint URL + multipart contract + ReuploadResponse DTO are byte-equivalent to 26.5.11; openapi.json regenerated to confirm zero diff. SDKs do NOT need regeneration.
1 parent 0c956f0 commit f26a17f

15 files changed

Lines changed: 87 additions & 26 deletions

File tree

CHANGELOG.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,72 @@ follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
55
the project uses [CalVer](https://calver.org/) (YY.MM.PP) per the
66
Firefly Framework convention (memory: `firefly_uses_calver`).
77

8+
## [26.5.12] - 2026-05-28
9+
10+
### Fixed — Re-upload pipeline correctness + LLM rename detection
11+
12+
Four cooperating bug fixes uncovered during multi-version re-upload
13+
testing of the same workbook. No public API or response-shape change:
14+
the PUT endpoint URL, multipart contract and `ReuploadResponse`
15+
DTO are byte-equivalent to `26.5.11`, so the Python and Java SDKs
16+
keep working without regeneration.
17+
18+
1. **`PUT /api/v1/datasets/{ds}/tables/{tbl}:upload` no longer
19+
corrupts the targeted snapshot of a multi-section workbook.**
20+
`IngestService.ingest_reupload` now looks up the existing table's
21+
`sheet_or_json_path` and sanitised `name` (single PK lookup) and
22+
threads them into Stage 2. `run_parse` filters the proposed-table
23+
list down to the matching section, with fallback by sanitised name
24+
so a row insertion that shifts the section range
25+
(`section[1:697]``section[1:698]`) still resolves correctly.
26+
Before the fix, the parser kept whatever section came first in the
27+
workbook (usually Sheet1), silently overwriting the targeted
28+
table's snapshot with unrelated data.
29+
30+
2. **LLM rename-detection agent is actually invoked.** Both call
31+
sites of `run_reconcile` (`IngestService.ingest` sync path and
32+
`IngestWorker` async path) now forward `settings=self._settings`.
33+
Without this, `_invoke_rename_agent` short-circuited on
34+
`if settings is None: return None`, so the Haiku-backed rename
35+
resolver never ran and every ambiguous removed-column landed as a
36+
`RENAMED_CANDIDATE` for human review instead of being auto-confirmed.
37+
38+
3. **`flyquery_schema_changes.llm_rationale` is persisted.**
39+
`_invoke_rename_agent` now returns the full ranked list
40+
(`[{name, confidence, rationale}, ...]`) instead of just the top
41+
`(confidence, name)` tuple. `_detect_renames` returns a third
42+
`confirmed_rationales` map keyed by old column name.
43+
`_write_schema_changes` writes the rationale into `RENAMED` rows
44+
(LLM rationale or "Auto-confirmed by 1-to-1 type signature match"
45+
for the unambiguous branch) and into `RENAMED_CANDIDATE` rows
46+
(rationale of the top proposal hoisted for fast audit).
47+
48+
4. **`RENAMED_CANDIDATE.after_json.candidates` carries the LLM's
49+
ranking.** When the top proposal misses the 0.8 auto-confirm
50+
threshold, the system now stores the ranked
51+
`[{name, confidence, rationale}]` list from the agent. The old
52+
behaviour stored the raw type-group of added columns with no
53+
discrimination — every `RENAMED_CANDIDATE` for the same type
54+
showed the same flat list. Operators reviewing pending renames
55+
now see "best guess first" with the confidence and rationale per
56+
alternative.
57+
58+
### Changed — Internal-only
59+
60+
- `run_parse` accepts two new keyword params: `target_sheet_or_json_path`
61+
and `target_name`. Both default to `None`, so call sites that didn't
62+
ask for targeted-section selection are unaffected. The OpenAPI
63+
surface is unchanged.
64+
- `_detect_renames` signature changed from
65+
`tuple[dict, list]` to `tuple[dict, dict, list]`. Internal helper;
66+
not exported. Callers updated in the same change.
67+
68+
### Fixed — CI
69+
70+
- `ruff format` on `stages/parse.py` and `stages/reconcile.py`
71+
(line-length wrapping). Caught by the `task lint` step on the
72+
`26.5.11` PR; rewrapped without behavior change.
73+
874
## [26.5.11] - 2026-05-24
975

1076
### Added — Webhook callbacks for every async ingest job

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ JSONL, Parquet, Avro, ORC, Arrow and Feather, plus their `.gz`,
2525
[![OpenAPI](https://img.shields.io/badge/api-openapi%203.1-green)](docs/api-reference.md)
2626
[![DuckDB](https://img.shields.io/badge/query%20engine-duckdb-yellow)](docs/architecture.md)
2727
[![pgvector](https://img.shields.io/badge/vector--store-pgvector-336791)](docs/architecture.md)
28-
[![Version](https://img.shields.io/badge/version-26.5.11-green.svg)](#)
28+
[![Version](https://img.shields.io/badge/version-26.5.12-green.svg)](#)
2929
[![License](https://img.shields.io/badge/license-Proprietary-lightgrey.svg)](LICENSE)
3030

3131
</div>

Taskfile.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ tasks:
115115
-g python
116116
-o sdks/python
117117
--package-name flyquery_sdk
118-
--additional-properties=packageVersion=26.5.11,projectName=flyquery-sdk,library=asyncio
118+
--additional-properties=packageVersion=26.5.12,projectName=flyquery-sdk,library=asyncio
119119
--skip-validate-spec
120120
- cd sdks/python && uv pip install --system --quiet . || true
121121

@@ -140,5 +140,5 @@ tasks:
140140
--invoker-package com.firefly.flyquery
141141
--api-package com.firefly.flyquery.api
142142
--model-package com.firefly.flyquery.model
143-
--additional-properties=artifactId=flyquery-sdk,groupId=com.firefly,artifactVersion=26.5.11,library=webclient,dateLibrary=java8,java8=true,useJakartaEe=true
143+
--additional-properties=artifactId=flyquery-sdk,groupId=com.firefly,artifactVersion=26.5.12,library=webclient,dateLibrary=java8,java8=true,useJakartaEe=true
144144
--skip-validate-spec

pyfly.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pyfly:
1212
# and admin tooling identify the service correctly.
1313
app:
1414
name: flyquery
15-
version: 26.5.11
15+
version: 26.5.12
1616
description: >-
1717
Operational Structured-Data Intelligence (upload-driven).
1818
Multi-tenant ingestion + Text-to-SQL over user-uploaded structured

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[project]
22
name = "flyquery"
33
# CalVer YY.MM.PP per memory `firefly_uses_calver`.
4-
version = "26.5.11"
4+
version = "26.5.12"
55
description = "Operational Structured-Data Intelligence (upload-driven) -- multi-tenant ingestion + Text-to-SQL service over user-uploaded structured files. Part of Firefly OperationOS."
66
readme = "README.md"
77
requires-python = ">=3.13,<3.14"

sdks/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ firefly four-header wire contract
2727
|---|---|---|
2828
| **Path** | [`sdks/python/`](./python/) | [`sdks/java/`](./java/) |
2929
| **Coordinates** | `flyquery-sdk` on PyPI | `com.firefly:flyquery-sdk` (Maven) |
30-
| **Latest version** | `26.5.11` | `26.5.11` |
30+
| **Latest version** | `26.5.12` | `26.5.12` |
3131
| **Runtime** | Python 3.9+ | Java 25 (LTS) + Spring Boot 3.5.9 |
3232
| **HTTP client** | `aiohttp` + `aiohttp-retry` (asyncio) | Spring WebFlux `WebClient` + Reactor Netty (reactive) |
3333
| **Model layer** | Pydantic v2 | Jackson |
@@ -41,8 +41,8 @@ firefly four-header wire contract
4141
**Python**
4242

4343
```bash
44-
uv add flyquery-sdk==26.5.11
45-
# or: pip install flyquery-sdk==26.5.11
44+
uv add flyquery-sdk==26.5.12
45+
# or: pip install flyquery-sdk==26.5.12
4646
```
4747

4848
**Java (Maven)**
@@ -51,7 +51,7 @@ uv add flyquery-sdk==26.5.11
5151
<dependency>
5252
<groupId>com.firefly</groupId>
5353
<artifactId>flyquery-sdk</artifactId>
54-
<version>26.5.11</version>
54+
<version>26.5.12</version>
5555
</dependency>
5656
```
5757

sdks/java/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<artifactId>flyquery-sdk</artifactId>
66
<packaging>jar</packaging>
77
<name>flyquery-sdk</name>
8-
<version>26.5.11</version>
8+
<version>26.5.12</version>
99
<url>https://github.com/firefly-operationOS/flyquery</url>
1010
<description>Java SDK for flyquery -- Operational Structured-Data Intelligence. Auto-generated from the flyquery OpenAPI 3.1 spec. Targets Java 25 + Spring Boot 3.5.9 + WebFlux.</description>
1111
<scm>

sdks/python/flyquery_sdk/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
""" # noqa: E501
1515

1616

17-
__version__ = "26.5.11"
17+
__version__ = "26.5.12"
1818

1919
# Define package exports
2020
__all__ = [

sdks/python/flyquery_sdk/api_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def __init__(
9191
self.default_headers[header_name] = header_value
9292
self.cookie = cookie
9393
# Set default User-Agent.
94-
self.user_agent = 'OpenAPI-Generator/26.5.11/python'
94+
self.user_agent = 'OpenAPI-Generator/26.5.12/python'
9595
self.client_side_validation = configuration.client_side_validation
9696

9797
async def __aenter__(self):

sdks/python/flyquery_sdk/configuration.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ def to_debug_report(self) -> str:
573573
"OS: {env}\n"\
574574
"Python Version: {pyversion}\n"\
575575
"Version of the API: 26.5.4\n"\
576-
"SDK Package Version: 26.5.11".\
576+
"SDK Package Version: 26.5.12".\
577577
format(env=sys.platform, pyversion=sys.version)
578578

579579
def get_host_settings(self) -> List[HostSetting]:

0 commit comments

Comments
 (0)