Skip to main content

Changelog

v1.50.0 — 2026-08-12

A non-compliance verdict that says why, not just “no” (EPIC AH)
  • A story scoring 83 against a 77 threshold showed READY, BORDERLINE and “Below threshold” at once. The last one was simply false. Compliance has always meant score at or above threshold and no failing required criterion — unchanged — but the panel and the Cockpit had a single fixed label for every non-compliant story, whatever the real cause.
  • The verdict now names its actual cause: below threshold, unmet required criteria (named, by their real INVEST axis), or both. One shared function derives it from data already computed and now persisted alongside the score, and both surfaces render through that same function, so they cannot drift apart.
  • Quality level and compliance verdict are now distinct, including for assistive technology. The level (Ready / Needs improvement / Critical) comes from the score alone; the compliance verdict is what actually gates generation. The level can no longer be mistaken for permission to generate.
  • Per-axis suggestions now follow your interface language too. An English-interface reviewer got their justification in English but the suggestion right below it in French — the field was missed when the justification fix shipped in v1.49.0. Same mechanism, same single call, no retranslation.
  • The story detail drawer stops showing its own reference twice: the header title is now the clickable reference, and the duplicate in the footer is gone.

v1.49.0 — 2026-08-11

The INVEST justification reads in your language, not the story’s (EPIC AE3)
  • An English-interface reviewer reading a French story used to get the justification in French. Technically it honoured the letter of “never translate story content” — but a justification isn’t story content. It is analysis displayed in the tool and never written back to Azure DevOps.
  • Each field in the schema sent to the model now names its own expected language, right next to its placeholder, instead of one blanket instruction covering the whole response. A single global directive invites the model to quietly unify everything to one language — which is exactly what was happening.
  • The per-axis justification targets your interface language. The rewritten description, acceptance criteria and generated tests still target the story’s language, untouched. Still one LLM call.
  • A saved justification keeps the language it was written in. Reading it later under a different interface language never retranslates it, and switching your interface language never marks a score stale. If the model drifts anyway, it is logged and nothing else — no retry, no rewrite, no error shown.
  • Three fixes ride along in the detail drawer: the block order matches the design (coverage before provenance), all six INVEST axes now show their justification instead of only the failing ones — you previously couldn’t see why a passing axis passed — and the work-item reference carries the story title again instead of a bare #298.

v1.48.0 — 2026-08-11

The Cockpit’s reserved coverage column finally has something in it (EPIC AG)
  • Every release since v1.47.1 carried a 120px column on “Ready to generate”, “Stale score” and “Not scored”, deliberately empty — filling it needed a relations call the Cockpit didn’t make. It now does.
  • A fourth “Covered by tests” funnel card and the column itself show n linked cases or no test, loaded in the background after the first render so it is never blocking. The three existing cards keep their exact content.
  • The detail drawer gains a Test coverage block — linked cases, automated cases, and an estimated count of acceptance criteria still without a test — plus an Open in Test Plans ↗ link. That estimate carries its uncertainty in its type, not just its label, so no surface can render it as a measured fact by accident.
  • One request resolves the whole visible scope: identifiers are merged across every story before a single call, and automation status rides along on that same request.
  • A failed resolution leaves the indicators simply absent, never a misleading zero, and never touches scoring, generation or the DoR gate.

v1.47.0 – v1.47.2 — 2026-08-11

The Cockpit matches its reference design, column for column
  • The visual direction landed in v1.44.0, but the Cockpit had drifted from its own mockup: summary cards squeezed instead of spanning the row, no gauge or caption, a numeric badge instead of a progress bar for the INVEST score, and — the part that actually broke the read — four sections rendered two different ways, so the ID / Story / Score columns never lined up.
  • All four sections now share one column-width contract, applied identically top to bottom, so a story’s row means the same three columns wherever it appears. The tab is renamed Cockpit, the area and iteration pickers move to a compact pair top-right, and each section header gains a status dot.
  • The INVEST score reads as a bar with the number and a greyed-out threshold. The reason a story needs work is now one sentence — “Borderline — 1 INVEST axis tips the verdict”, “Acceptance criteria not testable (V, T weak)” — derived from the same persisted statuses, never a new call.
  • v1.47.1 and v1.47.2 close the drift that only appeared once “Stale score” and “Not scored” had rows in them: three status badges overflowing a 190px cell, a “generation locked” notice firing on every row of three sections instead of once in the header, and a clipped “Re-evaluate compliance” action.
  • Purely presentational across all three releases — no scoring, generation or gate logic changed.

v1.46.0 — 2026-08-11

Every input field now goes through the design system (EPIC AF)
  • The previous visual refresh changed the product’s tokens, but a token only reaches an element that consumes it. 24 raw <input> / <select> / <textarea> fields across 7 screens — 13 on Config alone — were still browser-drawn underneath the new palette. That is precisely what read as “basic, off-brand” on that screen.
  • They now all go through the same Input / Select / Textarea primitives, plus a new Checkbox primitive replacing five raw checkboxes. A guard test blocks a raw field from creeping back in, same pattern as the button guard from v1.30.0.
  • The auth-mode radios and the two sliders stay native by design, with only their appearance harmonised.
  • The base shadow on cards and panels is softer and applied consistently; small controls get a smaller corner radius. Both re-checked against the dark theme. No behaviour, colour or typography changed.

v1.45.0 — 2026-08-11

Manual and Automated tests become one Studio, and confrontation has no exception left
  • The two tabs are gone. A single Studio tab holds both modes behind an internal switch, with a permanent right-hand column showing the confrontation summary — identical / similar / new counts — while cases are still being edited.
  • Constitution §14 (“single door to writing”) is now absolute. A story with zero existing test cases could previously write straight through, skipping confrontation entirely. Every generation now passes through the confrontation screen first, even when the tally is “0 identical · 0 similar · all new”.
  • Each decision option (Create / Update / Ignore) states its consequence in the screen itself instead of leaving it to the label.
  • Sliders are gone from every generation screen, replaced by a −/value/+ stepper, same ranges.

v1.44.0 – v1.44.1 — 2026-08-10

Teal Instrument visual direction, and confrontation before writing (EPIC AE)
  • The “SaaS Arc” look is replaced by a single-accent teal palette with self-hosted fonts. The Quality Cockpit funnel is redrawn and a story-detail side drawer is added.
  • The review-before-write window becomes a full-screen confrontation surface, showing a real side-by-side diff against existing test cases before anything is written. The modal is gone, not just restyled.
  • v1.44.1 inverts the translation guard. A field check found French strings still surfacing in the English interface a full sprint after the v1.43.0 guard shipped — each slipped past the pattern-based check in its own way. Rather than adding more patterns, every screen component is now enumerated and must consume the translation layer, no exceptions without a stated reason.
  • A second, new guard compares each key’s French and English value directly, catching a value present in both files but identical in both — translated in neither. Four such values fixed; no logic, condition or call changed.

v1.43.0 — 2026-08-10

One language per screen, and a denser review window (EPIC AD4)
  • A field demo surfaced screens mixing French and English — English strings next to French labels on the very same screen, twelve files affected. Every screen label now comes from the translation layer, in both languages, and an automated check blocks any literal string from creeping back in, with a short explicit list of justified exceptions.
  • The review-before-writing window introduced in v1.42.0 didn’t hold up past a handful of cases. Each case now collapses to a single line — typology, qualification, title, actions — with a chevron to expand it; the side-by-side diff and full warning text appear only once expanded.
  • The banner carries a short title plus a one-line count of identical / similar / new cases, and the action footer stays outside the scrolling area.

v1.42.0 — 2026-08-10

A guided write flow (EPIC AD)
  • The review opens in its own dedicated window — focus trapped, Escape to close, focus restored — with a fixed footer, two pre-fill shortcuts, and a close confirmation once a decision has been made.
  • The bare write confirmation is replaced by a report naming each case’s real outcome (created / updated / ignored), its real id, a direct link, the model and time used, and a “Generate more cases” button.
  • Test-plan attachment becomes a question asked after writing, rather than an immediate, unasked list.

v1.41.0 – v1.41.1 — 2026-08-10

Review before writing (EPIC AC)
  • Generated cases are now compared against those already attached to the story via the Tested By relation, and qualified as identical, similar or new by lexical comparison — no extra model call.
  • You decide per case: create, update or ignore. The safest option is pre-selected, and consequences (executed, hand-edited, automated, belongs to a plan) are surfaced before you commit to an update.
  • A single pluralization mechanism replaces eight approximate labels.
  • v1.41.1 fixes the review screen’s decisions not actually reaching the write step — the screen was correct, the outcome wasn’t.

v1.40.0 – v1.40.1 — 2026-08-10

Test Plans authorization and diagnostic (EPIC AB)
  • TestForge now declares the vso.test / vso.test_write scopes needed to reach Test Plans at all. You will be asked to reauthorize the extension once after updating.
  • A diagnostic mistook a missing extension permission (401) for an absent organization licence (403) — two very different problems with two very different fixes. Corrected.
  • Navigation links to the plan and the suite are shown after a successful attachment.
  • v1.40.1 fixes suite creation (a required parent suite was missing) and makes Tier 1 actually create its Test Case work items before attaching them.
  • Worth knowing: pushing manual tests to a story (the Tested By relation) has never required a Test Plans licence — an ADO Basic account is enough. The Test Plans licence unlocks suite-based organisation, which is optional.

v1.39.1 — 2026-08-09

Configuration changes apply without a reload (EPIC X)
  • A saved provider change used to need a hard reload. The hub read the LLM configuration once when it opened and never refreshed it, and the configuration screen had no way to announce a save. The stale value was handed to the Quality Cockpit and used for every provider call and for secret redaction. Since the provenance panel reads that same configuration to decide what to state, it could claim a story stayed inside your tenant while the newly-saved provider was in fact sending it to a third party — a false assurance on the one screen meant to prevent exactly that.
  • Fixed by two complementary changes, neither sufficient alone. Every code path that calls a provider now re-reads the configuration at the moment it acts, and a shared hook keeps the topbar, availability banner, cockpit actions and provenance panel current the instant a save succeeds. A one-off save callback was deliberately avoided: it would have left the next component to read the configuration with the identical defect.
  • A failure now tells you what to do about it. Five resolution hints — check your API key, wait and retry, check the endpoint, retry or switch model, retry or check your configuration — existed in the translations but were never displayed. Both error modals now show the hint next to the provider’s message.

v1.39.0 — 2026-08-09

Honest provenance and verdict traceability (EPIC AA)
  • The work item panel now states where your analysis actually runs, for the provider you actually configured. With Azure OpenAI or Azure AI Foundry it confirms the analysis stays on your own resource, inside your tenant. With OpenAI, Mistral or Gemini it states plainly that data is sent to a named third-party host, outside your tenant. The Anthropic proxy gets a third, distinct case: relayed through your own proxy, then processed by a third party. Never one promise reused regardless of provider.
  • Only the host name is ever displayed — no API key, token or tenant identifier, by construction. The block also carries a standing reminder that nothing is written to Azure DevOps without your explicit approval, and a link to your LLM settings. It is permanent and non-blocking, a calmer register than the one-time consent warning shown when you first pick an external provider.
  • The verdict carries its own context. For a story with a saved score, the block shows the date and threshold exactly as they were when the score was computed — never today’s values. An old score never silently inherits today’s rules. The model used and the required criteria weren’t recorded at scoring time in earlier versions; rather than backfill them from current settings and misrepresent history, the panel omits them for those scores and says so.
  • Fixed: the exported iteration report always claimed data stayed in your tenant, whichever provider produced the scores. That sentence circulated in wikis and chats. It now reflects the actual provider, using the same logic as the panel.

v1.38.0 — 2026-08-09

Refreshed visual identity, dark theme wired (EPIC Z)
  • The hub’s topbar no longer stacks a second dark bar under Azure DevOps’ own chrome. It adopts a light surface, with the active tab marked by the accent colour. Structure, provider badge and tab navigation are unchanged.
  • Figures now render in an embedded monospace face. Scores, counters, work item IDs, timestamps and token budgets align in columns and read as measurements rather than prose. The font is bundled in the extension (about 7 KB, Latin-1 subset) — no external request, so it works on air-gapped instances.
  • Dark theme actually wired. Host-theme detection already existed; the missing dark values are now defined, so every semantic colour has an explicit value in both themes.
  • Four pre-existing contrast failures fixed — muted text on the page background, the accent button’s label, the error badge, and muted text on the dark hero surface all measured below the WCAG AA threshold for normal text. Found while adding a contrast guard, not introduced by this redesign.
  • Presentation only: no logic, data, Azure DevOps call or permission changed.

v1.37.0 — 2026-08-09

Exportable iteration readiness report (EPIC Y)
  • A new “Generate report” action in the Quality Cockpit produces a Markdown summary of the current scope: period and date, model used, stories ready out of the total, average score, the weakest INVEST axes ranked by how many stories they affect, and every non-compliant story with its real reason.
  • The reason is never approximated. A story scoring 83 against a threshold of 70 but missing a required criterion is reported as “missing required criterion”, never as “below threshold”. A story whose score is stale is reported as such, even if its old verdict still happens to hold.
  • The report can be copied to the clipboard or downloaded as a .md file, and stays readable pasted as-is into a wiki page or a team channel. It states that scores were computed inside your organization’s tenant.
  • Everything is derived from data the Cockpit already holds: no additional LLM call, no new endpoint, nothing stored. The preview reuses the error modal component introduced in v1.36.0 — no new screen.

v1.36.1 — 2026-08-09

Field-validation fixes on Gemini (EPIC X)
  • A batch summary could disagree with the failed rows on screen. A story that failed once and later succeeded kept its failure mark indefinitely. Marks are now reset at the start of every batch, so the announced count and the marked rows cannot diverge.
  • A malformed response showed a parser position instead of a next step. Investigation ruled out truncation — the provider’s own dashboard reported 100% success and output well under the configured cap; the model simply returned a complete but syntactically invalid body despite JSON mode being requested. The failure is now classified by the type of the underlying error, not by matching text, and reads “the model returned an invalid response — retry, or switch model”, with the raw detail still available.
  • The Gemini API key travelled in the request URL. A key in a query string ends up in proxy logs, browser history, and any network trace exported to support. Gemini requests now authenticate through the vendor’s documented header instead. The five other providers are unaffected.
  • Worth knowing: Google is retiring legacy Gemini API keys in favour of service-account-scoped ones from September 2026. A configuration working today may stop then — see the Help tab.

v1.36.0 — 2026-08-09

Explicit provider errors and assisted model selection (EPIC X)
  • Every LLM failure is now surfaced. A new dependency-free modal (focus trap, Escape to close, focus restored) states what failed, the provider’s own message and a suggested fix — on “Test connection”, on scoring a single story, and on code generation.
  • A batch run never opens one modal per story. Each failing row is flagged in place and exactly one summary modal appears at the end, with the processed count, the failed count and the dominant cause.
  • Fixed: a stale score could pass for a fresh one. A failed re-score left the previous score visible with nothing to indicate it hadn’t just been computed. The row now marks it explicitly as a previous, non-refreshed score.
  • Fixed: a story failing inside a batch showed nothing at all — it stayed silently unscored, indistinguishable from one the batch hadn’t reached yet.
  • Assisted model selection outside Azure. OpenAI, Mistral, Gemini and Anthropic offer a list of suggested models with an always-available free-text option; a model already saved outside the list is preserved, never overwritten. Azure OpenAI and Azure AI Foundry keep free-text entry — the deployment name is yours, no catalogue can know it.
  • Defense in depth against secret leakage: any error message or console log that echoed a raw URL or an authorization header is now scrubbed before being shown or logged.

v1.35.3 — 2026-08-09

LLM transport delegated to each provider (EPIC X)
  • Four providers out of six were broken on scoring and test generation. “Test connection” returned success for OpenAI, Mistral, Gemini and Anthropic, but INVEST scoring and both manual and automated generation failed — a shared helper applied the Azure OpenAI URL shape and header to every non-Foundry provider, a fallback its own comment scoped to the two Azure providers only.
  • Each provider now carries its own transport. Scoring and generation call the provider directly; every hand-built URL and header outside the providers is gone. “Test connection” and real calls share the same code path by construction, so this class of defect cannot silently reappear.
  • Azure OpenAI and Azure AI Foundry requests are bit-for-bit unchanged, verified by dedicated tests. Gemini and Anthropic keep their own native request and response formats rather than being forced into an OpenAI shape.

v1.35.0 — 2026-08-08

Reliable, reproducible INVEST scoring (EPIC W)
  • A 12-fixture evaluation campaign found the previous temperature: 0.3 made scoring unreproducible: 6 out of 12 fixtures changed score between two identical runs, and 2 crossed the Definition-of-Ready threshold on unchanged content. INVEST scoring now runs at temperature: 0 — only 2 out of 12 fixtures moved. Test generation and story improvement keep their own settings, where variability is legitimate.
  • Re-score a ready story. A story in the Ready section now exposes an explicit Re-score action next to Generate. Previously, once a story was Ready there was no way to score it again short of deleting and recreating the work item.
  • Re-score the entire scope. “Analyze all” can now target every story in scope, not just unscored ones — as a distinct action with a confirmation stating the story count, since the token cost is real. The default (unscored only) is unchanged.
  • Borderline badge. A story is flagged Borderline when flipping a single INVEST axis between ok and weak would be enough to cross the threshold. It is derived from the persisted statuses and your current threshold — no hardcoded margin, so it adapts to a custom Definition of Ready. Purely informative: it never changes eligibility, locking or the gate.
  • On a reasoning model, the adaptive sender still omits temperature by design (EPIC Q probe-and-retry); scoring reproducibility then depends on the provider’s own determinism.

v1.34.2 — 2026-08-08

Real titles, types and content for linked work items (EPIC W)
  • Linked work items showed the link-type name instead of the real title. The panel was rendering the ADO relation’s attributes.name — which is the link type (Parent, Child…), not the target’s title, since expanding relations never returns the linked item’s own fields. A single batch call now resolves the real title, type and description for every linked item.
  • The linked-context feature never actually reached the model. The same mixed-up field fed the LLM: checking a linked item sent the word “Parent” (about 2 tokens) instead of its content. Each checked item now contributes its real title and description, and the displayed token budget reflects that real content.
  • Children, predecessors and successors were silently dropped. They were listed and checkable, but only parents and related items were ever transmitted — checking any other category had no effect. All five categories now reach the generation context.
  • Work item type is now shown next to each linked item (Feature, Bug, User Story…) as a text badge, alongside the link category and the real title.
  • If the batch resolution fails, the panel stays usable — each reference falls back to #id alone and generation is never blocked.

v1.34.0 — 2026-08-08

Uniform, navigable work item references (EPIC W)
  • Every reference to a work item now renders as #id title and is clickable. A plain click opens the native ADO work item dialog on top of the hub — no page reload, no lost context; a Ctrl/Cmd/Shift or middle click opens it in a new browser tab, and the URL can be copied like any link.
  • Adopted on four surfaces: the Quality Cockpit (all four sections, including rows in error), the selected story banners on Manual tests and Automated tests, and the linked work-item context panel. In the Cockpit only the id is interactive, so it never competes with the per-story action; in the context panel the reference sits outside the checkbox, so clicking it never toggles your selection.
  • Link category labels (Parent, Related, Predecessor, Successor, Child) are now localised in French and English.

v1.32.0 — 2026-07-08

Robust Azure Repos push and pull request creation (EPIC V)
  • Pushing twice to the same branch no longer fails (TF401028). The target branch tip is now re-read immediately before pushing, and each file is added or edited according to what the target branch actually contains.
  • No more silent orphan branches (TF401398). The base branch is picked from the repository’s real branches, preselected on its default branch, instead of assuming main. A new branch is created in one pass from the chosen base tip.
  • A push error is no longer a dead end. Your form and generated files are preserved, and ADO’s error is decoded into an actionable message with a clear next step instead of a raw failure.

v1.31.1 — 2026-06-29

Bilingual Gherkin keywords (EPIC U)
  • French Gherkin scenarios are no longer blocked at push: TestForge now recognises both English keywords (Given/When/Then/And/But) and their French equivalents (Soit/Étant donné/Quand/Lorsque/Alors/Et/Mais) when deriving the ADO steps. Only a scenario with no recognised keyword in either language still blocks.
  • Generation keeps the structural keywords in English (BDD grammar) while the step text follows the user story language; the validation label is localised from the story language (Vérifier : for French stories, Verify: otherwise).
  • Fixes a latent regression of mono-format Gherkin (v1.31.0), where the parser recognised English keywords only and the classic-steps fallback had been removed.

v1.31.0 — 2026-06-28

Mono-format manual test generation (EPIC U)
  • Choose the manual test format — Classic steps or Gherkin BDDupfront, before generating; TestForge produces a single, editable representation instead of parallel steps plus a read-only Gherkin view.
  • The Gherkin scenario is now editable, and the push derives the ADO steps from your edited scenario — blocked with an actionable message if it is no longer derivable (no silent push of an empty Test Case).
  • The Steps/Gherkin view toggle and the separate push-format toggle are gone — one source of truth.
  • Cucumber generation now requires Gherkin mode: cases generated as Classic steps prompt an explicit “regenerate in Gherkin mode” message (no extra LLM call, no mechanical conversion).
  • Fixes the “Gherkin scenario not available” gap on negative and edge cases — every case now carries a scenario, with the failure expressed in the Then.

v1.30.0 — 2026-06-24

Harmonised buttons across every screen (EPIC T)
  • Every interactive control now goes through the design-system Button, so the look stays consistent and theme-aware (light/dark) on every screen — no raw buttons left anywhere.
  • A clear action hierarchy signals intent at a glance: the Cockpit Generate is teal (the product’s happy path), screen-level primary actions (Save, Test connection, Generate code, Push, Attach, Rewrite) are navy, secondary/remediation actions (Improve, Score, Re-score, Re-evaluate, Cancel/Confirm) are outlined, toggles are pills, and discreet links are ghost.
  • Keyboard users get an accessible :focus-visible ring. A guard test locks the invariant so a raw <button> can’t silently creep back into a screen.

v1.29.0 — 2026-06-23

The Quality Cockpit remembers your scope (EPIC S)
  • The Cockpit now remembers the last area path + iteration you used and restores them when you come back, per project. The preference is personal (stored in your User scope, never shared with the team) and restored defensively — if a remembered area or iteration no longer exists, it’s simply ignored, with no query against a phantom scope.

v1.28.0 — 2026-06-23

Automated tests reach parity with manual (EPIC S)
  • The Automated tests tab now offers the same generation controls as the manual screen: opt-in linked work-item context, attachments and a pasted spec excerpt, and test count per typology — all wired into code generation (enriched context + a best-effort per-typology count directive, filtered to the selected typologies).

v1.27.0 — 2026-06-23

Redesigned Quality Cockpit (hybrid)
  • The Cockpit opens with a funnel (backlog → scored → ready) and a “Recommended action” card that tells you what to do next for the current scope.
  • Stories are grouped into four DoR sections — Ready, Needs improvement, Stale score, Not scored — each with one primary action. A ready story has a single Generate button that opens a Manual / Automated menu; other states show their remediation with generation locked (🔒).
  • A compliant-but-stale story now sits in Stale score (not Ready) and can’t be generated until re-evaluated, enforcing the single-entry-point gate.

v1.26.0 — 2026-06-22

The Quality Cockpit is the single entry point to generation (EPIC S)
  • The Manual and Automated tests screens no longer carry their own user-story list. You pick a ready story (DoR-compliant and up to date) in the Cockpit and choose Generate → Manual / Automated; the screen opens with the story preselected. With no preselection, the screen shows an explicit empty state with a “Go to Cockpit” button.
  • “Analyze (INVEST)” is removed from the generation screens — scoring stays centralised in the Cockpit; the PO panel keeps its INVEST analysis.

v1.25.1 — 2026-06-22

Contextual typology selector
  • The test-typology chips now appear only on Manual tests and Automated tests (hidden on Quality / Config / Help). Your selection stays shared and single — it governs both manual and automated generation and persists when you switch tabs.

v1.25.0 — 2026-06-21

A DoR change flags your whole backlog — re-synced in one click, no LLM (EPIC R)
  • Changing your Definition of Ready now flags all previously scored stories as “Re-check compliance — the DoR changed”, including those scored before this feature existed (a one-shot migration).
  • A new “Re-evaluate whole iteration” action recomputes compliance cold across the iteration with no LLM call, touching only the affected stories. Progress is reported n/N; a save failure is non-blocking.

v1.24.0 — 2026-06-20

Fine-grained staleness — a DoR change no longer re-runs the LLM (EPIC R)
  • TestForge now tells apart the story changed from the Definition of Ready changed. A story edit still triggers a full re-score (LLM); a DoR threshold/rule change instead flags the affected stories “Re-check compliance” and offers a “Re-evaluate compliance” button that recomputes conformity cold, with no LLM call (the INVEST score is independent of the threshold). If both changed, the re-score wins. DoR saves now record updatedAt / updatedBy.

v1.23.1 — 2026-06-19

Idempotent quality writes (EPIC R)
  • Re-scoring an already-scored story (alone or in a burst), or re-running an iteration analysis, no longer fails with a version error. Quality writes are now idempotent: each save reads the current document version and carries it, retrying transparently on a concurrent-write conflict (multiple tabs, “Analyze all”). A genuine save failure now shows a distinct message, separate from a scoring/LLM error.

v1.23.0 — 2026-06-18

Quality Cockpit (EPIC P)
  • New Quality tab as the hub entry point: backlog stories grouped by Definition-of-Ready status, with area-path and iteration selectors.
  • On-demand and batch INVEST scoring: score a single story, or run “Analyze all” across an iteration — token estimate shown upfront, a hard cap with confirmation, non-blocking failures, and bounded retry on rate limits.
  • Persisted scores: results are stored in your own Azure DevOps tenant (never the story content — scores and analysis metadata only) and flagged as stale when the story changes, with one-click re-score.
  • Iteration average and trend: the average score of scored stories, plus a forward-only trend sparkline once at least two iterations are captured.
  • Product Owner panel detail: the work item panel shows the persisted score read-only, with an expandable INVEST breakdown (status, rationale and suggestions per criterion).

v1.22.0 — 2026-06-17

Universal Foundry model compatibility (EPIC Q)
  • Any OpenAI-style deployment now works by name, including reasoning models (GPT-5.x, o-series, DeepSeek-R1) that reject max_tokens or a non-default temperature. A shared sender adapts parameters at runtime on HTTP 400 (max_tokensmax_completion_tokens, drops temperature / response_format) and retries — with no per-model setup.
  • “Test connection” now exercises the same parameter contract as real calls and surfaces the exact error body instead of a generic message.
  • Optional “Reasoning model” toggle in Advanced Settings skips the discovery round-trip; Claude-on-Foundry and Gemini keep their dedicated providers.

v1.20.1 — 2026-06-16

Fix — saving the Definition of Ready
  • Project Administrators can now save the per-project Definition of Ready configuration (score threshold, gate on/off, mandatory criteria). The Project Admin check now runs against the Azure DevOps permissions API using your existing session — no extra extension permission is requested — and only when the Definition of Ready screen is opened.

v1.19.0 — 2026-06-13

Unified on-demand INVEST score + hub icon Work item panel (PO / BA)
  • Unified INVEST score (0–100): the score is now derived deterministically from the 6 LLM-evaluated criteria — the same source as the I/N/V/E/S/T grid. No more contradictory dual grid.
  • On demand, never automatic: the score only appears after clicking “Analyse (INVEST)”. No LLM call fires on panel open.
  • Before → after score: after “Rewrite in ADO”, the panel re-reads the server fields (GET REST — not the form cache, which caused a frozen score) and resets the analysis. Click “Analyse (INVEST)” again to compute the after score and compare improvement.
  • Actionable failure message: when no LLM is configured or the endpoint is unreachable, a descriptive message with a link to the Config tab is shown — no phantom score is displayed.
Hub
  • Hub navigation icon: the TestForge icon now appears in the ADO vertical navigation bar (iconAsset added to testforge-hub).
Definition of Ready
  • The DoR gate now uses the real INVEST LLM score and criterion statuses. Without a prior analysis, generation remains available — no automatic blocking without a score.

v1.18.0 — 2026-06-09

8 frameworks live + exhaustive Definition of Ready gate Automated test generation
  • All 8 frameworks now generate end-to-end. Cypress (JavaScript), Playwright (Python) and Playwright (.NET / C#) appeared in the framework selector but raised a “framework not supported” error at generation time because their prompt modules were missing — the three are now fully operational, with idiomatic Page Object structure and conformant file layout.
  • Added — Cucumber (Java): step definitions for io.cucumber.java, with .steps.java / .feature files.
  • Added — Cucumber (Python): pytest-bdd runner, with _steps.py / .feature files.
Quality Gate
  • The gate now covers every generation surface. When a User Story does not meet the Definition of Ready, both the manual and the automated test-generation buttons are disabled — the automated tab can no longer be used to bypass the gate.
  • Clearer feedback: a disabled generation button now shows the current score and the configured threshold (e.g. “score 52, threshold 70”) and links straight to the Product Owner panel so the story can be improved first.
  • Required INVEST criteria are now enforced: a mandatory criterion that is weak or missing blocks generation when an INVEST analysis is available; the offline, score-only check is unchanged.
  • The gate can be switched off without losing its configuration, via a new toggle in the Definition of Ready settings.

v1.16.0 — 2026-06-06

Real US ID traceability + Next Steps guide
  • Traceability annotations: generated tests now reference the real work item ID (@us-1234) instead of a placeholder.
  • Quality score — traceability dimension: placeholder and unknown IDs no longer count as a valid annotation; only real work item IDs are accepted.
  • “How to use this code” accordion: shown inline after each generation — install command, directory structure and run command for the selected framework.
  • “Full setup guide →” link: a direct link to the framework section in the documentation.

v1.15.1 — 2026-06-06

Hotfix — QA Hub loading
  • Fixed an infinite loading spinner when opening the QA Hub. Admin-role detection now runs fully offline, with no network call at load time.

v1.15.0 — 2026-06-06

Quality Gate & Definition of Ready
  • Configurable Definition of Ready: a per-project INVEST threshold (0–100, default 70) plus individual INVEST criteria marked required or optional, with organisation → project inheritance. Editing is restricted to Azure DevOps Project Admins.
  • Enforcement (levels 1 & 2): a warning banner appears in the Product Owner panel when a story is non-compliant, and the “Generate tests” button is disabled in the QA Hub when the story is below threshold or missing a required criterion. The gate runs on the offline heuristic score — no LLM required.
  • Backlog Quality dashboard: a new tab in the QA Hub listing the sprint’s stories with their heuristic score, Definition-of-Ready status and failing criteria. Recomputed on the fly, with no stored data.

v1.14.0 — 2026-06-06

Test count control
  • New TestCountPanel in the QA Hub Manual Tests tab.
  • Simple mode: global slider 2–32 with live distribution pills (e.g. 3 Nominal · 4 Boundary · 2 Equivalence · 2 Negative).
  • Advanced mode: individual sliders per typology (1–8 each), running total displayed.
  • Preferences persisted to ADO user account (test-count-config-v1).
  • generateTestCasesByTypology() accepts optional testCountConfig — fully backwards-compatible.

v1.13.0 — 2026-06-06

Polish & accessibility
  • ⚙️ Config button in work item panel now navigates correctly to the Hub Config tab.
  • Accent teal button contrast fixed: #1D9E75 + white text — contrast ratio 4.8:1 (WCAG AA).
  • Inline code blocks in Help tab: --surface-hover background — contrast ratio 15:1 (WCAG AAA).
  • All inline buttons migrated to Button design system (primary, ghost-blue, pill-on, pill-off).

v1.12.0 — 2026-06-05

Design System Refresh — Direction B “SaaS Arc”
  • Typography: Space Grotesk replaces Segoe UI.
  • Palette: marine #042C53 for hero surfaces, teal accent #22d3a5 for active states.
  • HeuristicScoreCard: hero card with 42px score, coloured level badge.
  • QaHubView: marine topbar with active provider badge.
  • New Card variants: hero and accent. Visual regression guard T-DS-16.

v1.11.0 — 2026-06-05

Branding, documentation, unified config
  • Marketplace icon (static/icon.png 128×128) and new overview.md.
  • Help tab in QA Hub: user documentation bundled as Markdown (zero network, offline-ready).
  • Unified configuration: work item panel no longer embeds a ConfigScreen.

v1.9.0 — 2026-06-05

Gherkin export, inline INVEST suggestions, AC format toggle
  • InvestSuggestion.criterion: suggestions linked to their INVEST criterion. Click a criterion cell to expand inline.
  • Export format toggle (Classic / Gherkin BDD).
  • Steps/Gherkin pills in TestCaseList: global toggle for all cases in the current US.
  • AC format toggle (Bullet list / Gherkin per AC): persisted per user.

v1.6.0 — 2026-06-04

Providers, Gherkin, code quality
  • 6 LLM providers: OpenAI, Mistral, Gemini (browser-direct) + Anthropic (client proxy).
  • Gherkin on manual tests: gherkinScenario field, pushed to System.Description.
  • 8 test frameworks: Cypress JS, Playwright Python/.NET, Cucumber JS/Java/Python added.
  • Code quality score: 5-dimension local score with warnings and Regenerate button.
  • stripHtml fix for ADO rich-text fields.

For the full commit history, see the GitHub repository.