Skip to content

Releases: olafkfreund/TFactory

v0.9.3

11 Jun 08:46
85f386b

Choose a tag to compare

  • /api/specs/ingest now reliably auto-schedules the Planner (TFactory #347). Ingested specs were landing at status=pending with planner_scheduled: false and the warning "planner module not importable" — but only in the long-lived server process. The request-time lazy import from agents.planner import schedule_planner (inside create_spec_ingest_workspace) intermittently raised ImportError mid-request, while the very same import resolved cleanly in every fresh process and at app startup. Fix: routes/specs.py now imports agents.planner once at module load (app boot), pinning it into sys.modules so 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_planner call sites in task_control.py now catch Exception (not just ImportError), log the traceback, and surface a planner scheduling failed: … warning — so a future regression shows up in logs and the ingest response instead of a silent pending.

v0.9.2

10 Jun 12:27
2a2d997

Choose a tag to compare

  • /api/specs/ingest now 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 declared tfactory block (lanes/frameworks/ac_to_code_map) was discarded. SpecIngestRequest now carries an optional contract; create_spec_ingest_workspace persists it to context/task_contract.json (where read_task_contract() looks first) when it has the RFC-0002 markers, so parse_tfactory_profile drives lane/framework selection. No contract → inference, unchanged (backward compatible).

v0.9.1 — AIFactory→TFactory spec ingest fix

10 Jun 07:01

Choose a tag to compare

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

09 Jun 23:38
12dee63

Choose a tag to compare

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.yml quality_gate block + TFACTORY_PR_STATUS=1. See guides/pr-gate.md.
  • Run TFactory without AIFactory — generic spec ingestion (WS2, #313#315).
    create_spec_ingest_workspace + the task_create_from_spec MCP tool +
    POST /api/specs/ingest (with a typed ingestSpec client) 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, a ProjectStore
    abstraction (JSON default / org-scoped DB behind APP_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 the api:full scope authenticates on /api/* (for the handover skill +
    CLI), with expiry enforcement + last_used_at tracking.
  • Ollama Cloud documented + verified (#306). Reachable via the
    openai-compatible:<model> path + OPENAI_COMPATIBLE_* env; connectivity
    checker python -m providers.ollama_cloud_check. See guides/ollama-cloud.md.

v0.8.2

09 Jun 23:05
44d0efb

Choose a tag to compare

  • Agent bash no longer breaks under the OS sandbox on k3d (AIFactory #363). Mirrors AIFactory v3.6.9: bwrap can't mount /proc on k3d (the node is a container), so the SDK's bash sandbox broke every agent command. Gated sandbox.enabled behind AIFACTORY_BASH_SANDBOX (default on); set false on the cluster — bash works, isolation via the K8s pod boundary + command allowlist until gVisor lands.

v0.8.1

09 Jun 19:22
e5a4bbe

Choose a tag to compare

  • Agent command sandbox now actually engages (#321). The Chainguard runtime
    image omitted bubblewrap (bwrap) and socat, 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
    apk layer. Verified on the cluster: the node allows unprivileged user
    namespaces, so bwrap creates a real sandbox (not just silencing the warning).

v0.8.0

09 Jun 00:40
ca7bd32

Choose a tag to compare

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-only sandbox, 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
    acceptflag). 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:meta oracle (#196). Parse the pfactory:meta block 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.
  • 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 int correlation_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.
  • 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) and toHaveScreenshot visual 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

08 Jun 21:03
cfa0c96

Choose a tag to compare

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 via TFACTORY_COMPLETION_OUTBOX /
    APP_COMPLETION_RELAY_ENABLED.
  • Additive envelope upgrade (#282). Per-event id (idempotency key),
    CloudEvents-core (specversion/source/type/time), and W3C traceparent
    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 terminal needs_human
    completion event when the correction-cycle cap is reached.
  • SaaS connector visual lane (#173). Opt-in visual: true browser lane on
    ConnectorTarget/HttpTarget for visual-inspection runs, with ServiceNow
    browser guidance (iframe#gsft_main + stable selectors).
  • SAP OData connector (#111). sap-odata.py.tmpl api-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_token cookie in the
    auth middleware + get_current_user, and make the SPA checkAuth cookie-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.json at build time.

v0.5.0

03 Jun 17:52
dde0875

Choose a tag to compare

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 a QA_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)
      in context/source.json; api_url defaults to AIFactory's web-server
      (http://localhost:3101, override TFACTORY_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.py writes
      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, or python -m agents.handback <spec_dir> --send.
    • Bounded closed loop (#187). loop.py + /tfactory-fixloop drive a
      test→fix→re-test cycle that stops at passed, or stuck (cap
      TFACTORY_HANDBACK_MAX_CYCLES default 2, or no progress).
    • AIFactory receiver (sister repo, AIFactory#317): POST /api/tasks/{task_id}/apply-correction + MCP task_apply_correction write
      QA_FIX_REQUEST.md onto the original spec and run the existing QA Fixer.
    • Dry-run-first + opt-in throughout (no automatic pushes). See
      guides/aifactory-handback.md and
      docs/plans/2026-06-03-aifactory-tfactory-handback-design.md.

v0.4.0

03 Jun 15:18
6a4f346

Choose a tag to compare

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 into automated-test/<YYYY-MM-DD-HHMMSS>/ with a deterministic human report,
    an LLM correction plan (injectable seam + deterministic fallback), a GitHub
    issue export (dry-run), and meta.json. New agents/visual_inspection/
    (packager · report · correction_plan · issues · store); a
    write_paths_to_branch git 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-tfactory opt-in (visual_inspection {enabled, target, flow} threaded through task_create_and_run). Phases P1/P2/P4/P5
    shipped; P3 (ServiceNow browser/SSO) remains, needing a live tenant.
    See docs/plans/2026-06-03-visual-inspection-run-design.md.
  • SaaS connector target (#111). A first-class type: connector target
    (ServiceNow / Salesforce / SAP / MuleSoft) reusing the http + credential-vault
    auth, plus a platform registry mapping each platform → API style · library/
    check template · guidance. See guides/saas-connectors.md.
  • storageState login-once scaffolding (#107). Gen-Functional scaffolds
    auth.setup.ts + a requires_auth Playwright config from a ref-auth target's
    selectors, so a browser test logs in once and reuses the session.