Skip to content

Changelog

This page summarizes user-visible and operational changes. Dependency-only, merge and test-only commits are grouped when they do not alter an API contract.

2026-11-06

Update PDF parsing and environment dependencies

  • Upgrade pypdf to version 7 and refresh PDFium and virtualenv, retaining the existing PDF splitting, CV extraction and environment creation workflows.
  • Verify chatbot extraction with real synthetic PDFs covering page order, image-only pages, encrypted files and unreadable streams.
  • Document that abbreviated filters in ordinary PDF streams are no longer tolerated by pypdf; affected chatbot attachments retain the existing empty-text behavior for extraction failures.

Share prompt caching across native Decisions workflows

  • Apply the shared generation cache policy and bounded keys to every native Decisions caller, keeping variable evidence outside explicit cache boundaries.
  • Reuse single-choice rules as developer input and preserve multi-question contracts, configured profiles, request deadlines and per-request accounting.
  • Expose cache eligibility, read/write tokens and costs for cold/warm comparisons; add French greeting scenarios for guardrail and supervisor evaluations.
  • Explicitly allow ordinary greetings while continuing to evaluate any substantive request in the same message against the normal safety and scope rules.

Preserve the first approved AI evaluation benchmark

  • Store the complete 464-scenario benchmark approved by Fabien Labernia in lossless gzip format, including all 160 embedding scenarios and original approval metadata.
  • Read and create compressed references through the existing evaluation CLI, preserving plain JSON support and exclusive creation for each approval revision.

2026-11-05

Bound retries across AI providers

  • Apply three total attempts with SDK exponential backoff across OpenAI, Azure OpenAI, Anthropic and OVH, including GenAI and auxiliary provider requests.
  • Remove nested application retries and bound initial Live handshakes without replaying established streams, audio or business actions.
  • Let evaluations recover within the same observation while preserving per-attempt budget reservations, diagnostics, cancellation and existing time limits.

Separate reflective coaching from company-knowledge research

  • Require a specific company or configured-resource fact before selecting knowledge research; an unavailable profile alone does not justify a transfer.
  • Allow plain-language reflection and adaptable coaching suggestions directly, while preserving evidence requirements for personal facts and company methods.
  • Align the agent prompt and tool description without another model call or changing the existing coaching and knowledge evaluation expectations.

Stop unavailable profile lookup loops in Career Chat

  • Hide profile lookup from model action selection when the request has no loaded profile, and continue with available context without repeated retrieval.
  • Preserve access to existing profiles with empty categories and refresh availability from each request, without a persistent failure flag.
  • Align profile instructions and offline evaluations for ordinary and streamed delivery, including English and French coaching.

Ground profile calls and prioritize conversation closure

  • Require an explicit useful profile category during agent action selection; evaluate empty knowledge-source cases against actual tool arguments.
  • Prioritize explicit conversation closure before Career Chat action selection, distinguishing it from career-break policy questions without another model call.
  • Compare link context with the exact requested subject and operation before spending a page read, preferring direct matches over neighboring topics.
  • Require the selected entry's own page handle and a consistent public progress message, while preserving source budgets and existing evaluation expectations.

Clarify corrections of unsupported knowledge claims

  • Illustrate retracting an earlier manager-invitation claim as unsupported by the retrieved guidance, followed by the documented recovery steps.
  • Keep the correction focused on the available evidence without asserting an exemption from requirements that the source does not address.

Follow relevant knowledge leads

  • Require a reasonably relevant remaining lead before further knowledge browsing, and align the judge without imposing a minimum page count.

Accept faithful contextual paraphrases in simulation evaluations

  • Allow explanatory feedback to resolve clear pronoun references and tolerate minor lexical imprecision without changing the facts or assessment.
  • Preserve exact quotations and reject unsupported attribution of initiatives, diagnoses, completed actions or outcomes.
  • Let the French vague-commitment summary condense the exchange's established theme without requiring turn-by-turn chronology, while preserving substantive speaker contributions and grounded scoring.

Keep simulation feedback within the observed time frame

  • Evaluate visible behavior and the quality of commitments without treating unobserved future execution as a weakness or a reason to lower a score.
  • Keep implementation advice in actionable tips and allow fewer or no improvement areas when the transcript does not support further gaps.

Keep unconfirmed future agreements conditional

  • Make advice dependent on unconfirmed future agreements explicitly conditional.

Judge task-help actions by usefulness and concision

  • Replace the fixed one-or-two-action limit after an unsupported guarantee with a few concrete, safe actions proportionate to the task.
  • Align the evaluation rubric while preserving refusal, grounding and useful follow-up requirements.

Make task-help follow-up headings optional

  • Allow closing questions with or without a heading, including in longer guides, while retaining one to four useful follow-up questions and clear presentation.
  • Align the nominal and boundary evaluation rubrics with this formatting rule.

Allow focused discussions in sparse talent rationales

  • Accept a targeted conversation or relevant evidence as ways to assess a candidate against search criteria; work examples are optional.
  • Align English and French evaluation rubrics while retaining factual grounding.

Ground JPM transition explanations

  • Omit unsupported-match reservations and unrelated skills from JPM rationales.

Ground learning rationales in retained search criteria

  • Identify legitimate search criteria before assessing content matches, mismatches and missing evidence; consider relevant profile context afterward.
  • Assess each retained criterion separately and preserve its supported, mismatching or unknown status in the concise explanation, including after an overall non-match.
  • Check every reservation against an explicit criterion and the available metadata; keep response locale separate from course requirements and avoid filler caveats.
  • Exclude topics introduced solely by discarded instructions from all assertions and reservations, using a general rule instead of certification-specific examples.

Ground training explanations in legitimate needs

  • Ground profile-based training explanations in documented course relevance, without inventing pedagogical links between unrelated skills.
  • Limit search reservations to legitimate criteria and align the judge so that discarded fabrication instructions do not require certification caveats.

Ground resume PDF judging in visible source text

  • Provide nominal and injection PDF references exclusively to the evaluation judge, keeping production parsing inputs unchanged.
  • Distinguish faithfully copied source content from added commentary and preserve the different injection-transcription rules for OCR and resume extraction.

Classify resume skills independently of section headings

  • Classify each explicit skill by its meaning and stated use, including in generic skill lists, before considering the residual otherSkills category.
  • Check category placement explicitly in the existing text and PDF evaluations, without adding technology-specific classification examples to the prompt.

Ground OCR evaluation in visible source text

  • Give nominal and injection OCR evaluations separate source-text references and rubrics, without exposing expected transcriptions to the production model.

Remove legacy offer evaluations from the active scope

  • Remove the two obsolete PwC offer retirement declarations and their workflow.
  • Record the still-available legacy endpoint as an explicit scope exclusion, visible in reports, without keeping the active inventory incomplete.
  • Preserve historical campaign results and validation of unrelated coverage gaps.

Bound portable evaluation cost history

  • Automatically retain the five latest observations per current scenario and compatible repricing group on each cost export, using costs.history_size.
  • Remove obsolete scenario measurements after merging reports, without changing current cost forecasts, campaign archives or semantic quality references.

Run five evaluation scenarios concurrently by default

  • Set the manual and weekly campaign defaults to five isolated scenario processes.
  • Preserve shared spending limits, one observation per scenario and existing campaign and observation deadlines.

Improve documentation navigation

  • Add breadcrumbs, a visible following table of contents and URL anchor tracking to help readers navigate and share sections of long guides and API references.
  • Preserve relative navigation links across deployments and reverse-proxy prefixes.

Add structured choices to generic chat interactions

  • Expose text, single-select and multi-select question formats, with opaque option IDs and optional alternative text, through the existing JSON and SSE contracts.
  • Validate choices against checkpoint-owned options before resuming; preserve grouped questions, skips, cancellation and canonical conversation history.
  • Keep person/objective choices closed and single-select; remove numbered-text selection parsing and document coordinated frontend deployment.
  • Add English/French evaluations for single and multiple learning-topic choices.

Evaluate ambiguous Lexi retrieval by candidate recall

  • Keep the Python/snake-care retrieval scenario and require programming in the top three semantic and hybrid candidates, without requiring first position.
  • Retain nDCG as diagnostic data for that case and preserve strict contextual selection in lexi.provided_selection.ambiguous.
  • Keep the other retrieval expectations and historical campaign verdicts unchanged.

Order Lexi mission candidates by global relevance

  • Preserve the candidates reserved for each mission, then sort the selected pool by total fused relevance with deterministic catalogue-index tie-breaking.
  • Keep query construction, embedding and LLM profiles, candidate limits and exclusions unchanged. Explicit negative job statements still require contextual assessment by the selection model; global fusion alone may rank them highly.

Align matching evaluations with the English pivot

  • Replace direct French/English matching with the standardized English skill title, preserving Ada 2, the 0.91 threshold, negative candidates and F1 checks.
  • Extend the existing translation evaluation with a French SQL SELECT skill title and verify that resolved English translations reach the skill-import embedding call.
  • Preserve historical results while correcting their interpretation: direct cross-language similarity does not represent the production matching input contract.

Grade Lexi candidate ranking and final selection separately

  • Require semantic and hybrid Recall/nDCG checks for the four unambiguous positive Lexi retrieval cases, keeping the minimum nDCG at 0.7 and generic scores diagnostic.
  • Add a distinct skill-selection scenario that rejects snake care ranked ahead of programming for a Python backend developer with an explicit animal-care exclusion.
  • Preserve production ranking, models and historical campaign evidence.

Refine SQL matching evaluation examples

  • Make both positive paraphrase candidates explicitly name SQL in their titles.
  • Focus the French/English matching example on SQL SELECT queries, preserving negative candidates and the existing ranking and selection requirements.
  • Document the narrower coverage and retain previous failed observations as known limitations; production matching and client referentials are unchanged.

Separate objective-title matching from conversational disambiguation

  • Evaluate the ambiguous objective with a realistic Python programming title, retaining ranking checks and requiring the correct selected identifier.
  • Preserve the API-code-versus-snake-care request in an agent evaluation, allowing correct exact-title resolution or objective-tool HITL before suggestions.
  • Retain completed objective-tool results for judging and verify selection, resumption, skip and cancellation with offline graph tests.

Preserve job context in the ambiguous Lexi retrieval evaluation

  • Supply a realistic Python developer role and description, keeping the animal-care exclusion in the description and passing production mission fragments to embeddings.
  • Preserve the existing catalogue, embedding profile and ranking expectations.

Evaluate matching with realistic skill titles

  • Compare skill titles in JOM/JPM embedding scenarios, including paraphrases, French/English equivalents, ambiguous terms and unmatched skills.
  • Add related but distinct database skills as negative candidates without changing production thresholds, matching logic or acceptance criteria.
  • Keep natural-language retrieval cases and historical campaign evidence intact.

Confirm Lexi duplicate candidates with OpenAI Decisions

  • Retrieve nearest neighbors across each authorized referential and object kind, then confirm equivalence with the configured native mini Decisions profile.
  • Keep uncertain/related concepts separate and require every pair in a semantic group to be confirmed; retain deterministic exact-label findings on partial runs.
  • Remove threshold from find_duplicates requests while keeping label-group responses and bare-list requests. Object requests reject unknown fields.
  • Separate embedding candidate recall, fixed-pair Decisions, and end-to-end group evaluations, preserving historical campaigns and strict false-merge expectations.

2026-11-04

Align standard embedding evaluations with application defaults

  • Use text-embedding-ada-002 for the default and training profiles in both standard campaign configurations; reserve text-embedding-3-small for Lexi.
  • Align the default-profile cost estimate with Ada 2 pricing and verify the selected model through embedding scenarios and actual consumer SDK requests.
  • Preserve historical campaign evidence; results from another model do not establish the quality of the standard application configuration.

Evaluate and calibrate duplicate grouping on distinct catalogues

  • Replace repeated duplicate-query variants with 24 title-only catalogues, split equally between calibration and validation, retaining the historical SQL pair.
  • Record pairwise cosine evidence, actual groups and false/missed duplicate counts.
  • Calibrate with the production anchored grouping rule and strict threshold comparison; keep held-out scores out of candidate selection.
  • Export catalogue concepts and pair labels for review. Production embedding profiles, thresholds and historical campaign verdicts remain unchanged.

Align coaching evaluations and clarify practical guidance

  • Accept an optional relevant basic-profile lookup when company knowledge is unavailable, while preserving source limitations and conversational follow-up.
  • Allow simulation tips to consolidate observed strengths or implement explicit commitments without inventing gaps or completed actions.
  • Make short task-help refusals actionable and their follow-up heading optional.
  • Omit irrelevant profile facts silently from search rationales and define SQL correctness by matching expected results rather than merely checking queries.
  • Align evaluation rubrics, examples and offline adapter checks.

Exclude visible extraction commands from CV transcriptions

  • Clarify that commands addressed to the extraction system are omitted from documentText and other fields, whether visible or hidden in the CV.
  • Preserve genuine candidate content in native-file and extracted-image paths, with an explicit example and matching CV evaluation checks.

Accept targeted profile checks and source-scoped corrections in evaluations

  • Allow zero or one relevant profile lookup in English and French coaching streaming scenarios, retaining stream fidelity and the closing invitation.
  • Distinguish statements about the documented recovery procedure from unsupported general exemptions in the contextual-retry rubric.
  • Exercise direct coaching and optional successful or unavailable profile checks offline; preserve historical campaign verdicts.

Keep unconfirmed agreements conditional and omit redundant match caveats

  • Make simulation advice conditional when it depends on an agreement that the transcript does not establish, without requiring a confirmation question.
  • Stop sparse-profile JOM explanations after the grounded requirement condition when no distinct evidence remains; omit data-completeness caveats even within the same sentence.
  • Align the existing evaluation rubrics and conditional-advice example.

Make simulation outcomes observable and ground PwC comparisons

  • Include an observable confirmation directly in a simulation's expected outcome, even when its evaluation criterion already explains that confirmation.
  • Distinguish an Opportunity's subject from explicitly stated experience requirements in PwC Talent Match Insight, accepting a single factual sentence.
  • Align the existing evaluation rubrics and synthetic examples with these rules.

Clarify empty-profile answers and configurable definition tasks

  • Add a concise recorded-skills example for an entirely empty profile, without listing unrequested empty categories.
  • Make the skill-definition task explicit in the plain and grouped prompt-engine evaluation inputs, requesting an action and purpose rather than a circular restatement. Keep the production engine configurable by its caller.
  • Document a reusable caller prompt and require the requested description column in both evaluation scenarios, without prescribing exact definition wording.

Preserve evidence and measurement scope in AI responses

  • Omit unrequested empty profile categories and distinguish missing records from an absence of real skills or development needs.
  • Keep active-listening search expansions specific to listening practices.
  • Allow neutral factual statements for unassessed simulation topics, and recognize initial dialogue even when the learner's commitment remains vague.
  • Preserve the measured population consistently between key-result titles and descriptions; clarify the SQL review scenario's denominator.
  • Align evaluation rubrics and synthetic responses with these rules, retaining historical campaign verdicts.

Clarify corrections, profile summaries and complementary practice

  • Make Knowledge Base corrections explicitly withdraw unsupported earlier claims before giving the supported steps, without asserting unsupported exemptions.
  • Keep listed skills distinct from interests in sparse profile summaries and omit commentary about missing experience.
  • Recognize dialogue already established about a colleague's needs before suggesting a further confirmation or refinement.
  • Propose a simulation when conversational practice is explicitly requested and the selected course explicitly lacks corresponding practice; retain the rules against duplication and unsupported assumptions about course content.
  • Clarify the person-disambiguation scenario's need for one selected contact and align evaluation rubrics and synthetic examples with these behaviors.

Avoid unnecessary personal-CV clarification and calibrate evaluation feedback

  • Read an explicitly selected personal CV without blanket client-content screening, retaining the restriction for concrete client-work requests.
  • Use N/A for diplomacy when no sensitive topic supports its assessment; distinguish this from supported openness, collegial tone and specificity.
  • Keep gendered wording acceptable in evaluations when neutrality is not required, without permitting invented names or contradictions of supplied facts.
  • Accept topic-and-goal rationales for sparse training metadata without requiring extra subject content, and allow a clear duration mismatch without repeating the exact course length. Preserve historical evaluation verdicts.

Keep training-query expansion within the requested subject

  • Illustrate precise SQL subtopics without introducing the broader discipline of database design unless requested; retain flexible query wording.

Keep undocumented skills unknown in opportunity explanations

  • Contrast a documented Python match with an empty profile, using a condition that does not presume the person possesses or lacks the required skill.

Preserve experience timing in talent explanations

  • Distinguish listed experience from a current role and use temporally neutral wording when the supplied evidence does not establish whether it is ongoing.
  • Align English and French nominal evaluation rubrics and examples.

Make understanding observable in simulation outcomes

  • Express understanding through a conversational demonstration, such as restating an impact or confirming a shared interpretation, without imposing fixed wording or additional objectives.

Prioritize learning-plan clarification dimensions

  • Select at most three unanswered dimensions before native question generation, prioritizing topic, background and available time when all are unknown.
  • Share the one-dimension-per-question rule with structured scope assessment, retaining known preferences, sufficiency checks and independent answer/skip actions.

Reinforce sentence case in Lexi skill labels

  • Add explicit SQL and API examples and a final capitalization check to the label normalization prompt, preserving acronyms, proper names and exact input keys.

Distinguish subject context from invented course content in evaluations

  • Allow training-rationale judges to recognize a subject's general purpose, such as using SQL to query data, when catalogue metadata is sparse.
  • Keep unsupported course activities, duration and proficiency claims invalid; preserve the sparse-context exception without changing the production prompt.

Ground simulation feedback in the full exchange

  • Resolve clear references across dialogue turns before identifying missing details, and distinguish genuine omissions from useful refinements.
  • Keep established facts consistent across feedback fields and preserve the distinction between a future commitment and completed action.
  • Preserve quality, quantity, frequency and speed when paraphrasing commitments; communicating better does not imply communicating more or more often.
  • Cover weekly, vague and detailed commitments in English and French evaluations.
  • Increase the manual and weekly evaluation call ceiling to 1,500 for the expanded corpus, retaining one observation per scenario and the USD 10 campaign ceiling.

Keep simulation clarification focused

  • Separate the situation and intended outcome into independently answerable HITL questions when both need clarification, without imposing a fixed questionnaire.
  • Align English and French evaluation rubrics with essential-only scoping; allow a single useful question and a generic professional counterpart when sufficient.

Clarify document and profile sources before retrieval

  • Give source selection priority over Career Chat profile and document tool rules, using one HITL question when both sources plausibly match the request.
  • Keep explicit source choices and clear profile requests uninterrupted; preserve skip and cancellation without selecting a source automatically.
  • Align streaming action-selection and final-response instructions, with English and French evaluation coverage and no frontend contract change.

Replay saved AI agent evaluations

  • Capture durable native checkpoints for conversational and specialist-agent observations; inspect or branch an observation in an isolated diagnostic run.
  • Support judge-only reassessment of recorded answers and reviewed HITL continuation criteria, preserving original failures and shared campaign budgets.
  • Expose diagnostic provenance in JSON, HTML and review workbooks without allowing partial runs to replace full-run references or cost measurements.
  • Keep ephemeral Knowledge Base research independent of the parent checkpoint durability, avoiding a technical failure during captured evaluations.

Bound specialist model and tool loops

  • Apply native per-invocation limits of eight model turns and six tool calls to conversational specialists. Block excess tools while allowing a final answer; repeated model loops use the existing sanitized execution error boundary.
  • Preserve independent allowances for subsequent turns and HITL resumes, existing Knowledge Base limits and the shared model/profile/retry configuration.

Centralize recoverable tool errors

  • Use native LangChain error middleware for task guidance, profile analysis and objective retrieval, preserving sanitized messages and uninterrupted HITL control flow.
  • Remove redundant catches and error-command builders; keep specialized partial-result and API error boundaries in their owning workflows.

Use native conversation context management

  • Share native LangChain tool-result editing and history trimming across specialist agents; retain complete current turns and persisted search artifacts.
  • Remove unused supervisor/objective history middleware and redundant specialist classes, message-list helpers and their implementation-specific tests.

Track search results with native tool artifacts

  • Read returned training, opportunity and talent identifiers from structured tool artifacts for continuation searches, independently of generated display text.
  • Remove identifier regex parsing and keep the existing recent-history scope.

Share durable clarification across chatbot workflows

  • Replace the bot learning_plan_clarification output with generic interaction and required data.allowedActions / ordered data.questions; retain the SSE event.
  • Replace single-text resumes with grouped data.answers. Each question can be answered or skipped; submit once at the end, or cancel the whole request from any step. Document the frontend stepper and breaking request changes. Prefer three essential questions, with a technical ceiling of ten.
  • Add HITL for simulation scoping, person/objective/action-plan selection, ambiguous sources/topics, empty opportunity/talent searches and work-task details.
  • Preserve candidates and completed search work across resumes; validate selections, stop deterministically on cancellation or skipped required selections, without inventing targets. Remove automatic unfiltered opportunity-profile substitutions.
  • Limit pauses to blocking gaps, reuse known context and group necessary questions; optional presentation preferences do not block an otherwise actionable request.
  • Align prompts, examples and streaming action selection with the shared tool. Record the HITL development preference in AGENTS.md and maintain offline scenarios.

Ground simulation key moments without a positive-negative quota

  • Allow one meaningful quoted moment, including feedback that combines a strength and a refinement, without requiring a separate negative moment.
  • Keep empty lists for exchanges with no supported meaningful moment, and align evaluation rubrics and the short-conversation fixture.

Clarify unresolved follow-ups before searching

  • Add a concrete Career Chat example that reformulates an unanswered topic clarification without searching all candidate subjects or announcing a search.
  • Keep the ambiguous-knowledge evaluation strict about zero tool calls.

Base simulation difficulty on conversational complexity

  • Prioritize counterpart behavior, stakes and reasoning effort when setting difficulty and duration; make outcome counts and time ranges indicative.
  • Align scenario evaluation rubrics and illustrate a simple three-outcome, three-criterion conversation rated Beginner at about 10 minutes.

Stop talent-match explanations after sufficient evidence

  • Add a complete one-sentence example for a direct Python skill match, without an unsupported reservation about broader experience or missing information.
  • Align the nominal evaluation rubric while accepting equivalent grounded wording.

2026-11-03

Delegate learning-plan clarification to the interaction flow

  • Route clear learning-plan requests through the training tool even when scoping details are missing, so HTTP chat can pause through its human-in-the-loop flow.
  • Add English and French agent-dispatch evaluations alongside the existing scope-decision and pause/resume checks.

Allow concise single-sentence development rationales

  • Allow 1 to 3 concise sentences, retaining the 60-word limit, and align examples and evaluation rubrics.

Tolerate isolated spelling mistakes in learning-plan evaluations

  • Accept isolated spelling or accent mistakes when the requested language and intended meaning remain clear; keep schedules, identifiers and factual grounding strict.

Omit unrelated profile facts from training rationales

  • Mention profile context only when it explains a supported match or useful benefit for the explicit training search.

Explain temporarily unavailable knowledge sources

  • Distinguish an inability to check internal information just now from a completed search with no supported answer, without exposing technical details or promising recovery.

Retain only explicit preferences in conversation summaries

  • Keep language preferences limited to explicit user statements and illustrate omission of unsupported statuses and empty headings.

Pause and resume learning-plan clarification

  • Add explicit HTTP chat answer, skip and cancel interactions, with a new learning_plan_clarification response and terminal SSE run.interrupted.
  • Persist scoping pauses, cache completed preparation, check ownership and safety on resume, and reserve each interaction atomically across workers.
  • Document frontend payloads, state transitions, errors and restart behavior; add bilingual scoping examples and offline graph/transport tests.

Judge capability fallback suggestions under their effective category

  • Apply the recorded effective category and explicit coaching exception when a requested training category is unavailable.
  • Accept learning goals, study organization, self-practice and resource-selection criteria without imposing a course search or complete learning plan.

Tolerate minor development-description length overruns

  • Keep the production description target at 80–120 characters while accepting up to 130 characters in development-objective evaluations when content remains clear, concise and grounded.
  • Align all four generation scenarios, exercise 121- and 125-character fixtures, and verify the 130/131-character boundary without relaxing rationale length.

Make Task Helper emoji examples non-exclusive

  • Replace the closed emoji set with illustrative examples, allowing other relevant Unicode markers such as a puzzle piece for a reusable template.
  • Preserve optional placement, readability and factual meaning, and align both task-help evaluation rubrics and the nominal technical fixture.

Omit unsupported statuses from conversation summaries

  • Omit action, completion and resource-selection statuses that the summarized history does not establish, including missing-information placeholders.
  • Omit empty summary headings while preserving relevant explicit negative facts.
  • Align the nominal and injection-boundary evaluation rubrics and technical fixtures without changing retained recent messages or summarization limits.

Align no-talent evaluation criteria with search guidance

  • Accept an actionable alternative without requiring an explicit no-results announcement, while preserving factual grounding and prohibiting guarantees.
  • Replace the nominal and boundary inputs with realistic colleague searches and align their technical fixtures. Production prompts are unchanged.

Allow compact Career Chat closing invitations

  • Allow a concrete closing invitation in the same paragraph as short coaching guidance when the next conversational step is clear. Longer responses retain a separate short final paragraph.
  • Align the English and French streaming evaluation rubrics and add a compact English technical fixture while preserving relevance and factual grounding.

Avoid profile lookups when closing a conversation

  • Explicitly select a direct acknowledgment when the user closes or pauses a conversation without a new request, without calling tools or resuming old tasks.
  • Clarify in the profile tool description and Career Chat instructions that a call requires at least one relevant data category; all-false calls are invalid.
  • Preserve the existing closing evaluation's no-tool requirement and judge rubric.

Retry transient native Decisions failures

  • Use the ordinary OpenAI SDK exponential retry policy for native Decisions, limited to three total attempts within the existing 15-second deadline.
  • Meter each evaluation attempt independently, retain uncertain spending and diagnostics, and allow normal grading after recovery. Exhausted retries remain incomplete observations; campaign budgets and scenario repetitions are unchanged.

Clarify task selection before calling tools

  • Route missing task details to a user-facing clarification before calling tools, including in the public-response selection phase and task-helper description.

Keep training prompt suggestions focused on feasible learning actions

  • Keep every feasible Find a Training suggestion focused on courses or a learning plan instead of isolated exercises or advice.

Define simulation skills by one coherent capability

  • Define simulation skills by one coherent capability, allowing related behaviors joined by conjunctions while keeping independent capabilities separate.

Distinguish unknown training metadata from documented mismatches

  • Distinguish documented course mismatches from unknown criteria, especially missing certification metadata, and align the evaluation cases and examples.

Respect sparse training context when judging rationales

  • Clarify that the sparse French training-title evaluation accepts a rationale linking SQL basics to the stated learning goal without requiring a practical application absent from the supplied context.
  • Give the production prompt's sparse-context exception precedence, retaining factual grounding and the disabled simulation when added value is unproven.
  • Align the simulated response and review guidance; production prompts are unchanged.

Accept complementary feedback practice without prescribing every interaction

  • Keep concrete feedback role-play as a valid complement to a lecture explicitly lacking interactive practice in the French training-title evaluation.
  • Treat colleague reactions and wording adjustments as optional enrichments, retaining the checks for a distinct task and learning benefit.
  • Align the simulated response and evaluation review guidance; production prompts are unchanged.

Keep opportunity objectives focused by meaning

  • Replace the ban on "and" with one skill or certification per objective, allowing several related uses of the same skill while rejecting combined independent competencies.
  • Align the nominal and boundary opportunity-title evaluations and their simulated responses with the semantic rule.

Tolerate minor training-rationale length shortfalls in evaluations

  • Keep the production prompt's 80–120-character instruction and accept a minor shortfall below 80 in evaluation when the explanation stays clear and grounded.
  • Preserve the 120-character maximum and use the 78-character boundary response as a simulated example of this evaluation-only tolerance.

Choose task-help emojis by meaning rather than fixed placement

  • Make emoji placement and repeated check marks optional, accepting readable numbered steps and reasonable alternatives for tips and highlights.
  • Guide markers by nearby content, including risks, metrics and scheduling, without implying completed work or guaranteed outcomes.
  • Align both task-help evaluation scenarios and the nominal simulated response.

Ground Galaxy path descriptions when skills are unavailable

  • Describe the proposed profession, family and level progression when the employee skill list is empty, without inventing competencies or experience.
  • Make transferable-skill commentary conditional on evidence and align the boundary path evaluation and its simulated response.

Keep JOM skill alignment distinct from experience and proficiency

  • Clarify that a listed skill, direct match or matching score does not establish practical experience, proficiency, mastery or expertise.
  • Apply the distinction to general, skills and motivation rationales and make the nominal JOM evaluation expectation explicit.

Avoid repetition in sparse talent explanations

  • Follow a single documented matching fact with a useful invitation to discuss the searcher's needs, without inventing experience or proficiency.
  • Add a concrete prompt example and align the English first-name-only evaluation and its simulated response with this expectation.

Judge roleplay and proposed learning outcomes in context

  • Accept natural in-character acknowledgments, intended learning milestones and reasonable qualitative benefits expressed in the future tense.
  • Distinguish future progression within a proposed plan from claims of completed learning, while retaining checks for invented facts and unsupported guarantees.
  • Align the affected evaluation rubrics and simulated responses with this reading.

Clarify key result tracking initialization and unknown baselines

  • Explain that new-period result counts and rates start at zero by convention, while unknown existing levels retain a null baseline.
  • Evaluate these cases with distinct goal contexts and explicit expected start values, including percentage measures.

Make JPM rationales personal and actionable with sparse evidence

  • Address the employee directly and present the target role as a direction to explore when shared skills or responsibilities are not evidenced.
  • Suggest assessing unknown proficiency and developing it if needed, without assuming a skill gap or commenting on missing profile data.
  • Align the JPM evaluation criteria and simulated responses with these rules.

Preserve valid proficiency levels during Lexi repair

  • Require a concrete, supported defect before changing an existing skill level. Uniform levels or unrelated quality findings alone do not justify a change.
  • Align the nominal and boundary repair evaluation criteria with this requirement.

Distinguish disclosure refusals from disclosure

  • Allow refusals to briefly name a protected-information category already requested by the user, while retaining the prohibition on revealing its contents or explaining how to obtain them.
  • Align the instruction-injection evaluation rubric and keep the scenario critical.

Use a concision target for training recommendation subtitles

  • Target 30 words or fewer while accepting small overruns when the subtitle remains concise, clear and grounded in the supplied evidence.
  • Align the generation prompt and evaluation criteria with this flexible target.

Preserve nullable opportunity codes

  • Keep custom_job.code null when absent and convert non-null values to strings during Smart Mobility import and opportunity standardization.
  • Retain the code as descriptive metadata without adding it to matching or AI inputs.

2026-11-02

Reduce development objective generation latency

  • Generate objectives with the configured default semantic profile, preserving the existing prompt, structured response and tenant reasoning settings.
  • Search trainings from each objective's exact title and description without intermediate LLM reformulation. Keep access and availability filtering, and retain query reformulation for Training Matching and LangGraph tool calls.

Generate development objectives without recorded skill gaps

  • Make skill gaps optional when job, skill, experience, training history or selected training context is available. Build on existing strengths without inventing deficits, required skill levels or career ambitions.
  • Keep an empty response without a model call when no usable context is supplied.

Restore RabbitMQ startup outside eastus

  • Allow automatic RabbitMQ consumer startup in every zone except eastus, matching the administrative controls. PostgreSQL mode and the local deployment environment remain excluded.
  • Log when the local environment or the eastus zone prevents automatic startup.

Make development objective rationales natural and concise

  • Request 2 or 3 short sentences and at most 60 words, addressed to the employee and focused on a concrete work benefit supported by the available context.
  • Keep skill levels and gaps as selection evidence without quoting them in the rationale; avoid HR jargon, profile recaps and missing-information caveats.

Reduce registry upload size

  • Use Kaniko gzip compression level 6 for image and cache layers in staging and production builds, trading additional compression CPU time for smaller uploads.

Reduce runtime image contents

  • Exclude evaluation cases and results from Docker builds and remove bundled scientific-library test suites while retaining runtime data and helpers.
  • Strip native extension debug information without removing executable code or dynamic symbols; remove the temporary stripping tools in the same image layer.

Share bounded worker admission across remaining business processing

  • Route referential analysis, document preparation, language detection, JSON and archive processing, and SMTP TLS setup through the managed blocking pool.
  • Keep HTTP quotas and administrative status queries independent of heavy work; document executor lifecycle exceptions and the default queue's capacity limit.

Remove direct file access from chatbot request processing

  • Use async upload APIs when size metadata is unavailable, with bounded reads.
  • Offload Base64 file and frontend-image processing and asynchronously load the frontend configuration template, preserving validation and public errors.

Isolate tabular processing in Prompt Engine and Lexi

  • Move row validation, grouping, result assembly and spreadsheet serialization into the bounded pool while preserving prompts, row order and error responses.
  • Build enriched output frames without mutating caller-owned tables.

Isolate similarity and deduplication computation

  • Run Lexi duplicate grouping, skill-library deduplication and shared matching scoring in the bounded pool, including PostgreSQL title similarity matrices.
  • Preserve scores, thresholds, repository priorities and result ordering.

Keep embedding preparation off the event loop

  • Move tokenizer loading, input reduction and token-aware batching into the shared bounded pool while preserving provider payloads and request order.
  • Give operational batch and export scripts ownership of that pool.

Remove unused application helpers and orphan contracts

  • Remove obsolete opportunity-search adapters and their orphan vector-search implementation and evaluation scenarios, cluster index CLI helpers, repository methods and utility wrappers with no active application callers.
  • Remove the orphan pagination module and unused long-term memory request schemas, together with tests dedicated to the retired code.
  • Preserve active HTTP, MCP and LangGraph entry points and shared behavior checks, including calibrated language detection through the async API.

Isolate the required synchronous LangGraph MongoDB adapter

  • Keep one LangGraph-owned synchronous client and move its initialization and closure to the bounded blocking pool, including cancellation cleanup.
  • Remove administrative sync clients/dependencies and separate shared document types from driver initialization.
  • Remove unused synchronous attached-job and Atlas index mutation wrappers; retain the active async operations and pure index-definition builders.

Retire synchronous configuration readers and migrate operational scripts

  • Remove unused synchronous MongoDB tenant/configuration readers and PostgreSQL configuration wrappers; the shared async readers remain authoritative.
  • Use native async PyMongo and Psycopg in the eight provider-configuration migration scripts, preserving their CLI, dry-run defaults, guarded writes and transaction boundaries. Cancellation closes connections and rolls back SQL work.

Use async MongoDB for client provisioning and index repair

  • Await registration, configuration, collection and index commands directly.
  • Retain command deadlines, dry-run reports, Search-before-classic ordering and three bounded classic workers, with cancellation and cleanup owned by the caller.

Use async persistence for opportunity status synchronization

  • Await tenant resolution, configuration, status inventory and batched MongoDB writes while keeping file parsing in the bounded blocking pool.
  • Preserve read-only HTTP 200 checks, HTTP 202 background updates, comparison counters, cleanup ordering and partial-failure behavior.

Remove unused synchronous persistence and scoring paths

  • Remove unused MongoDB CRUD helpers and legacy matching wrappers while retaining the active asynchronous workflows, shared calculations and reporting functions.
  • Keep explicit score, ranking and penalty expectations in the surviving tests.

Diagnose unresolved client databases

  • Log the effective client ID, datasource, environment and failure reason from shared MongoDB tenant resolution, retaining request correlation and sanitizing bounded routing values without changing HTTP responses or consumer behavior.

2026-10-30

Preserve standalone professional headlines during CV extraction

  • Explicitly copy a visible professional headline into professionalSummary, even without a profile heading or descriptive paragraph, and retain it in the public summaryAmbitionSection without inventing employment history.
  • Require the synthetic Data Analyst headline in both CV evaluation cases and align their offline replies while retaining injection and absent-field checks.

Avoid unsupported caveats in talent-match insights

  • Allow one or two sentences in general, skills and motivation explanations; add a second sentence only for a distinct point grounded in supplied evidence.
  • Keep the 300-character limit and distinguish a documented Python match from an unknown Python capability in the existing evaluation scenarios.

Preserve capitalization in already normalized skill labels

  • Clarify that skill normalization does not capitalize every word and preserves the exact casing of short, clear labels that already satisfy the rules.
  • Check API design and SQL with exact boundary assertions, while retaining semantic evaluation for labels that need simplification.

Ground Knowledge Base corrections in retrieved evidence

  • Instruct Knowledge Base to withdraw unsupported earlier claims without automatically asserting the opposite or weakening supported recovery steps.
  • Exercise qualified corrections in the existing contextual-retry offline fixtures while retaining the judge's factual-support expectations.

Include learning plans in training prompt suggestions

  • Define Find a Training to cover both relevant course searches and learning plans for developing skills; expose the existing plan-building capability in the model's available-action descriptions.
  • Accept complementary course-search and learning-plan suggestions in the nominal evaluation while retaining checks for unavailable catalogue actions.

Allow useful emoji markers throughout task guidance

  • Allow an emoji on each action step and remove the conflicting per-section limit from the task-helper prompt.
  • Align task-help evaluation criteria with readability and practical guidance; retain the prohibition on guaranteed promotions and unsupported claims.

Clarify learning-plan phase titles

  • Use localized numeric schedule labels such as Weeks 1–2 and Semaines 1 à 2, followed by a short theme, instead of written-out ordinals.
  • Preserve calculated phase boundaries and training assignments. Cover monthly, weekly and daily plans in English and French evaluations.

Use available names naturally in talent explanations

  • Supply first and last names to candidate explanation prompts on MongoDB and PostgreSQL. Let the model choose the appropriate available name form, preserve candidate identity and write complete sentences in the conversation language.
  • Remove legacy profile-name substitutions and unused name-display tools.
  • Keep returned candidate IDs in checkpointed tool metadata so follow-up searches exclude previous results independently of generated wording. Older messages without this metadata cannot supply candidate IDs for exclusion.
  • Cover complete, partial, shared and missing names in English and French evaluation scenarios.

Use the large profile for evaluation judges

  • Route semantic judging through the large profile and align the shipped OpenAI and Anthropic judge configurations with that profile's model and effort.
  • Preserve independent judge configuration, scenario expectations, historical verdicts and spending limits; recompute forecasts before a future campaign.

Remove evaluations for the unused PwC job-offer generator

  • Remove both pwc.offer scenarios and their offline reply fixtures for the legacy /ai/jobOfferGenerator endpoint scheduled for removal.
  • Retain PwC insight evaluations and historical evidence. Keep the still-present endpoint in the source inventory and report its missing evaluation coverage until the production code is removed.

Remove the profile-sharing evaluation scenario

  • Remove the synthetic profile-sharing boundary case and its offline reply fixture: profile-based suggestions do not depend on users sharing a profile in chat.
  • Retain the nominal profile-fallback case and historical campaign evidence.

Keep intentionally retired evaluation coverage visible

  • Require an explicit inventory reason for each retired scenario class and reject undeclared coverage gaps or declarations that still have active examples.
  • Allow campaigns on remaining cases while preserving retirement reasons in reports and preventing incomplete coverage from becoming a global reference.

Remove the source-outage disclosure evaluation

  • Remove the scenario requiring a user-facing notice about an unavailable internal source when retrieved web evidence already answers the question.
  • Remove its dedicated offline reply fixture and retain historical campaign evidence and the other Knowledge Base nominal and boundary cases.

Distinguish source qualifications from unsupported policy claims in evaluations

  • Let the judge distinguish corrections of prior assistant claims and qualified observations about consulted sources from categorical claims based on silence.
  • Assess Knowledge Base grounding separately from unchanged answer delivery, without treating accepted answers or source IDs as proof of factual support.
  • Clarify retry and correction rubrics while retaining historical verdicts.

Assess out-of-scope refusals by content rather than format

  • Remove mandatory acknowledgments and sentence counts for out-of-scope refusals; professional redirection is optional.
  • Align the scenario rubric and judge with correct blocking and non-fulfillment, while retaining checks against answering the blocked request despite a block label.

Align follow-up suggestions with available actions

  • Describe configured capabilities as available and unavailable actions, without exposing internal agent names or requiring availability data from the frontend.
  • Redirect unsupported categories to available coaching, or remove the category preference when coaching is unavailable, while preserving the response shape.
  • Distinguish resource-selection advice from catalogue access in generation and judging; retain failures for concrete requests to perform disabled actions.

Ground training collection explanations and companion activities

  • Include bounded course descriptions and skill titles in collection metadata generation, so explanations can identify documented activities and their use.
  • Require a distinct task and learning benefit before suggesting a simulation, including within learning plans; incomplete descriptions do not prove that a course lacks practice.
  • Cover existing exercises, complementary practice and sparse evidence in English/French evaluations while retaining the configured default profile.

Focus evaluation languages on English and French

  • Remove locale-only duplicates while retaining distinct business cases.
  • Preserve historical reports and cost measurements with their original labels.

Clarify Career Chat follow-ups

  • Preserve useful coaching reflection questions and end substantive responses with one concrete invitation that gives the user a clear next reply.
  • Distinguish that invitation from a total question-count limit; retain the clarification, verbatim-delivery and conversation-closing exceptions.

Distinguish proposed performance goals from invented profile facts

  • Clarify the sparse Developer/SQL scenario to accept grounded future work and reasonable success criteria, while also allowing insufficient_profile.
  • Retain checks against invented current business facts, demonstrated mastery, repeated goals and generic training activities. Preserve historical verdicts.

Refresh evaluation cost measurements

  • Add 539 complete usage observations across 356 scenarios from three October 30 campaigns to portable cost forecasts, preserving previous measurements.
  • Keep the campaign and daily spending ceilings unchanged. Cost evidence does not approve model quality or erase failed campaign results.

Reduce evaluation accounting overhead

  • Reuse the budget journal validator under the existing shared lock, retaining global spending ceilings and durable reservation/settlement semantics.
  • Discover model call sites and load the workflow inventory once for execution, then pass the snapshot to isolated scenario processes.
  • Record startup, dispatch, execution, judge, HTTP transport, budget and collection durations in evaluation reports and review workbooks, including partial failures.

Keep evaluation process slots occupied

  • Run up to four isolated scenarios concurrently by default, refilling each slot after its result is collected instead of waiting for a complete batch.
  • Preserve shared campaign and daily budgets, per-scenario isolation, timeout cleanup and partial evidence. Concurrency remains configurable from 1 to 32.
  • Set the campaign deadline to 20 minutes from a complete 375-scenario judged run measured at 325.7 seconds with eight processes: extrapolate to four processes, add a 50% margin and round up to five minutes. Keep the 60-second observation timeout and existing spending ceilings.
  • Support an explicit --no-campaign-timeout timing-calibration run without changing the next campaign's deadline or its other resource limits. Record effective deadlines in the report and review workbook.

2026-10-29

Refresh measured evaluation costs

  • Add 240 complete usage observations from the judged October 29 campaign to portable cost forecasts, preserving scenario fingerprints and quality failures.
  • Keep the campaign and daily spending ceilings unchanged; cost measurements do not approve a quality reference.

Show raw scenario context in evaluation reviews

  • Display synthetic user profiles, Knowledge Base sources, tool results and external-data fixtures beside each scenario request in the Excel review.
  • Preserve empty values and distinguish raw source data from the recorded model inputs, without changing scenarios or observed results.

Align evaluation evidence with production contracts

  • Supply the SQL goal through conversation history and preserve direct text tool results as graph commands, with no incremental-text requirement.
  • Distinguish Knowledge Base source synthesis from unchanged final delivery; retain structured decisions and safe validation reasons for rejected answers.
  • Clarify multilingual allowance inputs, nominal DOCX expectations and semantic judge guidance without changing embedding thresholds or approving past results.

Exercise real profile tools in Career Chat evaluations

  • Provide synthetic user documents to the nominal and empty-profile scenarios, preserving production field selection, skill filtering and response formatting.
  • Record the actual tool result for agent and judge review without accessing a real user database. Keep the expectations for recorded and absent skills.

Keep evaluation review scenarios together in Excel

  • Size scenario rows from wrapped content instead of splitting after twelve line breaks, keeping ordinary cases on one row.
  • Split long text between complete checks where possible and label continuation rows beside the case identifier. Preserve all content and annotate only part 1.

Localize terminology in training rationales

  • Explicitly use natural localized content labels in both rationale modes, including formation or cours in French, while preserving official titles.
  • Strengthen the existing French search-rationale evaluation to reject the English generic nouns learning and learnings in its explanation.

Target PwC bookmark and interest lookups

  • Single-user imports and standardization load only referenced opportunities and their enrichment fields, preserving current eligibility and output ordering.
  • Skip database access when no enabled reference exists and reuse the existing unique opportunity-ID index.

Reuse storage clients for direct Datalake writes

  • Reuse Azure Blob clients across unitary imports and direct writes while still awaiting each upload and retaining batch-specific queues and ownership.
  • Close shared clients at application shutdown. Missing, empty or whitespace-only BLOB_ENDPOINT creates no storage client or upload worker.

Reuse the DeepL HTTP client

  • Share one lazy HTTP transport across translation batches in each application event loop and close it after background processing stops.
  • Preserve translation payloads, timeouts, the configured tiny-profile fallback, and cancellation; skip transport creation when DeepL credentials are absent.

Recognize unchanged skill-inference sources

  • Reuse successful MongoDB skill inference across users, jobs, opportunities and trainings using pre-translation source fingerprints and effective settings.
  • Preserve declared-skill merging, forced refresh and experience order; cache successful empty results while keeping generation failures eligible for retry.
  • Regenerate legacy documents on their next eligible import, distinguish standardized maintenance input, and exclude cache metadata from user change detection.
  • Add a Python-to-SQL source-change evaluation and deterministic invalidation, failure, projection and translation round-trip coverage.

Overlap independent standardization steps

  • Fetch the user's attached job while skills are inferred and translated; compute gaps only after both are ready.
  • Run independent skill, entity-text and title enrichments concurrently for jobs, opportunities and trainings, preserving required dependencies and final saves.
  • Keep optional errors isolated and await owned tasks on cancellation, including attached-job propagation. Preserve prompts, profiles and embedding inputs.

Reuse standardization embeddings

  • Embed inferred skill names once per operation and search configured catalogs in groups of four, preserving reference priority and selection rules.
  • Reuse opportunity title vectors only when both stored vectors and the effective embedding request fingerprint match; regenerate legacy or invalidated pairs.
  • Preserve model profiles, reasoning settings and best-effort enrichment behavior.

Explain chatbot tool progress

  • Restore visible opportunity, talent and person-identification activities and expose objective and Knowledge Base page-read tools in the existing SSE stream.
  • Add conditional simulation, objective-search, training-refinement, task-drafting and knowledge-navigation steps, translated into all 12 supported locales.
  • Describe knowledge evidence review accurately even when further research follows; preserve the SSE envelope, final business results and model-call count.

Run local tests in parallel

  • Run the complete coverage gate with four configurable pytest workers and deterministic collection; keep real PostgreSQL migration checks sequential.

Reuse isolated test preparation

  • Reuse immutable source analysis in opted-in evaluation protocol tests and copy isolated Git templates for version tests, preserving invalidation checks.

Consolidate shared worker tests

  • Consolidate shared PostgreSQL enrichment lifecycle tests while retaining entity-specific processing coverage and the 100% line and branch threshold.

Remove public JOM pool inspection routes

  • Remove GET /api/v1/matching/jom/pools/users and GET /api/v1/matching/jom/pools/opportunities, including their dedicated read services.
  • Keep internal pool construction, matching calculations and persisted-score APIs.

Group feedback processing with matching operations

  • Expose feedback processing at POST /api/v1/feedback/process under the Matching Operations Swagger category.
  • Preserve authentication, JSON body, query parameters, MongoDB-only availability and the existing feedback workflow. No legacy path alias is retained.

Expose JOM explanations under the rationale path

  • Replace the versioned Talent Match Insight path with POST /api/v1/jom/rationale.
  • Preserve query parameters, authentication, generation behavior and the JSON string response. Document request/response examples for frontend integration.

Generate learning explanations on demand

  • Remove automatic per-learning rationale generation and the rationale field from suggestion cards. Preserve RRF ordering, collection titles/subtitles, learning-plan phases and search context.
  • Add optional search_query to GET /api/v1/get_training_matching_rationale: nonblank text requests a grounded search-based explanation in 1–2 sentences; omitted or blank text keeps the existing profile-based 80–120-character prompt.
  • Maintain the shared default model/reasoning profile, extend evaluation cases and document the frontend migration.

Improve knowledge research relevance and contextual retries

  • Enrich discovered links with permitted paths and bounded surrounding context, filter utility links, and retain usable evidence when an individual link is malformed.
  • Require direct support for the requested subject and operation, explore another plausible lead after a tangential result within existing budgets, and resolve retries from user history rather than earlier assistant claims.
  • Expose remaining navigation capacity and add correlated, content-free progress diagnostics. Preserve the mini profile, four model calls and destination controls.
  • Strengthen evaluations with ambiguous menus, neighboring procedures, true absence, retries/corrections and multilingual capability questions.

Let Knowledge Base select relevant public pages and sections

  • Give the Deep Agent discovered link labels and a bounded page/section reader, so relevant pages can be selected independently of menu order.
  • Prefer article content, retain section indexes and support excerpt continuation without repeated downloads or RAG searches. Preserve scope validation, shared page budgets, the mini profile and the four-call research ceiling.
  • Extend synthetic evaluations for late links/sections and unavailable linked pages; preserve direct delivery and localized public progress events.

2026-10-28

Avoid repeating full tests during release promotion merges

  • Keep full local tests and 100% coverage for development and ordinary commits, but skip the repeated suite for pending merges into release/*.
  • Retain other local hooks and downstream GitLab quality checks; verify the destination for detached promotion worktrees. Manual full-suite runs are unchanged.

Isolate Git fixture repositories during release validation

  • Clear repository-local Git environment variables before the full test suite, so linked-worktree hooks cannot redirect fixture Git commands into the release checkout or its shared configuration.

Resolve knowledge website redirects and explain retrieval failures

  • Follow same-host HTTP-to-HTTPS redirects and retain HTTPS when a reverse proxy advertises an HTTP destination, including trailing-slash redirects.
  • Preserve configured host/path boundaries, public-address checks and crawl limits without rewriting tenant configuration or retrying over HTTP.
  • Report safe failure codes, exception types and HTTP statuses in page warnings while retaining request/client correlation and excluding URLs or page content.

Stream final chatbot text and localize public progress

  • Stream eligible final specialist answers through OpenAI, Azure OpenAI and Anthropic while retaining postprocessing and complete tool/card delivery.
  • Separate private action selection from public generation using the same configured profile; assign a stable answer ID across deltas and completion.
  • Add temporary Knowledge Base public search comments without exposing hidden reasoning, and translate fixed labels/errors in all 12 application locales.
  • Extend real-graph evaluations to cover streaming, direct delivery and multilingual answers/comments. See the frontend guide.
  • Allow up to 1,400 evaluation calls for the expanded corpus while retaining absolute limits of 10 USD per campaign and 30 USD per day.

Introduce the structured chat streaming contract

  • Consume native LangGraph V3 events and expose versioned run/activity events, invocation IDs, nesting, elapsed durations and safe terminal failures.
  • Replace the previous step/tool/token/done SSE contract on the existing route; preserve the input and final business response shapes. Frontend migration is required; see the streaming guide.
  • Emit Knowledge Base progress for actual document/page research, source comparison and response preparation; keep research contents private.
  • Cancel owned graph work on disconnect and avoid synthetic text deltas from completed structured model responses.

Bound chatbot graph execution

  • Limit supervisor and memory nodes to 30 seconds and complete specialists to 180 seconds, preserving existing guardrail and knowledge research budgets.
  • Recover optional memory and knowledge failures at graph boundaries; propagate required failures safely without retries or provider changes.
  • Apply the same deadlines to independently invoked specialist graphs and MCP.

Research knowledge through a dedicated Deep Agent

  • Run only safety checks before supervisor routing. Career Chat can transfer company-knowledge questions to its own Knowledge Base Deep Agent.
  • Preserve file-RAG retrieval and add bounded public-page exploration configured per tenant, with concurrent sources, isolated errors and an expiring page cache.
  • Use the shared mini model/reasoning profile for research and synthesis. Deliver the supported answer unchanged, or return once to Career Chat for clarification.
  • Add frozen-source evaluations for linked pages, complementary/conflicting facts, source outages, prompt injection and the English/French handoff behavior.
  • Hide the Knowledge Base handoff when RAG is disabled or empty and no active URLs are configured. Direct research calls also skip all model/embedding work when no source is available; Career Chat handles the clarification itself.

Parallel AI evaluation campaigns

  • Run manual and weekly campaigns in batches of four isolated scenario processes, configurable with --parallelism; use 1 for sequential execution.
  • Share campaign and daily budgets across workers, retain incomplete evidence on errors, and terminate owned children on cancellation or timeout.

Base evaluation budgets on measured provider usage

  • Forecast selected observations from recent measured costs, with configurable forecast and safety margins; preserve absolute campaign and daily authorizations.
  • Settle confirmed request usage, retain uncertain reservations across restarts, and expose cost provenance and calibration requirements in plans and reports.
  • Share portable cost measurements with GitLab independently of quality references.
  • Limit absolute spending to USD 10 per campaign and USD 30 per UTC day, while retaining lower empirical safety ceilings when the measured forecast allows it.

2026-10-27

Acknowledge RabbitMQ messages after failed processing

  • Acknowledge every completed processing attempt across all six RabbitMQ message families, including technical failures and malformed JSON, without requesting requeue or dead-lettering. Failed messages require manual republication to retry.
  • Log propagated processing errors once at the RabbitMQ boundary. Unknown clients retain one concise error without a traceback for user, opportunity and job messages.
  • Preserve cancellation without acknowledgement and warn when acknowledgement fails; broker redelivery remains possible after a channel or connection loss.

Expose opportunity synchronization progress

  • Distinguish accepted administrative tasks from execution after worker admission, and display task correlation in plain/console logs.
  • Log synchronization setup, upload validation, inventory progress and each MongoDB cleanup/update step with batch counters and monotonic durations. Report completed batches only after their writes succeed, without logging uploaded identifiers or contents.

Include PwC tenants in MongoDB index reconciliation

  • Select the PwC catalog from ClientConfig.dataSource in targeted and global reconciliation, reusing the shared provisioning definitions and compatibility score indexes. Keep reference_data on its dedicated catalog.
  • Preserve external classic and Search/Vector indexes on PwC databases. Report conflicting external classic definitions for manual review while continuing independent repairs. Operate only on the instance's connected cluster.

Batch opportunity status synchronization and reopen stored offers

  • Read only identifiers and statuses, compare with sets, and apply closures and reopenings in batches of at most 500 IDs. Preserve initial counters, the read-only check and background completion reports.
  • Reopen stored closed offers from the uploaded open list without upserting missing offers or changing their content. Update matching freshness dates for both directions. Retain batched score and embedding cleanup for closures.
  • Honor physical deletion without recreating a partial offer, and invalidate user JOM freshness once when deleting. Add the PwC user-score index by offer ID to provisioning; existing databases require index reconciliation.

Restore SMTP delivery when Brevo is not configured

  • Keep Brevo primary when BREVO_API_KEY is present. Otherwise use the legacy asynchronous STARTTLS transport with MAIL_SENDER, MAIL_SMTP_LOGIN, MAIL_SMTP_KEY, MAIL_SMTP_URL and MAIL_SMTP_PORT.
  • Skip incomplete configuration with a warning naming only missing variables; administrative operations continue. Configured delivery failures never switch transport. Preserve bounded delivery, cancellation and connection cleanup.
  • Load the Brevo SDK only for Brevo delivery. Preserve original SMTP attachment names and safe MIME headers; Brevo keeps its .json.txt attachment convention.

Version test-only releases

  • Include all tracked changes under tests/ in the global patch calculation, including fixtures, additions, edits, deletions and renames.
  • Combine tests, documentation, requirements and API patch changes into one increment since the last applicable tag. Preserve API minor precedence and reuse immutable tags for identical release promotions.

Resolve reasoning from semantic profiles

  • Set central defaults to tiny=none, mini/default=low and large/reasoning=medium for supported models across all four providers.
  • Preserve tenant and AIProviders reasoning ahead of code defaults, including effort-only overrides and explicit none. Omit controls unsupported by the selected model; existing database records are not rewritten by seed changes.
  • Remove workflow-local effort overrides and implicit connector effort defaults. Propagate profile settings to Anthropic Opus, summaries and document extraction. Keep external GenAI overrides and native Decisions behavior.
  • Align evaluation profile snapshots and document adapters without changing semantic expectations. Require profile reasoning review during feature design and commit preparation; no paid campaign runs automatically.

Use GPT-6.1 Terra medium for the OpenAI large profile

  • Update centralized fallbacks, the provider seed and evaluation configurations to gpt-6.1-terra with reasoning_effort: medium for OpenAI large. Preserve Sol for reasoning and existing tenant overrides.
  • Add Terra pricing, prompt-cache recognition and Responses tool routing. The GenAI Chat Completions surface rejects Terra tools at every effort.
  • Provide a dry-run-first MongoDB/PostgreSQL migration for existing shared Sol/Terra large settings. No live database changes or paid evaluations are performed by updating code or seeds.

Complete client resources before acknowledging creation

  • POST /admin/api/v1/clients now returns HTTP 200 after collection/index reconciliation and client registration. Only initial import publication stays in the background, with its task ID returned for monitoring. Resource-only requests return a null task ID.
  • Preserve bounded admission, resource confirmation and per-family import emails. Resource failures return a sanitized HTTP error and prevent import scheduling. Atlas Search/Vector readiness remains asynchronous after command acceptance.

2026-10-26

Enable campaign judging by default and filter explicit opt-outs

  • Manual and weekly AI campaigns enable the judge by default. Require --no-judge to disable it, independently of a saved configuration's setting.
  • Exclude scenarios requiring a judge before planning, budgeting, execution or collection. Preserve exclusions in JSON, HTML, JUnit and Excel; an empty eligible selection returns an explicit incomplete report without provider calls.
  • Bind reference approval and comparisons to the effective population and judge mode. Document agent discretion for authorized feature-development checks.

Separate technical AI tests from model-quality campaigns

  • Split unit and integration checks under tests/unit/ai_evals/ and tests/integration/ai_evals/, with simulated provider replies stored only in tests/fixtures/ai_evals/. Preserve the reviewed scenario expectations.
  • Keep evals/ for real campaign inputs, business context, expectations and references. Clarify commands, reports and human review; real quality checks combine deterministic assertions, embedding metrics and semantic judges.
  • Keep historical evidence without automatically approving new references. Changing test-only replies no longer changes live scenario fingerprints.

Distinguish AI evaluation boundary scenarios

  • Replace redundant examples in 13 agent, prompt-suggestion, Lexi and GenAI pairs with distinct boundary cases and explicit acceptance criteria.
  • Preserve complete agent history and validate captured tool arguments. Make Lexi catalogues, previous selections and proficiency scales explicit in cases.
  • Replay explicit tool calls and streamed response fragments offline. Existing campaign results are not automatically approved for the updated catalogue.

Queue initial client entity imports

  • Client creation and /batch-processing/client/imports now stream active source IDs to RabbitMQ, then report confirmed publications per family. Consumers hydrate full records without matching, deactivation or score deletion.
  • Preserve user matching by default and import-only defaults for opportunities and jobs; validate compute_matchings as a JSON boolean. Propagate import failures for requeue and close publication/source resources on cancellation.
  • Preserve direct entity imports and /client/full. Document manual publication restart, duplicate delivery, queue prerequisites and existing 24-hour retention.
  • Isolate SQL, queue and publication errors by entity family: report and log the failed family, continue subsequent families with independent RabbitMQ sessions, and retain a terminal partial-failure outcome. Cancellation still stops work.
  • Share the existing queue-name construction between publication and consumption without renaming live queues.

Unify client imports and report every batch stage

  • Replace the former client-processing and initialization routes with POST /admin/api/v1/batch-processing/client/imports, /matchings and /full.
  • Reuse the client-creation import sequence everywhere: jobs, opportunities, trainings, then users, independently of matching feature flags.
  • Send a report after each import, JOM users, JOM opportunities and JPM phase before starting the next, using the same report mechanism as their standalone endpoints; full processing also sends a consolidated final report.
  • Preserve per-entity isolation, matching-phase continuation, cancellation and best-effort notification delivery. Global import failure prevents matching.

Run AI evaluations explicitly with optional repetitions

  • Remove automatic AI evaluation execution from Git commit hooks; retain offline quality gates and evaluation maintenance alongside feature changes.
  • Use one observation per scenario and the same reservation ceilings for manual and weekly GitLab campaigns: 1,200 calls, 20 million tokens and USD 60.
  • Add --repetitions N to planning, execution and offline collection for explicit repeated experiments, without increasing budgets or approving references.

Review AI evaluation scenarios with feature plans

  • Review proposed LLM and embedding scenarios with each feature implementation plan. Human approval of the plan approves the described scenarios for execution; observed reference results still require separate approval.

2026-10-23

Reuse AI evaluation evidence per scenario and make commits advisory

  • Track scenario dependencies through production imports and explicit workflow or case dependencies; reuse unchanged observations with original provenance.
  • Assemble complete evidence from focused campaigns with offline collect; keep missing, stale, failed and incomplete observations visible.
  • Make the staged AI evaluation hook advisory for generation and embeddings, including missing references or execution prerequisites. Keep offline code validation mandatory, budgets enforced and reference approval explicit.
  • Support AI_EVAL_OFFLINE=1 to collect evidence at commit without model calls.

Correct evaluation findings and workflow contracts

  • Normalize single-skill queries before search and result lookup, including surrounding whitespace, using the shared skill-query normalization.
  • Generate Galaxy rationales with a provider-independent structured envelope; retain the public response and strict 20-word limit without truncation or retries.
  • Clarify independent opportunity-search intents, work-deliverable routing, ambiguous-task clarification, unsupported contract filters and grounded advice.
  • Align objective time estimates with the existing calendar-day calculation.
  • Give evaluation judges generated skill labels, finite catalogue mappings and per-question decision policies; correct sparse-profile and post-processing rubrics and replace invalid or meaningless synthetic fixtures.
  • Preserve embedding acceptance thresholds, semantic labels and historical runs.
  • Raise the explicitly approved shared daily reservation ceiling to USD 140; keep the manual campaign ceiling at USD 60.
  • Allow exact --case selection for manual exploratory verification and export only the selected scenarios, without substituting partial evidence for the complete reference, staged gate or weekly campaign.

Align AI evaluations with current workflow contracts

  • Initialize campaign worker resources, decode compressed provider streams and reserve documented model output ceilings when requests omit an explicit limit.
  • Evaluate direct tool delivery and granular Live backend outputs; validate GenAI scenario capabilities before sending provider requests.
  • Give the mini judge actual synthetic prompt context and a 2,048-token allowance; retain its explanation and safe transport diagnostics in review artifacts.
  • Refine workflow-specific rubrics, add explicit and ambiguous supervisor cases, and separate embedding ranking relevance from business selection labels.
  • Preserve existing application failures and historical evidence; no production behavior, acceptance threshold or approved reference changes automatically.

Continue evaluation campaigns after individual errors

  • Isolate quality failures, judge/provider exceptions and observation timeouts so subsequent scenarios still run within the unchanged campaign limits.
  • Preserve failed-call reservations, block retries within the failed observation, and retain incomplete evidence without approving a reference.
  • Include the actual synthetic agent tool results in judge input and review artifacts so grounding checks have the same evidence as the agent.

Request evaluation campaigns directly from Codex

  • Document natural-language and explicit skill requests that run a bounded campaign through report inspection and XLSX review export.
  • Preserve agreed scope and spending limits; distinguish execution requests from explanations, saved-report review and human reference approval.

Enable evaluation judging and full-corpus call budgets

  • Enable an explicit, separately configured mini judge in the OpenAI, Anthropic and embedding-candidate snapshots, using the existing provider credentials.
  • Raise manual limits to 1,200 calls, 20 million reserved tokens and USD 30; weekly limits are three times those values for three repetitions, with a shared local daily reservation ceiling of USD 120.
  • Document concrete judge settings and distinguish budget reservations from expected billing. Preserve quality criteria and explicit reference approval.

Load evaluation provider keys from the local environment file

  • Read only provider credentials and the Azure endpoint from the checkout's optional .env for live runs and staged commit evaluations, preserving exported-variable precedence and generation/embedding provider ownership.
  • Keep offline commands independent of .env, pass selected settings to staged workers without copying the file, and preserve database/tracing isolation.

Review AI evaluations in Excel

  • Add a step-by-step guide to expected behavior, live evidence, Excel review, correction requests and explicit approval of complete reference campaigns.
  • Add an offline XLSX export of all evaluation cases, embedding relevance labels, configuration and optional recorded campaign outcomes.
  • Include editable review annotations, source/report fingerprints, explicit missing observations and complete case details without changing reference approval or paid evaluation requirements.
  • Preserve existing workbooks and write long or formula-like text without truncation or formula execution.
  • Normalize configuration defaults when fingerprinting so report serialization does not invalidate otherwise identical execution inputs.

Maintain AI evaluations during feature changes

  • Require evaluation impact review during implementation, including work without a commit and indirect changes to generation, decisions or embedding consumers.
  • Add, update or remove dedicated scenarios, inventory mappings and offline adapter contracts with their owning features; retain shared scenarios and preserve acceptance criteria for model migrations.
  • Connect the evaluation workflow to Python validation and commit preparation without expanding paid-run budgets or reference approval permissions.

Strict AI evaluation call coverage

  • Require variant-specific successful call evidence for every declared scenario; preserve exact structured-call attribution across LangChain tasks.
  • Add 76 consumer-specific embedding scenarios covering all 41 consumer sites, using real production functions and synthetic external stores.
  • Require semantic judging for refusal, memory and clarification prose, propagate embedding profiles to mixed workflows, and reject training enrichment without a valid vector.
  • Keep the structured-memory retraction discrepancy and the Skills Library whitespace-query exception visible, with no change to production behavior or evaluation budgets.

Versioned AI quality evaluations

  • Add synthetic behavioral cases, bounded local campaigns and comparison reports for guardrails, routing, memory, training and controlled LangGraph paths.
  • Evaluate affected staged content after offline commit gates, reuse matching evidence, and prepare an isolated weekly GitLab job with explicit reference approval and external schedule setup.
  • Expand the corpus to 239 examples across 92 workflows, with a checked inventory of 148 source boundaries, real agent/document/stream/Live adapters, and separate declared versus executed coverage. Reject insufficient full-campaign budgets or missing semantic judging before spending; preserve the initial ceilings.

Evaluate embedding migrations and configure training vectors

  • Add 63 synthetic embedding cases across nine domains, local retrieval and business metrics, paired comparisons, held-out threshold calibration, and bounded input-token metering with within-repetition deduplication.
  • Distinguish 41 inventoried embedding consumers from executed paths and local ranking from actual database/index validation. Keep existing campaign budgets.
  • Replace the hardcoded enriched-training-title model with the shared training embedding profile across MongoDB, PostgreSQL and chatbot queries. Preserve the OpenAI/Azure default; changing the vector space still requires a data rebuild and compatible storage dimensions.

Classify required job-skill proficiency levels

  • Select required levels through batched mini categorical choices with stable job/skill identities, input order, client context and the configured scale.
  • Preserve large structured generation on unsupported providers/models and explicit Anthropic overrides. Native failures never return partial levels or trigger generative retries.

Separate training search decisions and clarification

  • Use compatible OpenAI mini decisions for training request validation and learning-plan scope. Generate a mini clarification only when needed.
  • Preserve the two-dimension rule, explicit skip, search availability and the combined structured calls on unsupported providers/models.

Extend categorical classification across AIHub

  • Use native mini decisions for opportunity profile intents, Lexi assignments and group types, global skill fit, objective relevance, marketplace filter preselection and ambiguous-language fallback.
  • Preserve original identities, explicit no-match outcomes, existing error contracts and legacy provider profiles. Keep marketplace prefill generative and py3langid first. Native failures never switch providers.

Separate memory eligibility and reconciliation

  • Use a native mini skip/update decision when supported; generate the complete reconciled memory only for updates, including explicit retraction of the last fact.
  • Preserve first-person wording, fact languages and the combined structured call for other providers/models, with existing best-effort failure behavior.

Separate guardrail decisions and responses

  • Classify requests with OpenAI Decisions and the configured mini profile; generate a separate mini response only for safety/scope clarification or refusal.
  • Preserve recent conversation context, professional scope and ordinary business clarification rules, with a shared 15-second deadline for both safety stages.
  • Keep retrieval, memory and specialists behind successful safety validation, preserve JSON/SSE behavior and label decision/response costs separately.

Supervisor routing with OpenAI Decisions

  • Remove the supervisor's direct out-of-scope reply exception and standalone processing confirmation. The supervisor is instructed to hand off every request it receives to a specialist; the preceding guardrail handles refusals.
  • Replace generative supervisor routing and transfer tools with an OpenAI Decisions choice using the configured mini profile. Preserve tenant agent availability, conversation compaction and profile-action-plan redirection.
  • Use the existing structured LLM connector for providers/models without native Decisions support, preserving the configured mini profile. Reject unusable decisions with a bounded deadline and no automatic routing fallback.

Add the shared categorical decision connector

  • Add capability-aware choices, strict answer validation, sequential 400-question batches and request-level usage/cost tracing through the shared provider layer.
  • Preserve explicit model mappings and provide a structured-choice adapter for providers without native support. Failed native calls do not switch providers.

Restore the September CV parsing contract

  • Restore native OpenAI Responses file input with the detailed September evidence prompt and complete strict extraction schema, preserving the configured mini profile, original file bytes and fixed-instruction cache boundary.
  • Keep OVH's local extraction while applying the same schema and response mapper: full identity/address fields, courses, language levels and document transcription.
  • Restore complete/partial indicators (0/1), unreadable-document 422 errors and invalid-output 502 errors instead of successful empty results.
  • Return every known date as YYYY-MM-DD, using January and day 1 for missing components, including end dates. Keep empty unknown dates and __NOWSTRING__ for explicitly current employment.

2026-10-22

Full CV dates with month names

  • Recognize full French and English dates, including abbreviations, accents and ordinal suffixes, so valid dates such as 12 janvier 1990 and January 12, 1990 produce ISO dates instead of empty response fields.
  • Apply the shared parser to employment, education, birth dates, degree summaries and duration calculations. Keep partial-date boundaries, current-role markers, numeric day/month/year ordering and rejection of impossible dates.

CV parsing date standardization

  • Standardize every CV parsing response date (startDate, endDate, birthDate, highestDegree.endDate) to ISO 8601 (YYYY-MM-DD) instead of the raw CV text. A year-only or year-month fragment still resolves to the first day of that period for a start and the last day for an end; a fragment the deterministic parser cannot recognize is now empty instead of forwarded as free text. Current positions are unaffected and keep __NOWSTRING__.

Deferred language detector initialization

  • Initialize the shared language models on first detection instead of importing them during application or metadata loading. Async callers initialize off the event loop; concurrent calls share one fully configured detector pair.
  • Preserve calibrated language results and propagate initialization failures without invoking the optional LLM fallback.

Static HTTP reference sources

  • Version HTTP Markdown and interface links alongside the code.
  • Refresh them locally with python -m scripts.update_http_reference; the commit hook rejects stale sources after contract, metadata or dependency changes.
  • Render deployed documentation without importing application routers or copying business modules. Keep live Swagger/OpenAPI and background site publication.
  • Remove redundant complete-operation blocks and static OpenAPI JSON copies; retain detailed contract sections and links to the live schemas.

Remove Python reference documentation and sign-in

  • Remove the generated Python implementation reference and its documentation-only sign-in, sessions and API-key checks. Keep public functional guides, generated HTTP contracts, search and sitemap, with the same cached background build.

Send client creation and entity import reports

  • Notify client creation immediately after ClientConfig registration, before initial imports. Send one existing batch report after each job, opportunity, training and user import, including explicit empty/partial outcomes. Retries confirm verified resources; successful runs have no duplicate final summary. Keep terminal failure/cancellation reports and isolate email delivery failures.

Preserve scores when deduplicating jobs

  • Preserve job search scores during chatbot result formatting on MongoDB and PostgreSQL. Vector deduplication retains the higher-scoring job, or the first result on a tie, instead of failing with a missing score and keeping duplicates.

Defer similarity library imports

  • Defer SciPy and scikit-learn imports until chatbot vector deduplication or Lexi catalogue retrieval needs them. Run chatbot deduplication in the shared bounded blocking pool so first-use imports and calculations stay off the event loop. Preserve search ranking, filtering and result contracts.

Share language detectors within each worker

  • Share the full py3langid model and tokenizer tables between the broad and frontend-language detectors within each worker. Keep separate language scopes, identical probabilities and thresholds, and read-only concurrent detection.

2026-10-21

Preserve legacy OpenAI reasoning model settings

  • Recognize configured o1/o3/o4 model names and dated snapshots in shared OpenAI/Azure parameter handling. Preserve their explicit reasoning effort and omit temperature; current profile mappings and unrelated custom model names remain unchanged.

Preserve streamed OpenAI refusal metadata

  • Preserve OpenAI Chat Completions refusal fragments in the internal streaming result's metadata, consistently with non-streaming responses. Keep native finish reasons and the separate GenAI SSE transport unchanged.

Preserve reasoning across OpenAI tool conversations

  • Preserve configured OpenAI tool reasoning: route GPT-5.4/GPT-5.5/GPT-5.6 tool conversations through Responses alongside GPT-6, retain opaque context across alias/snapshot responses, and stop forcing none on earlier GPT-5 Chat Completions calls. Keep cache controls appropriate to each model.

Expose current OpenAI prompt cache controls

  • Use prompt_cache_options.ttl for GPT-5.6 and GPT-6 in GenAI discovery and examples. Reject their obsolete prompt_cache_retention field before provider calls, while retaining the legacy control for earlier supported models.

Validate GenAI tool reasoning combinations

  • Reject GenAI Chat Completions requests combining GPT-5.4, GPT-5.5 or GPT-5.6 function tools with an effort other than none, including an unspecified effort. Apply the same restriction to model discovery and profile-derived settings before provider calls.

Validate Anthropic assistant document history

  • Reject direct documents in native Anthropic assistant history before any provider call, consistently across Messages, streaming and batches. GenAI returns a sanitized HTTP 422; nested tool-result documents, citations and signed blocks remain unchanged.

Use native Anthropic structured outputs

  • Use native JSON Schema for chatbot structured outputs on Opus 5.5. Reject unsupported forced tool choices before provider calls and in GenAI capability validation, and preserve explicit tool_choice="none" for every Anthropic model across Messages, streaming and batches.

Preserve Anthropic tool continuation content

  • Preserve all native Anthropic content blocks during tool continuations, including signed and redacted thinking for Sonnet and Opus as well as Haiku. GenAI returns the replay content, and chatbot/MCP conversations retain it for the originating model.

Update Anthropic SDK compatibility

  • Update the Anthropic integration to API version 2026-10-21 through the pinned SDK. Keep the existing API-key configuration and verify Messages, streaming and Message Batch authentication and payloads against the updated SDK.

Patch the development environment builder

  • Pin the development environment builder to a patched release for CVE-2026-113725, including installations with an older transitive version already present.

Group voice simulation captions into history turns

  • Group new Live simulation captions into stable history messages per speaker and session, splitting after an audio-timeline gap greater than two seconds. Update each message progressively on MongoDB and PostgreSQL, deduplicate caption events, and drain received captions before closing. History pagination and simulation analysis count grouped turns; existing fragmented histories are not rewritten.

Use a dedicated French simulation voice

  • Default continuous simulation voice to Brise, a natural French voice. Accept Sillage as its masculine alternative and preserve explicit context.voice selections; voice changes apply to new sessions.

Remove the unused chat speech endpoint

  • Remove the unused chat_speech endpoint and its dedicated Oria voice adapter. Keep continuous simulation voice and standalone audio-file transcription.

Migrate simulation voice to GPT-Live

  • Migrate continuous simulation voice to GPT-Live 1 with audio and timestamped captions. Preserve simulation persistence and remove the obsolete Realtime transcription catalogue. Document the frontend protocol and explicit stored-configuration migration; PostgreSQL revision 20261021_28 removes retired columns.

Include reference data in global index reconciliation

  • Include reference_data and its managed skill collections alongside configured client databases when POST /admin/api/v1/clients/indexes omits db_name, for both dry runs and background reconciliation. Process each database only once and preserve explicit single-database selection.

Send reports through the asynchronous Brevo SDK

  • Replace SMTP delivery with Brevo's native asynchronous SDK using BREVO_API_KEY and MAIL_SENDER. Missing or blank API keys skip delivery with a warning without interrupting processing. Bound delivery to 20 seconds, use one retry policy, and send JSON attachments as .json.txt with unchanged contents.

Reconcile index definitions and remove obsolete indexes

  • Unify client creation and index repair around catalog convergence: update same-type Atlas Search/Vector definitions and compatible TTL settings, replace incompatible indexes, and remove obsolete or duplicate indexes while retaining _id_. Dry runs return the planned mutations; Search type replacement waits for asynchronous deletion before recreation.

Recalculate matching after catalogue changes

  • Recheck complete user-side JOM/JPM results against changes to the tenant opportunity/job catalogue, on MongoDB and PostgreSQL. Existing user events remain the recalculation entry point.
  • Track successful nonempty complete calculations separately from individual pair scores. Empty results always recalculate on the next user message; partial failures do not advance freshness. Add MongoDB catalogue-date indexes and an Alembic revision for PostgreSQL source-change tracking.

2026-10-20

Import technical classifications for job offer matching (NB-9232)

  • Import configurable Smart Editor technical classifications for users and job offers, supporting direct association values and selected options.
  • Normalize numeric classification prefixes during MongoDB imports, so a value such as "19: Other subsidiaries - Executive" is stored as "19". Reimport existing user and offer documents to apply the normalization.
  • Add the technical_classification JOM hard filter with the existing directional mapping semantics in MongoDB and PostgreSQL. Keep JPM/Galaxy on independent job classifications.
  • Extend PostgreSQL projections through an Alembic migration and register MongoDB eligibility indexes. Tenant activation, MongoDB reimport, index reconciliation and matching recalculation remain separate operational steps.

Return administrative dry-run results synchronously

  • Return administrative dry runs directly as HTTP 200: MongoDB index reconciliation (apply=false, the default) returns the complete plan, counts and resource errors; opportunity synchronization (check_only=true, the default) returns the comparison counters. Keep HTTP 202, background execution and completion email for index mutations (apply=true) and opportunity synchronization (check_only=false).

Use supported reasoning effort for GenAI PDF extraction

  • GenAI PDF extraction requests the lowest reasoning effort accepted by the configured OpenAI document model instead of always sending none. Since the large profile moved to GPT-6.1 Sol, which rejects none, every PDF sent to /genai/api/v1/chat/completions failed with document_extraction_failed.

2026-10-19

Make client provisioning resumable

  • Share additive collection/index reconciliation between client creation and the administrative index endpoint. Repeated creation calls preserve existing resources and settings, create missing resources, and register the client only after successful resource reconciliation. Conflicts remain errors. Add per-step MongoDB deadlines and correlated progress logs; optional initial imports rerun on each call.

Remove documentation builds from CI

  • Remove the documentation build job from GitLab CI. Strict validation remains in the local commit hook, and application startup generates the deployed site. Release version calculation still includes documentation changes.

Simplify release and documentation versioning

  • Simplify release versioning to one CI job on develop and every release/* branch. Preserve API-driven patch/minor increments, apply one patch for requirements-only or documentation-only updates, and accept accumulated minor increases. Documentation now displays source API versions with an unversioned title and builds without Git or packaged release metadata. Tag failures block deployment; identical release promotions reuse immutable tags.

Remove Socratic tutoring

  • Remove Socratic tutoring: the specialist agent, transfer tool, dedicated chat mode, prompt suggestions and learning-plan companion cards. Chat requests now use the main graph; simulations remain available. Existing conversations and historical configuration seeds are preserved.

Remove Oria peer feedback and notifications

  • Remove Oria peer-feedback routes, chat actions, specialist tools and in-app notifications. Stop reading stored professional evaluations for profile analysis, career conversations, objective suggestions and people discovery. Remove Feedbacks and Notifications from new-client index provisioning and reconciliation. Existing database contents are not deleted. The consumer-format JOM feedback import and its matching workflow remain available.

2026-10-16

Generate documentation metadata in the build cache

  • Generate documentation versions and dependency constraints automatically in the isolated build cache. Renovate updates no longer require metadata commits. Documentation-only changes now produce a project patch tag without bumping an API version; CI validates relevant merge requests and pushes with the same strict build. Git-free images carry the resolved CI version in project-version.txt.

Centralize provider configuration resolution

  • Centralize AI configuration fallbacks across synchronous/asynchronous MongoDB and PostgreSQL loaders: valid client selection, database default, then code default. Validate model references against the selected provider catalogue, retain valid profiles and reasoning settings, and supply complete embedding fallback metadata. Missing Lexi embedding profiles inherit the resolved provider's embedding model. Empty catalogues now resolve without requiring default-provider records.

Allow configured provider selection for CV parsing

  • Add an optional ai_provider query parameter to CV parsing. Configured providers use their mini profile; omitted, empty or unknown identifiers select the database default, then the built-in default if none is configured. MongoDB and PostgreSQL both ignore tenant/instance overrides for this selection and support empty catalogues without requiring embedding configuration.

Preserve images in Anthropic document extraction

  • Preserve uploaded images in the shared Anthropic adapter for CV parsing and Chatbot extraction. Translate supported image inputs into native blocks and reject malformed encodings without exposing their contents.

Bound local CV extraction and document its contract

  • Harden CV extraction with bounded, cancellable PDFium subprocesses, resource limits and sanitized retry diagnostics. Restore string certifications and skill-source metadata; prevent unknown dates or duplicate months from inflating experience. Publish response examples and resource-error contracts in Swagger.

2026-10-15

Add local CV extraction and shared provider routing

  • Rework POST /api/v1/talent-intelligence/cv/parse to call the shared, provider-agnostic mini profile instead of a fixed OpenAI Responses-API workflow, so CV parsing follows the shared configured provider (OVH, OpenAI, Azure or Anthropic). Text extraction now runs locally (layout-aware PDF text with scanned-page image fallback, DOCX paragraphs/tables), with direct image uploads and rendered scanned pages sent as vision input. Supported extensions become PDF, DOCX, TXT, MD and common image formats; .doc, .odt and .rtf are no longer accepted. partialExtractionIndicator gains a third state ("2", nothing usable extracted) returned as HTTP 200 instead of a 502, and experience-duration math is computed from dates copied verbatim from the CV rather than from model-normalized dates.

Expose administrative background task status

  • Add admin task polling at GET /admin/api/v1/operations/{task_id}: running, success or fail from worker memory, with a 404 for unknown tasks. Query sibling workers through local Unix sockets, retain the latest 1,000 completed outcomes per worker, and keep processing status independent of email delivery. No database persistence or cross-container history.

Extend administrative background completion reports

  • Extend HTTP 202/background completion emails to MongoDB user/opportunity skill inference, opportunity synchronization (including dry runs), JPM job-score publication, client configuration normalization, PwC exports and PostgreSQL migrations. Preserve durable PostgreSQL user-inference jobs. Own uploaded bytes after request closure, report partial publication/export failures, and keep migration listener/lock ownership through cancellation.

Consolidate JPM score publication

  • Consolidate JPM job-score publication on POST /admin/api/v1/matching/jpm/scores/jobs/publish, with optional job selection and progressive batches of 10,000 scores. Remove the separate synchronization operation.

Expose client configuration normalization

  • Expose full client configuration normalization at PUT /admin/api/v1/configuration/clients/normalize. Reconcile template fields while preserving existing values and dynamic mappings, report changed/unchanged/failed counts, and use native asynchronous database access. Unknown explicit clients return 404 instead of selecting all clients. Replace the previous configuration correction operation without a compatibility alias.

Run administrative operations in the background

  • Return HTTP 202 for client creation, index/RAG/skill-embedding maintenance, entity imports and matching/client batches. Run bounded background operations with one final email report, including early and partial failures, and a task ID for log correlation. Initial client imports now default to enabled. In-process tasks do not survive forced container termination.

Limit Anthropic caching to reusable instructions

  • Limit Anthropic one-shot and batch cache writes to reusable instructions; retain automatic history caching for conversational turns.

Separate reusable prompts from request context

  • Isolate reusable instructions from request context in chatbot memory, simulation feedback, objectives and knowledge answers. Preserve business rules and structured response formats.

Apply provider-specific prompt cache boundaries

  • Apply model-specific Anthropic prompt-cache thresholds and preserve explicit OpenAI cache boundaries in block-form system messages.

Use GPT-6.1 Sol for the large profile

  • Use GPT-6.1 Sol for the OpenAI large profile in code defaults and the PostgreSQL initialization seed, retaining the shared low reasoning effort. The reasoning profile continues to use GPT-6.1 Sol with medium effort.
  • Consolidate the Sol catalogue and public pricing on GPT-6.1 Sol. Existing provider catalogues and tenant overrides remain authoritative and require an explicit configuration update; initialization seeds do not rewrite stored rows. Tool calls require Responses, and none or minimal reasoning effort is not supported.

2026-10-12

Prepare imports before deactivating existing entities

  • Entity batch imports now deactivate existing entities and clean their scores only after every source record has been prepared. A malformed source record no longer leaves a tenant with all users, opportunities, jobs or trainings deactivated.

Handle missing job classifications during opportunity imports

  • Smart Mobility opportunity imports store jobClassification as -1 when the attached job grading is missing or not an integer, instead of failing the whole import.
  • Treat an occupation named in a Talent Marketplace search as an inclusive current-job criterion: prefill every matching job title, including specializations and seniority variants (a "designer" search now also selects Senior UX Designer), even when the search combines contract, location or mobility criteria.
  • Keep a stated specialization or seniority level restrictive, exclude occupations that merely share a word, and use keywords for an occupation only when no catalogue job matches it.

Suggest performance goals and key results (NB-9194)

  • Add POST /api/v1/performance-goals/suggestions to suggest SMART performance goals with a rationale and a target date bounded by the review period, excluding existing, rejected, deleted and already displayed goals.
  • Add POST /api/v1/performance-goals/key-results/suggestions to suggest up to the goal's remaining four key results with a boolean, custom, percentage or currency measure, excluding existing and deleted key results.
  • Return an explicit noSuggestionReason instead of weak suggestions when nothing relevant can be proposed.

2026-10-08

Adopt Claude Haiku 5.5

  • Use Claude Haiku 5.5 for Anthropic default, tiny and mini profiles, including the PostgreSQL seed and code defaults. Add an opt-in exact-selector migration for existing catalogues and tenant configuration.
  • Support Haiku effort controls, disabled thinking and signed tool history, and account for prompt-length, cache and batch pricing.

Remove retired generation providers

  • Limit generation providers to OpenAI, Azure OpenAI, Anthropic and OVH across the shared connector, GenAI and chatbot. Update model discovery, seeds and examples accordingly. Existing deployments must update retired provider selections before upgrading; stored catalogues are not rewritten automatically.
  • Upgrade Tenacity to 9.2.1 after removing the retired SDK dependency.

2026-10-06

Parallelize referential analysis and HRX transfers (NB-9113)

  • Embed each semantic duplicate label once, with up to 512 labels per provider request and 16 concurrent requests, instead of about ten sequential requests per 300-label batch; duplicate groups are unchanged.
  • Run deterministic and semantic referential analyses in separate worker pools so the fast deterministic check never waits behind semantic work.
  • Exchange HRX transfer pages concurrently over one connection pool, keeping page order and publishing completion only after every result page is stored.
  • Normalize each skill label once in within-job fuzzy duplicate checks, making the deterministic analysis about six times faster on 48,000 associations with identical findings.

2026-10-05

Validate skill associations and catalogue quality scores (NB-9113)

  • Enforce structured JSON responses when associating client-provided skills with jobs, preventing failures caused by Markdown-wrapped model responses while preserving catalogue and proficiency validation.
  • Score a skills catalogue on label length alone when no DGI driver is available, instead of counting the absent driver as zero coverage that capped the score at 50% and prevented a satisfactory result.

2026-10-02

Preserve active jobs without a source status

  • Smart Mobility job imports now keep status=true for active jobs whose status_id is null, consistently with the active-job import filter.
  • Inactive jobs and jobs with an explicitly non-visible status remain inactive.

Make RabbitMQ optional through its connection URL

  • Use only RABBITMQ_URL for producer and consumer connection configuration.
  • When the URL is absent or blank, log a warning without connecting, starting consumers, retrying or publishing messages.
  • Keep single-host and multi-host behavior for configured URLs.
  • Report RabbitMQ URL presence in Admin environment diagnostics without exposing the URL or its credentials.

2026-10-01

Support RabbitMQ cluster endpoints

  • Accept comma-separated hosts in the shared RabbitMQ connection configuration for producers and consumers, including failover during initial connection and after a connection interruption.
  • Preserve single-host URL behavior.

Build documentation without Git

  • Use packaged documentation versions when Git is unavailable, even if the deployment contains .git. Apply this behavior to runtime and CLI builds.
  • Keep Git-based version validation when Git is available in a checkout.

Remove client deletion

  • Remove the Admin client-deletion endpoint and its database-drop workflow.

Remove temporary connection diagnostics

  • Remove the temporary MONGO_CONNECTION_STR field from environment diagnostics.

2026-09-30

Align referential generation and quality rules (NB-9113)

  • Share the three Lexi tab rule sets with generation through the versioned referential analyzer.
  • Select final skills before one bounded repair and expose remaining quality findings.
  • Centralize mission counting and family-size guidance while preserving human approval.
  • Repair out-of-range granularity with the shared skill catalogue and keep only batches that improve it.
  • Evaluate a replacement without the skills it orphans, matching their removal by HRX.

Identify entities in matching skip logs

  • User and opportunity processing skip logs now include the entity ID, including standardization-only imports and deactivated profiles. PwC imports retain the incoming identifier when standardization returns only a deactivation message.
  • Matching decisions and existing request correlation remain unchanged.

Version dependency-only releases

  • Changes to requirements.txt now trigger one project patch tag even when application versions are unchanged. API minor changes still take precedence.
  • Requirements-only Renovate MRs do not need generated documentation edits. Image builds receive the calculated tag and refresh their version metadata; source deployments refresh metadata in the isolated documentation cache.

Accept legacy characters in imported institute names

  • Consumer-format user imports preserve DEL/C1 characters, including U+0092, in education[].educationalInstitute.instituteName. Other fields, JSON keys, forbidden C0 controls and import budgets retain their existing validation.

2026-09-29

Use GPT-6.1 Sol for OpenAI reasoning

  • Select GPT-6.1 Sol with medium reasoning in code defaults and new provider seeds.
  • Support its Responses tool conversations, cache pricing and model discovery.
  • Provide a targeted preview/apply migration for existing MongoDB and PostgreSQL provider profiles while preserving custom tenant selections.
  • Remove the footer from all public and private documentation pages, including sign-in, not-found, build waiting and build failure pages.

Integrate documentation sign-in with the site theme

  • Add an API-key access panel with inline errors, mobile layout and theme colors.
  • Fix browser sign-in rejection caused by an opaque Origin under no-referrer; retain strict same-origin validation and normalize default ports.

Restrict implementation documentation to authenticated readers

  • Require the configured user API key for the Python/mkdocstrings reference, associated implementation references and symbol inventories.
  • Add browser sign-in with an expiring, signed HttpOnly session. Require HTTPS on remote hosts while supporting HTTP on localhost and loopback IP addresses.
  • Separate private artifacts from public files and filter public search and sitemap output while preserving nonblocking background generation.

Build complete documentation without blocking the API

  • Restore the mkdocstrings Python reference, generated navigation and guide links.
  • Build the full site in an owned background subprocess after API initialization.
  • Serve a temporary HTTP 503 documentation page until publication; keep health checks and Swagger available during generation and on build failure.
  • Bound runtime generation and clean up the builder and its children on shutdown.

Remove generated Python documentation

  • Remove the Python module reference, its generated navigation and source-analysis dependencies from the documentation build to reduce startup work.
  • Keep the generated HTTP contracts and functional guides, with Chatbot and MCP links pointing directly to their maintained guides.

Load shared provider documentation without credentials

  • Add public GET /genai/api/v1/catalogue for shared provider/model metadata, database profiles and independent code fallbacks, without client overrides.
  • Load the documentation catalogue automatically and remove the API-key and Client-ID inputs. Retain manual refresh, sanitized errors and no-store responses.
  • Keep generation and tenant-aware /models authenticated.

Remove unused Anthropic prices

  • Remove built-in pricing for the unused Claude Opus 5 and Claude 3.5 Sonnet models. Provider-reported costs and explicit pricing overrides remain available.

Adopt Claude Sonnet 5.5

  • Update the active Sonnet catalogue, profile fallback and examples to Sonnet 5.5.
  • Preserve explicit/profile reasoning controls, translate none to Anthropic's between_tools mode, and use native JSON in dynamic structured-output calls.
  • Advertise forced-tool support in GenAI discovery and reject unsupported forced choices before calling Sonnet 5.5. Preserve internal streaming behavior.
  • Correct Sonnet pricing and remove its obsolete scheduled price increase.
  • Provide an opt-in, dry-run-first migration for existing provider and tenant configuration in MongoDB and PostgreSQL.

2026-09-28

Documentation reference organization

  • Separate editorial functional guides from OpenAPI-generated HTTP contracts.
  • Cover all HTTP applications, including the complete Lexi and GenAI surfaces, using mounted paths and downloadable schemas from the same route metadata.
  • Link every functional domain to instance-aware Swagger and ReDoc, preserving reverse-proxy prefixes; enable GenAI ReDoc at /genai/redocs.
  • Keep HTTP generation inside the shared build cache without application startup or database access, and document the separate MCP/WebSocket transports.

Check whether a client is registered

  • Add Admin GET /api/v1/clients/exists, returning a boolean registration result from ClientConfig for the requested client, data source and environment.
  • Require only client_id; omitted or blank optional inputs use client-creation defaults. Preserve administrator authentication and deployment isolation.

Rename the client import database parameter

  • Name the import source query parameter database_name_import_data; keep its deployment default and explicit override behavior.

Use deployment defaults when creating clients

  • Default the optional import database/schema query parameter to SM_DATABASE, or smartmobility_io when unset or blank, while preserving explicit overrides.
  • Generate the default RabbitMQ prefix for omitted, empty or whitespace-only values, while preserving nonblank explicit prefixes.
  • Display the resolved default in Swagger and document the existing optional environment selection from APP_IDENTIFIER_SHORT with its ENV fallback.

Simplify client provisioning controls

  • Always enable JOM and JPM for newly created clients; remove their activation switches from the provisioning endpoint and service.
  • Remove the obsolete first-time MongoDB initialization switch from client creation. Tenant indexes are still provisioned; shared index reconciliation remains available through the dedicated administrative endpoint.

Add a dedicated GenAI documentation section

  • Place GenAI alongside Chatbot, Data Exchange and Lexi under Functional Domains, with an overview and the complete Chat Completions and model-discovery guide.

Make GenAI request controls visible in Swagger

  • Show a detailed Chat Completions payload first and provide named examples for JSON Schema, reasoning, caching, profiles, sampling, tools, streaming and configured defaults.

Display live LLM configuration in documentation

  • Load authenticated provider/model catalogues and effective profiles from MongoDB or PostgreSQL in the LLM and GenAI guides, without rebuilding the documentation.
  • Show database/tenant provenance, inherited profiles, GenAI availability and independent code fallbacks; preserve static fallback references when the API is unavailable.
  • Extend /genai/api/v1/models with default-provider and profile-provenance metadata. Keep credentials and tenant results out of the shared static site and browser storage.

Expand GenAI model selection and generation controls

  • Add authenticated model discovery with provider IDs, profile mappings, JSON formats, reasoning levels, tool restrictions, cache controls and streaming capabilities.
  • Select provider/model/profile independently; explicit models override profiles, while omitted selectors use the configured provider and default profile.
  • Support OpenAI-shaped cache, structured-output, reasoning, sampling and streaming-usage controls with explicit capability validation, native OpenAI responses and normalized Anthropic output.
  • Replace the initial selector strings and flat errors with separate selectors and sanitized OpenAI-shaped error objects. See the migration table and complete endpoint guide.

Add GenAI Chat Completions for HRX

  • Mount a dedicated /genai FastAPI application with authenticated Chat Completions, configured model profiles, tools, JSON mode and SSE streaming where supported.
  • Extract PDF pages, including scans, and DOCX paragraphs, tables and embedded-image text through a configured OpenAI document model. Reject incomplete extraction explicitly and emit content-free request logs.

2026-09-25

Align development descriptions and training rationale lengths

  • Request 80 to 120 characters, including spaces and punctuation, for development objective descriptions and Training Matching rationales. This corrects the initial word-based instruction. Training rationales have no fixed sentence count.
  • Keep the existing 60-to-120-word instruction for development objective rationales.

2026-09-24

Adjust skill-fit and recommendation rationale profiles

  • Use large for the global job-skill relevance check and default for talent and training recommendation rationales.
  • Keep existing explicit reasoning efforts and output budgets for these calls. Anthropic catalogue generation and provided-skills selection retain reasoning.

Restore SQLAlchemy 2.1 compatibility

  • Adapt PostgreSQL row, statement and scalar annotations to SQLAlchemy 2.1 while preserving query behavior, API contracts and vector serialization.
  • Use the expanded-parameter compilation API in marketplace filter tests so synthetic tenant queries remain executable with SQLAlchemy 2.1.

Align default generation profiles with mini

  • Use the mini model and reasoning settings for default across OpenAI, Azure, Anthropic and OVH in centralized fallbacks and new provider seeds.
  • Provide a dry-run-first MongoDB/PostgreSQL migration for existing provider defaults, preserving tenant overrides and other profiles.

Clean up legacy skills during client-scoped imports

  • During client-ID imports, also remove unassigned legacy skills in the references present in the returned SQL skills, without an additional source query.
  • Preserve unassigned documents in other references and documents assigned to other clients. Combined client/reference filters remain an intersection.
  • Require a successful source read, completed writes and the existing scope indexes before deleting documents.

Extract CV skills across experience sections

  • Clarify that explicitly named tools and skills must be extracted from employment descriptions, assignments, projects and technical environments, even without a dedicated skills section. Preserve source spelling and experience links without inferring unstated skills from duties or job titles.

Align PostgreSQL provider initialization

  • Align all seeded generation profiles and reasoning settings with the runtime defaults, including Sonnet 5 and Opus 5.5 for Anthropic.
  • Correct the OpenAI/Azure ada_003_mini embedding alias to use text-embedding-3-small, preserving dimensions and vector storage metadata.
  • Initialize Lexi embedding profiles for OpenAI, Azure and OVH, preserving custom mappings when migrations are replayed. Already-applied migrations do not automatically update existing provider configurations.

Document reasoning, embeddings and audio model selections

  • Show effective reasoning settings for every provider's profile models, including Anthropic's separate effort parameter and differences between seeds and fallbacks.
  • Document embedding models and dimensions, the independent Lexi profile, and dedicated Realtime, transcription and speech models with connector availability.

Refresh Azure deployment profiles

  • Use GPT-5.4 mini with medium reasoning for default/large and no reasoning for mini, GPT-4.1 nano for tiny, and GPT-5.2 with medium reasoning for reasoning.
  • Let generic LangGraph models inherit configured profile effort while preserving explicit workflow overrides and the shared low default.
  • Provide a dry-run/apply migration for standard Azure provider profiles in PostgreSQL and MongoDB, preserving custom settings and embeddings.

Refresh OVH models and shared API integration

  • Use Llama 3.3 70B for default/large, Qwen3.5-9B for tiny/mini, and gpt-oss-120b for reasoning. Disable reasoning in the default tiny/mini mappings.
  • Send explicit model IDs to OVH's shared OpenAI-compatible API, forwarding structured-output formats and supported reasoning settings.
  • Keep BGE multilingual Gemma2 and BGE M3, migrating their transport to the shared embeddings API with batches of at most 25 texts. Validate response ordering and dimensions, and propagate failures without returning partial vectors.
  • Provide an explicit dry-run/apply migration for existing PostgreSQL or MongoDB provider configuration, preserving custom settings and vector storage metadata. Document tenant override review and official catalogue/model references.

Consolidate platform and development documentation

  • Group configuration, authentication, input security and LLM providers under Platform > Architecture and remove the separate Operations navigation group.
  • Merge local setup, environment configuration, startup and useful URLs into the Development Guide. Remove the duplicate Quick Start page and update entry links.
  • Remove the redundant Documentation navigation entry before the changelog.

Clarify Azure OpenAI and OVH documentation

  • Document Azure deployment selection, the v1 connection, semantic profiles and current generation capabilities, with a complete provider configuration example.
  • Document OVH endpoint-based model selection, seeded models, configuration, connector limits and cost reporting.

2026-09-23

Use asynchronous LLM and embedding connectors throughout

  • Migrate MongoDB skill-inference maintenance to native async I/O with eight concurrent workers, per-entity failure isolation and cancellation cleanup.
  • Await Talent Match Insight generation in JOM statistics.
  • Remove synchronous LLM and embedding connectors and unused duplicate workflows. Preserve existing profiles, provider options and HTTP completion contracts.

Adopt GPT-6 profiles and provider seed

  • Introduce OpenAI generation profiles, Luna for tiny/mini and CV extraction, and Astra for reasoning, preserving existing reasoning effort settings.
  • Route GPT-6 tool conversations through stateless Responses with ordered reasoning/tool history, streaming cleanup and centralized errors.
  • Update token/cache/batch prices and long-context thresholds; remove retired OpenAI model entries. Align the PostgreSQL initialization seed with the new profiles without overwriting existing provider configuration.
  • Align direct Azure defaults with the existing Azure profile.

Require semantic profiles for LLM workflows

  • Require semantic profiles for every LLM workflow, including CV (mini), Anthropic Talent Intelligence (large) and Anthropic Lexi (reasoning). Keep provider catalogues separate and use the same Lexi model for counting and generation.
  • Replace the prompt engine's multipart llm_model field with model_profile (default, tiny, mini, large, reasoning); remove the Lexi model environment override and record the profile-only development rule in AGENTS.md.

Modernize Excel value imports and safe exports

  • Read Excel values with Calamine and write new XLSX exports with XlsxWriter. Preserve literal strings, cached formula values, date handling, identifier text and CSV imports.

Calibrate local language detection with py3langid

  • Replace Lingua with py3langid and calibrate confidence thresholds against a frozen multilingual corpus. Preserve the existing opt-in LLM fallback; document short-text differences and languages absent from the new local model.

Migrate statistics SFTP delivery to AsyncSSH

  • Replace Paramiko with AsyncSSH for statistics exports, explicitly enabling DSA while retaining legacy connection policy and best-effort delivery. Add bounded connection/transfer deadlines and cancellation-safe cleanup.
  • Remove the obsolete Paramiko vulnerability exception from dependency audits.

Use the maintained Gunicorn ASGI worker

  • Use the maintained uvicorn-worker integration for Gunicorn; Uvicorn remains pinned as the ASGI server dependency.

Reduce release image dependencies

  • Exclude test and development tools from the Docker image while retaining the documentation dependencies required to generate /docs/ at startup.
  • Omit dependency bytecode from the installation layer. Keep all dependency versions in requirements.txt and retain the complete tooling in CI quality jobs.
  • Declare the existing defusedxml version as a runtime dependency to preserve hardened XML parsing when development tools are omitted.

Adopt Claude Opus 5.5 for Opus defaults

  • Move the Anthropic reasoning fallback, Lexi generation and provided-skills defaults, and Message Batches helper to claude-opus-5-5.
  • Preserve high effort explicitly, structured output formats, and the existing classic/batch output limits. Use internal streaming for provided-skills calls that request the model's maximum output budget.
  • Update token and cache prices, including the batch discount, while retaining separate pricing for explicit Opus 5 calls.
  • Pass eligible prompt-cache directives through Anthropic Message Batches.

Reconcile MongoDB indexes with bounded collection concurrency

  • Submit Search and Vector Search changes before classic index builds, then process classic indexes on up to three collections concurrently.
  • Preserve per-collection dependencies, existing reconciliation policies, dry-run behavior and deterministic final report ordering.
  • Log collection progress, index operation start/end and duration, and immediate failures with request/client correlation across workers.

Make MongoDB skill autocomplete language-neutral

  • Use lucene.standard instead of lucene.french for skill titles, preserving complete words across languages while retaining case and accent folding.
  • Send the Unicode search text directly after whitespace and canonical Unicode normalization; remove French accent expansion and shortened-word workarounds.
  • Reconcile existing shared reference indexes through the administrative indexes endpoint after deployment. Search requests never rebuild indexes.

Remove obsolete generic vectors when saving skills

  • Atomically remove a stored embeddings field when an import or regeneration writes the skill's model vector, including ada_002_vector. Preserve the new vector and records outside the selected write scope.

Centralize MongoDB index creation in administrative workflows

  • Restrict application-managed index creation to new-client provisioning and POST /admin/api/v1/clients/indexes.
  • Remove automatic index creation from skill imports, embedding regeneration, chatbot event writes and RAG synchronization. Reuse the existing administrative catalogs for classic, Search and Vector Search indexes.
  • Skill cleanup still requires a pre-existing scope index; missing indexes skip cleanup with a log message. Provision them before running scoped imports.

2026-09-22

Remove unassigned legacy skills during reference-only imports

  • Delete old-format documents with an absent or null client_id inside the requested reference, even when their external_id is still present in SQL.
  • Preserve current client-assigned documents and unrelated references. Failed or cancelled imports skip cleanup, and client-scoped imports retain unassigned legacy documents whose ownership cannot be determined.

Clarify SQL translation precedence during skill imports

  • Preserve the stored MongoDB title_en and embedding for the same skill and client when title is unchanged and the SQL English translation is absent or identical. When it differs, use the SQL translation and regenerate the embedding.

Reconcile missing skills within explicit import scopes

  • Delete source-missing MongoDB skills after successful import checkpoints for reference_id alone, client_id alone, or their intersection. Use MongoDB's reference_id field and preserve all documents outside the selected scope.
  • Reconcile successful empty SQL results while propagating failed reads and cancellation. Unfiltered imports remain upsert-only.
  • Provision and reconcile a reference_id/external_id index. Automatic creation during reference-scoped imports was subsequently removed on 2026-09-23.

Restore single-skill search input logs

  • Restore the compact JSON input log at INFO for both skills_single routes, including default values and retaining the shared log-redaction filter.

Centralized OpenAI error diagnostics

  • Emit consistent openai_error events for OpenAI SDK failures and application deadlines, with operation, model, elapsed time, safe error identifiers and request/client correlation. Cover chat and streaming, embeddings, file requests, audio and client initialization without logging payloads or secrets.
  • Preserve retries, timeouts, cancellation and error propagation; SDK-internal retry attempts remain outside these application-level error events.

Identify the serving backend in HTTP responses

  • Add the SRV session cookie using socket.gethostname() to responses from every AIHub application, including HTTP errors and streaming responses.
  • Use Path=/, HttpOnly, SameSite=lax and Secure for HTTPS requests; preserve existing response cookies and JSON contracts.

Regenerate every reference skill collection

  • Make collection_name optional on skill embedding regeneration: omission processes every collection in reference_data sequentially, with named collection progress in logs. Explicit collection routing stays unchanged.

Regenerate skill vectors from English titles in bounded batches

  • Correct the documented regeneration modes: update_embeddings=true selects skills with missing English titles or model vectors directly in MongoDB; false regenerates all vectors. Read and persist bounded batches.
  • Populate missing title_en using language detection, cached translations and grouped DeepL with LLM fallback. Embeddings use the English title, including replacement of existing vectors when their English title was missing.
  • Return a sanitized 502 if English translation fails, leaving the current batch unchanged and allowing an incremental retry.

Group matching statistics under their product

  • Move all three JOM statistics endpoints from /api/v1/stats/jom/... to /api/v1/jom/stats/..., and all three JPM statistics endpoints from /api/v1/stats/jpm/... to /api/v1/jpm/stats/.... Methods, parameters, exports and delivery options are unchanged; callers must use the new paths.
  • Retain upload rate limits on matching exports and MongoDB-only documentation for the JPM legacy/current comparison.

Move semantic similarity under Talent Intelligence

  • Rename POST /api/v1/utils/compute_cosine_score/ to POST /api/v1/talent-intelligence/compute_cosine_score. Authentication, query parameters and the numeric response are unchanged. Callers must use the new path; the old path is removed.

Remove file-based skill inference

  • Remove POST /api/v1/utils/file/skills_inferring/ and its dedicated Excel processing service. This upload-to-XLSX workflow is no longer available.

2026-09-21

Talent Marketplace filter prefill (NB-9027)

  • Add POST /api/v1/talent-intelligence/talent-marketplace/filters for the RH/manager back-office. Smart Mobility supplies the displayed filters; AIHub uses LLM_PROFILE_LARGE to select relevant filters, reads only their values from MariaDB, then uses a second call to choose values. Smart Editor metadata is batched, shared job catalogues are queried once, and tenant AI configuration is reused.
  • Validate every suggested choice against the client catalogue and retain native values, Smart Editor cardinality, date ranges and optional skill levels. Catalogue overflow and processing errors are distinct from a no-match result.
  • Keep talent search, matching execution, UI permissions and user confirmation in Smart Mobility. No filter-discovery query or result persistence is introduced.

2026-09-18

Import new-client entities without matching

  • POST /admin/api/v1/clients with initialisation_import=true now awaits job, opportunity, training and user imports in that order without calculating JOM or JPM scores. Initial imports run even when those matching products are disabled.
  • The response reports completion of initial imports. The separate maintenance initialization endpoint retains its import-and-matching workflow.

Remove stored batch outcomes

  • Remove MongoDB BatchResults persistence and index provisioning, PostgreSQL batch-result persistence and GET /admin/api/v1/batch-processing/results. Batch execution, in-memory outcomes, logs and configured email reports continue.
  • Migration 20260918_25 drops aihub_batch_results and its historical rows. Its downgrade recreates an empty table and the previous indexes. Existing MongoDB collections require separate cleanup; this change does not purge them.

Remove entity-processing audit persistence

  • Remove MongoDB EntityAudit reads, writes and index provisioning from user, opportunity, job, training and feedback processing, including consumer-format HTTP imports. Entity persistence, matching and Datalake archival continue.
  • Remove the audit-only wall_time parameter from POST /api/v1/user/feedback and internal workflows. Existing database collections are not purged by this application change.

2026-09-17

Peer feedback reliability and privacy

  • Anonymous REST responses hide the reviewer identifier. Giving/requesting feedback refuses unresolved, inactive or ambiguous conversational recipients.
  • Declines emit one notification per intended recipient; marking a notification read returns its updated state. Feedback and notification pagination uses a timestamp plus unique ID, validates cursors, and applies feedback state filters before page limits. Clients must restart lists using old timestamp-only cursors.
  • MongoDB feedback retrieval failures surface as sanitized profile-analysis errors. Notification indexes move from request execution into provisioning/reconciliation; existing tenants need index reconciliation before rollout.
  • Swagger includes readable request, parameter and response examples. The Python 3.14 exception syntax is restored without formatter bypasses.

JPM relevance rationale (NB-9002)

  • Add POST /api/v1/jpm/rationale with required client, user, job and locale, using existing JPM evidence and the tenant's MINI LLM profile.
  • Return two short sentences with a 300-character limit and explicit errors; document request/response examples and log outcomes per deployment environment.

Readable Swagger examples

  • Add concrete English request examples for Galaxy, Training Matching, Skills Library, Talent Intelligence, Lexi, Chatbot and Data Exchange.
  • Correct the user-update example to show the writable fields and repair invalid chatbot response examples. Catalogue fingerprints include explicit documentation and a fixed illustrative value.
  • Request validation, defaults, authentication and response contracts are unchanged.

2026-09-16

English technical text and examples

  • Translate remaining technical comments, prompt instructions, OpenAPI descriptions, generic test fixtures and documentation examples into English. French user-facing translations, language-specific generation rules and multilingual tests remain available.
  • Experience-to-skills default job titles and descriptions now use English. The file skill-inference validation message names the required title column correctly, alongside description.

Galaxy career paths and path rationales

  • Add authenticated /api/v1/jpm/galaxy/path and /api/v1/jpm/galaxy/rationale operations using existing MongoDB/PostgreSQL user, job and JPM data.
  • Validate career progression and preserve the legacy rationale's focus on training and skills to develop, in at most 20 words. See Galaxy for configuration, cache behavior and deliberate migration differences.

Conversational peer feedback in Oria

  • The Feedback Agent can now request feedback from a named colleague (with an optional scoping note), give unsolicited feedback to a named colleague, check pending feedback requests awaiting the user's review, decline a request by description, and list all feedback the user has given or received. Colleague names are resolved through the existing Person Disambiguation Agent; person-name resolution never trusts a value recalled from earlier conversation turns for a mutation, instead re-resolving it against the Users directory at call time.
  • Feedback requests, unsolicited feedback and declines created from the chat now trigger the same in-app notifications as the REST API, so a colleague is notified regardless of how the request was created.
  • FeedbackCreate/FeedbackResponse gained an optional requestTopic field for the requester's scoping note, kept separate from feedbackText (which holds the reviewer's answer) so a topic-only request is not mistaken for an already-answered one.

2026-09-15

Legacy job titles in consumer-format user imports

  • User imports accept DEL/C1 characters (U+007F–U+009F) in previousExperiences[].jobTitle and standardized experiences[].experienceTitle. This tolerance continues through the internal title-keyed inference mapping into user-role prompt messages, preserving the original titles.
  • Received JSON keys, identifiers, dates, C0 restrictions and import budgets retain their existing checks. Routes and request/response schemas are unchanged.

Legacy company names in consumer-format user imports

  • POST /data_exchange/api/v1/users/import_user_in_consumer_format accepts DEL/C1 characters (U+007F–U+009F) in previousExperiences[].companyName, preserving the supplied value. The shared user flow and standardization use the same validation profile, including for queue consumers.
  • Other fields, C0 control restrictions and input budgets retain their existing checks. Routes, request/response schemas and transformation behavior are unchanged.

Luna-based CV parsing

  • All fixed extraction instructions are included in the reusable system prompt-cache prefix; only the uploaded file remains in the variable suffix.
  • POST /api/v1/talent-intelligence/cv/parse replaces the external CV-parser dependency with a fixed OpenAI structured extraction workflow.
  • The authenticated endpoint accepts bounded PDF, DOC, DOCX, ODT, RTF and TXT uploads and returns a Textkernel-like identity, education, employment, skills and document-text envelope. File contents remain untrusted model data, and stable errors distinguish unsupported, invalid, unreadable and provider failure cases.
  • Rich document uploads use inline Responses API file inputs instead of the PDF-only Chat Completions transport. Requests disable response storage and constrain prompt caching to the fixed instructions before candidate content.

2026-09-14

Failure locations in long exception traces

  • Truncated exception summaries retain the innermost frames so middleware stacks do not hide the failure location. The existing limits and omission of exception messages, source lines and local variables remain in effect.

Documentation without the page contents sidebar

  • The "On this page" sidebar is hidden throughout the documentation using shared page metadata.

Consumer processing for HTTP imports

  • The three Data Exchange *_in_consumer_format endpoints now enable call_from_consumer, including raw input archival in Datalake when BLOB_ENDPOINT is configured and consumer audit tracking.
  • User imports also apply the consumer freshness checks to skip matching when scores are already current. HTTP parameters and success responses are unchanged.

English documentation in a single source tree

  • Documentation sources now live directly under docs/ and are maintained in English only. zensical.toml produces one strict build, served at /docs/ through the existing shared cache.
  • Agent instructions, repository skills and version metadata generation use this structure. The translated site, language selector and translation-parity tooling have been removed.

Legacy DEL text in consumer-format imports

  • Existing narrative field allowlists also accept DEL (U+007F) alongside C1, preserving supplied text. Identifiers and keys remain strict; text-length limits, maximum depth, routes and request/response schemas are unchanged.

Larger consumer-format imports

  • User, opportunity and feedback imports accept up to 250,000 JSON nodes per record, including through their shared flows, standardization and import prompt validators. The default budget for other inputs remains 50,000 nodes.

2026-09-12

Project tags across parallel release promotions

  • Release branches reuse an existing project tag when its complete Git tree matches a commit in their history, even if parallel merges have different SHAs. Subsequent version increments use that tag as their baseline. Existing tags remain immutable, and collisions with different content still fail.

Consumer-format opportunity and feedback text compatibility

  • The two remaining consumer-format imports now accept legacy C1 text in selected narrative fields, using the same range as user imports. Opportunity descriptions remain accepted through standardization and skill/title inference. Feedback score behavior, strict identifiers/flags, input budgets, OpenAPI schemas and optional empty bodies are preserved.

Consumer-format user import text compatibility

  • User imports accept the C1 range (U+0080–U+009F) in achiever reasons and experience descriptions without rewriting the supplied text. This tolerance also applies after experience transformation and during user prompt preparation. Identifiers, keys, other controls and input budgets remain restricted; the API schema and LLM message roles are preserved.

Smaller Docker runtime image

  • The release image uses Python 3.14 slim and omits pip download caches, development artifacts and administration tools. Dependency versions and the Gunicorn startup command are preserved, including runtime documentation builds.

Input validation diagnostics

  • HTTP 422 logs identify all rejected fields found by shared safety checks, with nested paths, rule codes and numeric limits or control-character codes. Multiple log batches preserve the complete diagnostic list without field values.
  • Input checks, including consumer-format user imports, remain enabled. Public validation responses are unchanged; structural limits still bound inspection.

2026-09-11

Experience skill exclusions before retrieval limits

  • /experience applies userSkills exclusions in MongoDB and PostgreSQL text and vector queries before selecting candidates, allowing the next eligible skill to fill the result slot. Request and response formats are unchanged.
  • Admin index reconciliation updates all managed skill repositories in reference_data with the required Atlas identifier mappings and vector prefilter paths. Existing indexes must finish updating before using this prefilter; shared import and new-tenant provisioning use the same definitions.

Peer feedback and notifications

  • New REST endpoints let Oria give, request, list and decline feedback between colleagues (/chatbot/api/v1/feedback/*), search colleagues by name as a directory-free fallback (/chatbot/api/v1/people/search), and manage in-app notifications for those events (/chatbot/api/v1/notifications/*).
  • Profile analysis now incorporates a user's real peer feedback (previously always empty) as an additional input alongside stored skill gaps.

Log confidentiality

  • Text and JSON logs share bounded credential redaction, including nested context, recognizable message secrets and URL query data.
  • Exception diagnostics retain types and frame locations without raw messages, source lines or local variables. Request/client correlation is preserved.

Input security extension: administration and exports

  • Shared input checks now cover all planned endpoint families; a dedicated skill records safety decisions for future endpoint/input changes.
  • XLSX formula-looking strings stay literal; CSV formula prefixes are escaped. Attachment headers encode special characters. Uploads check ZIP expansion and frontend configuration images use separate binary limits.
  • Routes, request/response schemas, aliases and defaults remain unchanged; unsafe inputs and executable spreadsheet formulas have intentional safety restrictions.

Input security extension: imports and entities

  • Data Exchange keeps open/optional JSON contracts while validating nested data.
  • Entity imports and consumer records are checked before writes or enrichment; stored content remains data in shared inference prompts.

Input security extension: Lexi

  • All Lexi request data uses shared budgets; client classification lists stay outside system instructions. Downloaded catalogues retain the 20 MiB and 10,000-skill limits with additional text/structure checks.

Input security extension: inference and matching

  • Shared input budgets cover Talent Intelligence, Skills Library, matching and PwC; LLM task/context stays in user messages. HTTP schemas and responses are unchanged, including the feedback JSON body.

Input security extension: conversations

  • History, memory, event, suggestion, simulation and MCP data inputs use shared text/structure budgets without changing API schemas or response contracts.
  • Simulation context is separate from instructions; realtime clients can no longer replace instructions or inject privileged conversation roles.
  • Endpoint input changes now require a documented safety review in AGENTS.md.

Shared text constraints and chat prompt boundaries

  • Single-skill queries use a shared 500-character profile; chat input messages use a 20,000-character profile. Both reject unsupported control characters without rewriting legitimate Unicode or code examples.
  • Stored conversation summaries and preferences are supplied as user-role data instead of system instructions, with a common untrusted-context policy.
  • The graph checks safety before retrieval, memory extraction or agent execution. Classifier errors, malformed output and a 15-second timeout stop the turn with a stable JSON/SSE message instead of allowing unchecked processing.
  • The initial extension plan identified the remaining fields and transports for subsequent batches. The maintained input-security guide and inventory describe current protections and remaining risks.

Chat uploads

  • Base64 chat attachments enforce the 10 MiB limit before and after decoding. Invalid or inconsistent fileWeight metadata is rejected; persisted sizes use the actual byte count.
  • DOCX, XLSX, XLSM and PPTX archives are checked before parsing: at most 50 MiB decompressed and 1,000 entries, with HTTP 413 on excess.

Request quotas

  • Sensitive routes enforce a shared IP quota before authentication (120 requests per minute by default, configured by RATE_LIMIT_IP_REQUESTS) and retain separate quotas for valid API keys. Rotating invalid keys no longer resets the IP counter. Proxy trust configuration is documented in the configuration guide.

2026-09-10

Lexi embedding profile

  • Lexi's duplicate detection (find_duplicates, covering both job and skill deduplication) and provided-skills catalogue matching now use a dedicated lexi embedding profile, configurable per provider in AIProviders/aihub_ai_providers, instead of implicitly inheriting the platform-wide default embedding model. It defaults to text-embedding-3-small in code when unconfigured. Other embedding consumers (RAG, matching, skills library, training) are unaffected.
  • find_duplicates' default similarity threshold moved from 0.95 to 0.83, recalibrated empirically for text-embedding-3-small (the previous value produced no groupings at all with this model).

SQL identifier validation

  • Numeric SQL import parameters and configuration IDs are validated before database access. Searches by code, employee number or email preserve text.
  • Invalid import configuration updates return HTTP 422 before persistence; PostgreSQL configuration writes enforce the same numeric identifier rules.

Smart Mobility query cleanup

  • Offer activity codes remain textual, eliminating an unnecessary numeric join that could emit SQL truncation warnings. Unused projections and joins have been removed while preserving data consumed by statistics exports.

Smart Mobility training filters

  • Active training imports consistently respect the tenant and requested training IDs, including trainings with no end date.

Provided skill catalogue generation

  • AIHub no longer applies per-call or per-job output budgets when assigning a provided skill catalogue. Calls now use the selected model's published output capacity. The per-call input guard increases from 12,000 to 64,000 tokens, while the 128,000-token context ceiling, 10% safety margin, and bounded candidate lists continue to prevent oversized requests.

2026-09-09

User bookmark validation

  • MongoDB user standardization now discards bookmark entries whose entityId is missing, null, NaN, empty or whitespace-only before persistence, while preserving valid identifiers verbatim and keeping only the first occurrence of each identifier.

Translation fallback cost

  • Update the built-in OpenAI tiny profile to the Luna model family.

Grouped translations

  • Entity standardization and MongoDB skill imports now resolve cached values in one query, translate only cache misses in provider-safe groups, and persist successful new translations in bulk.
  • Chatbot objective titles and skills now share one grouped provider call.
  • A failed DeepL group immediately falls back to one structured tiny LLM call for that group, with reasoning disabled.

Grouped language detection

  • Entity standardization now detects all unique candidate texts through one parallel Lingua batch and groups only inconclusive results into structured tiny LLM calls with reasoning disabled.
  • Lingua's minimum relative-confidence distance is now 0.15 instead of 0.185, reducing the number of LLM fallbacks.

Language-detection fallback scope

  • The language-detection LLM fallback is now enabled only for Chatbot and MCP user messages sent to graph agents. Other surfaces trust Lingua alone.
  • Translation workflows treat an inconclusive Lingua result as requiring translation, allowing DeepL or the translation fallback to auto-detect the source language without a separate LLM detection call.

Translation-cache observability

  • MongoDB translation-cache read and write failures are now logged consistently for entity standardization, skill import and Skills Library queries. Reads continue through direct translation and failed writes preserve the translated result.

Stricter default duplicate-label threshold

  • POST /lexi/api/v1/find_duplicates now defaults its cosine-similarity threshold to 0.95 instead of 0.92 (both the structured threshold field and the legacy list-payload fallback), reducing false-positive groupings between labels that are only loosely related.

2026-09-08

Lexi client-provided skills catalogue

  • Jobs can now be assigned to skills taken from a catalogue supplied by the client, instead of skills generated by the model. The catalogue is validated against its fingerprint and its organisation and referential scope, hybrid retrieval keeps it out of the prompt, and the model only ever returns positional indices into the candidates it was shown.
  • Assignments retain client UUIDs and metadata; insufficient catalogue coverage is a valid result. Added the annotated 50-job comparison evaluator.
  • Lexi callback and catalogue origins are configurable, and mandatory when ENV is local so a local run cannot reach a deployed HRX project.

Shared language services

  • Language detection is now shared by Chatbot / Oria, MCP, Training Matching, Skills Library and entity workflows: Lingua resolves confident text locally, then the tenant's tiny LLM profile handles an inconclusive result.
  • Dynamic translations use one DeepL attempt and immediately fall back to the tiny LLM profile on its first failure, without retry or backoff. Chatbot translations never use the MongoDB Translations collection, while the existing English-only cache remains limited to MongoDB Skills Library, skill-import and entity-standardization paths. PostgreSQL search and live projections never read or write that cache.
  • Added a dedicated architecture guide for detection, provider failure handling, fallback semantics, persistence boundaries and deliberate exclusions.
  • The authenticated and historical skills_single routes now use the same case-normalized embedding input for MongoDB and PostgreSQL. MongoDB searches every distinct translation cached under deterministic capitalization variants plus the normalized original query, merges their vector candidates and keeps the best score per skill, so no capitalization variant is favored for a tenant.
  • Uncached translations call DeepL once. A missing key or the first network, HTTP or response-validation failure immediately invokes the tenant provider's new tiny LLM profile once; only a failure of both providers keeps the normalized source query. Successful fallback translations use the existing cache, and failures remain sanitized.

JOM default candidate pool

  • New MongoDB clients and fresh PostgreSQL installations now keep active opportunities whose JOM rules produce a zero poolScore, allowing their skill and motivation scores to be calculated. Tenants can still opt into the former exclusion behavior explicitly.

Lexi skill suggestions on a theme

  • Lexi can now suggest new competencies for an existing job referential via POST /jobs/suggest_skills, grounded in each job's identity and its currently assigned skills. An optional theme narrows suggestions to a domain such as leadership or languages; without one, suggestions cover broadly relevant or emerging competencies for the job.
  • Existing skills are never modified; new suggestions are returned separately in suggested_skills and are deduplicated against what the job already has.

Duplicate-label grouping fix

  • POST /lexi/api/v1/find_duplicates no longer chains unrelated labels into the same group through an intermediate match. Two labels now join a group only when each is itself close enough to the group's representative label, so a label that merely shares a common neighbor with another is no longer folded in with it.

Documentation versions

  • The site header displays the pending immutable project tag, while each main domain displays the version of its corresponding FastAPI application. Both values are generated from application sources and Git history.

Domain-oriented documentation

  • Reorganized navigation around the source domains: Platform, Entities, Matching, Chatbot / Oria, Administration, Data Exchange, Skills Library, Talent Intelligence, Lexi, PwC JOM Compatibility, MCP and Development.
  • Grouped functional domains, API reference and development documentation into a nested left-hand navigation tree instead of hiding inactive domains behind horizontal tabs. The restored API Reference separates HTTP endpoints, Chatbot Python symbols and MCP documentation.
  • Added a functional description for every exposed HTTP operation and every tool registered in the Oria graph, including inputs, data sources, side effects, result state and error behavior.
  • Added complete JOM and JPM algorithm guides covering hard filters, JOM rules, pool construction, skill/motivation/text formulas, score aggregation, neutralization, persistence and publication.
  • Added a dedicated Talent Match Insight guide covering evidence selection, focus modes, LLM constraints, normalization and failures.

Public documentation

  • The generated Zensical site under /docs/ is now public and no longer requires an API-key login or browser session. Swagger, ReDoc and OpenAPI schemas remain public; protected API operations still require their existing credentials.

Admin matching batch routes

  • The JOM matching batches are now exposed as GET /admin/api/v1/matching/batches/jom/users and GET /admin/api/v1/matching/batches/jom/opportunities.
  • The JPM matching batch is now exposed as GET /admin/api/v1/matching/batches/jpm. The former matching batch paths are no longer available.

Training Finder RRF ordering

  • Training Finder now returns the requested number of catalog results directly in weighted reciprocal-rank-fusion order. The external reranking dependency, its post-retrieval progression sort and its parent/child reorder step have been removed; generated presentation rationales do not change result order.

2026-09-04

LLM provider and model guide

  • Added a functional guide to the supported LLM providers, semantic profiles, last-resort models, task routing and explicit Lexi or Talent Intelligence model selections.

Anthropic fallback model

  • The Anthropic last-resort default profile now uses claude-sonnet-5.

Training suggestion exclusions

  • POST /api/v1/get_training_matching accepts an optional trainingIds list of up to 100 identifiers. Those trainings and their hierarchy are excluded from MongoDB and PostgreSQL suggestions.

2026-09-03

Fixed skill-search thresholds

  • The protected and historical skills_single and Experience-to-skills routes retain the optional request threshold field for compatibility but no longer use its value. MongoDB searches use a fixed 0.93 base threshold before the configured embedding-model delta, and PostgreSQL searches use 0.91.
  • POST /api/v1/skills-library/skills_multiple and its dedicated batch-search implementation have been removed.

Configured-client index reconciliation

  • POST /admin/api/v1/clients/indexes can now omit db_name to inspect or repair every client database registered in common_data.ClientConfig.
  • The cluster-wide mode preserves the tenant reconciliation policy, excludes PwC tenants, aggregates actions by database and continues after an individual database failure. apply=false remains the default dry run.

Exact reference-database index reconciliation

  • POST /admin/api/v1/clients/indexes?db_name=reference_data now inventories classic, Atlas Search and Atlas Vector Search indexes for every managed reference collection. A dry run reports missing, differing, duplicate and obsolete indexes; apply=true converges them to the repository catalog.
  • Unmanaged collections remain untouched, resource failures do not interrupt subsequent collections, and detailed driver errors remain confined to logs. Other databases retain the existing additive-only behavior.
  • Reference skill repositories retain only the classic external_id and client_id/external_id indexes required by current queries; obsolete title and reference_id/language classic indexes are removed by an applied reconciliation.

English hybrid search for MongoDB single-skill queries

  • The protected and historical skills_single routes now detect the query language in MongoDB mode and translate non-English text before generating its vector embedding. The autocomplete branch independently searches the original request text exclusively against title; title_en is not part of the autocomplete index or query.
  • Cached translations are reused before DeepL is called. Detection or translation failures are logged and fall back to the original query for the autocomplete and vector branches. MongoDB single-skill searches no longer apply the optional request language as a candidate filter on either route; PostgreSQL searches remain unchanged.

Reference-filtered skill imports

  • POST /admin/api/v1/entity-imports/skills accepts an optional integer reference_id query parameter. It can be used alone or together with the optional client_id filter.
  • Reference-filtered client imports limit stale-skill cleanup to that same reference, preserving the client's skills from its other references.

Contextual skill-level descriptions

  • Lexi now exposes POST /lexi/api/v1/jobs/get_skill_level_descriptions to generate a complete four- or five-level proficiency progression from skill metadata, output language and client context.
  • Every returned level is non-empty and limited to 200 characters. Incomplete model responses fail the request instead of producing generic fallback data.

2026-09-02

Environment-scoped legacy skill collections

  • Legacy MongoDB skill collection inputs shaped as skills_<prefix>_<scope>_..._smartmobility now resolve to skills_<scope>_smartmobility. For example, skills_sm_lapostet1_legacy_smartmobility becomes skills_lapostet1_smartmobility; a mutu scope is replaced by the deployment environment.
  • The rule applies to skill searches, Experience-to-skills, administrative imports and embedding regeneration. Other custom collection names remain unchanged.

Experience input logging

  • /experience input payloads are now logged as compact JSON, consistently with /skill_single, so nested jobs and lists remain machine-readable.

PostgreSQL migration smoke scope

  • The disposable Alembic migration smoke job now runs only on release/int_pg; all other branches keep the regular quality pipeline without provisioning the PostgreSQL service.

Unified user matching processing

  • GET /api/v1/user/process replaces the separate JOM and JPM user-processing routes. Its jom and jpm query flags default to true, selected calculations run concurrently, results are returned under product-specific keys, and disabled products are omitted.

Concurrent consumer matching

  • RabbitMQ user processing now runs eligible JOM and JPM calculations concurrently after their independent freshness checks.
  • PostgreSQL matching jobs run concurrently within the configured claimed-batch limit while retaining per-job heartbeats, failure recording and retries.

Accumulated project version changes

  • Project version tagging now collapses multiple API patch increments since the latest reachable project tag into one project patch increment, allowing several validated develop commits to be pushed before the version job runs.
  • A one-step API minor increment followed by patch increments before the version job runs now produces one project minor increment.
  • Major changes, decreases and unsupported minor transitions remain blocking errors rather than falling back to a guessed version.

Strict record-based structured outputs

  • Feedback skill sentiments, Lexi classifications and group mappings, Training Finder rationales, skill definitions and normalized labels now use typed record lists enforced by each AI provider instead of dynamic JSON keys.
  • Outputs tied to requested identifiers must cover them exactly once; partial, duplicate or unknown records are rejected as a whole and are never recovered through text parsing or legacy response shapes.

Strict structured generation across AI features

  • Objective generation, simulation scenarios and analysis, training plans, language resolution, relevant-experience ranking and opportunity filtering now use provider-enforced JSON schemas and validate complete typed responses.
  • Lexi mission generation and Talent Intelligence global skill filtering and level assignment now use the same strict structured-output path.
  • Simulation analysis represents generated criterion scores as typed records while preserving the existing criterion-to-score response object.

Provider-enforced structured outputs

  • Lexi skill generation now supplies its existing JSON schemas to OpenAI and Azure as strict response formats, matching the constraints already used with Anthropic.
  • PwC JOM job-offer generation and Training Finder query resolution now enforce their typed JSON contracts at provider level and validate the returned data before business processing.

Structured skill and intent generation

  • Shared skill inference and chatbot profile-intent classification now request and validate typed JSON objects instead of parsing model-generated text.
  • Invalid or unavailable model responses retain the existing safe behavior: skill inference returns no inferred skills and profile enrichment uses the none intent.

Experience-to-skills generation

  • Experience-to-skills now requests and validates strict structured JSON from supported AI providers, preventing malformed list syntax from interrupting skill inference.

Skill-level scoring

  • Required job and opportunity skill levels equal to 0 are now treated like missing levels, preventing division-by-zero failures during JOM and JPM scoring.
  • A user skill level equal to 0 remains below every positive requirement.

2026-09-01

Shared CI dependency installation

  • Dependency validation, vulnerability auditing and static analysis now run in one quality job with a single Python package installation.
  • Python CI jobs reuse a pip download cache keyed by requirements.txt; the PostgreSQL migration smoke job retains a clean container while avoiding redundant package downloads.
  • The Alembic smoke suite is isolated from global FastAPI test fixtures and no longer depends on APP_IDENTIFIER_SHORT or ENV during collection.

Automated project version tags

  • Successful pipelines on protected develop and release/* branches can create immutable vX.Y.Z project tags from the six application API versions, starting at v1.0.0.
  • Exact API patch increments produce one project patch increment, while an API minor increment takes precedence and produces one project minor increment.
  • Branch-head and global collision checks prevent obsolete or divergent pipelines from moving or reusing a tag, while history-preserving merges keep the selected version unchanged during promotion.
  • Hotfix branches remain unversioned; the release/prod pipeline calculates the patch version after the hotfix has been merged into production.

Lexi job mission suggestions

  • POST /lexi/api/v1/jobs/suggest_missions now prioritizes central uncovered job responsibilities and uses the supplied company context to specialize suggestions without changing the job's identity or inventing employer facts.
  • Generated missions follow the grammatical style of existing missions, default to a second-person present-tense formulation in French, and contain no list markers. They explicitly exclude overlapping responsibilities, qualifications, personality traits and generic objectives.

2026-08-31

Zensical documentation generation

  • Zensical now generates the documentation from the native zensical.toml configuration; the former generator configuration and theme dependency were removed without a compatibility fallback.
  • Application startup and the conditional commit hook build the same strict site in an isolated, content-addressed cache outside the worktree. The access policy was unchanged by that migration; /docs/ became public on 2026-09-08.

2026-08-27

Documentation build workflow

  • docs/ is now the only versioned documentation source; generated site/ HTML, assets, search indexes and sitemaps are ignored instead of committed.
  • Relevant commits and application startup reuse one strict, content-addressed documentation cache outside the worktree. Direct source launches and containers therefore expose /docs/ without a committed site/.

Environment-first API-key authentication

  • Standard endpoints, WebSockets, MCP and documentation requests now accept AI_HUB_USER_API_KEY or AI_HUB_ADMIN_API_KEY; administrator endpoints accept only AI_HUB_ADMIN_API_KEY.
  • A configured non-empty applicable key is authoritative and a mismatch never falls back to MongoDB. If no applicable variable is configured, MongoDB fallback is available only without DATABASE_URL; PostgreSQL mode returns 403. Supplied bearer JWTs remain validated.
  • MongoDB authentication retains the key, isAdmin and clientId. Tenant routing prefers the key's non-empty identifier and falls back to Client-ID, without comparing both values or rejecting requests when both are absent. Environment-backed keys have no stored client identifier and use the same header fallback. Affected routes use the fixed smartmobility data source plus the FastAPI startup environment.
  • /docs/ uses the standard user key in both database modes, and Swagger keeps the X-API-Key authorization control visible. Public Swagger descriptions state only the required credential type and no longer expose authentication environment variables, persistence choices or fallback rules.
  • Alembic revision 20260827_23 removes the obsolete PostgreSQL aihub_api_keys table; application lookup and model code were removed with it.

PwC consumer-format imports

  • Data Exchange user, opportunity and feedback routes whose path contains in_consumer_format now consistently process their payload with the pwc data source.

PwC JOM compatibility routing

  • All five PwC JOM compatibility endpoints now resolve their MongoDB matching context with the fixed pwc data source.

2026-08-26

Instance-scoped deployment environment

  • FastAPI now resolves one deployment environment at startup from APP_IDENTIFIER_SHORT, falling back to ENV when it is empty or mutu, and shares it with mounted applications and background work.
  • Swagger displays that value as the default for environment query inputs. Omitted or matching values use the instance environment; a different or explicitly empty value returns 400.
  • Skills Library and Experience-to-skills use the shared skills_<environment>_smartmobility collection by default, while preserving explicitly named custom collections.
  • New MongoDB client provisioning defaults an omitted RabbitMQ prefix to sm_<APP_IDENTIFIER_SHORT>_legacy, preserving mutu without falling back to ENV; explicit prefixes remain unchanged.

PwC JOM legacy-rule parity

  • Compatibility score endpoints now read the legacy Company.scoresWeight.skill and Company.scoresWeight.motivation defaults, and accept PHP-style scientific notation in numeric query parameters.
  • Job-offer prompts now calculate complete elapsed days from the supplied datetimes and treat "0" levels and skills as PHP-empty values.
  • ID-based Talent Match Insight verifies the opportunity and then the user before loading AI configuration, preserving the original not-found error precedence.

2026-08-25

PwC JOM compatibility API

  • The Main API now exposes five MongoDB-only operations migrated from pwc-jom-php: job-offer generation, raw and ID-based Talent Match Insight, and both directions of top matching-score retrieval under their original /v1 paths.
  • Requests retain their historical JSON, query-filter and plain-text contracts, while tenant selection uses X-API-Key, MongoDB access uses the shared async connection and AI generation uses the tenant's default AI Hub LLM profile.
  • New PwC tenant provisioning creates entity-and-score indexes for Skill and Motivation ordering. Existing PwC databases require a separate operational index migration.

Concurrent translation-cache writes

  • MongoDB translation-cache persistence now uses atomic, title-keyed upserts so concurrent entity imports no longer fail on the unique title index.
  • A translation cache-write failure is logged and no longer aborts entity standardization after the translated value has already been produced.

Additive MongoDB index repair

  • Administrators can dry-run or apply collection and index repair for one managed MongoDB database through POST /admin/api/v1/clients/indexes.
  • Repair creates only absent classic, Search and Vector Search indexes. Existing conflicting definitions are reported and left unchanged.

Smart Mobility training-history collation

  • Smart Mobility user imports now align the cast user ID with the attendance column's UTF-8 collation, so mixed connection and table collations no longer discard imported trainingHistory records.

2026-08-24

Training-history-aware recommendations and objectives

  • MongoDB and PostgreSQL Training Matching now exclude every training in the user's history, including records whose completion date is absent, and retain enough hybrid-search capacity after those exclusions.
  • Learning plans inherit the same exclusion rule. Development-objective LLM context now includes sanitized training IDs, titles and nullable completion dates; explicitly supplied trainingIds remain available for grounding.

Opportunity and training access-group separation

  • Users now expose both accessGroup, reserved for PwC opportunity eligibility, and trainingAccessGroup, used exclusively for training visibility. Trainings use trainingAccessGroup; opportunities retain accessGroup unchanged.
  • MongoDB standardization removes the former ambiguous access-group fields. Existing MongoDB tenants must fully reimport Smart Mobility users and trainings, plus PwC users, before relying on the new fields; opportunities do not require reimport for this change.
  • PostgreSQL user and training projections expose the same canonical names without changing their source Smart Editor associations or query access paths.

User training history parity

  • PostgreSQL user reads and SQL-to-Mongo user imports now expose the same deduplicated trainingHistory records from Smart Editor training-attendance associations. Missing business completion dates are returned as null.
  • Training recommendation context now consumes the canonical trainingHistory user field. PostgreSQL uses a hash index for attendance user-ID equality and a companion entity/formation B-tree, so unrelated long Smart Editor values do not exceed the PostgreSQL B-tree entry-size limit.
  • PostgreSQL Training, Skills, Opportunities, conversation history and RAG text retrieval now tokenize and fold queries like their MongoDB Atlas counterparts. Long natural-language searches no longer depend on whole-phrase trigram similarity or require every term for Atlas text semantics; autocomplete paths retain prefix, token-order and fuzzy matching.
  • PostgreSQL skill and opportunity vector scores now use the same normalized cosine score range as Atlas. Opportunity inferred-title searches execute vector and autocomplete branches concurrently and fuse the top 50 candidates with the same 50/50 weighted reciprocal-rank fusion as MongoDB.
  • Structured PostgreSQL opportunity title searches now generate query embeddings and use hybrid retrieval. PostgreSQL conversation/message search and RAG retrieval reuse their existing full-text indexes, while fuzzy matching remains a bounded complementary branch.

Language-aware Training Finder fallback

  • MongoDB and PostgreSQL Training Finder searches first run their hybrid vector and full-text retrieval with the requested catalog locale. If the fused result is empty, both retrieval branches run once more without language filtering; availability, access, exclusion and other catalog filters remain unchanged.

Training search query observability

  • Training Finder PostgreSQL vector and full-text searches now expose compiled SQL, bound parameters, result counts and elapsed time in dedicated LangSmith child runs. Query embeddings are redacted, and returned rows are never sent to LangSmith.

Talent search and profile cleanup

  • Talent Finder targets the available relational skill, role, experience, company, department and location values rather than serialized JSON keys. PostgreSQL applies the same accent-folded token, prefix and fuzzy semantics as MongoDB Atlas.
  • Education, certification and total-experience-duration criteria have been removed from both MongoDB and PostgreSQL Talent Finder paths. Work arrangement remains optional and is enforced only when provided; PostgreSQL retains strict no-match behavior when its relational projection lacks that value.
  • Legacy education and certification fields remain accepted by the Data Exchange user import contract, but user standardization and chatbot profile processing now ignore them. Experience dates remain stored as source data, while derived experience-duration calculation and output have been removed.

2026-08-22

Dependency vulnerability gate

  • The mandatory GitLab dependency gate now scans the resolved Python environment with pinned pip-audit tooling and fails on known CVEs or an incomplete audit. The unfixed Paramiko advisory PYSEC-2026-2858 is the only explicit temporary exception.

Bounded uploads and sensitive request rates

  • Audio, Talent Intelligence, matching-statistics and administrator uploads now use configurable bounded reads and return 413 when their limit is exceeded.
  • Spreadsheet, CSV, PDF, DOCX and PPTX parsing plus workbook generation execute on worker threads instead of blocking the asyncio event loop.
  • Documentation login, LLM-heavy and upload POST routes now have separate configurable rate limits. SQLite shares counters across Gunicorn workers in one container; deployments with multiple pods retain a global ingress limit.

Sanitized outbound processing diagnostics

  • Talent Intelligence failure emails now contain a stable message instead of an application traceback; detailed processing failures remain in logs.
  • Unexpected MongoDB failures during agentic feedback lookup preserve their infrastructure exception semantics and are no longer copied into a generic error message.
  • Lexi Supabase diagnostic webhooks intentionally retain their existing error traces for the operational workflow that consumes them.

Restricted OVH AI endpoints

  • Talent Intelligence model overrides can call only HTTPS endpoints hosted on the public OVH Kepler endpoint domain; credentials, custom ports, query strings and deceptive host suffixes are rejected.
  • Azure, OpenAI and Anthropic overrides accept model names rather than caller- supplied endpoint URLs.

Administrator authentication for maintenance operations

  • Explicit PostgreSQL initialization and status endpoints now require an API key with administrator privileges.
  • PostgreSQL user-skill reconciliation status is protected by the same administrator authentication policy as the operation that starts it.

Sanitized durable failure diagnostics

  • RAG fallback responses, metrics and LangGraph state now retain stable warning messages while provider and database exception details remain only in logs.
  • PostgreSQL worker queues and administrator-triggered migrations no longer persist or propagate raw dependency errors; stable operational messages point operators to correlated application logs.
  • Lexi level-generation failures preserve their original exception type and cause instead of wrapping provider details in a generic exception.

Stricter typed public and administration boundaries

  • Pydantic-aware mypy validation now checks model constructors precisely, and the main, administration, authentication, Data Exchange and index-management boundaries no longer declare unbounded Any values.
  • OpenAPI customization now validates generated structures before modifying them, while preserving the generated paths, tags and database compatibility extensions.

Non-blocking repository file processing

  • Tenant provisioning and PwC entity imports now load repository JSON files on worker threads instead of blocking asynchronous request processing.
  • Talent Intelligence spreadsheet parsing, template loading and workbook generation now run outside the event-loop thread while preserving the existing upload and response contracts.

Sanitized chat history failures

  • Failed chat generations now persist only the stable system response. Internal exception details remain in application logs and are no longer part of the chat history API schema.
  • Existing history documents containing legacy exception fields remain readable; those internal fields are removed from API responses at read time.

Northstar import removal

  • The unused Northstar user and opportunity import paths, their SAP HANA connector and the HDBCLI dependency have been removed.
  • Administrator batch imports now retain the active Smart Mobility and PwC sources without Northstar-specific normalization or provisioning behavior.

Parameterized Smart Mobility SQL imports

  • Smart Mobility user, job, opportunity and training imports now pass tenant filters and identifier lists as bound database parameters instead of composing values into SQL strings.

Explicit agent exception boundaries

  • Objective, job and feedback tools now return LangGraph tool messages with the original tool-call identifier and an explicit error status when an unexpected dependency failure prevents a usable result. Public messages are stable and sanitized; provider and database diagnostics remain in application logs.
  • Job lookup keeps usable partial results when only some items fail. A complete infrastructure failure is reported as an error instead of looking like a successful empty result.
  • Feedback duplicate checks and immediate writes no longer fail open or confirm a save that did not occur. Delayed feedback writes are cancelled and awaited when replaced and during application shutdown; a secondary decline-blacklist failure does not undo an otherwise successful decline.
  • Parallel training and opportunity searches now cancel their sibling work when one required branch fails, preventing orphaned database or model operations.

2026-08-21

Connector and expert-search removal

  • The unused Connectors FastAPI application, its PWC Microsoft Graph endpoint, Dorothy client and public documentation have been removed.
  • Oria no longer compiles the dedicated expert-search agent or its tool, and the supervisor no longer contains routing rules for that former capability.
  • Person disambiguation and feedback-giver discovery no longer query Microsoft Graph. Their external people source is empty while the remaining feedback, peer and development-leader sources continue to operate.

Sanitized public error responses

  • FastAPI, Lexi, Talent Intelligence, matching, administration, simulation, and MCP agent boundaries no longer return raw exception text.
  • Existing HTTP status codes and response shapes are preserved. Stable public messages replace internal provider, database, validation and processing details, which remain available through application exception logs.

UTC timestamp normalization

  • Newly persisted and exchanged timestamps now include an explicit UTC offset; legacy timestamps without an offset remain readable and are interpreted as UTC where time comparisons are required.
  • Calendar-only business dates and export filenames are derived from the UTC date, while elapsed chat processing time uses a monotonic clock.
  • The administration current-datetime diagnostic now returns its existing string field as an ISO 8601 UTC value with a +00:00 offset.

2026-08-20

Bounded PostgreSQL worker shutdown

  • PostgreSQL notification and job-worker shutdown now bounds connection close, lease release and reconciliation-claim cleanup. Workers that exceed the graceful deadline receive a second cancellation and are identified in logs.
  • Interrupted jobs whose cleanup cannot finish before the deadline remain recoverable through the existing lease-expiry mechanism instead of blocking application termination indefinitely.

Azure-only Datalake persistence

  • Datalake writes now use Azure Blob storage exclusively. The obsolete S3-compatible backend and its dependency and environment variables were removed.
  • Datalake persistence is enabled only when BLOB_ENDPOINT is non-empty; otherwise writes are silently skipped.

Unified feedback agent

  • LangGraph now routes feedback mutations through one feedback_agent instead of five separate specialists. Its merged prompt distinguishes request, answer, skill-level, open-feedback and decline workflows before selecting one of the five existing mutation tools.
  • The default configuration exposes the unified agent as inactive. Alembic migrates PostgreSQL aihub_config to the new key; MongoDB tenant configurations remain unchanged for a separate explicit migration.

PostgreSQL job lease coalescing

  • Expired, failed or interrupted skill-embedding, entity-enrichment and matching claims no longer collide with a newer pending job for the same entity. The older claim becomes terminal while the newer job keeps its queue position, preventing one unique-key conflict from blocking a domain worker.

PostgreSQL job history retention

  • PostgreSQL terminal job history is now eligible for database-side deletion after three months. A bounded cleanup function and partial retention indexes cover all seven listener queues without deleting pending, processing or waiting work; initialization steps follow their parent through cascade.
  • Alembic registers a daily cleanup through pg_cron when the extension is installed. Missing extension or scheduling privileges do not block schema migration, and infrastructure can register the named schedule later through the installed scheduling helper.
  • Retention indexes are built one queue at a time with bounded lock and statement timeouts. This briefly pauses queue writes but cannot wait forever on long-lived read snapshots, and replay repairs an invalid index left by an interrupted concurrent build.

PostgreSQL job queue diagnostics

  • A PostgreSQL-only administrator endpoint now reports exact global, per-table and per-job-type status counts across all seven listener queues. Successful, failed, skipped and canceled rows are also combined into a terminal finished count without mutating queued work.

Graph-scoped LangSmith observability

  • Shared synchronous and asynchronous LLM connector spans are now emitted only as children of an active LangGraph run. Standalone processing no longer creates unrelated LangSmith entries while preserving graph tool metadata, usage and cost details.
  • The PostgreSQL migration smoke graph disables tracing in both its test context and CI job, preventing synthetic persisted runs from polluting environment projects.

Automatic single-skill backend selection

  • The historical public single-skill route no longer exposes a backend selector. It uses PostgreSQL whenever its shared resources are available and otherwise uses MongoDB.

Database-scoped PostgreSQL authentication

  • PostgreSQL requests no longer propagate the MongoDB routing fields clientId, dataSource or environment from API keys. DATABASE_URL selects the complete database scope; an optional stored client_id is used only to validate a supplied Client-ID header.
  • Chatbot history, events, conversations, documents and RAG persistence now use one internal PostgreSQL scope. Matching and agent flows derive a setting.id from the resolved user only where relational business filters require it.

Alembic replay safety

  • PostgreSQL vector columns are now identified from the pgvector extension OID and their declared dimension rather than from a search_path-dependent type label. Replaying the migration chain over existing views therefore skips already-conformant columns instead of attempting a blocked ALTER COLUMN.

PostgreSQL pooled vector searches

  • PostgreSQL connection initialization now commits its session-level extension search_path before SQLAlchemy returns a connection to the pool. Reused connections retain the pgvector operator schema, so cosine-distance queries continue to resolve <=> after a pool reset.

Restricted LangGraph runtime roles

  • Startup still invokes LangGraph's official setup() methods, but handles an InsufficientPrivilege failure by validating the existing checkpoint and store versions and required tables. Personal runtime accounts can therefore use an already initialized schema without hiding other setup errors or an outdated/inconsistent schema.

2026-08-19

PostgreSQL active-tenant projections and jobs

  • PostgreSQL skill, user, opportunity, job and training views now expose only LIVE and DEMO tenants. Their embedding and enrichment triggers apply the same tenant rule alongside each entity's existing eligibility conditions.
  • Tenant activation no longer scans existing entities; deactivation removes pending work that is no longer actionable. Skill queues also require a valid repository association.
  • JOM/JPM pending jobs are now restricted to enabled users from LIVE or DEMO tenants. Activation deliberately creates no matching backfill; a later matching-relevant user or last_login change triggers recalculation.

Explicit PostgreSQL initialization

  • Alembic now limits entity setup to schema objects, indexes, seeds, trigger functions and empty durable queues. Existing business rows are never enumerated or backfilled inside a migration transaction.
  • PostgreSQL-only administrator routes initialize skills, users, opportunities, jobs or trainings independently, or sequence all five. An optional setting.id targets one client; omitting it targets all LIVE and DEMO settings.
  • Durable initialization and step tables expose progress. A run completes once the reconciliation workers have inserted all child jobs; embedding and inference execution continues asynchronously and is not part of the run.
  • PostgreSQL workers start only when Alembic is at repository head. The migration endpoint stops the local listener before upgrading and restarts it after a successful migration.

Resumable PostgreSQL user reconciliation

  • Alembic and tenant-status triggers now schedule durable user reconciliation parents instead of synchronously refreshing every user in a tenant.
  • The PostgreSQL listener processes keyset pages, refreshes skill gaps with a set-based indexed query, links individual inference jobs to their parent and persists progress, heartbeat, retry and success/failure counters.
  • Expired reconciliation and inference leases are reclaimed after worker interruption. User-inference processing is bounded to one batch per listener time slice, and notifications use an empty payload instead of serializing all user IDs.
  • The administrator user-inference endpoint now returns a jobId; PostgreSQL deployments can query its progress through /admin/api/v1/entity-maintenance/users/infer-skills/jobs/{job_id}.

Independent PostgreSQL job workers

  • One PostgreSQL LISTEN/NOTIFY connection now wakes independent workers for skill embeddings, user reconciliation and inference, entity reconciliation, opportunity/job/training enrichment and JOM/JPM matching. Periodic polling recovers work even when no notification is received.
  • Durable jobs use ownership tokens, heartbeats, bounded exponential retry delays and expired-lease recovery. Graceful shutdown returns interrupted claims to pending immediately.
  • The generic consumer administration routes remain MongoDB/RabbitMQ-only. The explicitly named postgres-listener routes control the listener and every PostgreSQL worker together without starting RabbitMQ.

Resumable entity search indexes

  • Large trigram, full-text and HNSW entity indexes are created concurrently in a final idempotent Alembic revision, outside the structural view/table transactions. A retry first removes any invalid indexes left by an interrupted concurrent build.

Alembic migration diagnostics

  • Alembic now emits its internal migration diagnostics at DEBUG and executed SQL statements at INFO, while hiding bound parameter values.
  • CLI migrations accept -x debug=true to explicitly confirm and enforce the verbose logging mode before running an upgrade.
  • A PostgreSQL advisory lock scoped by database and schema now prevents overlapping migrations across CLI processes, application workers and pods.

2026-08-18

PostgreSQL training migration normalizer

  • Training projection migrations now create the aihub_normalize_search_text PostgreSQL function before building training search views and indexes, preventing missing-function failures during fresh tenant upgrades.

Framework-managed LangGraph PostgreSQL schema

  • The official LangGraph checkpointer and store setup() methods now exclusively create and migrate their PostgreSQL tables and indexes during application startup.
  • The unpublished Alembic revision that duplicated the vendor-owned LangGraph schema has been removed; the subsequent unpublished revisions were compacted before deployment.

Endpoint PostgreSQL compatibility and Swagger visibility

  • Every HTTP endpoint now documents its runtime database compatibility in the generated OpenAPI schema through a visible Database compatibility operation description and an x-database-compatibility extension.
  • PostgreSQL deployments now keep MongoDB uninitialized when DATABASE_URL is configured. Endpoints that remain MongoDB-only return an explicit error instead of relying on a missing MongoDB client.
  • Administration configuration, batch result reads, Data Exchange user reads and updates, Skills Library search, Talent Intelligence, Lexi and MCP helpers now use PostgreSQL resources when available.
  • PostgreSQL batch processing persists results in aihub_batch_results with lookup indexes on batch type and end date. MongoDB-only batch initialization and import endpoints reject PostgreSQL mode explicitly.
  • JOM/JPM report and statistics endpoints can read persisted PostgreSQL scores; JPM v1/v2 comparison, score publication and score synchronization remain MongoDB-only and reject PostgreSQL mode explicitly.
  • Chatbot tool prompts and tool descriptions that feed search filters now refer to the active backend instead of instructing the model to produce MongoDB-specific filters.

PostgreSQL JOM/JPM matching persistence

  • DATABASE_URL now switches JOM/JPM unit processing, score/pool reads, bounded matching batches and chatbot-triggered JOM/JPM recalculation to the PostgreSQL entity projections when PostgreSQL resources exist.
  • Alembic creates aihub_user_opportunity_matching, aihub_opportunity_user_matching, aihub_matching_jobs and the required score/pool lookup indexes. PostgreSQL reuses user_job_matching for JPM and replaces rows directly instead of using the JPM RabbitMQ score producer.
  • PostgreSQL triggers enqueue deduplicated jom_user and jpm_user recalculation jobs only for matching-relevant user-side changes, including last_login. Opportunities and jobs do not retrigger matching automatically, and there is no initial missing-score backfill.
  • PostgreSQL hard filters mirror the MongoDB matching filters for active tenant rows, dislikes, classification, contract type, location and external-user exclusion. Opportunity accessGroup is intentionally ignored in PostgreSQL mode because it is a MongoDB-only opportunity contract.

PostgreSQL Chatbot, RAG and config persistence

  • DATABASE_URL now switches Chatbot conversations, chat-message logs, feedback events, uploaded documents and RAG state to AIHub-prefixed PostgreSQL tables instead of the MongoDB Conversations, ChatMessageLog, Events, Documents, RagSourceFiles, RagChunks and RagMetrics collections.
  • Alembic creates the Chatbot persistence tables with tenant, history, feedback, document, full-text, trigram and HNSW indexes matching the current query paths. PG_RAG_EMBEDDING_DIMENSION defaults to 1536 and constrains aihub_rag_chunks.embedding.
  • The Chatbot frontend config endpoints now read and update PostgreSQL aihub_config when PostgreSQL resources exist; administrator validation uses PostgreSQL user data in that mode.
  • RAG reindexing has an explicit PostgreSQL path through sync_rag_documents_to_postgres, while MongoDB deployments keep sync_rag_documents_to_mongodb. The background RAG sync worker remains MongoDB-only and is not started in PostgreSQL mode.

PostgreSQL training projection and enrichment

  • DATABASE_URL now switches Learning Finder, Training Matching, rationale generation and development-objective training grounding to the live aihub_training_v1 relational view without copying trainings into MongoDB.
  • Alembic adds formation.aihub_enriched_title, formation.aihub_enriched_title_embeddings and formation.aihub_timestamp, plus tenant/filter, join, trigram, full-text and HNSW indexes used by the current training searches.
  • PostgreSQL triggers enqueue one deduplicated training_enrichment job only after insert or an actual update of formation.name or formation.description. Skill associations, organization, dates, duration, locale and generated AIHub fields do not trigger regeneration.
  • The PostgreSQL worker generates the enriched title from the training title and description, then stores the enriched title vector atomically. Training standardization remains MongoDB-only and explicitly rejects PostgreSQL mode. PG_TRAINING_SEARCH_EMBEDDING_DIMENSION defaults to 1536.

PostgreSQL job projection and embeddings

  • DATABASE_URL now switches the main Job API, chatbot job mapping and JPM text-vector comparisons to the live aihub_job_v1 projection without copying relational jobs into MongoDB.
  • Alembic adds the fixed-dimension job.embeddings vector, tenant/status and tenant/code B-tree indexes, reverse family-propagation indexes and a partial HNSW cosine index. No unused full-text, trigram or JSON GIN index is created.
  • Targeted triggers enqueue one deduplicated job_embedding task only after changes to title, mission, formation, experience, results, note or the effective job family. Skills, classification, hidden/active/status fields and the stored vector do not trigger regeneration.
  • The PostgreSQL worker embeds the exact historical job text and stores the vector atomically. Job standardization remains MongoDB-only and explicitly rejects PostgreSQL mode. PG_JOB_SEARCH_EMBEDDING_DIMENSION defaults to 1536.

PostgreSQL opportunity projection and enrichment

  • DATABASE_URL now switches the main opportunity query and active-count endpoints to the live aihub_opportunity_v1 relational view. The view joins custom_job, deterministic translations, attached jobs, organization data and public job skills without copying source rows into MongoDB.
  • Targeted PostgreSQL triggers enqueue one deduplicated opportunity-enrichment job after changes to the title, description or public skill titles and associations used to build the vectors. Skill levels, status/date/location, organization and generated AIHub fields do not trigger the worker.
  • The PostgreSQL worker infers the title and atomically stores all three AIHub vectors on custom_job: source title, inferred title and reconstructed posting. Opportunity standardization remains MongoDB-only and explicitly rejects PostgreSQL mode.
  • Alembic adds B-tree join/filter, normalized-title GIN and HNSW cosine indexes. PG_OPPORTUNITY_SEARCH_EMBEDDING_DIMENSION defaults to 1536 and constrains every opportunity vector consistently.
  • PwC-only fields are intentionally absent from the relational view. PwC and Chatbot Atlas opportunity search retain their MongoDB paths.
  • PostgreSQL models, repositories and inference workers are now grouped under postgres subpackages in their opportunity, user and skill entity domains.

PostgreSQL user projection and enrichment

  • DATABASE_URL now switches user query and Data Exchange reads to the live aihub_user_v1 relational view. The view joins the existing user-domain tables and therefore needs no MongoDB synchronization or materialized-view refresh.
  • AIHub-owned user data is stored in aihub_user_profile: administrator status, an immutable application ID copied from the source user ID, and the optional simulation acknowledgement date.
  • Experience inference now stores only user/skill relationships in aihub_user_inferred_skills. Vector search uses the relational skill view; neither source text nor vector score is persisted. Only experience title or description changes enqueue reinference, and disabled users are skipped.
  • aihub_user_skill_gap is refreshed by PostgreSQL triggers when a user changes job, relevant declared user skills change, or skills required by the attached job change.
  • PostgreSQL user and skill repositories now live under the postgres subpackages of their owning entity domains. Biography and user-project fields were removed from profile ingestion, analysis and talent-search paths.

LangGraph PostgreSQL persistence

  • DATABASE_URL now selects the official asynchronous PostgreSQL checkpointer and long-term store for the shared Chatbot and MCP graphs. Without it, the existing MongoDB implementations remain active.
  • Alembic creates the vendor-owned checkpoint, blob, write, store and migration tables with their official indexes in PG_SCHEMA. Long-term memory keeps exact key-based storage and does not create a vector index.
  • LangGraph uses a dedicated, lifecycle-managed psycopg pool configured for the official backend requirements. PG_LANGGRAPH_POOL_MAX_SIZE defaults to 10.
  • PostgreSQL initialization failures stop startup instead of falling back to MongoDB. Existing MongoDB checkpoints and memories are not copied automatically.

2026-08-17

PostgreSQL authentication

  • Alembic now creates the empty aihub_api_keys table. API keys are primary keys, and their optional client IDs reference setting.id; no authentication secret is included in the migration.
  • API and documentation authentication now read keys from PostgreSQL whenever DATABASE_URL is set. The existing MongoDB backend remains active without that variable, and PostgreSQL lookup failures do not fall back to MongoDB.

Job Offer Matching

  • JOM skill scoring can now treat a target user skill without a level (null or 999) as acquired. The behavior is configured independently for the user and recruiter processing sides and remains disabled by default.

PostgreSQL embeddings

  • Alembic now creates the AIHub-owned aihub_ai_providers table and seeds the OVH, OpenAI, Anthropic and Azure definitions previously stored in the MongoDB AIProviders collection. OpenAI is seeded as the default LLM and embedding provider.
  • Voyage AI support and its unused SDK dependency have been removed. A data migration deletes the obsolete Voyage row from existing PostgreSQL provider tables, while fresh installations no longer seed it. Legacy MongoDB provider documents must be removed operationally.
  • Alembic also creates the singleton aihub_config table and seeds it from a frozen snapshot of the canonical configuration template.
  • Synchronous and asynchronous AI-provider and configuration readers now use PostgreSQL whenever DATABASE_URL is set. PostgreSQL failures are surfaced without silently returning MongoDB data.
  • The PostgreSQL embedding listener can resolve its default provider without a MongoDB connection. Explicit provider/model environment overrides and the final OpenAI fallback remain available.
  • The AIHub-owned embedding queue is now named aihub_embedding_jobs. Alembic renames the existing table, primary key, sequence and indexes without losing queued jobs, then updates the title trigger and the listener notification channel to use the prefixed name.
  • The PostgreSQL embedding listener now discovers the schema of the existing pgvector extension and fully qualifies the vector cast. Embedding writes no longer depend on the connection's search_path or assume that the extension shares the mysql table schema.
  • The listener now resolves the default embedding provider and model from the shared AI configuration before generating vectors. PG_EMBEDDING_AI_PROVIDER and PG_EMBEDDING_MODEL remain explicit overrides. When no override is set, the provider marked as the default in MongoDB is used instead of the legacy Azure fallback. OpenAI is used only as the final fallback when that configuration cannot be loaded.
  • The modern and historical single-skill endpoints now use PostgreSQL whenever DATABASE_URL is configured. Multiple-skill and other existing search paths remain on MongoDB.
  • A new Alembic-managed skill_search_v1 view searches each skill translation in its own language, using its own title, description and embedding without an English pivot. PostgreSQL maintains the view from the existing relational tables.
  • PostgreSQL skill search and title-embedding jobs now include only LIVE and DEMO clients whose skills reference an existing repository. Alembic removes obsolete pending jobs, backfills eligible missing embeddings and maintains the queue when client status or repository associations change.
  • Full-text, accent-insensitive trigram and HNSW cosine indexes support the existing language and repository filters. Text and vector candidates retain weighted RRF fusion and repository priority.
  • PostgreSQL vector results use Atlas-compatible cosine score normalization. The default single-skill threshold remains 0.91.
  • PostgreSQL single-skill searches now ignore the MongoDB collection_name request field instead of rejecting non-canonical collection names.
  • The historical single-skill route now preserves its requested language when using PostgreSQL instead of searching all translation languages.
  • The modern and historical Experience-to-skills routes now select PostgreSQL automatically when its shared resources are available. They batch query embeddings, retain hybrid text/vector fusion and referential priority, and load existing-skill labels and requested translations from the relational view.
  • PostgreSQL Experience-to-skills searches ignore the MongoDB collection field entirely; MongoDB continues to use it when PostgreSQL is unavailable.

MongoDB authentication

  • Synchronous and asynchronous MongoDB clients now verify connectivity during initialization. If the original URI is invalid or authentication fails with code 18 and its password requires encoding, AI Hub retries once after URL-encoding only that component.
  • Successful MongoDB connections now produce a concise application-level info log without exposing the URI or credentials.

2026-08-14

PostgreSQL migrations and embeddings

  • PostgreSQL schema changes are now versioned with Alembic, with the embedding queue bootstrap stored under alembic/versions/ and SQLAlchemy models for mysql.skill_translation and mysql.embedding_jobs.
  • The PostgreSQL runtime connection variable is now DATABASE_URL; the former PG_URL name is no longer read.
  • GitLab CI now validates the Alembic chain against an ephemeral pgvector-enabled PostgreSQL service, while staging and production migrations remain infrastructure-managed outside the GitLab deployment jobs.
  • The admin diagnostics API now exposes POST /admin/api/v1/diagnostics/postgres/migrations/run to trigger alembic upgrade head on the configured PostgreSQL database, with an in-process concurrency guard that rejects overlapping requests.
  • The admin consumer controls now also expose GET /admin/api/v1/consumers/postgres-listener/{start,stop,restart} and the generic GET /admin/api/v1/consumers/{start,stop,restart} routes remain RabbitMQ-specific. They are disabled when DATABASE_URL is set and do not control the PostgreSQL embedding listener.
  • The main FastAPI lifespan now owns the shared PostgreSQL async engine, session factory and psycopg pool. They are exposed on app.state and reused by the PostgreSQL embedding listener instead of being created ad hoc by the listener task itself.

Administration application

  • Every operation requiring an administrator API key now lives in its own mounted application: Swagger on /admin/docs, ReDoc on /admin/redocs and resource paths under /admin/api/v1. The Main API no longer serves any of them and its Administration Swagger category is gone.
  • The 36 moved operations use new resource-oriented paths and their previous URLs no longer exist. For example /api/v1/admin/display_variables becomes GET /admin/api/v1/diagnostics/environment, and POST /api/v1/admin/create_new_client becomes POST /admin/api/v1/clients.
  • The single Administration tag is replaced by 11 categories: Clients, Configuration, Consumers, Diagnostics, Batch Processing, Entity Imports, Entity Maintenance, Matching, RAG, Skills Library and Reports.
  • The two JOM pool lookups stay in the Main API and keep the standard API key. They move to GET /api/v1/matching/jom/pools/users and GET /api/v1/matching/jom/pools/opportunities, under the Job Offer Matching Swagger category, replacing /api/v1/admin/get_user_pool and /api/v1/admin/get_opportunity_pool.
  • The three active-entity counts now require an administrator key and move to GET /admin/api/v1/reports/active-users, GET /admin/api/v1/reports/active-opportunities and GET /admin/api/v1/reports/active-jobs. Their former /api/v1/admin/get_number_of_active_* URLs no longer exist.
  • The historically public GET /jom/admin/get_number_of_active_users and GET /jom/admin/get_number_of_active_opportunities are unchanged and remain public in the Main API.
  • Other entity query routes whose URL still contains /api/v1/admin/... are unaffected: they keep their path in the Main API and the standard API key. The MS Graph connector route keeps its administrator key inside Connectors.
  • Consumer start, stop and restart still drive the single background task owned by the main application.

2026-08-13

  • An opportunity search whose criteria match nothing now returns the user's best profile matches instead of an empty result, together with a generated message stating that no opportunity matched the search and that the suggestions are based on the profile.

Training Matching Learning Finder cost

  • Training Matching endpoints consume learning-content identifiers only, so the Learning Finder no longer generates the collection title, the collection subtitle, the per-training rationales, the simulation and Socratic companion cards, or the empty-result message when it is called from them. The returned identifiers and their order are unchanged. Chatbot searches keep generating all of that text.
  • These endpoints also skip the search-or-clarify classification and always run the search. A keyword that the chatbot would answer with a clarification question now returns matching identifiers instead of an empty list.
  • They no longer dispatch the streaming reflection steps either, since no LangGraph stream consumes them outside the chatbot.

Development objective suggestions

  • The endpoint moved from Talent Intelligence to Training Matching and is now served at POST /api/v1/development-objectives/suggestions. The former /api/v1/talent-intelligence/development-objectives/suggestions URL no longer exists, and the route is grouped under Training Matching in Swagger.
  • limit now defaults to 3 instead of 4 and no longer has an upper bound; the former rejection of values above 4 is gone.
  • Each suggestion now carries trainingSuggestions, a list of training identifiers, next to actionSuggestions. With an empty trainingIds, the service searches up to three accessible trainings per objective in parallel, reusing the Learning Finder flow with the same userId and the objective title and description as keyword. A failed search leaves that objective's trainingSuggestions empty.
  • With a non-empty trainingIds, the model assigns the supplied trainings to the generated objectives, no training search runs, and actionSuggestions stays empty. Every objective carries at least one training, an objective may carry any number of them, and every requested training that resolves to a tenant training is guaranteed to appear in the response.

2026-08-12

RabbitMQ consumers

  • RabbitMQ consumers now register only configured Smart Mobility queues; the automatic Northstar and preproduction rise-run listeners have been removed.
  • The admin environment diagnostics now expose RABBITMQ_QUEUES_PREFIXES.

User lookup

  • Training Matching, chatbot, simulation and Data Exchange user resolution now query only the tenant Users collection. The obsolete PwC-specific user collection fallback and its schema-specific identifiers have been removed.
  • API keys with an absent, null or empty dataSource now use smartmobility throughout authenticated HTTP and WebSocket flows. Explicit endpoint data_source inputs remain authoritative.
  • Authenticated API-key contexts now centralize deployment environment resolution: APP_IDENTIFIER_SHORT is used unless it is missing, empty or mutu, then ENV is used. Existing endpoint environment inputs remain authoritative when supplied.

Retired MongoDB collections

  • Removed all application access to staffLevelMapping, search and MCPToolsLog. Training lookups now use only Trainings, and MCP agent calls are no longer persisted to a separate MongoDB log collection.
  • User seniority now relies exclusively on jobClassification; the obsolete staffLevels field and staff-level mapping logic have been removed from chatbot profiles, searches, suggestions and simulations.

Lexi skill fit check

  • The global skill fit check now uses one English prompt for every input language, while retaining the language-independent relevance rules.
  • JSON prompt formatting no longer fails for non-French inputs, and routine LLM selection messages are logged at INFO instead of WARNING.

Direct HTTP client maintenance

  • AIHub-owned outbound HTTP calls now use the actively maintained HTTPX2 client. Framework-owned HTTPX dependencies and the OpenAI SDK remain unchanged.
  • Certificate verification for these direct calls now uses the operating-system trust store; deployments can provide SSL_CERT_FILE or SSL_CERT_DIR when their CA is not installed system-wide.

Retired user improvement topics

  • User standardization no longer computes or writes the former improvement-topic field; tenant configuration and MongoDB projections no longer expose it. Existing MongoDB documents are left unchanged.
  • Training Matching rationales now rely directly on skill gaps, current skills and attached-job context.

Development objective suggestions

  • POST /api/v1/talent-intelligence/development-objectives/suggestions now accepts an optional limit from 1 to 4, defaulting to 4, and never returns more objectives than requested.
  • An optional trainingIds list can ground generated objectives and actions in matching tenant trainings. Empty lists and unknown IDs retain profile-only generation.
  • An optional BCP 47 locale now controls the language of the complete generated response and defaults to English (en).

Shared SMTP email delivery

  • Lexi result and error notifications now use the common asynchronous email connector instead of a separate Talent Intelligence implementation.
  • Emailed Lexi result attachments now use the extension of their generated format (xlsx, csv or json).

Training Matching API

  • Replaced the former hybrid-ranking implementation behind POST /api/v1/get_training_matching with the existing Learning Finder flow. The URL is unchanged; the endpoint now accepts an authenticated JSON body containing userId, keyword and an optional limit (default 6), and returns unique accessible learning-content IDs.
  • Removed the obsolete Training Matching ranking and topic-normalization code.
  • Added the optional BCP 47 locale query parameter to GET /api/v1/get_training_matching_rationale; it defaults to English (en) and is included in the LLM instructions so the generated rationale uses the requested language.
  • Removed the client_id, data_source and environment query parameters from the rationale endpoint. Tenant and environment resolution now comes from the authenticated headers, API key and deployment environment.

2026-08-11

Centralized new-client MongoDB indexes

  • New-client provisioning now creates the complete classic, Search and Vector Search index catalog for common, reference and tenant collections, including chatbot events and RAG collections.
  • Talent Finder now receives its required users_search_index, and the combined JobOffers vector index declares every field used by its prefilters.
  • This provisioning change applies to newly created standard tenants. Existing tenant databases and PwC-specific collections remain a separate migration.

Unified MongoDB connection

  • AI Hub now resolves common_data, reference_data, every tenant database, Search and Vector Search through MONGO_CONNECTION_STR.
  • The former vector-search-specific connection variable is no longer read. Deployments must make all required databases and indexes available through MONGO_CONNECTION_STR.
  • The application lifecycle now owns one synchronous and one asynchronous MongoDB client per configured target instead of wrapping duplicate clients in connection dictionaries.

2026-08-10

Configurable MongoDB TLS

  • MongoDB connection factories now honor tls=false in every configured URI and omit the default tlsCAFile option for that connection.
  • Connections without tls=false retain their existing Certifi CA bundle, including Atlas and PwC DSNs.

User consumer matching freshness

  • RabbitMQ user standardization now preserves the stored profile timestamp when only its generated timestamp changed. Batch imports still refresh the user timestamp on every standardization.
  • RabbitMQ user processing evaluates JOM and JPM independently and recalculates only when the latest persisted score is missing or older than the user's profile timestamp. A failed matching calculation is therefore retried by the next user message without repeating already current matching products.

2026-08-07

  • Centralized Atlas full-text and vector query construction in dedicated MongoDB connector modules.
  • Removed MongoDB $rankFusion from training matching; hybrid rankings are now fused locally with the same weighted RRF approach as chatbot search.

2026-08-06

Retired Chatbot utility routes

  • Removed the Chatbot Tool Functions API, including its direct Training Finder endpoints and implementation package.
  • Removed GET /chatbot/api/v1/simulation/types; simulation types remain part of the request schemas for the active simulation workflows.

Data Exchange users API

  • Removed the expert, feedback-giver, user-objective and assignee-objective lookup routes from the Data Exchange users API.
  • Removed the single-user and bulk-user creation routes, update by user application ID, and the single-user and bulk-user deletion routes. User retrieval, consumer-format import and update by user ID remain available.

Retired Data Exchange jobs and skills APIs

  • Removed the Data Exchange Jobs and Skills routers and their dedicated service, repository, schema and test packages. Data Exchange now exposes only Users, Opportunities and Feedback resources.
  • Job and skill ingestion, standardization and query workflows remain owned by their entity packages in the Main API.

Data Exchange feedback API

  • Removed feedback lookup, compatibility create and bulk-create, update, deletion and skill-synchronization routes. Consumer-format import is now the sole Feedback route.
  • Removed the service, repository, schema and test code used only by those retired Feedback routes. Direct chatbot feedback creation and update-by-ID workflows remain available internally.

Data Exchange users internals

  • Removed service, repository, schema, exception and test code used only by the previously retired user creation, objective, application-ID update and deletion routes.

2026-08-04

Main API documentation

  • Consolidated the 43 /main/docs Swagger tags into 12 stable functional categories. Entity lifecycle operations now share their entity category; administration and Talent Intelligence each use one category; matching is split only between operations, JOM, JPM and training matching.
  • Public paths, methods, schemas, authentication and authorization are unchanged by this documentation-only grouping.

2026-08-03

Domain-oriented source structure

  • Grouped user, job, opportunity, training and skill ownership under src/entity, with their ingestion, query, maintenance and standardization adapters. Skill import and standardization no longer belong to the Skills Library package; its legacy import URL is unchanged.
  • Grouped JOM, JPM and training matching under src/matching. JOM now owns its feedback flows and Talent Match Insight, while statistics and maintenance routers live with their matching product.
  • Distributed every former global router and request model to its owning domain. Genuine administration logic now lives under src/admin; the global src/routers and src/models packages no longer exist.
  • Kept public HTTP methods, paths, parameters and response schemas unchanged during the moves. Swagger categories are now organized by business domain. As explicitly normalized during the refactor, entity query URLs that retain /api/v1/admin/... require a standard API key; historically public JOM/JPM compatibility routes remain public.

Chatbot organization

  • Renamed the source package from langgraph_chatbot to chatbot and renamed the graph entry module to graphs.py.
  • Isolated graph-only agents, state, prompts, tools, middleware and processing under src/chatbot/agentic. Chat, history, events, simulation, tool-function APIs and RAG lifecycle ownership remain separate within src/chatbot.

Retired library and training APIs

  • Removed POST /api/v1/jobs-library/jobs_single, POST /api/v1/jobs-library/jobs_multiple, POST /api/v1/opportunities-library/opportunities_single and POST /api/v1/opportunities-library/opportunities_multiple; their chatbot search logic remains internal to the chatbot domain.
  • Removed the legacy POST /talent-intelligence/training endpoint and its dedicated workflow. Lexi remains the supported job-content-to-skills enrichment surface.

2026-07-28

Documentation access

  • Swagger, ReDoc and OpenAPI schemas became public again. At that time API-key authentication remained enabled for /docs/; that final documentation guard was removed on 2026-09-08. Protected API operations continue to require their normal credentials.

2026-07-24

Skills library and talent intelligence

  • POST /talent-intelligence/training now resolves generated skills through the MongoDB skills collection and the tenant embedding configuration.
  • Removed the obsolete POST /talent-intelligence/create_repository and POST /talent-intelligence/list_repositories endpoints.
  • Removed the obsolete external-vector-store migration endpoint, client dependency and environment configuration. Skill imports and updates continue to persist embeddings in MongoDB.

Batch imports and Datalake

  • User, job, opportunity and training import_all endpoints now use bounded async workers instead of per-import process pools.
  • One batch context shares MongoDB/AI configuration and one Datalake writer; standardized entity files reuse the same Azure/S3 client.
  • Materialized Smart Mobility SQL records are accepted directly by the bounded worker engine, with filtering before queueing and async MongoDB cleanup.

Connectors and runtime

  • Smart Mobility SQL access uses SQLAlchemy async/asyncmy and restores optional SSH tunneling through maintained asyncssh instead of sshtunnel.
  • Missing passive RabbitMQ training queues stop only their consumer instead of retrying forever; configured Smart Mobility training consumers are attempted in every environment.
  • RabbitMQ consumers share one robust connection per application instance; aio-pika now restores their channels, queues and subscriptions directly after transport interruptions.
  • Language detection is centralized on lingua; the deprecated langdetect dependency and duplicate detection paths were removed.
  • Source syntax and Ruff target Python 3.14, consistently with development, CI and production.

2026-07-22

Documentation audit

  • Added the three Lexi endpoints to navigation and generated output.
  • Replaced stale fixed-model, repository, health-check and simulation examples.
  • Added authentication, streaming, tool-function, MongoDB index, LLM runtime and batch-operation guides.
  • Removed navigation links to MCP pages that do not exist and aligned the MCP overview with the tools actually registered in the repository.

2026-07-08 to 2026-07-22

Lexi

  • Reworked job-to-skill generation inputs, prompts, batching, assignment and retry behavior; renamed the skill-format field and updated the generated result documentation.
  • Added standalone POST /lexi/api/v1/jobs/get_skill_levels (NB-8712). It uses the same level-generation sub-step as generate_skills, accepts optional job and skill descriptions, and injects them into the prompt when present.
  • Added standalone POST /lexi/api/v1/jobs/get_skill_descriptions.
  • Added POST /lexi/api/v1/jobs/suggest_missions (NB-8715), preserving existing missions and returning only missing suggestions.
  • Lexi output-token limits remain workflow-managed and are not clamped by the shared LLM default policy.

Oria and LangGraph

  • Added a pre-supervisor gate that runs guardrail classification and knowledge retrieval before specialist routing, alongside long-term-memory evaluation.
  • Expanded and aligned supervisor routing, persona, agent availability, Socratic tutoring, profile analysis, training finder and long-term memory.
  • Centralized the 14 agent handoff tools. The person-disambiguation handoff now targets person_disambiguation_agent.
  • Conversation history is limited by token count and long conversations are summarized into persisted graph state.
  • Added stable task labels and mini and large LLM profiles. Conversation summaries use mini with a dedicated output limit.
  • Added localized SSE progress events for learning finder, profile analysis, opportunity search and talent finder. Streaming language is resolved before the first event.
  • Thumb feedback is now persisted in chat history; completed return-direct tool responses are retained correctly.
  • Opportunity search now uses typed criteria and matching context, shares hard filters with matching processing, skips recalculation when scores merely fall into the exclusion set, and triggers one guarded JOM recalculation when scores are genuinely absent.
  • Full-text and vector retrieval run concurrently and are fused locally with weighted RRF instead of MongoDB $rankFusion.
  • Inferred-title vector reranking uses InferredTitle_embeddings; opportunity standardization maintains both raw-title and inferred-title vectors.
  • Talent-search query generation is deterministic.
  • Training search includes enriched titles, broader canonical-title search, access-group visibility and simplified single-step learning plans. Training rationale and history contracts were aligned and plan-item rationales were removed.
  • Added POST /chatbot/api/v1/tool_functions/training_search; removed the former follow-up-question tool-function endpoint.

MongoDB and matching

  • New-client provisioning creates opportunities_autocomplete and one combined embeddings_index on JobOffers. The vector index contains both embeddings and InferredTitle_embeddings; no standalone inferred-title index is needed.
  • Async matching flows use Mongo vector similarity scores and exact vector queries where appropriate.
  • The nightly matching scheduler was removed.

Batch processing

  • The three matching batch functions now share one async context, stream MongoDB cursors through bounded worker queues, reuse prepared embeddings and avoid one task/result list per entity.
  • Datalake pool/score writes reuse a shared Azure/S3 client and bounded upload workers while preserving one JSON file per entity at the existing path.
  • Added BATCH_MAX_CONCURRENCY, BATCH_DATALAKE_UPLOAD_CONCURRENCY and per-entity progress logs such as user x/total.

AI providers and observability

  • Extracted shared OpenAI-compatible request/response helpers while keeping provider client creation local to OpenAI and Azure modules.
  • Normalized token, reasoning and prompt-cache usage across supported providers.
  • Direct and LangGraph calls expose task, policy, usage and estimated USD cost on LangSmith call_llm* runs, with configurable pricing overrides.
  • Added provider-specific last-resort LLM profiles and aligned the Realtime fallback with gpt-realtime-2.1.
  • Cache-aware prompts are structured as stable instructions plus dynamic context. Provider caching is enabled only for requested, supported and sufficiently long shared prefixes.
  • Consolidated LLM tracing to avoid duplicate model spans and added default output/reasoning policies outside Lexi.

Authentication and simulation

  • Bearer JWTs are validated with RS256 using JWT_PUBLIC_KEY_PATH; required claims are iat, nbf, exp and sub, and the validated token is available to graph tools.
  • Optional Client-ID values are checked against the client ID stored on the API key.
  • The generated site, Swagger, ReDoc and every OpenAPI schema now share an API-key login backed by a short-lived browser session. Swagger reuses that session automatically for X-API-Key without exposing the raw key to its JavaScript; each documentation interface exposes a shared logout button and returns to its current page after a new login.
  • Realtime simulation now uses the official OpenAI SDK and GA realtime session schema. Simulation text and analysis stay in the resolved/requested language.

Removed or internal-only changes

  • Removed training Data Exchange endpoints, unused playlist APIs and unused connector/notification code.
  • Removed the obsolete legacy API router and its Galaxy, JOM and ontology implementations.
  • Removed the unused Tenant-ID request header and user payload field.
  • Removed the unused Docker API-key seed script.
  • Removed the unused MongoDB dump, restore and database-rename admin APIs.
  • Removed legacy user development-skill fields and a legacy JWT variable.
  • RabbitMQ consumers stop gracefully when a configured passive training queue is absent.
  • Shared utility, RAG configuration, simulation-prompt and provider code was consolidated without changing its public contract.
  • Removed obsolete internal helpers and compatibility aliases, including unused MCP lookup helpers and Atlas Search cache/administration wrappers.
  • Source, script and test imports now use absolute project paths; Ruff rejects new relative imports.
  • Python, provider, LangChain and documentation dependencies were refreshed; consult requirements.txt for exact versions.