{"id":50787996,"url":"https://github.com/marquesantero/cfa","last_synced_at":"2026-06-12T09:05:50.121Z","repository":{"id":346444469,"uuid":"1190001919","full_name":"marquesantero/cfa","owner":"marquesantero","description":"Governed execution kernel for AI-native systems with typed intent resolution, policy evaluation, state projection, and auditability.","archived":false,"fork":false,"pushed_at":"2026-06-06T21:52:55.000Z","size":1625,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T22:11:51.161Z","etag":null,"topics":["agentic-systems","ai","architecture","data-engineering","governance","llm","orchestration","python"],"latest_commit_sha":null,"homepage":"https://marquesantero.github.io/cfa/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marquesantero.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-23T21:54:38.000Z","updated_at":"2026-06-06T21:52:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/marquesantero/cfa","commit_stats":null,"previous_names":["marquesantero/cfa"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/marquesantero/cfa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marquesantero%2Fcfa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marquesantero%2Fcfa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marquesantero%2Fcfa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marquesantero%2Fcfa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marquesantero","download_url":"https://codeload.github.com/marquesantero/cfa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marquesantero%2Fcfa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34236624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentic-systems","ai","architecture","data-engineering","governance","llm","orchestration","python"],"created_at":"2026-06-12T09:05:49.327Z","updated_at":"2026-06-12T09:05:50.109Z","avatar_url":"https://github.com/marquesantero.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CFA — Contextual Flux Architecture\n\n[![CI](https://github.com/marquesantero/cfa/actions/workflows/ci.yml/badge.svg)](https://github.com/marquesantero/cfa/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/github/marquesantero/cfa/graph/badge.svg?token=P5NFQBZGYT)](https://codecov.io/github/marquesantero/cfa)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n[![Tests](https://img.shields.io/badge/tests-536%20passed-brightgreen)](https://github.com/marquesantero/cfa/actions/workflows/ci.yml)\n[![PyPI](https://img.shields.io/pypi/v/cfa-kernel)](https://pypi.org/project/cfa-kernel/)\n[![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-blue.svg)](https://www.python.org/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![Docs](https://img.shields.io/badge/docs-docusaurus-blue.svg)](https://marquesantero.github.io/cfa/)\n\n**A typed, pre-execution governance gate for AI agents and data pipelines.**\n\nYou declare what you intend to do as a `StateSignature`. CFA answers\n`approve`, `replan(remediations)`, or `block(reason)` — deterministically —\nin **under 3 ms p99** on a warm kernel, and writes the decision into a\nSHA-256 hash chain you can verify offline with `cfa audit verify`. No\nnetwork. No server. No keys.\n\n## Why CFA exists\n\nSix things CFA does today that no adjacent tool gives you together:\n\n1. **Structured remediation, not just yes/no.** When a fixable rule fails,\n   CFA returns the fix as data. The caller — an LLM agent, a CI step, a\n   human — applies it and retries. The recovery loop is part of the\n   contract, bounded at three attempts, and audited.\n   ```json\n   { \"action\": \"replan\",\n     \"faults\": [{\"code\": \"GOVERNANCE_RAW_PII_IN_PROTECTED_LAYER\", ...}],\n     \"interventions\": [\n       \"Set constraints.no_pii_raw=True\",\n       \"Apply sha256() on PII columns before the join\"\n     ]\n   }\n   ```\n\n2. **Offline-verifiable audit chain.** Every decision is a\n   content-hashed event linked into a SHA-256 chain. `cfa audit verify`\n   replays the chain on any host that has the JSONL file. No vendor, no\n   server, no API key.\n   ```bash\n   $ cfa audit verify --file audit.jsonl\n   OK · 1 274 events verified · last_hash=a4f3…6c01\n   ```\n\n3. **Dataset-aware policy primitives baked in.** PII columns,\n   partitioning, classification, merge keys, target layer — these are\n   first-class primitives, not metadata you re-encode in Rego. A typical\n   rule fits in six YAML lines:\n   ```yaml\n   - name: forbid_raw_pii\n     condition: pii_in_protected_layer\n     action: block\n     fault_code: GOVERNANCE_RAW_PII\n     severity: critical\n     remediation: [\"Apply sha256() on PII columns before the write\"]\n   ```\n\n4. **One signature, three production backends.** The same approved\n   `StateSignature` compiles to PySpark + Delta Lake, ANSI SQL with\n   `MERGE INTO`, or dbt models with `schema.yml`. Each backend declares\n   its own forbidden tokens for static validation. New backends register\n   through `BackendRegistry` without touching the kernel.\n\n5. **MCP server, working today.** Any MCP-compatible agent (Claude\n   Desktop, Cursor, Continue, custom LangGraph nodes) calls CFA before\n   it touches production data. Five tools: `cfa_evaluate_signature`,\n   `cfa_describe_rules`, `cfa_explain_fault`, `cfa_audit_check`,\n   `cfa_list_backends`.\n\n6. **Deterministic by default; LLM is opt-in.** The decision path is a\n   pure function of `(signature, policy_bundle, catalog)`. Same inputs\n   produce the same decision and the same hash, every time, with no\n   network call. LLMs participate only on the front edge (intent →\n   signature) and only if you ask for them via the `[llm]` extra.\n\nEach of these is a recorded\n[Architecture Decision Record](docs/adr/). The reasoning, the\nalternatives we rejected, and the boundaries are written down.\n\n## Quick start\n\n```bash\npip install cfa-kernel\ncfa init\ncfa evaluate \"Join NFe with Clientes and persist to Silver\" \\\n  --catalog .cfa/catalog.json\n```\n\nFor a real CI gate, the four-line decorator form:\n\n```python\nfrom cfa.adapters import cfa_guard\n\n@cfa_guard(\"Join NFe with Clientes anonymize CPF persist Silver\",\n           policy_bundle=\"policies/prod-v1.yaml\", catalog=CATALOG)\ndef my_pipeline(): ...\n```\n\nThe decorator caches a single `KernelOrchestrator` per guard and adds\n~2.4 ms p99 to your call. Production-friendly.\n\n## Where CFA pairs (instead of replacing)\n\nCFA is **not** an LLM observability tool, a generic policy engine, a\ndata catalog, or a data-quality-at-rest tool. Pair with LangSmith /\nPhoenix / Patronus, OPA, Unity Catalog / Atlan / DataHub, and Great\nExpectations / Soda respectively. The [Compare](https://marquesantero.github.io/cfa/docs/compare)\npage has the side-by-side breakdowns.\n\n## What CFA does\n\n| Step | What happens |\n|------|-------------|\n| **Formalize** | Natural language or JSON → typed `StateSignature` contract |\n| **Govern** | Policy Engine evaluates PII, cost, schema, partition constraints |\n| **Generate** | Execution planner + deterministic code generation (PySpark, SQL, dbt) |\n| **Execute** | Pluggable sandbox with metrics collection + runtime validation |\n| **Validate** | State projection, SHA-256 audit trail, lifecycle indices |\n\n## Surfaces\n\nAll interfaces are backend-agnostic. CFA evaluates a `StateSignature` contract — however it was produced.\n\n| Surface | For | Example |\n|---------|-----|---------|\n| `cfa` CLI | Everyone | `cfa policy check --signature sig.json` |\n| `cfa catalog` CLI | Data platform teams | `cfa catalog validate catalog.json` |\n| `cfa policy` CLI | Security/compliance | `cfa policy validate policies/prod.yaml` |\n| `cfa storage` CLI | Operations | `cfa storage stats --db cfa.db` |\n| `cfa lifecycle` CLI | Platform teams | `cfa lifecycle evaluate --db cfa.db` |\n| `cfa signature` CLI | External systems | `cfa signature validate request.json` |\n| `cfa.testing` | CI/CD | `evaluate(\"intent\", catalog=catalog)` with pytest |\n| `cfa.runtime` | Production | `RuntimeGate` as decorator/context-manager |\n| `cfa.mcp` | AI agents | MCP server for any MCP-compatible client |\n| `cfa.adapters` | Any framework | Universal `cfa_guard` decorator (LangGraph, CrewAI, AutoGen, DSPy, OpenAI Agents SDK) |\n\n## Architecture\n\n```text\nCLI / MCP / Adapter / API\n        │\n        ▼\n   ┌─ Formalize ──┐   NL / JSON / Tool call → typed StateSignature contract\n   ├─ Govern ──────┤   Policy check + REPLAN cycle (approve / replan / block)\n   ├─ Generate ────┤   Plan + code (PySpark / SQL / dbt) + static validation\n   ├─ Execute ─────┤   Pluggable sandbox + runtime validation\n   └─ Validate ────┘   State projection + SHA-256 audit + lifecycle indices\n                           │\n                           ▼\n            Decision JSON / Audit Trail / OTel / Prometheus\n```\n\n## Capabilities\n\n| Capability | What it gives you |\n|------------|-------------------|\n| SHA-256 audit trail | Tamper-evident chain of decisions, verifiable offline (`cfa audit verify`) |\n| State projection | Each execution carries the typed state of the prior one — no implicit globals |\n| Lifecycle indices (IFo/IFs/IFg/IDI) | Quantifies how often an intent recurs, stabilizes, and qualifies for promotion to a reusable skill |\n| REPLAN cycle | Failed policy checks emit a structured remediation, not a hard stop |\n| Backend-agnostic codegen | Same signature compiles to PySpark, ANSI SQL, or dbt — pluggable via `BackendRegistry` |\n| Artifact hashing | Catalog, policy bundle, and signature are content-hashed and bound to every decision |\n| MCP protocol | Any MCP-compatible agent can call CFA as a governance tool |\n| SQLite + JSONL storage | First-class persistence with stats, retention cleanup, and vacuum |\n| Config auto-discovery | `cfa.yaml` walked up the tree; all CLI commands respect it |\n| Zero core dependencies | Optional extras for `yaml`, `otel`, `mcp`, `llm` — none required for the kernel |\n\n## CLI\n\n```bash\n# Governance \u0026 evaluation\ncfa evaluate \"intent\" --catalog catalog.json --strict\ncfa policy check --signature signature.json --policy-bundle policies/prod.yaml\ncfa policy check --signature sig.json --catalog cat.json --strict --audit-log audit.jsonl\n\n# Validation (CI-ready with JSON output and exit codes)\ncfa catalog validate catalog.json --require-datasets --format json\ncfa signature validate signature.json --format json\ncfa policy validate policies/prod.yaml --format json\n\n# Audit \u0026 verification\ncfa audit show --id INTENT_ID --file audit.jsonl --format json\ncfa audit verify --file audit.jsonl\n\n# Policy rules\ncfa rules list\ncfa rules explain FAULT_CODE\n\n# Storage management\ncfa storage stats --db cfa.db --format json\ncfa storage cleanup --db cfa.db --retention 90\ncfa storage vacuum --db cfa.db\n\n# Lifecycle management\ncfa lifecycle evaluate --db cfa.db --window 30\ncfa lifecycle list --db cfa.db\n\n# Project health\ncfa status --format json\n\n# Bootstrap\ncfa init\n\n# Backends\ncfa backend list\n```\n\n## From Python\n\n```python\nfrom cfa.testing import evaluate, assert_passed\n\nresult = evaluate(\n    \"Join NFe with Clientes and persist to Silver\",\n    catalog=MY_CATALOG,\n    policy_rules=my_rules,\n    backend=\"pyspark\",\n)\nassert_passed(result)\n```\n\n### Policy check with audit\n\n```python\nfrom cfa.policy.engine import PolicyEngine\nfrom cfa.types import StateSignature\n\nsignature = StateSignature.from_dict(signature_dict)\nengine = PolicyEngine(policy_bundle_version=\"prod-v1.0\")\nresult = engine.evaluate(signature)\n# result.action → approve / replan / block\n```\n\n### Runtime gate\n\n```python\nfrom cfa.runtime import RuntimeGate, GateConfig\n\ngate = RuntimeGate(\n    config=GateConfig(policy_bundle=\"prod_v1.0\", sandbox=\"mock\"),\n    catalog=PROD_CATALOG,\n)\n\n@gate.guard(\"aggregate sales with PII protected\")\ndef my_pipeline():\n    ...\n```\n\n### SQLite storage\n\n```python\nfrom cfa.storage import SqliteStorage\n\nstore = SqliteStorage(\"cfa.db\")\nstore.ensure_schema()\n\n# Audit\nstore.audit_append(event)\n\n# Execution records (lifecycle)\nstore.execution_append(record_dict)\n\n# Lifecycle skills\nstore.skill_upsert(\"hash_a\", skill_data)\n```\n\n## Policy Bundles\n\nDeclarative YAML policy rules — separate governance from code:\n\n```yaml\n# policies/prod-v1.yaml\npolicy_bundle:\n  version: \"prod-v1.0\"\n  rules:\n    - name: forbid_raw_pii\n      condition: pii_in_protected_layer\n      action: block\n      fault_code: GOVERNANCE_RAW_PII\n      severity: critical\n      message: \"PII in protected layer without anonymization.\"\n      remediation:\n        - \"Apply sha256 on PII columns before the operation\"\n```\n\nValidated at load time — unknown conditions, duplicate fault codes, and invalid enums are caught immediately.\n\n## Config File\n\n```yaml\n# cfa.yaml (auto-discovered by all commands)\nversion: \"1.0\"\nstorage:\n  backend: sqlite\n  path: cfa.db\n  retention_days: 90\ndefaults:\n  catalog: .cfa/catalog.json\n  policy_bundle: .cfa/policies/prod-v1.yaml\n  backend: pyspark\n```\n\n## Backends\n\nThree governed code generation backends, all pluggable via `BackendRegistry`:\n\n| Backend | Language | Features |\n|---------|----------|----------|\n| `pyspark` | PySpark + Delta Lake | Merge, partition overwrite, PII anonymization |\n| `sql` | ANSI SQL | MERGE INTO, INSERT OVERWRITE, partition clauses |\n| `dbt` | dbt models + schema.yml | Config blocks, refs, not_null/unique tests, PII annotations |\n\nEach backend declares its own forbidden tokens for static validation.\n\n## MCP Server\n\nExpose CFA governance to any AI agent via Model Context Protocol:\n\n```json\n{\n  \"mcpServers\": {\n    \"cfa\": {\n      \"command\": \"python\",\n      \"args\": [\"-m\", \"cfa.mcp\"]\n    }\n  }\n}\n```\n\n5 tools: `cfa_evaluate_signature`, `cfa_describe_rules`, `cfa_explain_fault`, `cfa_audit_check`, `cfa_list_backends`.\n\n## Repository\n\n```text\nsrc/cfa/\n├── core/              Kernel, Planner, CodeGen, Conditions, Phases\n├── policy/            PolicyEngine, PolicyBundle, catalog validation, standalone-governance surface\n├── resolve/           Intent → StateSignature (rule-based + LLM backends, confirmation orchestrator)\n├── validate/          Static, runtime, and signature validation\n├── obs/               Metrics, OTel, Notify, Indices, Promotion\n├── behavior/          BehaviorSpec + Systematizer (human intent → policy rules)\n├── audit/             AuditTrail, Context, Hashing\n├── lifecycle/         IFo/IFs/IFg/IDI indices + Promotion/Demotion engine\n├── execution/         Partial execution, State projection\n├── adapters/          Universal cfa_guard decorator for any framework\n├── backends/          PySpark, SQL, dbt (pluggable)\n├── sandbox/           Pluggable sandbox backend + registry + executor\n├── cli/               CLI commands by family (core/, governance/, reporting/, project/, infrastructure/)\n├── storage/           SQLite + JSONL backends (stats, cleanup, vacuum)\n├── mcp/               MCP server (JSON-RPC over stdio)\n├── reporting/         HTML reports\n├── runtime/           Production governance gate\n├── testing/           pytest-native evaluate() + fixtures\n├── config.py          CFA config (discovery, defaults)\n├── types.py           StateSignature, Fault, KernelResult\n└── _lazy.py           Reusable lazy loader for package __init__\n```\n\n\u003e The 1.1.0 cycle consolidated five packages from the 1.0.0 layout: `governance` → `policy`, `validation` → `validate`, `observability` → `obs`, `normalizer` + `resolution` → `resolve`. `adapters/` lost the per-framework shim files (langgraph/crewai/autogen/dspy/openai_agents) in favor of a single universal decorator.\n\n## Docs\n\nAll documentation at **[marquesantero.github.io/cfa](https://marquesantero.github.io/cfa/)**:\n\n- [Getting Started](https://marquesantero.github.io/cfa/docs/getting-started)\n- [CLI Reference](https://marquesantero.github.io/cfa/docs/cli)\n- [Policy Bundles](https://marquesantero.github.io/cfa/docs/policy-bundles)\n- [Backends](https://marquesantero.github.io/cfa/docs/backends)\n- [MCP Server](https://marquesantero.github.io/cfa/docs/mcp-server)\n- [Reporting](https://marquesantero.github.io/cfa/docs/reporting)\n- [Architecture Notes](https://marquesantero.github.io/cfa/docs/architecture-notes)\n- [FAQ](https://marquesantero.github.io/cfa/docs/faq)\n\n## Demos\n\nTwo complete notebooks, tested on Databricks with CFA 1.0.0, 0 errors:\n\n| File | Format | Description |\n|------|--------|-------------|\n| `demos/cfa_demo_complete` | `.dbc` / `.py` | Rule-based governance — APPROVE, REPLAN, BLOCK, codegen, audit, storage |\n| `demos/cfa_llm_demo_complete` | `.dbc` / `.py` | LLM-powered — semantic normalizer, systematizer, strict mode, compare |\n\nImport the `.dbc` into Databricks or run the `.py` files anywhere.\n\n## Extending CFA\n\nCFA is built so that adding a **vertical** (a new domain to govern —\ninfrastructure, agent tool calls, financial transactions, ML deploys)\nor an **integration** (a new way to feed signatures in and emit decisions\nout) is a pip-installable package. You do not edit the kernel.\n\n```toml\n# pyproject.toml of your plugin\n[project.entry-points.\"cfa.verticals\"]\nmyapp = \"cfa_vertical_myapp.vertical:MyappVertical\"\n\n[project.entry-points.\"cfa.integrations\"]\nmytool = \"cfa_int_mytool.integration:MyToolIntegration\"\n\n[project.entry-points.\"cfa.decision_sinks\"]\nslack = \"cfa_sink_slack.sink:SlackWebhookSink\"\n```\n\nReference contracts:\n[ADR-0007](docs/adr/0007-layered-architecture.md),\n[ADR-0009](docs/adr/0009-vertical-protocol.md),\n[ADR-0010](docs/adr/0010-integration-protocol.md).\nFull guide: [Extending CFA](https://marquesantero.github.io/cfa/docs/extending).\n\n## Roadmap\n\nCFA is a typed layer between **intent** and **execution**. Data writes\nwere the first vertical because the maintainer is a data engineer with\nprimitives that were easy to test. The kernel itself is domain-agnostic —\nevery additional vertical (infrastructure, agent tool calls, financial\ntransactions, schema migrations, ML model deploys) plugs in as an\nexternal package via the\n[Vertical](docs/adr/0009-vertical-protocol.md) contract.\n\nThe strategy from 1.2.0 forward — formalised in\n[ADR-0013](docs/adr/0013-protocol-over-product.md) — is **dual-track**:\nevery release ships one substrate deliverable (something that survives\nmultiple hype cycles) and one adoption deliverable (something useful\nthis quarter). Cadence: 6–8 weeks per minor.\n\nFull plan in [`drafts/ROADMAP.md`](drafts/ROADMAP.md). Headline picks:\n\n| Release | Substrate | Adoption |\n|---------|-----------|----------|\n| **1.1.0** (current) | Plug contracts (ADR-0007 → 0012), vertical-aware `StateSignature`, 599 tests, perf baselines | Honest positioning, MCP server, `compare.md`, ADRs |\n| **1.2.0** (next) | `cfa-protocol v0.1` in a separate repo — JSON Schema for signature, audit chain, decision, policy bundle; conformance suite | `cfa dbt check` — reads `manifest.json`, runs the policy bundle in CI; GitHub Action template; demo project |\n| **1.3.0** | Standalone Go binary `cfa-verify` — validates audit chains and signatures without Python | `cfa.verticals.agent` + reference LangGraph + Claude demo: agent tries to delete prod, CFA blocks with remediation |\n| **1.4.0** | TypeScript signature builder (`@cfa/protocol`); `cfa-hub` catalog of verticals/bundles/sinks | Airflow `CFAGateOperator`; Slack / OTel / GitHub PR DecisionSinks; `cfa.verticals.infra` + `cfa terraform check` |\n| **1.5.0** | Conformance badge + `cfa-protocol v0.5`; spec stability milestones | Live dashboard, lifecycle CLI, 2-3 case studies |\n| **2.0.0** | `cfa-protocol 1.0` stable; third-party security audit; governance process | Multi-vertical in real production; 5+ implementations (Python + Go + TS + 2 others) |\n\nThe protocol becomes the product. The Python kernel is *one*\nimplementation. Verticals, integrations, decision sinks are shipped or\nmaintained externally. The substrate survives whatever framework wins\nin 2027.\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md) for development setup, test conventions, and the PR checklist. By participating, you agree to the [Code of Conduct](./CODE_OF_CONDUCT.md). Security issues: see [SECURITY.md](./SECURITY.md).\n\n## License\n\n[MIT](./LICENSE) · [Antero Marques](https://github.com/marquesantero)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarquesantero%2Fcfa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarquesantero%2Fcfa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarquesantero%2Fcfa/lists"}