Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .claude/board/ISSUES.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@
> Open blockers and cross-repo follow-ups. Append new entries at the top;
> change only the `Status` line of an existing entry.

## ISS-LG-MASKRISC-PATH-NDARRAY — Quack could not be consumed by git

- **Status:** RESOLVED 2026-10-10 by lance-graph #1457 (`e724d83`): mask-risc names ndarray by git, and lance-graph's workspaces patch it back to the sibling checkout.
- **Where:** lance-graph `crates/lance-graph-mask-risc/Cargo.toml` (`ndarray = { path = "../../../ndarray" }`).
- **What:** the relative path leaves the lance-graph checkout, so any git consumer of `lance-graph-quack` (which depends on mask-risc) fails with "no matching package named `ndarray`". It also breaks lance-graph's own CARGO-COMPUTE-SUBSTRATE rule 5. Fix upstream: mask-risc names `ndarray = { git = "https://github.com/AdaWorldAPI/ndarray", branch = "master" }`, and lance-graph's root adds `[patch."https://github.com/AdaWorldAPI/ndarray"] ndarray = { path = "../ndarray" }`, so its own builds keep the sibling checkout and one ndarray identity. Verified locally: HubSPO-rs builds and tests against the patched checkout with one ndarray package.

## ISS-DIRSIM-HUBSPO-GAPS — dir-sim lacks what tickets, mail and documents need

- **Status:** OPEN (upstream asks; not built here — STOP rule)
Expand Down
36 changes: 36 additions & 0 deletions .claude/board/LATEST_STATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,42 @@
- CI: `.github/workflows/ci.yml` runs fmt, clippy (`--no-deps -D warnings`)
and `cargo test --workspace` with debug info off.

## Filter compiler (D-QRY-1)

- `hubspo-store::catalog`: the production `Registrar` + `Binder` for Quack.
One `Codebook` per coded field (label `i` → code `i`, unknown labels bind
to nothing), plane `0` of every table is its live plane, nullable fields
name a validity plane. Refuses duplicate fields / lanes / labels, a
codebook on an integer field, and live-as-validity. 4 unit tests.
- `hubspo-query::filter::compile(object, groups, &binder) -> Filter`:
HubSpot filter groups (AND within, OR across), operators EQ NEQ LT LTE GT
GTE BETWEEN IN NOT_IN HAS_PROPERTY NOT_HAS_PROPERTY; CONTAINS_TOKEN is
refused (text search is the Tantivy index). Values are HubSpot strings;
integers are decimal `i32` until D-ONT-6 fixes lane encodings (amounts,
timestamps). Three-valued over nullable properties: a record with no
value is kept by no comparison, NEQ and NOT_IN included — whether HubSpot
agrees is a value-oracle question (`ISS-ORACLE-PORTAL`).
- `tests/filter_oracle.rs`: 600 random filter-group sets over 5,000
records (3 % deleted, 20–30 % missing values with random payloads left in
the lanes) are compiled, lowered and run on mask-risc; every kept-row set
equals a plain-loop reading (456 non-trivial, 122 empty, 22 all live).
Disable runs 2026-10-10 (`cargo test -p hubspo-query --test filter_oracle`):

| disable | red |
|---|---|
| `sql_where` dropped | oracle + missing-value test |
| NOT_IN compiled as IN | oracle |
| BETWEEN upper bound exclusive | oracle |
| groups ANDed instead of ORed | oracle |
| live plane dropped | oracle + presence test |
| NOT_HAS_PROPERTY on a required property true | oracle + presence test |

A seventh guard (`reads_value`, keeping presence-only properties off the
nullable list) stayed green and was deleted: `sql_where` gates only
comparison leaves, so it guarded nothing.
- Quack became consumable by git with lance-graph #1457
(`ISS-LG-MASKRISC-PATH-NDARRAY`, resolved).

## Harvest (D-ONT-1, public-catalog half)

- `scripts/fetch-hubspot-specs.sh` → `.cache/` (gitignored), then
Expand Down
4 changes: 2 additions & 2 deletions .claude/board/STATUS_BOARD.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
| D-ONT-2 | OGAR: `ogar-from-schema` OpenAPI front end (queued upstream, `lib.rs:48`) — **requested from OGAR, not built in HubSPO-rs** | L | Queued | |
| D-ONT-3 | Mint dossier: per candidate concept (H-ADR-2 table) the METHOD/STORAGE/STRUCTURE evidence + OGIT source + convergence argument; submit to the 5+3 codebook council | M | Shipped | ratified v3 `.claude/plans/hubspo-concept-mint-dossier-v3.md` (5+3 council, 2026-10-10) |
| D-ONT-4 | OGAR PR: `ConceptDomain::Crm` (`0x05XX`), 15 concepts in `class_ids` + `CODEBOOK` + `ALL`, `HubSpoPort` (`0x000B`) + aliases, layout doc row; lance-graph `ogar_codebook` mirror rows + `AppPrefix` 0x0008–0x000B. `crm_actions` deferred to D-ACT-1 (dossier v3 §7) | M | Shipped | OGAR#330, lance-graph#1438 |
| D-ONT-5 | `hubspo-port`: `RbacPlug` binding; `HotPlug` over Crm ids asserted to fail `NoCapabilitiesFor` until D-ACT-1 (dossier v3 §7); deliberately-wrong-plug test proving each drift arm can fire | S | In PR | `hubspo-port`, 13 tests |
| D-ONT-5 | `hubspo-port`: `RbacPlug` binding; `HotPlug` over Crm ids asserted to fail `NoCapabilitiesFor` until D-ACT-1 (dossier v3 §7); deliberately-wrong-plug test proving each drift arm can fire | S | Shipped | `hubspo-port`, 13 tests (`04edf87` on main) |
| D-ONT-6 | `hubspo-schema`: ClassViews for contact, company, deal, ticket, lead, product, line item, quote, activity kinds; standard property position tables via the generator into `hubspo-generated` | L | Queued | |
| D-ONT-7 | Custom-object/-property design (H-ADR-3) + probe P-CUSTOM-1 (lane-per-property vs packed run; fold latency at 50 / 500 / 2,000 custom properties) | M | In progress | P-CUSTOM-1 2026-10-10: lanes 0.73–1.61× std, packed 15–35×; lane write 33–96 s vs 1.5 s |

Expand All @@ -46,7 +46,7 @@

| D-id | Deliverable | Size | Status | Evidence |
|---|---|---|---|---|
| D-QRY-1 | Filter compiler: HubSpot filter groups (AND within group, OR across groups; operators EQ/NEQ/LT/…/HAS_PROPERTY/CONTAINS_TOKEN/IN/BETWEEN) → Quack program | L | Queued | P-QDB-1: catalog + codebook `Binder` and nine bound programs proven against an oracle |
| D-QRY-1 | Filter compiler: HubSpot filter groups (AND within group, OR across groups; operators EQ/NEQ/LT/…/HAS_PROPERTY/CONTAINS_TOKEN/IN/BETWEEN) → Quack program | L | In PR | `hubspo-store::catalog` + `hubspo-query::filter`; 600 random filter sets equal a plain-loop oracle on mask-risc; #19 |
| D-QRY-2 | Lists: active (incremental on version delta) + static (stored mask); membership history | L | Queued | P-LIST-1 2026-10-10: 2.6 ms at 10M; alloc ∝ fragments touched. P-SPARSE-1: 1.93 ms, 257 KiB flat at 10M |
| D-QRY-3 | Saved views + board view (report pivot over pipeline × stage) | M | Queued | |
| D-QRY-4 | Quack lowering of callcenter's `ParsedQuery` (the upstream DataFusion `parsed_query_to_plan` is an unimplemented stub) | M | Queued | |
Expand Down
7 changes: 7 additions & 0 deletions crates/hubspo-query/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,10 @@ publish = false

[lints]
workspace = true

[dependencies]
lance-graph-quack.workspace = true

[dev-dependencies]
hubspo-store = { path = "../hubspo-store" }
lance-graph-mask-risc.workspace = true
Loading
Loading