Capability tooling evaluation (touri / uri2verify / TestQL / dockfra / hypervisor)

Date: 2026-07-18 Goal gap: pack required_capabilities ↔ connector doctor readiness (Subactor / Plesk) Scope: smoke-test candidate packages; apply only what closes the gap; minimal refactors.

Summary

PackageSmoke resultVerdict for gapApplied?
tellmesh/touriCore import + validate/list OK; 14 pass / voice+markpact failures unrelatedHelpful — capability id + .uri.capability.yaml manifest shapeYes (pattern + local manifests)
tellmesh/uri2verifyUnit tests pass; capability-plan was broken without hypervisorHelpful — capability verification plan builderYes (touri fallback + used as design cue)
semcod / TestQLInstalled (1.2.60); testql analyze on platform OKPartial — good scenario orchestrator, not SSOT for pack⊆doctorThin wrapper scenario only
wronai/dockfra doctorCLI runs; reports wizard offline without dockfra stackNot useful for Plesk capability ⊆ gateNo
wronai/hypervisorExamples = touri capability registry copy; package not importable without installPartial — contract-registry pattern; too heavy as dependencyNo (uri2verify still prefers it when present)
wronai/vdisplayPresent; display orchestrationNot useful for this gapNo

Test results (detail)

touri (/home/tom/github/tellmesh/touri)

uri2verify (/home/tom/github/tellmesh/uri2verify)

TestQL

dockfra doctor

hypervisor

Integration shipped in Subactor

ArtefactRole
platform/config/connector-capabilities/catalog.v1.jsonPack id ↔ doctor keys + aql.oql / aql.uri_processes
platform/config/connector-capabilities/plesk.doctor.fixture.jsonCI fixture mirroring live short-key + available shape
platform/config/connector-capabilities/*.uri.capability.yamlTouri-style docs (sync / sftp / tls / ssl_ensure)
platform/config/connector-capabilities/preflight.mjs⊆ doctor library + AQL ⊆ check + live fetch
platform/scripts/capability-preflight.mjsCLI (--live, --aql-only, capability_unavailable / capability_not_in_aql)
platform/test/capability-preflight.test.mjsUnit/regression (doctor + AQL)
core/.../capability-preflight-gate.mjsFail-closed gate for control
core/.../routes/llm.mjs + plans.mjs + apply-grants.mjsDeny before NL success / propose / grant issue
platform/bin/subactorSurfaces capability_unavailable / preflight_failed on ask
# Fixture (CI) — doctor ⊆ + AQL ⊆
node platform/scripts/capability-preflight.mjs --json
node platform/scripts/capability-preflight.mjs --aql-only --json
node platform/scripts/capability-preflight.mjs --require-publish-ready

# Live doctor from running urirun-node
URIRUN_NODE_TOKEN=$SUBACTOR_ADMIN_TOKEN \
  node platform/scripts/capability-preflight.mjs --live --via urirun --urirun-url http://127.0.0.1:18765 --json

# Live via bridge (in-compose)
BRIDGE_INTERNAL_URL=http://hr-bridge:8081 BRIDGE_SERVICE_TOKEN=… \
  node platform/scripts/capability-preflight.mjs --live --via bridge --json

Live doctor URI: plesk://host/doctor/query/report Shape: short keys + {available|boolean} + production_publish_ready. Pack ids use catalog aliases; plesk.site.sync is derived when SFTP is ready.

Packs (docs/www) declare: plesk.site.sync, plesk.transport.sftp, plesk.tls_san_check, plesk.ssl_ensure. letsencrypt stays not required — never claim public LE success.

Control env: CAPABILITY_PREFLIGHT=1 (default), CAPABILITY_PREFLIGHT_LIVE=1 (bridge/urirun when configured; else fixture). Inject CAPABILITY_DOCTOR_PATH or test doctorReport for red-path smoke.

What was refactored

  1. uri2verifycapability-plan CLI: hypervisor when contracts/ present, else touri registry.
  2. platform — live doctor normalize (availableready), CLI --live, pack/catalog SSL+SFTP alignment.
  3. core/control — fail-closed on /api/llm/intent + /api/plans/propose-from-intent.

No dockfra / vdisplay / hypervisor wholesale changes. No production DNS flip / no LE public success claim.

Test table (this continuation)

CheckResult
Unit fixture ⊆ packs (doctor)PASS
Unit live-shape normalize (available + short keys)PASS
Unit red sftp → capability_unavailablePASS
Unit pack caps ⊆ AQL (catalog + contracts)PASS
Unit unmapped / URI-not-allowed → capability_not_in_aqlPASS
CLI fixture exit 0 (+ aql_ok) / red exit 1PASS
CLI --aql-only exit 0PASS
Gate mocked red → deny (model_name: null)PASS
POST /api/apply-grants red doctor → 409 denyPASS
Live --via urirun against stackPASS when stack up (not claimed in offline CI)
TestQL thin wrapperShells CLI
Make / test:meta runs CLI doctor+AQLWired

Closed in this continuation

  1. AQL ⊆ CI — catalog aql.oql / aql.uri_processes + actor *.contract.aql allows; CLI --aql-only / default fixture run fails on capability_not_in_aql. Wired into make test-capability-preflight / npm run test:meta.
  2. Apply-grants defense in depthPOST /api/apply-grants denies when pack preflight would be red (capability_unavailable), audits apply_grant.denied_capability.

Remaining gaps

  1. touri voice/markpact flakes — unrelated; leave for tellmesh maintainers.
  2. PR9 DNS cutover / public LE — still blocked; do not claim success.
  3. logo pack — registered (pack + AQL + step-catalog); origin dry-run/apply still gated — no DNS flip.

Polish one-liner

Pack caps ⊆ live doctor and ⊆ AQL (catalog→URI/OQL + contract allows); control ask/propose/apply-grants fail-closed on red (capability_unavailable / capability_not_in_aql) — no DNS flip, no LE public success claim.