Progress
Live delivery snapshot, updated by hand as merges land — last refresh 2026-06-21 (TFactory v0.9.3, shipped). Recent milestones and the dated historical record are kept below. Full detail per release in the changelog.
Current status — v0.9.3 (shipped)
TFactory is in production as a governed node in the Factory line: PFactory plans, AIFactory builds, TFactory verifies, CFactory watches. It generates, runs, evaluates, and triages tests against the code AIFactory ships, then reports back up the spine.
What is live today:
- Five agents — Planner · Gen-Functional · Executor · Evaluator · Triager.
- Five lanes, all active — unit · browser · api · integration · mutation.
- Browser lane runs in a per-task Nix toolchain inside an ephemeral Kubernetes Job (RFC-0005 Tier A); it captures screenshots + video recordings (plus traces), rendered in the portal Acceptance / Evidence tabs and the CFactory cockpit.
- Verification Assurance Level (VAL) ladder — every run states how far it was
actually verified (RFC-0006); the Report tab leads with the VAL line and a lane
that did not run is
not_run, never a silent pass. - Acceptance-criteria fidelity — “verified X/Y” against the governed criteria.
- Host-venv pytest fallback — where there is no container runtime, pytest runs in a host virtualenv against the real code, so the verdict comes from a genuine execution rather than a skipped lane.
- MFA for SUTs — TOTP + a disposable Keycloak realm (RFC-0007 Class C).
- Credential Broker — pluggable secrets backends, ephemeral creds, egress gate, OIDC / workload-identity federation.
- Runs on any LLM — model-string routing, no provider lock-in.
- RFC-0001 completion event — one normalized cross-service envelope with a
shared
correlation_key, delivered at-least-once; CFactory consumes a single contract across AIFactory · PFactory · TFactory. - Governed pickup from PFactory —
pfactory:metais the test oracle. - Backstage catalog —
catalog-info.yaml+ TechDocs + an AI-assistant skill descriptor. - Bidirectional hand-back loop — bounded corrections returned to AIFactory’s QA Fixer, then re-tested.
v0.9.x — Factory PARR node (current, shipped)
████████████████████████████ governed pickup · RFC-0001 event · Backstage · Nix browser lane
v0.5.0 — Bidirectional AIFactory ↔ TFactory integration (2026-06-03)
████████████████████████████ epic #182 — 7 phases shipped + #108 live-fix
v0.4.0 — Visual Inspection Run + SaaS connector targets (2026-06-03)
████████████████████████████ epic #170 (P1/P2/P4/P5) · #111 · #107
v0.3.0 — Cloud testing (AWS/GCP/Azure) + platform + portal (2026-06-03)
████████████████████████████ epic #133 · #74 #73 #71 #85 #108 #109 #107 #138
v0.2.0 — Enterprise Test Framework Spine (2026-05-29)
████████████████████████████ 16 of 16 tasks (#16–#32) + evidence-links
Releases: https://github.com/olafkfreund/TFactory/releases
Backend tests: 531 (v0.1) → 1225 (v0.2) → 2803 (v0.5)
Recent milestones
Week of 2026-06-15 → 06-21 — verdict honesty + the verify-Job rollout
- VAL ladder, end to end (RFC-0006, shipped) — the verdict now states how far a run was verified, surfaced on the Report tab above the triage buckets, with the RFC-0015 requirement→test→VAL traceability matrix alongside it (#463).
- Host-venv pytest fallback (shipped) — fixes the case where the pytest lane could not launch its runner (no container runtime) and so never ran the generated tests; it now executes pytest in a host virtualenv against the real code and collects JUnit + coverage.
- Job-native verify execution (RFC-0016/0017) — default flip LIVE
(#466 closed, 2026-06-23) — the verify pipeline runs as a per-task k8s Job in
a contract-declared Nix toolchain.
TFACTORY_VERIFY_EXEC=kubejobis set on the reference deployment (gitops d9db3d5). The earlier blockers are resolved: the Job runs on the TFactory image so the agents import (#479), the Job env receives LLM provider credentials (#480), and file-auth CLI creds are seeded into the Job via an initContainer (#481). Proven live by adispatch_verify_jobsmoke — a real Job ran the full pipeline (evaluator executed the generated pytest, stability 3/3, mutation killed; triager ran an in-Job LLM session) → verdictacceptwith a durabledone/triagedjob-state row and traceability matrix. The in-pod path remains as the safe fallback (the shipped code default), but the live deployment is Job-native.
Factory PARR spine (shipped, v0.9.x)
TFactory became a verified node in the Factory line rather than a standalone tool:
- Governed pickup from PFactory (#193–#197) — recognise + enqueue governed
test targets, parse
pfactory:metaas the test oracle, then generate · run · report back up the spine. - RFC-0001 normalized completion event (#198 / #211 / #214 / #224) — the
Triager emits one cross-service envelope with a shared
correlation_key; CFactory watches a single contract across AIFactory · PFactory · TFactory. Default port moved 3102 → 3103. See the completion-event envelope. - Backstage onboarding (#215 / #216 / #223) —
catalog-info.yaml+ TechDocs, enriched annotations, an AI-assistant skill descriptor. - Reach more SUTs — multi-step / SSO login (#107),
toHaveScreenshotbaselines wired to the portal store (#109), live K8s port-forward fix (#108).
v0.5.0 — Bidirectional AIFactory ↔ TFactory integration (2026-06-03)
The reverse of the handover: when TFactory’s tests find problems, it hands a correction back to AIFactory’s QA Fixer, then re-tests — bounded so it can’t run away. Epic #182, seven phases shipped.
| Phase | What | Issue |
|---|---|---|
| P1 | source.json records the AIFactory hand-back target |
#183 |
| P2 | agents/handback/ correction builder + renderer (pure) |
#184 |
| P3 | AIFactory receiver: apply-correction REST + MCP + QA Fixer |
AIFactory#317 |
| P4 | dry-run-first sender + Triager completion hook | #185 |
| P5 | /handback-to-aifactory skill + companion + CLI |
#186 |
| P6 | bounded closed loop + /tfactory-fixloop |
#187 |
| Docs | guides/aifactory-handback.md + round-trip updates |
#188 |
Also this cycle: #108 —
the Kubernetes port-forward dispatch was live-verified against a real kind
cluster, fixing two defects the mocked tests masked (a missing port_forward
attribute; an IPv4-only readiness parse that hung on kubectl’s [::1] line).
Design: docs/plans/2026-06-03-aifactory-tfactory-handback-design.md.
v0.4.0 — Visual Inspection Run + SaaS connectors (2026-06-03)
- Visual Inspection Run (epic #170).
Record a Playwright browser run — trace + video + step-labelled verification
and error screenshots — and package a human report, an LLM correction plan,
and a GitHub-issue export into
automated-test/<datetime>/, surfaced in the portal’s Visual Reports. P1/P2/P4/P5 shipped; P3 (ServiceNow SSO) needs a live tenant. - SaaS connector target (#111).
A first-class
type: connectortarget (ServiceNow / Salesforce / SAP / MuleSoft) over the http + credential-vault auth. - storageState login-once (#107).
Gen-Functional scaffolds
auth.setup.tsso a browser test logs in once and reuses the session.
v0.3.0 — Cloud testing + platform foundations + portal redesign (2026-06-03)
- Cloud infrastructure testing — AWS · GCP · Azure (epic #133, complete). Read-only posture: access gate → discovery → Mermaid topology → Prowler/CIS (OCSF) → accept/flag/reject → remediation plan. All three live-verified. Launch from +Task → Cloud Infrastructure; reports land in Cloud Reports.
- Credential Broker (epic #62). Pluggable secrets backends, ephemeral 0600 file creds, honest egress gate, sandbox injection (#73), OIDC/workload-identity federation (#74).
- k8s dispatch (#108), test-target login (#107), visual-regression baselines (#109), Triager completion callback (#85), and a flagship-grade portal redesign.
v0.2.0 — task-by-task (historical record)
The 16-task enterprise spine that v0.3+ builds on. Kept for provenance.
| # | Task | Merge | Tests added |
|---|---|---|---|
| #16 | Task 0: Lane spine rename (functional / sast / dast / fuzz / mutation → unit / browser / api / integration / mutation) | 1ae97f9 + 4 prior commits |
+25 alias coverage |
| #17 | Task 1: Framework descriptor registry (pytest + Jest + Playwright at MVP) | 1c92280 (7 commits) |
+45 |
| #18 | Task 2: .tfactory.yml schema + parser + validator (http / k8s / docker_compose / feature_flag targets) |
6359590 |
+69 |
| #19 | Task 3: .tfactory/tests-catalog.json schema + 3-step AC-match lookup |
51fcebd (6 commits) |
+50 |
| #20 | Task 4: Snapshotter extension — lifts .tfactory.yml + tests-catalog into workspace context |
7b2fc8b (4 commits) |
+9 |
| #21 | Task 5: Planner per-subtask polyglot (language / framework / target_name / intent) | 43e9ac1 (6 commits) |
+52 |
| #22 | Task 6: Gen-Functional generic — descriptor.context_block injection; v0.1 prompt preserved as legacy | 4c006fb (6 commits) |
+25 |
| #23 | Task 7: Per-framework Docker runner images (pytest / jest / playwright) | f3f88dd (5 commits) |
+6 (skipped when no daemon) |
| #24 | Task 8: Browser-lane AppRuntime — docker-compose lifecycle + HTTP health-poll | d2aa2ae (6 commits) |
+25 |
| #25 | Task 9: TypeScript Evaluator primitives (tsc / ESLint / Stryker) | fde90ef (6 commits) |
+100 |
| #26 | Task 10: Evaluator coverage adapter — null-not-zero for Browser lane (Decision 11) | 4ef9a51 (4 commits) |
+21 |
| #28 | Task 12: 15 starter test templates (5 each for Playwright / Jest / pytest) | e58adfd (5 commits) |
+48 |
| #29 | Task 13: Skills + slash commands (/tfactory-init · /tfactory-add-test · /tfactory-from-template + handover update) |
782259f (5 commits) |
+36 |
| #30 | Task 14: Portal endpoints — frameworks / templates / skills / catalog | 94e711b (6 commits) |
+35 effective (43 declared; 8 hit the pre-existing starlette shim path) |
| #27 | Task 11: Triager update-vs-create + catalog mutation (3-step lookup_by_ac decides UPDATE-in-place / CREATE-new / SKIP-locked) |
cd5396b (5 commits) |
+24 |
| #31 | Task 15: LaneStatusGrid full reskin (5 independently lit lanes) + tfactory init / tfactory migrate v0_1_catalog CLIs |
f4eb9aa (5 commits) |
+21 backend + 27 frontend |
| #32 | Task 16: Test evidence capture (screenshots / video / trace / HAR) + retention enforcer + portal endpoint + frontend Evidence tab | 654e77a (5 commits; commit 4 deferred for follow-up PR) |
+86 |
v0.2.0 — released 2026-05-29
All 16 v0.2 tasks merged to main and the Task 16 deferred commit 4
follow-up (Triager PR-comment evidence-links, 5d8f588) landed
immediately afterwards. Annotated tag v0.2.0 pushed; GitHub Release
live at
https://github.com/olafkfreund/TFactory/releases/tag/v0.2.0.
Release body mirrors the v0.2.0 CHANGELOG section.
The Triager follow-up was the only piece held back during the parallel
batch (it block-waited on Task 11). It now ships portal evidence links
per accepted/flagged candidate in triage_report.md so PR reviewers
click straight from the comment to screenshots / video / trace.zip /
network.har.
Test totals
| Snapshot | Backend tests | Δ vs prior | Notes |
|---|---|---|---|
| v0.1.0-mvp baseline (2026-05-28) | 531 | — | Walking skeleton — Python + pytest only |
| v0.2 in progress (post-batch-1, 2026-05-29) | 1039 (7 skipped) | +508 | After 14 of 16 v0.2 tasks |
| v0.2 release candidate (post-batch-2, 2026-05-29) | 1170 (7 skipped) | +131 | After all 16 v0.2 tasks — exceeded the +~110 forecast |
v0.2.0 released (5d8f588, 2026-05-29) |
1177 (7 skipped) | +7 | After Triager evidence-links follow-up |
v0.2 post-release (HEAD bcc5c7d, 2026-05-29) |
1225 (7 skipped) | +48 | Starlette .content→.body shim sweep + showcase + iframe demo |
| v0.3.0 (Cloud + Credential Broker + portal, 2026-06-03) | ~2200 | +~975 | Cloud assessment, secrets backends, WIF, sandbox injection, portal redesign |
| v0.4.0 (Visual Inspection + connectors, 2026-06-03) | ~2400 | +~200 | agents/visual_inspection/, connector registry, storageState scaffold |
| v0.5.0 (Hand-back loop + #108, 2026-06-03) | 2803 | +~400 | agents/handback/ (request/render/send/trigger/loop), k8s live-fix |
The docker-runner smoke tests (#23) require a live daemon and gracefully skip when none is present.
Pipeline status
Planner ─► Gen-Functional ─► Executor ─► Evaluator ─► Triager
(polyglot (generic via (DockerRunner (5 signals; (catalog-aware
per #21) descriptor #22) + AppRuntime null coverage; + completion
+ Nix Job for TS primitives) event +
Browser lane) evidence-links)
The full pipeline runs end-to-end in production across all five lanes. The
historical v0.2.0 showcase — five Playwright tests generated from a five-AC user
story, with evidence captured — remains published at
/showcase/ running against
olafkfreund/tfactory-demo.
v0.2.0 demo + showcase
A live end-to-end run published at /showcase/:
- System under test: olafkfreund.github.io/tfactory-demo/ (Vite + React)
- 5 Playwright tests generated from the 5-AC user story; 4 pass, 1 fails (AC#5 surfaces a seeded cache bug)
- Evidence captured: 5 screenshots + AC#5 video.webm + AC#5 trace.zip
- Planner output: real test_plan.json emitted via the Claude subscription (no API keys)
- Tag:
v0.2.0-demoanchors the showcase commit (be52f9b)
Health signals
Test counts below are the last recorded snapshot (through v0.5.0); the suite has continued to grow through v0.9.x. See the changelog for current per-release figures.
- Pass — pytest (backend) — 2803 tests at v0.5.0 (1225 at v0.2.0)
- Pass — All 5 portal endpoints respond shim-compatibly without fastapi installed
- Pass — Pages site builds + deploys on every push to
main(Cayman + custom layout) - Pass — Showcase page renders the live SUT in an iframe + inline triage report with working evidence links
- Partial — Docker integration — runner images build under CI; per-image smoke
tests skip locally without a daemon (recovers via
tfactory-test) - Partial — End-to-end smoke (
scripts/e2e-smoke.sh) — 9 scenarios, operator-driven
Cross-references
- Live demo + showcase → Demo
- v0.2 driver doc →
docs/plans/2026-05-28-enterprise-test-frameworks-design.md - v0.2 task plan →
docs/plans/2026-05-28-enterprise-test-frameworks-tasks.md - Architecture → Architecture
- Changelog → CHANGELOG.md
- v0.2.0 release → github.com/olafkfreund/TFactory/releases/tag/v0.2.0
- v0.2.0-demo tag → github.com/olafkfreund/TFactory/releases/tag/v0.2.0-demo
- Epic + sub-issues → github.com/olafkfreund/TFactory/issues