{"id":51351712,"url":"https://github.com/ouverz/governed_arr","last_synced_at":"2026-07-02T16:36:32.383Z","repository":{"id":367187912,"uuid":"1267216512","full_name":"ouverz/governed_arr","owner":"ouverz","description":"A dbt project showing end-to-end ARR definitions, compute, transformation, validation and governance","archived":false,"fork":false,"pushed_at":"2026-06-24T23:03:50.000Z","size":1105,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T00:12:32.430Z","etag":null,"topics":["arr","data","data-modeling","dbt-core","governance","semantic-layer","snowflake"],"latest_commit_sha":null,"homepage":"https://portfolio.oferkulka.com","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ouverz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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-06-12T10:31:05.000Z","updated_at":"2026-06-24T23:03:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ouverz/governed_arr","commit_stats":null,"previous_names":["ouverz/governed_arr"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ouverz/governed_arr","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ouverz%2Fgoverned_arr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ouverz%2Fgoverned_arr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ouverz%2Fgoverned_arr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ouverz%2Fgoverned_arr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ouverz","download_url":"https://codeload.github.com/ouverz/governed_arr/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ouverz%2Fgoverned_arr/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35055537,"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-07-02T02:00:06.368Z","response_time":173,"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":["arr","data","data-modeling","dbt-core","governance","semantic-layer","snowflake"],"created_at":"2026-07-02T16:36:31.218Z","updated_at":"2026-07-02T16:36:32.372Z","avatar_url":"https://github.com/ouverz.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ARR Semantic Layer Lab\n\nA minimal, production-shaped ARR metric product with governed definitions,\nrepeatable validation, and a clear operating model from raw inputs to\nconsumable metrics.\n\nThis repository demonstrates one certified business metric, Ending ARR,\nimplemented as a governed data product rather than a loose analytics demo.\nThe local MVP uses DuckDB for reproducible validation and includes the\nSnowflake deployment path as part of the operating model, not as an afterthought.\n\n## What this project proves\n\n- one metric can be defined explicitly and certified end to end;\n- business rules can be owned, versioned, tested, and reviewed;\n- public marts can be protected with contracts;\n- semantic consumption can sit on top of governed definitions; and\n- CI/CD can validate the pipeline before deployment.\n\n## What this project does not claim\n\n- it is not a full finance system;\n- it is not a live production ingestion pipeline in the local lab;\n- it does not prove a hosted dbt Semantic Layer query path locally; and\n- it is intentionally scoped to one metric, not a broad analytics platform.\n\n## Portfolio Highlights\n\n- One governed metric, Ending ARR, defined end to end.\n- Real ARR edge cases: billing intervals, discounts, exclusions, churn, reactivation, and renewals.\n- A documented metric contract, singular business tests, and model/unit tests that prove the logic.\n- A governed consumption story that distinguishes certified BI and AI reuse from raw-table interpretation.\n- A reproducible local build that reviewers can run with Docker only.\n\n## Selected visuals\n\nThese two views show the shape of the system without making the README a wall of text.\n\n![ARR lineage and transformation layers](\u003cimages/Screenshot 2026-06-22 at 23.26.22.png\u003e)\n\n![ARR fact and test nodes](\u003cimages/Screenshot 2026-06-22 at 23.27.46.png\u003e)\n\n## Pattern borrowed from mature revenue stacks\n\nThe project follows a pattern used by stronger revenue analytics teams: keep raw inputs separate, derive historical truth with effective dates, and expose a clean consumption layer on top. In practice that means the ARR logic is anchored in point-in-time snapshot facts rather than current-state rows, so month-end truth stays stable and explainable. The same separation also makes it easier to publish a certified dataset for BI or semantic consumption without asking downstream users to interpret raw source tables directly.\n\n## What is intentionally deferred\n\nThis repo is scoped as a lab rather than a full production platform.\nDeferred items include live Metabase dashboards, live Snowflake semantic execution in this workspace, recognized ARR reconciliation, production orchestration, row-level security, multi-currency, usage-based pricing, and historical type-2 account dimensions.\n\nThat boundary is deliberate: it keeps the case study focused on proving one metric deeply instead of spreading effort across too many unfinished surfaces.\n\n## Quick Start\n\nPrerequisite: a running Docker daemon.\n\n```bash\ndocker compose build\ndocker compose run --rm dbt build\ndocker compose run --rm --entrypoint python dbt scripts/query_results.py\n```\n\nExpected certified Ending ARR:\n\n```text\n2025-01-31 | 19560.00\n2025-02-28 | 21960.00\n2025-03-31 | 30600.00\n2025-04-30 | 30240.00\n2025-05-31 | 25320.00\n2025-06-30 | 25320.00\n```\n\nInspect the local deployment:\n\n```bash\nmake inspect\n```\n\nGenerate and serve dbt docs at `http://localhost:8080`:\n\n```bash\nmake docs\nmake docs-serve\n```\n\nConfigure `.env` from `.env.example`, then validate and deploy to Snowflake:\n\n```bash\nmake debug-prod\nmake build-prod\n```\n\n## Documentation\n\n1. [`docs/metric_contract_arr.md`](docs/metric_contract_arr.md) for the certified metric contract.\n2. [`docs/singular_business_tests.md`](docs/singular_business_tests.md) for the human-readable test catalog.\n3. [`snowflake_semantic_views/snowflake_revenue_metrics.sql`](snowflake_semantic_views/snowflake_revenue_metrics.sql) for the native Snowflake semantic view.\n4. [`docs/ci_cd.md`](docs/ci_cd.md) for GitHub Actions validation and Snowflake deployment.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fouverz%2Fgoverned_arr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fouverz%2Fgoverned_arr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fouverz%2Fgoverned_arr/lists"}