Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
658 commits
Select commit Hold shift + click to select a range
aceb1a0
DEV-1643: public column-type API; reduce converter cognitive complexity
ZmeiGorynych Jul 6, 2026
7bea588
DEV-1643: probe the real type of brand-new derived fields
ZmeiGorynych Jul 6, 2026
30175c5
DEV-1643: type single cross-model derived field refs from the target …
ZmeiGorynych Jul 6, 2026
f7a5b80
DEV-1643: reset dropped time default; single-file suffix filter; kwargs
ZmeiGorynych Jul 6, 2026
c26d112
DEV-1643: reject unsafe OSI dataset names (path-traversal hardening)
ZmeiGorynych Jul 6, 2026
56619f7
DEV-1643: avoid /tmp literal in path-safety test (Sonar S5443)
ZmeiGorynych Jul 6, 2026
c95f6dd
DEV-1643: normalize Snowflake/Databricks expressions to default SQL
ZmeiGorynych Jul 6, 2026
616f4a9
Always reject unprojected joined ORDER BY; xfail the deferred capabil…
ZmeiGorynych Jul 7, 2026
8c7bbf2
Deduplicate joined-ORDER-BY test setups to clear Sonar duplication ga…
ZmeiGorynych Jul 7, 2026
55d5393
Merge pull request #224 from MotleyAI/egor/dev-1645-slayer-compiler-e…
ZmeiGorynych Jul 7, 2026
efa9e4d
Bump version to 0.9.4
ZmeiGorynych Jul 7, 2026
57c1dae
Merge pull request #225 from MotleyAI/egor/bump-0.9.4
ZmeiGorynych Jul 7, 2026
5aeac1f
Instruct agents to call help() before any other SLayer tool (DEV-1652)
ZmeiGorynych Jul 7, 2026
f9f1885
Merge pull request #226 from MotleyAI/egor/dev-1652-make-sure-to-tell…
ZmeiGorynych Jul 7, 2026
b9791d3
Merge pull request #220 from MotleyAI/egor/dev-1627-allow-join-constr…
whimo Jul 7, 2026
3ca6c68
Refine README
whimo Jul 7, 2026
e09f084
Expose per-task MCP query engine for teardown (DEV-1656)
ZmeiGorynych Jul 7, 2026
7799955
Merge pull request #227 from MotleyAI/egor/dev-1656-slayer-mcp-expose…
ZmeiGorynych Jul 7, 2026
2f5b6b2
Bump version to 0.9.5
ZmeiGorynych Jul 7, 2026
925995d
Merge pull request #228 from MotleyAI/chore/bump-version-0.9.5
ZmeiGorynych Jul 7, 2026
e7dab29
ReDoS protection
AivanF Jul 8, 2026
035859b
Handle errors in Pg facade
AivanF Jul 8, 2026
260c70d
Collect timing data
AivanF Jul 8, 2026
602fc6b
Merge pull request #221 from MotleyAI/aivan/2026-07-03-Postgres-facad…
AivanF Jul 8, 2026
2c62ad4
Fix quoting in WHERE of Pg facade
AivanF Jul 8, 2026
f6b0c23
Convert help() to inspect(memory:help.*) + per-file .md memories (DEV…
ZmeiGorynych Jul 9, 2026
6b8b89e
Apply help_content rewrites (help() -> memory:help.*, inspect_model -…
ZmeiGorynych Jul 9, 2026
e15318f
Address review feedback (Codex + CodeRabbit + Sonar) on DEV-1658
ZmeiGorynych Jul 9, 2026
4d26825
Re-assert help-memory invariant metadata on warm re-seed (Codex)
ZmeiGorynych Jul 9, 2026
d574087
Better Pg facade tests
AivanF Jul 9, 2026
986745a
DEV-1667: inspect null-reference collection views
ZmeiGorynych Jul 10, 2026
e589c8a
DEV-1667: address review feedback (Codex + Sonar)
ZmeiGorynych Jul 10, 2026
da70a97
DEV-1667: keep entity_type required on the MCP inspect tool
ZmeiGorynych Jul 10, 2026
5dae88d
DEV-1667: docs — inspect reference flag is optional (collection)
ZmeiGorynych Jul 10, 2026
a87073f
Merge pull request #230 from MotleyAI/egor/dev-1658-convert-help-call…
ZmeiGorynych Jul 10, 2026
0c0e042
DEV-1667: address CodeRabbit review
ZmeiGorynych Jul 10, 2026
db8aac7
Merge pull request #231 from MotleyAI/egor/dev-1667-slayer-inspect-nu…
ZmeiGorynych Jul 10, 2026
1a7dcc4
Bump version to 0.9.6
ZmeiGorynych Jul 10, 2026
cdbf36d
Merge pull request #232 from MotleyAI/chore/bump-version-0.9.6
ZmeiGorynych Jul 10, 2026
3ef88a0
DEV-1669: guard + best-effort help-seeding in create_mcp_server
ZmeiGorynych Jul 11, 2026
4d0befa
DEV-1669: silence intentional-in-test Sonar issues; strengthen opt-ou…
ZmeiGorynych Jul 11, 2026
a49c6c6
Merge remote-tracking branch 'origin/main' into egor/dev-1587-basic-p…
ZmeiGorynych Jul 13, 2026
f3a24de
Bump version to 0.9.7
ZmeiGorynych Jul 13, 2026
6cde1e2
Merge pull request #222 from MotleyAI/egor/dev-1587-basic-per-query-c…
ZmeiGorynych Jul 13, 2026
46554ed
Merge pull request #234 from MotleyAI/chore/bump-version-0.9.7
ZmeiGorynych Jul 13, 2026
e8e4986
Merge pull request #233 from MotleyAI/egor/dev-1669-slayer-create_mcp…
ZmeiGorynych Jul 13, 2026
246ee27
Merge remote-tracking branch 'origin/main' into egor/dev-1643-ingest-…
ZmeiGorynych Jul 14, 2026
bc30409
DEV-1643: add OSI import demo notebook (examples/13_osi_import)
ZmeiGorynych Jul 14, 2026
21c8a8a
Merge branch 'main' into aivan/2026-07-06-Postgres-facade-fixes
AivanF Jul 14, 2026
939304a
DEV-1643: address review feedback (Codex + Sonar)
ZmeiGorynych Jul 14, 2026
889c625
DEV-1643: hoist _args() out of pytest.raises block (Sonar S5778)
ZmeiGorynych Jul 14, 2026
3f0d39e
DEV-1643: correct clean-fail doc — failures go to the report, not met…
ZmeiGorynych Jul 14, 2026
b2351dc
DEV-1643: sharpen clean-fail doc precision (Codex)
ZmeiGorynych Jul 14, 2026
c05eab1
Merge pull request #229 from MotleyAI/aivan/2026-07-06-Postgres-facad…
AivanF Jul 14, 2026
fa23569
Refresh Postgres facade schema
AivanF Jul 14, 2026
4dfff65
DEV-1643: add agent-workflow (CLI + MCP) OSI demo notebook
ZmeiGorynych Jul 15, 2026
3518437
DEV-1643: rewrite OSI example intro as a clean step-by-step quickstart
ZmeiGorynych Jul 15, 2026
f7e7577
Fix from review
AivanF Jul 15, 2026
3855a86
Merge pull request #223 from MotleyAI/egor/dev-1643-ingest-osi-semant…
ZmeiGorynych Jul 15, 2026
d591537
Bump version to 0.9.8
ZmeiGorynych Jul 15, 2026
94e49f4
Merge pull request #236 from MotleyAI/chore/bump-version-0.9.8
ZmeiGorynych Jul 15, 2026
4aa6fc7
Fixes from Egor review
AivanF Jul 15, 2026
6f50ee1
Merge pull request #235 from MotleyAI/aivan/dev-1674-update-postgres-…
AivanF Jul 15, 2026
4c0eb1e
Sample values in column inspect only, not in ingest
AivanF Jul 15, 2026
33f21b8
Merge pull request #237 from MotleyAI/aivan/2026-07-15-ingest+column-…
AivanF Jul 15, 2026
3aeddc1
Quote SQL reserved-word identifiers in generated SQL (DEV-1686)
ZmeiGorynych Jul 16, 2026
0089677
Expand reserved-word set to close curation gaps (DEV-1686, Codex review)
ZmeiGorynych Jul 16, 2026
90e4d78
Reduce prequote_reserved_identifiers cognitive complexity (DEV-1686, …
ZmeiGorynych Jul 16, 2026
17c4c04
Discover joins for derived columns referencing a reserved joined mode…
ZmeiGorynych Jul 16, 2026
cb3888e
Make reserved-join discovery quote-tolerant across dialects (DEV-1686…
ZmeiGorynych Jul 16, 2026
bdb55f4
Dedupe DEV-1686 tests + document bare-keyword-column limitation (Sona…
ZmeiGorynych Jul 16, 2026
7ffe69e
Pass sql= by keyword to prequote_reserved_identifiers (CodeRabbit)
ZmeiGorynych Jul 16, 2026
351bc7a
Merge pull request #238 from MotleyAI/egor/dev-1686-slayer-generates-…
ZmeiGorynych Jul 17, 2026
a87af67
Bump version to 0.9.9
ZmeiGorynych Jul 17, 2026
fba3df2
Merge pull request #239 from MotleyAI/chore/bump-version-0.9.9
ZmeiGorynych Jul 17, 2026
3ff5978
Fix datasource passwords with reserved chars producing malformed URLs
ZmeiGorynych Jul 18, 2026
b686cc1
Preserve host:port-in-host backward compat in connection URL
ZmeiGorynych Jul 18, 2026
ac52248
Handle bracketed IPv6 hosts in connection URL normalization
ZmeiGorynych Jul 18, 2026
b197c97
Clarify connection-URL comment on database path encoding
ZmeiGorynych Jul 18, 2026
f04974b
Raise on port specified both in host and port field
ZmeiGorynych Jul 18, 2026
6b0f8a2
Pass drivername as keyword to URL.create (CodeRabbit)
ZmeiGorynych Jul 18, 2026
b4b1989
Document credential URL-encoding for component fields (from #241)
ZmeiGorynych Jul 18, 2026
50f8d26
Address CodeRabbit: clarify encoding scope + cover reserved-char user…
ZmeiGorynych Jul 19, 2026
3482a38
Merge pull request #243 from MotleyAI/egor/issue-240-union-datasource…
ZmeiGorynych Jul 19, 2026
fc7ca8f
Bump version to 0.9.10
ZmeiGorynych Jul 19, 2026
34baa4a
Merge pull request #244 from MotleyAI/chore/bump-version-0.9.10
ZmeiGorynych Jul 19, 2026
a4ff15a
Mask inline BigQuery credentials
mattfaltyn Jul 19, 2026
ace371d
Document datasource credential masking
mattfaltyn Jul 19, 2026
b1c9640
Fix duplicate CTE name when a query has multiple arithmetic-wrapped t…
whimo Jul 20, 2026
81c01ab
Reword change/change_pct/time_shift transform docs (DEV-1693)
whimo Jul 20, 2026
47faa1e
Address review: change_pct NULL guard, time_shift offset wording, gap…
whimo Jul 20, 2026
e4a402c
Collision-check hidden transform name allocation
whimo Jul 20, 2026
66d9ca9
Reserve dimension names against hidden transform allocation
whimo Jul 20, 2026
e2aabd0
Update docs/configuration/datasources.md
whimo Jul 20, 2026
5081c6e
Merge pull request #246 from mattfaltyn/agent/mask-bigquery-credentials
whimo Jul 20, 2026
15b29b0
Merge pull request #247 from MotleyAI/artemy/dev-1692-multiple-time_s…
whimo Jul 20, 2026
0f7031c
Bump version to 0.9.11
whimo Jul 20, 2026
dc2ecad
Merge pull request #248 from MotleyAI/chore/bump-version-0.9.11
whimo Jul 20, 2026
2e4fdd5
Add curated semantic enrichment to the Jaffle Shop demo
whimo Jul 20, 2026
e070bd2
Address review: guard non-table-backed models, refactor, copy spec ob…
whimo Jul 21, 2026
e69a3ed
Update metabase e2e column count for enriched demo measures
whimo Jul 21, 2026
152aa06
Move DEMO_ENRICHMENT import to module scope
whimo Jul 21, 2026
a835869
Trim comments and docstrings; drop internal issue IDs
whimo Jul 21, 2026
cdeadff
Merge pull request #250 from MotleyAI/artemy/demo-enrichment
whimo Jul 21, 2026
5c50e6b
Reject case-colliding ids across all storage backends
whimo Jul 22, 2026
e17e7db
Keep save_datasource backend-implemented; expose the check as a publi…
whimo Jul 22, 2026
1fd0353
Trim docstrings and comments to the essentials
whimo Jul 22, 2026
4bf77dc
Scope case-collision rejection to the YAML backend
whimo Jul 22, 2026
8ad935f
Address review: on-disk pair pre-check, async docs example, kwarg calls
whimo Jul 22, 2026
83e7039
Merge pull request #252 from MotleyAI/artemy/id-case-collision
whimo Jul 22, 2026
3c04ce3
MCP tools fixes
AivanF Jul 24, 2026
62653dc
Inspect tool label fix
AivanF Jul 24, 2026
98c7d7b
Merge pull request #253 from MotleyAI/aivan/dev-1690-MCP-tools-fixes
AivanF Jul 24, 2026
9595b87
Bump version to 0.9.12
whimo Jul 25, 2026
82c6d0d
DEV-1704 Stage 0: merge origin/main into the typed pipeline + parity …
ZmeiGorynych Jul 26, 2026
66ebe22
DEV-1704: address Stage-0 merge review — restore RLS + disposal, defe…
ZmeiGorynych Jul 26, 2026
c31f193
DEV-1715: re-wire per-query cache (DEV-1587) into the typed pipeline
ZmeiGorynych Jul 27, 2026
a906b6b
DEV-1715: address PR #254 review (Codex + CodeRabbit + Sonar)
ZmeiGorynych Jul 27, 2026
8a0b6cc
Remove stale help→inspect parity pin (DEV-1658/DEV-1717)
ZmeiGorynych Jul 27, 2026
9d30f95
Declutter CLAUDE.md, separate design decisions log
whimo Jul 27, 2026
b12968c
DEV-1704: integration triage — fix RLS get_column_types gap, pin inte…
ZmeiGorynych Jul 27, 2026
f40e01f
DEV-1704: typed Mode-B filter parser accepts the SQL LIKE operator (f…
ZmeiGorynych Jul 27, 2026
baae7b7
DEV-1704: fix CI — unpin the slayer.help-deletion test (false pin fro…
ZmeiGorynych Jul 27, 2026
3d6d55f
DEV-1716: route typed generator emission through slayer/sql/dialects/
ZmeiGorynych Jul 27, 2026
49d3218
Merge remote-tracking branch 'origin/egor/dev-1704-dev-1703-stage-0-m…
ZmeiGorynych Jul 27, 2026
6426596
Unknown type
AivanF Jul 27, 2026
894339e
DEV-1717: engine-parity batch — recommend_root_model, count_distinct_…
ZmeiGorynych Jul 27, 2026
853c307
Merge remote-tracking branch 'origin/egor/dev-1704-dev-1703-stage-0-m…
ZmeiGorynych Jul 27, 2026
774f3aa
Merge remote-tracking branch 'origin/egor/dev-1704-dev-1703-stage-0-m…
ZmeiGorynych Jul 27, 2026
8ca9b77
DEV-1716: dialect-quote the planned-path emission (time-shift / cross…
ZmeiGorynych Jul 27, 2026
d4a5b99
DEV-1716: address review — query-backed wrapped-ref mangling + Sonar/…
ZmeiGorynych Jul 27, 2026
6aa233a
Fix review comments
whimo Jul 27, 2026
6e863a4
DEV-1716: harden T-SQL multi-stage test to reject dotted bracketed id…
ZmeiGorynych Jul 27, 2026
6e200f4
DEV-1717: reject non-aggregating measures with a clear error (round/a…
ZmeiGorynych Jul 27, 2026
44c7f05
DEV-1716: normalize week_sunday -> WEEK in TsqlDialect.build_time_off…
ZmeiGorynych Jul 27, 2026
7bdf323
DEV-1716: decode alias-mangled stage aliases in build_flat_rename_wra…
ZmeiGorynych Jul 27, 2026
fbcec07
DEV-1716: decode mangled probe keys in get_column_types + test import…
ZmeiGorynych Jul 27, 2026
d685377
Merge pull request #257 from MotleyAI/egor/dev-1716-dev-1703-route-ty…
ZmeiGorynych Jul 27, 2026
6fef652
Merge remote-tracking branch 'origin/egor/dev-1704-dev-1703-stage-0-m…
ZmeiGorynych Jul 27, 2026
03b68c8
Merge remote-tracking branch 'origin/egor/dev-1704-dev-1703-stage-0-m…
ZmeiGorynych Jul 27, 2026
aba2f3c
DEV-1715: scan refresh keys by datasource fingerprint, not name (Codex)
ZmeiGorynych Jul 27, 2026
63ed24b
DEV-1715: pin refresh() re-exec to the entry's datasource identity (C…
ZmeiGorynych Jul 27, 2026
a73d0dc
DEV-1715: document refresh() datasource-identity pinning + query-back…
ZmeiGorynych Jul 27, 2026
a74c54c
DEV-1717: address PR #258 review (Codex + CodeRabbit + Sonar)
ZmeiGorynych Jul 27, 2026
bc6d162
Fixes from review
AivanF Jul 27, 2026
12029cf
DEV-1715: dedupe repointed-datasource test setup (Sonar duplication g…
ZmeiGorynych Jul 27, 2026
881967c
DEV-1717: facade catalog infers count_distinct_approx as INT (Codex)
ZmeiGorynych Jul 27, 2026
f069b79
Merge pull request #254 from MotleyAI/egor/dev-1715-dev-1703-re-wire-…
ZmeiGorynych Jul 27, 2026
6832f13
Merge remote-tracking branch 'origin/egor/dev-1704-dev-1703-stage-0-m…
ZmeiGorynych Jul 27, 2026
cdee29d
Merge pull request #258 from MotleyAI/egor/dev-1717-dev-1703-engine-p…
ZmeiGorynych Jul 27, 2026
f2a8b11
Merge pull request #256 from MotleyAI/egor/dev-1704-dev-1703-stage-0-…
ZmeiGorynych Jul 27, 2026
b3d4c2b
DEV-1718: refactor RLS SessionPolicy into a single ruleset
ZmeiGorynych Jul 27, 2026
75f6250
DEV-1718: address review feedback (Codex + Sonar + CodeRabbit)
ZmeiGorynych Jul 28, 2026
a3b30ed
DEV-1718: strengthen _build_exists defensive check to _reaches_anchor
ZmeiGorynych Jul 28, 2026
a055d59
DEV-1718: share per-rule anchor validation between construction and S…
ZmeiGorynych Jul 28, 2026
74a6bb8
Fixes from review 2
AivanF Jul 28, 2026
588bbaf
Merge pull request #255 from MotleyAI/artemy/cleanup-claude-md
whimo Jul 28, 2026
d5ba383
Merge pull request #259 from MotleyAI/aivan/2026-07-27-Unknown-type
AivanF Jul 30, 2026
daeece6
Extensible help
AivanF Jul 30, 2026
9fb55a8
Fixes from review
AivanF Jul 30, 2026
bd71bc0
run_query => query
AivanF Jul 30, 2026
a2db561
Merge pull request #262 from MotleyAI/aivan/2026-07-29-extensible-help
AivanF Jul 30, 2026
ac834e1
Merge branch 'main' into egor/dev-1718-separate-rls-filter-set-classes
whimo Jul 31, 2026
279327e
DEV-1718: trim docstring and comment bloat
whimo Jul 31, 2026
cf81b67
Merge pull request #260 from MotleyAI/egor/dev-1718-separate-rls-filt…
whimo Jul 31, 2026
2604ba4
Merge origin/main into egor/dev-1703 typed-pipeline branch
ZmeiGorynych Aug 1, 2026
d542ab3
DEV-1703: gate opaque-dimension guard on grouping (code-review fix)
ZmeiGorynych Aug 1, 2026
ac69ccc
DEV-1703: extend opaque-dim guard across stage boundaries (process-re…
ZmeiGorynych Aug 1, 2026
11d4976
DEV-1705 Stage 1: assert_scope_closed validator + carrier×scope matrix
ZmeiGorynych Aug 1, 2026
7d672b9
Merge remote-tracking branch 'origin/egor/dev-1703-comprehensive-appr…
ZmeiGorynych Aug 1, 2026
cb2cc87
DEV-1705: address PR #264 review (CodeRabbit)
ZmeiGorynych Aug 1, 2026
aed4268
Merge pull request #264 from MotleyAI/egor/dev-1705-dev-1703-stage-1-…
ZmeiGorynych Aug 1, 2026
14c4861
DEV-1706 Stage 2: ScopeFrame + single resolver + minimal alias allocator
ZmeiGorynych Aug 2, 2026
842f31f
DEV-1706: quote mixed-case join keys in the typed FROM/JOIN builder (…
ZmeiGorynych Aug 2, 2026
cf36dc2
DEV-1706: fold the aggregate-phase join collectors into the resolver
ZmeiGorynych Aug 2, 2026
9afa668
DEV-1706: fold the two ROW-phase join collectors into the resolver
ZmeiGorynych Aug 2, 2026
e9e9cce
DEV-1706: address PR #265 review (Codex composite kwarg + Sonar/CodeR…
ZmeiGorynych Aug 2, 2026
da98f98
DEV-1706: address PR #265 round-2 review (CodeRabbit)
ZmeiGorynych Aug 2, 2026
66c64fa
Merge pull request #265 from MotleyAI/egor/dev-1706-dev-1703-stage-2-…
ZmeiGorynych Aug 2, 2026
aa8f3e3
DEV-1707 Stage 3: unified reroot_aggregate_key (source + args + kwarg…
ZmeiGorynych Aug 2, 2026
bcaf249
Merge remote-tracking branch 'origin/egor/dev-1703-comprehensive-appr…
ZmeiGorynych Aug 2, 2026
851cea4
DEV-1707: address PR #266 review (Sonar S5778 + CodeRabbit nitpicks)
ZmeiGorynych Aug 2, 2026
0a14862
Merge pull request #266 from MotleyAI/egor/dev-1707-dev-1703-stage-3-…
ZmeiGorynych Aug 2, 2026
db9b30a
DEV-1708 Stage 4: cross-model/isolation CTE renderer on ScopeFrame + …
ZmeiGorynych Aug 3, 2026
b6ccaf8
DEV-1710 Stage 6: first/last explicit-time args resolve through Scope…
ZmeiGorynych Aug 3, 2026
96c8a32
Merge dev-1708 (Stage 4: cross-model/isolation CTE renderer on ScopeF…
ZmeiGorynych Aug 3, 2026
73a6808
DEV-1708 review round 1: ScalarCallKey/BetweenKey routed filters, com…
ZmeiGorynych Aug 3, 2026
3431e9a
DEV-1708 review round 2: NOSONAR(S3776) on two cohesive units after e…
ZmeiGorynych Aug 3, 2026
e09620c
DEV-1710: hoist generator out of pytest.raises (Sonar S5778)
ZmeiGorynych Aug 3, 2026
d60469e
DEV-1713 Stage 9: full naming module (result keys, flat names, dialec…
ZmeiGorynych Aug 3, 2026
60e9fec
Merge pull request #267 from MotleyAI/egor/dev-1708-dev-1703-stage-4-…
ZmeiGorynych Aug 3, 2026
b422b23
Merge branch 'egor/dev-1703-comprehensive-approach-expressions-crossi…
ZmeiGorynych Aug 3, 2026
30e4479
DEV-1713 PR #269 review: consecutive_periods de-collision + Sonar/Cod…
ZmeiGorynych Aug 3, 2026
31f9aae
Merge pull request #268 from MotleyAI/egor/dev-1710-dev-1703-stage-6-…
ZmeiGorynych Aug 3, 2026
3851ce0
DEV-1713 PR #269 review round 2: NOSONAR syntax + hidden-alias reserve
ZmeiGorynych Aug 3, 2026
54e2ed7
Merge remote-tracking branch 'origin/egor/dev-1703-comprehensive-appr…
ZmeiGorynych Aug 3, 2026
dffceb9
Merge origin/egor/dev-1703 into DEV-1713 Stage 9
ZmeiGorynych Aug 3, 2026
e473b05
DEV-1709 Stage 5: widen Law-3 isolation trigger to any crossing input…
ZmeiGorynych Aug 3, 2026
8139eaf
DEV-1711 Stage 7: time_shift CTEs on ScopeFrame (cross-model partitions)
ZmeiGorynych Aug 3, 2026
ba5f1e5
PR #271 review round 1: fragment-kwarg join registration + 2 Sonar fixes
ZmeiGorynych Aug 3, 2026
d355280
DEV-1713 PR #269 post-merge review: route enrichment flatten through …
ZmeiGorynych Aug 3, 2026
9f6b326
DEV-1726: dialect-aware case folding for CTE name collision detection
ZmeiGorynych Aug 3, 2026
20f746d
Merge pull request #271 from MotleyAI/egor/dev-1709-dev-1703-stage-5-…
ZmeiGorynych Aug 3, 2026
f66b9a8
DEV-1726 PR #273 review: Sonar fixes + CodeRabbit helper consolidation
ZmeiGorynych Aug 3, 2026
9b4386d
Merge origin/egor/dev-1703 into DEV-1713 Stage 9
ZmeiGorynych Aug 3, 2026
81d6d09
Merge remote-tracking branch 'origin/egor/dev-1703-comprehensive-appr…
ZmeiGorynych Aug 3, 2026
7c61561
PR #272 review sweep: structural filter-path scan + Sonar S3776/S1192…
ZmeiGorynych Aug 3, 2026
1d4a27d
Merge pull request #269 from MotleyAI/egor/dev-1713-dev-1703-stage-9-…
ZmeiGorynych Aug 3, 2026
5b489bb
Merge remote-tracking branch 'origin/egor/dev-1703-comprehensive-appr…
ZmeiGorynych Aug 3, 2026
9993afd
DEV-1703: make MetricFlow notebook bootstrap resilient to transient G…
ZmeiGorynych Aug 3, 2026
b305b3c
Merge umbrella (DEV-1713 Stage 9) into DEV-1711 Stage 7
ZmeiGorynych Aug 3, 2026
d536989
PR #272 CodeRabbit: null-safe doc example + compress DECISIONS entry
ZmeiGorynych Aug 3, 2026
14b9a7b
Merge remote-tracking branch 'origin/egor/dev-1703-comprehensive-appr…
ZmeiGorynych Aug 3, 2026
0c1598f
Merge pull request #272 from MotleyAI/egor/dev-1711-dev-1703-stage-7-…
ZmeiGorynych Aug 3, 2026
e826484
Merge remote-tracking branch 'origin/egor/dev-1703-comprehensive-appr…
ZmeiGorynych Aug 3, 2026
a7a0c24
DEV-1726 PR #273 review round 2: share gen-wide allocator at placehol…
ZmeiGorynych Aug 3, 2026
385d377
Merge pull request #273 from MotleyAI/egor/dev-1726-dialect-aware-cas…
ZmeiGorynych Aug 3, 2026
f5e588b
DEV-1712 Stage 8: order-only hidden slots + plan-time validations
ZmeiGorynych Aug 3, 2026
b6fec80
PR #274 review sweep: joined-ORDER-BY collision fix + Sonar/CodeRabbi…
ZmeiGorynych Aug 3, 2026
3115fc6
DEV-1728: render a cross-model aggregate grouped by a joined derived …
ZmeiGorynych Aug 4, 2026
9eca139
PR #274 review round 2: stage-host qualifier fix + S3776 NOSONAR
ZmeiGorynych Aug 4, 2026
fb30eae
DEV-1714 Stage 10: windowed measures (_wm_ range-join) on ScopeFrame
ZmeiGorynych Aug 4, 2026
db332ee
PR #274 review round 3: legacy collision guard + CodeRabbit T1/T2/T3
ZmeiGorynych Aug 4, 2026
df5222b
DEV-1728 PR #276 review round 1: Sonar gate, CodeRabbit, Codex
ZmeiGorynych Aug 4, 2026
aab4b9d
PR #274 review round 4: ambiguity/message refinements
ZmeiGorynych Aug 4, 2026
7bcf23c
DEV-1714 PR #277 review: windowed guard/plan robustness + generator e…
ZmeiGorynych Aug 4, 2026
31e80ec
DEV-1728 PR #276 review round 2: Sonar S6353 concise character class
ZmeiGorynych Aug 4, 2026
68f223f
PR #274 review round 5: reject unprojected sort key in legacy paginat…
ZmeiGorynych Aug 4, 2026
63f814f
Merge remote-tracking branch 'origin/egor/dev-1703-comprehensive-appr…
ZmeiGorynych Aug 4, 2026
d929da3
DEV-1714 PR #277 review round 2: ORDER BY windowed measure fix
ZmeiGorynych Aug 4, 2026
b6b1d64
Post-merge: route the order-only derived-crossing scope allocator thr…
ZmeiGorynych Aug 4, 2026
775250a
DEV-1714 PR #277 review round 3: deterministic windowed order
ZmeiGorynych Aug 4, 2026
341166a
Merge pull request #274 from MotleyAI/egor/dev-1712-dev-1703-stage-8-…
ZmeiGorynych Aug 4, 2026
6209f53
Merge origin/egor/dev-1703 (Stage 8 DEV-1712 + DEV-1726) into DEV-171…
ZmeiGorynych Aug 4, 2026
1ddab73
DEV-1714 PR #277 review round 4: route _wm_ CTE names through allocator
ZmeiGorynych Aug 4, 2026
f8afe91
DEV-1714 PR #277 review round 5: reject windowed+row mixed filter
ZmeiGorynych Aug 4, 2026
0cd20ea
Merge origin/egor/dev-1714 (Stage 10 windowed measures + Stage 8) int…
ZmeiGorynych Aug 4, 2026
b082ef9
Merge pull request #277 from MotleyAI/egor/dev-1714-dev-1703-stage-10…
ZmeiGorynych Aug 4, 2026
e7984d1
Merge pull request #276 from MotleyAI/egor/dev-1728-render-a-cross-mo…
ZmeiGorynych Aug 4, 2026
c022188
DEV-1733: order-only transform / composite / windowed ORDER BY targets
ZmeiGorynych Aug 4, 2026
03695d4
DEV-1732: frame-bound filters must not truncate trailing-window / shi…
ZmeiGorynych Aug 4, 2026
43f433f
Merge origin/egor/dev-1703 (DEV-1728 derived shared grain) into DEV-1732
ZmeiGorynych Aug 4, 2026
5ece3cf
DEV-1733 PR #280 review round 1: Sonar + CodeRabbit
ZmeiGorynych Aug 4, 2026
2f6cdfa
DEV-1733 PR #280 review round 2: last Sonar S5778
ZmeiGorynych Aug 4, 2026
be9905b
PR #281 review sweep: Sonar S9073/S3776 + CodeRabbit + Codex hardening
ZmeiGorynych Aug 4, 2026
db9acaf
DEV-1733 PR #280 review round 3: two silent-wrong-answer regressions
ZmeiGorynych Aug 4, 2026
39c699b
Merge pull request #281 from MotleyAI/egor/dev-1732-windowed-measures…
ZmeiGorynych Aug 4, 2026
f929fb1
Merge remote-tracking branch 'origin/egor/dev-1703-comprehensive-appr…
ZmeiGorynych Aug 4, 2026
8e5e43b
DEV-1733 PR #280 review round 4: DECISIONS summary contradicted its o…
ZmeiGorynych Aug 4, 2026
ca5ee9f
Merge pull request #280 from MotleyAI/egor/dev-1733-typed-pipeline-or…
ZmeiGorynych Aug 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .claude/skills/slayer-models.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ measures:
formula: "amount:sum / *:count"
```

Aggregation is specified at query time with **colon syntax**: `"amount:sum"`, `"amount:avg"`, `"*:count"`. A bare-name reference like `{"formula": "aov"}` resolves to the saved `ModelMeasure` formula on the model. Built-in aggregations: `sum`, `avg`, `min`, `max`, `count`, `count_distinct`, `first`, `last`, `weighted_avg`, `median`, `percentile`, `stddev_samp`, `stddev_pop`, `var_samp`, `var_pop`, `corr`, `covar_samp`, `covar_pop`. The two-column ones (`corr`, `covar_samp`, `covar_pop`) take the second column as a named param: `price:corr(other=quantity)`.
Aggregation is specified at query time with **colon syntax**: `"amount:sum"`, `"amount:avg"`, `"*:count"`. A bare-name reference like `{"formula": "aov"}` resolves to the saved `ModelMeasure` formula on the model. Built-in aggregations: `sum`, `avg`, `min`, `max`, `count`, `count_distinct`, `count_distinct_approx`, `first`, `last`, `weighted_avg`, `median`, `percentile`, `stddev_samp`, `stddev_pop`, `var_samp`, `var_pop`, `corr`, `covar_samp`, `covar_pop`. `count_distinct_approx` is dialect-aware (native approximate-distinct where available, exact `COUNT(DISTINCT)` fallback otherwise). The two-column ones (`corr`, `covar_samp`, `covar_pop`) take the second column as a named param: `price:corr(other=quantity)`.

## Data Types

Expand Down
8 changes: 5 additions & 3 deletions .claude/skills/slayer-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,18 @@ SLayer is a lightweight, agent-first semantic layer. Instead of writing raw SQL,

Query-backed models support two access patterns: **run by name** (`engine.execute("monthly_revenue", variables={...})` runs the stored backing query) and **as a source_model** (`{"source_model": "monthly_revenue", ...}` in another query). Variable precedence: runtime kwarg > stage > outer query > model defaults.

- **SessionPolicy** (Row-Level Security, DEV-1578 / DEV-1718) — immutable, agent-invisible forced filter passed at engine/local-client init. Carries one required `ruleset`: a `ColumnFilterRuleset` (filter every table that has the tenant column) or a `JoinFilterRuleset` (one anchor table holds the identifier; others reach it via explicit joins, with a whitelist for shared tables). `SlayerQueryEngine(storage, policy=SessionPolicy(ruleset=ColumnFilterRuleset(column="organization_uuid", value=...)))`. Silently scopes every query (base, joins, CTEs, sql-mode, query-backed, profiling) to one tenant at the final-SQL layer. No-filtering = `policy=None`; local-engine only (HTTP `policy=` raises). See [row-level-security.md](../../docs/concepts/row-level-security.md).

## MCP Tools

Discovery: `list_datasources`, `models_summary`, `inspect_model` (with sample data)
Querying: `query`
Discovery: `list_datasources`, `models_summary`, `inspect` (point lookup by `reference` + required `entity_type`; the model path carries sample data; `reference` accepts a single id, a same-kind **list** for a batched lookup, or **`None`/omitted** for the whole **collection** at that kind — `entity_type="model"` lists all models grouped by datasource, `entity_type="datasource"` lists all datasources, subsuming `models_summary` / `list_datasources`). `inspect_model` is DEPRECATED — use `inspect`.
Querying: `query`, `recommend_root_model` (given `model.column` / `model.metric` items, introspects the join graph to recommend the query `source_model` + each item's join path from it; optional `root_hint` forces an intended root when it reaches every item; returns partial-root `coverage` when no single model reaches all items)
Model editing: `create_model`, `edit_model`, `delete_model`
Datasources: `create_datasource`, `list_datasources`, `describe_datasource` (includes table listing by default), `edit_datasource`, `delete_datasource`, `set_datasource_priority`
Ingestion: `ingest_datasource_models`
Schema drift: `validate_models` (read-only diff against live schema; surfaces `SchemaDriftError` cleanups)
Memory write side: `save_memory`, `forget_memory` (per-entity learnings indexed by canonical entity strings — see [memories.md](../../docs/concepts/memories.md))
Search: `search` (three-channel: entity-overlap BM25 over memories + tantivy full-text + optional dense embedding similarity, RRF-fused per kind so each output bucket — `memories` / `example_queries` / `entities` — has membership/order invariant under the other buckets' caps; embeddings require the `embedding_search` extra and degrade gracefully when unavailable; partitions query-bearing memories into `example_queries` — see [search.md](../../docs/concepts/search.md))
Search: `search` (three-channel: entity-overlap BM25 over memory tags + tantivy full-text + optional dense embedding similarity, RRF-fused into a single flat `SearchResponse.results: List[SearchHit]` (DEV-1532) with a `kind` discriminator — `"memory"` / `"datasource"` / `"model"` / `"column"` / `"measure"` / `"aggregation"`; query-bearing memories are still memory hits, distinguished by `hit.query is not None`. Optional `cypher_filter` pre-narrows all three channels: full openCypher when `advanced_search` is installed, naive `MATCH (n:Label) RETURN n.id AS id` kind-filter otherwise. Embeddings also require the `advanced_search` extra and degrade gracefully when unavailable — see [search.md](../../docs/concepts/search.md))

## Package Structure

Expand Down
26 changes: 23 additions & 3 deletions .claude/skills/slayer-query.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@ A `SlayerQuery` is a JSON/dict object. The same shape works across the REST API,

`order[].column` is the short alias (`count`, `revenue_sum`) — not the colon form.

**Dim-only queries deduplicate.** A query with no measures and at least one dimension or time-dimension auto-emits `GROUP BY <dim/td aliases>` and returns the distinct combinations. The `GROUP BY` is applied before `LIMIT`, so a row cap can't silently drop unique tuples. There is no opt-out — if you want the raw row stream, query the underlying table outside the semantic layer.
**Ordering by something you don't project.** `order` may name an undeclared column/aggregate/expression ("top-N by X, show only Y, Z"). Computed hidden, sorted on, and stripped from the result: an **aggregate** (`amount:sum`, `customers.revenue:sum`), an inline **transform** (`rank(amount:sum)`, `change(...)`, `cumsum`/`lag`/`lead`/`ntile`), an inline **composite** (`revenue:sum / cnt:sum`, `abs(amount:sum)`), and a **windowed** aggregate (`amount:sum(window='90d')`, alone or inside a composite). A **raw row column** is orderable only in a raw-rows query (`distinct_dimension_values: false`); in a grouped/dedup query it's rejected (HTTP 400 — add it to `dimensions` or order by an aggregate of it). A **joined** row column is rejected — project it. Order expressions must use formula syntax for their operands, not the `name`s of measures declared in the same query: `{"column": "revenue:sum / cnt:sum"}` works, `{"column": "rev / cnt"}` is rejected.

**Dim-only queries deduplicate.** A query with no measures and at least one dimension or time-dimension auto-emits `GROUP BY <dim/td aliases>` and returns the distinct combinations. The `GROUP BY` is applied before `LIMIT`, so a row cap can't silently drop unique tuples. To opt out, set `"distinct_dimension_values": false` on the query — emits raw rows (no top-level `GROUP BY`), with WHERE / ORDER BY / LIMIT applied as usual. Any measure reference in `measures` / `filters` / `order` raises `DistinctDimensionValuesError` in this mode.

## Measures — colon aggregation

Expand All @@ -40,11 +42,15 @@ Each entry in `measures` is either a bare formula string or a `{"formula": ...,
"last(revenue:sum)",
"time_shift(revenue:sum, -1, 'year')",
"lag(revenue:sum, 1)",
"rank(revenue:sum)"
"rank(revenue:sum)",
"round(revenue:sum, 2)",
"abs(revenue:sum - cost:sum)"
]
```

Built-in aggregations: `sum`, `avg`, `min`, `max`, `count`, `count_distinct`, `first`, `last`, `weighted_avg`, `median`, `percentile`, `stddev_samp`, `stddev_pop`, `var_samp`, `var_pop`, `corr`, `covar_samp`, `covar_pop`. Two-column `corr`/`covar_samp`/`covar_pop` take the second column as a named param: `price:corr(other=quantity)`. `sum` and `avg` accept an optional trailing-window: `revenue:sum(window='30d')`.
Built-in aggregations: `sum`, `avg`, `min`, `max`, `count`, `count_distinct`, `count_distinct_approx`, `first`, `last`, `weighted_avg`, `median`, `percentile`, `stddev_samp`, `stddev_pop`, `var_samp`, `var_pop`, `corr`, `covar_samp`, `covar_pop`. `count_distinct_approx` is dialect-aware (native approximate-distinct where available, exact `COUNT(DISTINCT)` fallback otherwise). Two-column `corr`/`covar_samp`/`covar_pop` take the second column as a named param: `price:corr(other=quantity)`. `sum` and `avg` accept an optional trailing-window: `revenue:sum(window='30d')`. A time bound narrows which buckets come back, not which rows the window may reach — so `date_range` and an equivalent explicit filter (`created_at >= '2025-01-01'`) give identical windowed numbers. Only `<`/`<=`/`>`/`>=` against a time dimension's own column and a literal counts; other operators, non-time-dimension columns, bounds under `or`/`not`, and model-level `filters` all restrict the window's input as usual. Same rule for `time_shift`.

For month-over-month / period-over-period growth use `change_pct(x)` (absolute delta: `change(x)`) — both are calendar-aware and partition-safe (the underlying self-join matches on all non-time dimensions, so per-group series reset cleanly). Reach for `time_shift` only when you need the shifted value itself as a term in custom arithmetic or at a different grain (`time_shift(revenue:sum, -1, 'year')` for year-over-year).

`*:count` is always available — no column definition needed. `col:count` counts non-nulls.

Expand Down Expand Up @@ -116,6 +122,20 @@ Reference measures from joined models with dotted syntax + colon aggregation:

A dotted reference may target a *derived* column on the joined model (a column whose own `sql` is itself an expression). The engine recursively inlines the chain at query time — `"B.foo_normalized:sum"` where `B.foo_normalized.sql = "foo_raw / 100.0"` emits `SUM(B.foo_raw / 100.0)`. The same chaining works inside `Column.sql`, `filters`, and `dimensions`. When a filter names a *bare* local derived column whose SQL crosses a join (e.g. `Column(name="is_eu", sql="CASE WHEN customers.region = 'EU' THEN 1 ELSE 0 END")` referenced as `"filters": ["is_eu = 1"]`), the planner walks the column's chain and adds the joins the chain implies — no need to also list the column in `dimensions`.

## Picking the root model

Not sure which model to use as `source_model` for a set of columns/metrics? Call `recommend_root_model` with the `model.column` / `model.metric` items you want; it introspects the join graph and returns the recommended root plus each item's join-qualified path from it (aggregation suffixes preserved), ready to drop into a query.

```python
rec = client.recommend_root_model_sync(["customers.name", "products.category"])
rec.root_model # "orders"
[ip.path for ip in rec.item_paths] # ["customers.name", "products.category"]
```

Pass `root_hint` (a bare model name or `<data_source>.<model>`) to force an intended root — useful when the host is a bridge model that owns none of the items but matches your grain. It's honored when it reaches every item; otherwise the auto-pick is used and `warnings` says why.

MCP: `recommend_root_model(items, data_source=None, root_hint=None, format="markdown")`. If no single model reaches every item, `root_model` is `None` and `coverage` lists the best partial roots — a hint to split into a multi-stage `source_queries` query.

## ModelExtension

Extend a model inline with extra columns, named-formula measures, joins, or filters. The stored model is not modified:
Expand Down
3 changes: 1 addition & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ examples
*.md
!README.md
!LICENSE
mkdocs.yml
.readthedocs.yaml
zensical.toml
.dockerignore
.gitignore
Loading
Loading