{"adoption": {"forks": 464, "observed_at": "2026-08-28T04:09:12.062882+00:00", "stars": 5202}, "canonical_url": "https://ross.abutalabs.com/products/loopx", "card": {"archived": false, "artifact_type": "framework", "description": "Long-horizon agent control plane for durable, governed work across Codex, Claude Code, and other harnesses.", "domain": ["developer-tools", "large-language-models"], "enriched": true, "function": ["agent-framework", "workflow-automation", "state-management", "scheduling"], "health_score": 100, "homepage": "https://my.feishu.cn/wiki/CaL5wMk9ui17ngkWzeUcMlAYnZg", "language": "Python", "license": "Apache-2.0", "license_family": "permissive", "maturity": "active", "member_repos": ["huangruiteng/loopx"], "name": "huangruiteng/loopx", "platform": ["python", "cli", "cross-platform"], "pushed_at": "2026-08-26T21:45:53+00:00", "repo": "huangruiteng/loopx", "stars": 5202, "tags": ["loop-engineering", "agent-ops", "agent-harness", "long-running-agents", "control-plane", "codex", "claude-code", "local-first", "ai-agents", "automation"], "topics": ["agent-control-plane", "ai-agents", "codex", "loopx", "loop-engineering", "agent-ops", "long-running-agents", "workflow-automation", "agent-harness", "long-horizon"], "urls": [], "use_cases": ["manage long-running AI agent goals across multiple sessions", "orchestrate Codex and Claude Code agents with durable state", "add governance and human review gates to agent workflows", "recover and resume interrupted agent work", "coordinate peer agent teams on long-horizon tasks", "track objectives, todos, and evidence for agent loops"], "what_it_is": "LoopX is a provider-neutral, local-first control plane for long-horizon AI agents that runs on top of agent harnesses like Codex, Claude Code, and Cursor. It provides durable state, governance, recovery, and human-agent collaboration so long-running work stays reviewable and restartable across turns, tools, and agents.", "when_to_avoid": ["you only need short single-turn LLM calls without state or governance", "you want a fully autonomous agent framework rather than a control plane over existing harnesses", "you need a mature enterprise product rather than an early-stage open-source tool"], "when_to_choose": ["you run long-horizon agent work that spans many turns or sessions", "you need durable state, quotas, and handoffs across different agent harnesses", "you want human oversight and governance over autonomous agent loops"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/loopx", "repo": "huangruiteng/loopx", "role": "main", "score": 80}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:09:12.062882+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:00:14.714576+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "45a7f1a14cecdd54aee5f4e608e0f3b34729e23fb54a16e10f9ae4aae3ac4119", "fetched_at": "2026-08-28T04:09:12.062882+00:00", "kind": "readme", "missing": false, "url": "https://github.com/huangruiteng/loopx"}, {"content_hash": "f4ec76cbdf30197709efcfc34b5fef65cdc7539781ccf7e4962003ed7cca448c", "fetched_at": "2026-08-29T08:55:33.509213+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/loopx/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 99, "longevity": 6, "rhythm": 99}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["young"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 94, "days_push": 7, "days_rel": 11, "gap_med": 1, "n_releases_24m": 42}, "score": 80, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}