Releases: olafkfreund/TFactory
v0.9.3
/api/specs/ingestnow reliably auto-schedules the Planner (TFactory #347). Ingested specs were landing atstatus=pendingwithplanner_scheduled: falseand the warning "planner module not importable" — but only in the long-lived server process. The request-time lazy importfrom agents.planner import schedule_planner(insidecreate_spec_ingest_workspace) intermittently raisedImportErrormid-request, while the very same import resolved cleanly in every fresh process and at app startup. Fix:routes/specs.pynow importsagents.planneronce at module load (app boot), pinning it intosys.modulesso the downstream lazy import is a fast cache hit instead of a fragile fresh import. This unblocks the AIFactory→TFactory verify leg of the PARR loop (the contract already arrives; now the test pipeline actually runs).- Planner scheduling failures are no longer swallowed. Both
schedule_plannercall sites intask_control.pynow catchException(not justImportError), log the traceback, and surface aplanner scheduling failed: …warning — so a future regression shows up in logs and the ingest response instead of a silentpending.
v0.9.2
/api/specs/ingestnow accepts the signed Task Contract and uses it as the authoritative test profile (#71 Phase 3, with AIFactory v3.6.14). The handoff was contract-less ({project_id, spec_id, spec_text}), so the Planner inferred lanes/frameworks and PFactory's declaredtfactoryblock (lanes/frameworks/ac_to_code_map) was discarded.SpecIngestRequestnow carries an optionalcontract;create_spec_ingest_workspacepersists it tocontext/task_contract.json(whereread_task_contract()looks first) when it has the RFC-0002 markers, soparse_tfactory_profiledrives lane/framework selection. No contract → inference, unchanged (backward compatible).
v0.9.1 — AIFactory→TFactory spec ingest fix
Resolves /api/specs/ingest projects by id-or-name from the web-server store, fixing the AIFactory→TFactory handoff (#517 / #330). Image deployed via the sha-based CD (deploy.yml); this tag is the version marker. CHANGELOG: ## 0.9.1.
v0.9.0
First slice of the enterprise 90-day plan (
.agent-os/product/enterprise-90day-plan.md),
plus the per-user token + Ollama Cloud groundwork.
- PR-native quality gate (WS1, #310–#312). The Triager can publish a GitHub
commit status (TFactory / tests) that passes/fails a PR against a configurable
policy (agents/quality_gate.py+tools/pr_status.py), opt-in via the
.tfactory.ymlquality_gateblock +TFACTORY_PR_STATUS=1. Seeguides/pr-gate.md. - Run TFactory without AIFactory — generic spec ingestion (WS2, #313–#315).
create_spec_ingest_workspace+ thetask_create_from_specMCP tool +
POST /api/specs/ingest(with a typedingestSpecclient) turn a raw
markdown/Gherkin/EARS spec into a native test-gen task — no branch required. - GitHub issue → native TFactory test task (#326/#327). The portal's
issue→task flow now creates a native test-generation task via the ingest
endpoint, not an inherited AIFactory coding task. - Tenant hygiene — projects toward org-scoped DB (WS3, #316–#319). A
projects.json→DB migration into the owner's Personal org, aProjectStore
abstraction (JSON default / org-scoped DB behindAPP_PROJECTS_BACKEND), a
request→org resolver, and the live projects route routed through the store seam. - Java coverage wired into the Evaluator (WS4, #320). Format-aware coverage
parsing dispatches JaCoCo for the Java lane (Cobertura stays the default). - Per-user
acw_API tokens on the REST surface (#305). A user-minted key
with theapi:fullscope authenticates on/api/*(for the handover skill +
CLI), with expiry enforcement +last_used_attracking. - Ollama Cloud documented + verified (#306). Reachable via the
openai-compatible:<model>path +OPENAI_COMPATIBLE_*env; connectivity
checkerpython -m providers.ollama_cloud_check. Seeguides/ollama-cloud.md.
v0.8.2
- Agent bash no longer breaks under the OS sandbox on k3d (AIFactory #363). Mirrors AIFactory v3.6.9: bwrap can't mount
/procon k3d (the node is a container), so the SDK's bash sandbox broke every agent command. Gatedsandbox.enabledbehindAIFACTORY_BASH_SANDBOX(default on); setfalseon the cluster — bash works, isolation via the K8s pod boundary + command allowlist until gVisor lands.
v0.8.1
- Agent command sandbox now actually engages (#321). The Chainguard runtime
image omittedbubblewrap(bwrap) andsocat, so the Claude Agent SDK logged
"Sandbox disabled: … bubblewrap (bwrap) not installed" and ran agent bash
commands with no filesystem/network enforcement — unacceptable for a tool
that runs generated tests sandboxed. Both are now installed in the runtime
apklayer. Verified on the cluster: the node allows unprivileged user
namespaces, sobwrapcreates a real sandbox (not just silencing the warning).
v0.8.0
TFactory stops being a standalone tool and becomes a verified node in the
Factory line — it picks up governed test
targets from PFactory, emits a shared completion event CFactory can watch, and
registers itself in the Backstage software catalog. Part of the Factory
PARR-spine epic (Plan · Act · Review · Report).
- CI-parity verification signal — real imports, not mocks (#302). A sixth
Evaluator signal, inspired by the Hermes agent, that guards against "green
that lies" — tests passing locally (against mocks or a developer-shaped env)
yet failing in CI. The pytest lane now grades under a CI-matching environment
(ambient credentials blanked,TZ=UTC, hash seed pinned, locale normalised)
on top of the existing--network=none --read-onlysandbox, and a static
"real-imports" check flags any suite passing only by mocking out the subject
module under test (signals_summary.ci_parity: mocked-subject→ demote
accept→flag). Surfaced in the verdict + triage report; documented in
guides/testing-model.md. - PFactory governed-target pickup (#193–#197). TFactory now consumes test
work that PFactory has planned and
governed, rather than only ad-hoc handovers:- Recognise + enqueue (#195). Detect governed test targets and enqueue
them through the existing task pipeline. - Tag taxonomy (#194). Create the shared label set PFactory and TFactory
agree on for routing governed work. pfactory:metaoracle (#196). Parse thepfactory:metablock as the
test oracle — the governed acceptance contract the generated tests must
satisfy.- Generate · run · report back (#197). Produce tests for a picked-up
target, execute them, and report the result back up the spine.
- Recognise + enqueue (#195). Detect governed test targets and enqueue
- RFC-0001 normalized completion event (#198 / #211 / #214 / #224). The
Triager's terminal-status completion event now conforms to
RFC-0001
— the canonical cross-service correlation-key + completion-event schema, so
one shape flows across AIFactory · PFactory · TFactory and CFactory watches a
single contract:- Shared
correlation_key(GitHub issue number, with a synthetic
tf-<spec_id>fallback so it is never null); legacy intcorrelation_id
retained as a back-compat alias. - Default integration port moved 3102 → 3103 (#198); MCP-proxy tests
realigned. - Triager emits an RFC-0001 usage block on completion events (#224).
- See
docs/completion-event-envelope.md.
- Shared
- Backstage software-catalog onboarding (#215 / #216 / #223). TFactory is now
importable into Backstage:catalog-info.yaml+ TechDocs (#215/#216),
completion-event TechDocs aligned to RFC-0001, and enriched catalog
annotations + an AI-assistant skill descriptor (#223). - Reach more systems under test. Multi-step / SSO test-target login flows
(#107) andtoHaveScreenshotvisual baselines wired to the portal-managed
store (#109); live Kubernetes port-forward dispatch fix (#108). - Hardening. Patched the binutils CVE (CVE-2026-6846) to clear the P0 Trivy
gate; web-server deps installed into the backend venv so the full suite imports
cleanly (#219); core pipeline agents decomposed per a Clean Code review;
pre-existing ruff lint debt cleared. Backend suite now at 2803 tests.
v0.7.0
Hardens the Factory PARR spine's completion-event delivery (epic #284, TFactory
side complete), fixes the OIDC SSO login loop, and rounds out the SaaS connector
support.
✨ New Features
- Completion outbox + retrying relay (#281). At-least-once delivery of
RFC-0001 completion events — the Triager durably enqueues the envelope before
delivery; a relay drains it with exponential backoff + dead-lettering and
replays across restarts. Opt-in viaTFACTORY_COMPLETION_OUTBOX/
APP_COMPLETION_RELAY_ENABLED. - Additive envelope upgrade (#282). Per-event
id(idempotency key),
CloudEvents-core (specversion/source/type/time), and W3Ctraceparent
ride alongside the legacy fields. Published schema + CI validation. - Typed handback contract + bounded retry (#283). Versioned triage-report
contract (contracts/handback-triage-contract.v1.schema.json), assertion
pinning (manifest hash + additive-only diff-gate), and a terminalneeds_human
completion event when the correction-cycle cap is reached. - SaaS connector visual lane (#173). Opt-in
visual: truebrowser lane on
ConnectorTarget/HttpTargetfor visual-inspection runs, with ServiceNow
browser guidance (iframe#gsft_main+ stable selectors). - SAP OData connector (#111).
sap-odata.py.tmplapi-lane check (OData v2/v4,
bearer/OAuth or Basic) — all four connector platforms now have library checks.
🐛 Bug Fixes
- OIDC/Keycloak SSO login loop (#286). Honor the
access_tokencookie in the
auth middleware +get_current_user, and make the SPAcheckAuthcookie-aware
so SSO logins no longer bounce back to/login. - binutils CVE-2026-6846 (#218). Pinned
binutils>2.46-r1; Trivy P0 gate green.
🔧 Other
- Login page auto-versions from
package.jsonat build time.
v0.5.0
Close the loop with AIFactory: when TFactory's tests find problems, hand a
correction back to AIFactory for a fix, then re-test — bounded so it can't
run away. The reverse of/handover-to-tfactory. Epic
#182.
- Hand-back pipeline (#182). New
agents/handback/packages a finished
run's failures into aQA_FIX_REQUEST.md-shaped correction and (opt-in) sends
it to AIFactory's QA Fixer:- Traceability (#183). The snapshotter records the AIFactory hand-back
target (aifactory{project_id,spec_id,api_url,task_id}+correction_cycle)
incontext/source.json;api_urldefaults to AIFactory's web-server
(http://localhost:3101, overrideTFACTORY_AIFACTORY_API_URL). - Builder + renderer (#184).
request.py+render.py— pure-compute
selection of failing tests → a deterministic fix-request payload (reuses the
triage report + the visual correction plan). - Sender + Triager hook (#185).
send.pywrites
findings/handback_request.{md,json}always and POSTs only on
dry_run=False AND confirm; the Triager's terminal-status hook prepares
(default ON) and sends on opt-in (TFACTORY_HANDBACK_SEND=1), mirroring
TFACTORY_TRIAGER_GIT_WRITE. - Operator skill + CLI (#186).
/handback-to-aifactory(+ AIFactory
companion) previews then sends via the AIFactory MCP tool
task_apply_correction, orpython -m agents.handback <spec_dir> --send. - Bounded closed loop (#187).
loop.py+/tfactory-fixloopdrive a
test→fix→re-test cycle that stops at passed, or stuck (cap
TFACTORY_HANDBACK_MAX_CYCLESdefault 2, or no progress). - AIFactory receiver (sister repo,
AIFactory#317):POST /api/tasks/{task_id}/apply-correction+ MCPtask_apply_correctionwrite
QA_FIX_REQUEST.mdonto the original spec and run the existing QA Fixer. - Dry-run-first + opt-in throughout (no automatic pushes). See
guides/aifactory-handback.mdand
docs/plans/2026-06-03-aifactory-tfactory-handback-design.md.
- Traceability (#183). The snapshotter records the AIFactory hand-back
v0.4.0
A new Visual Inspection Run feature (all no-tenant phases shipped) plus the
first-class SaaS connector target. Epic
#170.
- Visual Inspection Run (#170). Record a generated Playwright browser run
(trace + video + step-labeled verification and error screenshots) and package
it intoautomated-test/<YYYY-MM-DD-HHMMSS>/with a deterministic human report,
an LLM correction plan (injectable seam + deterministic fallback), a GitHub
issue export (dry-run), andmeta.json. Newagents/visual_inspection/
(packager·report·correction_plan·issues·store); a
write_paths_to_branchgit helper to commit the folder to the SUT repo
(dry-run default); a portal Visual Reports page +/api/visual-inspections
routes; and a/handover-to-tfactoryopt-in (visual_inspection {enabled, target, flow}threaded throughtask_create_and_run). Phases P1/P2/P4/P5
shipped; P3 (ServiceNow browser/SSO) remains, needing a live tenant.
Seedocs/plans/2026-06-03-visual-inspection-run-design.md. - SaaS connector target (#111). A first-class
type: connectortarget
(ServiceNow / Salesforce / SAP / MuleSoft) reusing the http + credential-vault
auth, plus a platform registry mapping each platform → API style ·library/
check template · guidance. Seeguides/saas-connectors.md. - storageState login-once scaffolding (#107). Gen-Functional scaffolds
auth.setup.ts+ arequires_authPlaywright config from a ref-auth target's
selectors, so a browser test logs in once and reuses the session.