Repository navigation
Releases: morzu117/skifer
Releases · morzu117/skifer
Release list
v3.1.2
Fixed
AgenticHub's LLM intent-classification fallback (free-form questions with no matching keyword)
could route tolineage/dictionary/quality/buildereven when that agent isn't configured in
the hub, and_dispatchtreated it as a hard"Agent '<x>' non configure dans ce hub."error
instead of falling back to GenBI — on a hub exposing only GenBI, a free-form metrics question like
"l'évolution mensuelle du CA des commandes" could be misrouted and fail outright. Fixed by
restricting_llm_classify_intent's candidate intents (and its system prompt's per-intent
descriptions) to the agents actually configured on the hub, and by falling back to GenBI in
_dispatchonly when the intent came from that LLM fallback — an explicit keyword-detected
request for an unconfigured agent still returns the "non configure" error as before.- A failed Spark/Spark Connect query (e.g. an
AnalysisException) leaked its full message —
including theJVM stacktrace:marker and thousands of characters ofat org.apache.spark.../
at com.databricks...frames — intoAgentResponse.error/QualityResponse.error, and from there
into the Markdown rendered for Playground/the supervisor. Fixed by sanitizing the message at the
point each agent builds its error response (newagentic/_errors.py::sanitize_exception_message),
keeping only the readable prefix (error code, short message) up to theJVM stacktrace:marker (or
the first stack-frame line when that marker is absent) and capping the result's length; the full
original message is still available viaexc_info=Truelogging. The Provenance block is unaffected
— it reads only fromevidence, never fromerror.
v3.1.1
Fixed
SparkBackend._append_certification(contract/run/check certification rows) relied on Spark's
single-row schema inference, which fails withCANNOT_DETERMINE_TYPEas soon as one column is
entirelyNonein that row — the case for everySTARTEDRunEvent(target_fqn/staging_fqn/
quarantine_fqnall unset) on both Spark Connect and classic Spark. Certified publication could
never write its firstSTARTEDevent, blocking the wholedata_productpipeline before any Gold
write. Fixed by giving each of the three certification tables (contract_definitions,
materialization_runs,check_results) an explicit schema, the same pattern already used by
upsert_incidentandappend_semantic_usage_event.
v3.1.0
Changed
SkiferResponsesAgent(Plan 41) répond en Markdown (serving/_markdown_renderer.py) : le Playground et le
superviseur rendent le texte en Markdown, si bien que la réponse en texte brut y perdait son saut de ligne et
affichait les flottants bruts (total_revenue: 16200985.329999981). Un KPI affiche désormais lelabelde la
métrique (sinon sadescriptionsi elle est courte) et une valeur au format français (16 200 985,33), une
ventilation devient un tableau Markdown de 30 lignes au plus — triée, puisque la requête n'a pas d'ORDER BY:
un axe temporel dans l'ordre chronologique, toute autre ventilation par sa première mesure décroissante —, et la provenance est un bloc séparé qui explique
le statut de certification (NOT_EVALUATED→ « non évaluée (gate de certification désactivé) »). Les règles de
divulgation ne changent pas : aucune valeur de filtre, le maillon le plus faible l'emporte. La CLI et l'API
locale gardent le texte brut dehub_response_to_text.
Fixed
- Gate de certification sémantique (Plan 29) : sur Databricks, un modèle dont la
tableest en deux parties
(gold.kpi_orders) était toujours refuséMISSINGenwarn/enforce, même publié en mode certifié. Le
resolver lit cette table dans le catalogue du moteur et la publication enregistre le run sous ce nom à trois
parties (sts_demo_catalog.gold.kpi_orders), alors que le gate cherchait le nom nu.SemanticEnginecherche
désormais d'abord sous le nom qualifié par le catalogue, puis sous le nom nu, et la certification garde le nom
du modèle dans la preuve. ContractExtractorne dérive plus deFilterInvariantCheckpour un filtre de source portant sur une colonne que
la sortie ne publie pas (absente deselect_finalou deaggregate). Le check s'évalue sur la table publiée :
un filtrestatus:in:completed,shippedsuivi d'unselect_finalsansstatuséchouait en erreur SQL à chaque
publication certifiée, avec une trace Spark complète dans les logs. Aveckeep_all_columns, la sortie n'est
pas connue et le check est conservé.
v3.0.3
Added
- Workflow
Release(.github/workflows/release.yml) etscripts/release.pyréparé : la montée de version se
lance à la demande (gh workflow run release.yml -f bump=patch|minor|major, avecdry_runpossible). Il exige
une CI verte surmain, met à jourpyproject.toml,uv.lock,docs/install_databricks.mdet le
CHANGELOG.md, pousse le commitchore(release)et le tagvX.Y.Z, puis déclenche la publication PyPI.
release.pyrefusait de tourner depuis le passage à la publication de confiance (il cherchait des secrets
PYPI_API_TOKENqui n'existent plus).CLAUDE.mddécrit la procédure.
Fixed
SkiferResponsesAgent.predict()(Plan 41.4) ne mettait pas deidau niveau racine de
ResponsesAgentResponse. MLflow accepte ce champ comme optionnel (None, et le serialiseur
l'omet alors de la réponse), mais le schéma strict de l'API Responses d'OpenAI l'exige : un
client qui valide contre ce schéma rejette la réponse. Trouvé en validant la réponse en direct
de l'endpointskifer-agentsur le workspace (Plan 41.9) contre plusieurs schémas connus.
id=str(uuid4())au niveau racine, en plus de celui déjà posé sur l'item de sortie.