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
107 changes: 107 additions & 0 deletions .claude/exec-runs/sonnet-197-lint-sweep-resume.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# Sonnet 1.97.1 lint/test sweep — OGAR (RESUME run)

Branch: `claude/loco-funnel-probe-s0` (unchanged, no commits/pushes made — per instructions).

**RUN HALTED EARLY — disk-safety hard rule.** Free space on `/home/user` dropped
from 7.0 GB (start) to 3.9 GB over the course of this run, crossing the 4 GB
stop threshold. Per instruction, halting immediately after the crate in
progress (`ogar-action-handler`) finished cleanly, and reporting instead of
continuing.

`du -sh` at halt: `OGAR/target` = 1.5G, `ndarray/target` = 1.3G,
`lance-graph/target` = 7.7G (external, same driver noted in the previous
run's halt — a sibling repo's build growing on this shared host, not residue
from this sweep).

## Part 1 — re-verify of prior halt point

| Crate | Clean? | Fix applied | Tests | fmt |
|---|---|---|---|---|
| ogar-adapter-clickhouse-ddl | **yes, confirmed clean** | (fix from prior run — `map_or(false,f)` → `is_some_and(f)` at src/lib.rs:230 — verified still in place and clippy-clean) | 7 unit + 0 doctest — all pass | no changes |

## Part 2 — new crates swept this run (5 of 22, before disk halt)

| Crate | Clean before? | Clippy fix | Tests | fmt |
|---|---|---|---|---|
| ogar-adapter-postgres-ddl | yes | — | 10 unit + 0 doctest — all pass | no changes |
| ogar-knowable-from | yes | — | 10 unit + 0 doctest — all pass | no changes |
| ogar-from-elixir | **no** | see below | 5 unit + 0 doctest — all pass | 1 cosmetic whitespace change (rustfmt) |
| ogar-from-ruff | **no** | see below | 3 unit + 3 integration + 0 doctest — all pass | 1 cosmetic reflow change (rustfmt, unrelated whitespace in `examples/compile_corpus.rs`) |
| ogar-from-rails | yes | — | 3 unit + 18 ignored (require external Redmine/OpenProject checkouts, unrelated to this sweep) + 0 doctest — all pass | no changes |
| ogar-from-schema | yes | — | 2 unit + 1 integration (membrane_probe) + 0 doctest — all pass | no changes |
| ogar-action-handler | yes | — | 12 unit + 1 integration (lifted_action_dispatch) + 1 doctest — all pass | no changes |

### ogar-from-elixir detail

`crates/ogar-from-elixir/src/lib.rs:58-61` — `unused_imports`: 9 of the 11
names imported at module scope from `ogar_vocab` (`ActionSubject`,
`Association`, `AssociationKind`, `Attribute`, `EnterEffect`,
`GuardFailurePolicy`, `KausalSpec`, `Language`, `ModalSpec`, `TemporalSpec`)
are used only inside `#[cfg(test)] mod tests` (via `use super::*;`), not by
the crate's runtime code (which uses only `ActionDef` and `Class`).

Fix (matches the "unused import that only tests use belongs in the test
module" prior from the lance-graph sweep): trimmed the top-level `use` to
`use ogar_vocab::{ActionDef, Class};` and added the 9 test-only names as a
new `use ogar_vocab::{...};` inside `mod tests`. No behaviour change — purely
a scope move; `mod tests` already re-imports everything via `use super::*;`
so no name resolution changed.

### ogar-from-ruff detail

`crates/ogar-from-ruff/examples/compile_corpus.rs:30` — `unused_imports`:
`Write` in `use std::io::{BufRead, BufReader, Write};`. Grepped the whole
example file — `Write` appears only in a doc-comment (`//! 6. Write the
output...`), never as a trait-method call site (the actual JSON-write path
under `#[cfg(feature = "serde")]` uses `std::fs::write`-shaped helpers, not
the `io::Write` trait directly, or that arm wasn't compiled without the
`serde` feature enabled for this default `--all-targets` run). Fix: dropped
`Write` from the import list. No behaviour change.

## Crates NOT reached (17 of 22) — new resume point

```
crates/ogar-class-view
crates/ogar-render-askama
crates/ogar-fma-skeleton
crates/ogar-fma
crates/ogar-obo
crates/ogar-cpic
crates/ogar-adapter-python
crates/ogar-adapter-csharp
crates/ogar-auth
crates/ogar-encryption
crates/ogar-doc-ir
crates/ogar-a2ui-frame
crates/ogar-from-docv1
crates/ogar-render-typst
crates/ogar-blockly
crates/ogar-loco
```

(`ogar-action-handler` — last crate attempted — completed fully: clippy
clean, tests pass, fmt run with no changes, all before the disk threshold
was crossed. It does NOT need to be re-verified next run.)

None of the 17 above were built or linted this run — no clippy/test/fmt data
exists for them yet under 1.97.1.

## Nothing skipped for API/behaviour reasons

Both fixes applied this run (`ogar-from-elixir`, `ogar-from-ruff`) are pure
import-scope/unused-import mechanical cleanups with zero API or behaviour
change. No fix was skipped for "would change public API" reasons in the
crates reached this run.

## Disk trend observed (for orchestrator diagnosis)

```
7.0G (start) -> 6.8G -> 6.4G -> 6.3G -> 6.2G -> 5.9G -> 5.8G -> 5.2G
-> 4.9G -> 4.8G -> 4.4G -> 4.2G -> 4.1G -> 4.0G -> 3.9G (halt)
```

Same external driver as the prior halt: `lance-graph/target` at 7.7G,
apparently still an actively-growing build from a concurrent session on this
shared host. OGAR's own `target/` (1.5G) and ndarray's (1.3G) are not the
cause. Recommend either waiting for the sibling build to finish/shrink, or
running the remaining 17 crates on a host/session with more headroom.
99 changes: 99 additions & 0 deletions .claude/exec-runs/sonnet-197-lint-sweep.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# Sonnet 1.97.1 lint/test sweep — OGAR

Branch: `claude/loco-funnel-probe-s0`. Toolchain confirmed: `rustc 1.97.1`, `cargo 1.97.1`.

**RUN HALTED EARLY — disk-safety hard rule.** Free space on `/home/user` dropped
from 6.7 GB → 3.7 GB over the course of this run and was trending down, not
transient. Diagnosed with `du -sh`: OGAR's own `target/` is only 305 MB (not
the cause); `/home/user/lance-graph/target` is 9.6 GB and appears to be an
actively-growing build from another concurrent session on this shared host —
external contention, not residue from this sweep. Per the instruction "if free
space drops below 5 GB, STOP and report instead of continuing," I stopped
after 8 of 30 workspace crates. 22 crates were never reached (listed below).

## Crates checked (8 of 30)

| Crate | Clean before? | Clippy fix | Tests | fmt |
|---|---|---|---|---|
| ogar-vocab | yes | — | 141 unit + 7 doctest (1 ignored) — all pass | no changes |
| ogar-ontology | yes | — | 5 unit + 5 doctest — all pass | no changes |
| ogar-emitter | yes | — | 45 unit + 1 doctest — all pass | `src/do_adapter.rs`: rustfmt collapsed a short `vec![...]` literal onto one line (cosmetic, newer rustfmt width behavior — no logic change) |
| ogar-adapter | yes | — | 6 unit + 1 doctest — all pass | no changes |
| ogar-proposal | yes | — | 12 unit + 2 doctest (1 ignored) — all pass | no changes |
| ogar-adapter-surrealql | yes | — | 22 unit + 1 doctest (ignored) — all pass | no changes |
| ogar-adapter-ttl | yes | — | 5 unit + 0 doctest — all pass | no changes |
| ogar-adapter-clickhouse-ddl | **no** | see below | **NOT RE-RUN** (halted before re-verify) | **NOT RUN** |

### ogar-adapter-clickhouse-ddl detail

`crates/ogar-adapter-clickhouse-ddl/src/lib.rs:230` — `clippy::unnecessary_map_or`
(new in clippy shipped with 1.97):

```
this `map_or` can be simplified
--> crates/ogar-adapter-clickhouse-ddl/src/lib.rs:227:12
```

Fix applied (edit only, not re-verified by a clippy/test run — disk halt
happened immediately after this edit):

```rust
// before
.map_or(false, |c| c.is_ascii_alphabetic() || c == '_')
// after
.is_some_and(|c| c.is_ascii_alphabetic() || c == '_')
```

This is the only occurrence of the pattern in that function (`quote_ch_ident`).
Mechanical clippy-suggested rewrite, semantically identical (`Option::map_or(false, f)` ≡ `Option::is_some_and(f)`).

**ACTION NEEDED next run:** re-run `cargo clippy -p ogar-adapter-clickhouse-ddl --all-targets -- -D warnings`,
then `cargo test -p ogar-adapter-clickhouse-ddl`, then `cargo fmt -p ogar-adapter-clickhouse-ddl`,
to confirm the fix is complete and pick up test/fmt for this crate.

## Crates NOT reached (22 of 30) — resume point

```
crates/ogar-adapter-postgres-ddl
crates/ogar-knowable-from
crates/ogar-from-elixir
crates/ogar-from-ruff
crates/ogar-from-rails
crates/ogar-from-schema
crates/ogar-action-handler
crates/ogar-class-view
crates/ogar-render-askama
crates/ogar-fma-skeleton
crates/ogar-fma
crates/ogar-obo
crates/ogar-cpic
crates/ogar-adapter-python
crates/ogar-adapter-csharp
crates/ogar-auth
crates/ogar-encryption
crates/ogar-doc-ir
crates/ogar-a2ui-frame
crates/ogar-from-docv1
crates/ogar-render-typst
crates/ogar-blockly
crates/ogar-loco
```

None of these were built or linted this run — no clippy/test/fmt data exists
for them yet under 1.97.1.

## Nothing skipped for API/behaviour reasons

The one fix applied (`ogar-adapter-clickhouse-ddl`) is a pure clippy-suggested
mechanical rewrite with no API or behavior change. No fix was skipped for
"would change public API" reasons in the 8 crates actually reached.

## Disk trend observed (for orchestrator diagnosis)

```
6.7G (start) -> 5.2G -> 4.3G -> [recovered] 6.6G -> 6.2G -> 6.0G -> 5.7G
-> 5.4G -> 4.9G -> 4.2G -> 3.8G -> 3.7G (halt)
```

`du -sh` at halt: OGAR/target = 305M, ndarray/target = 824M, lance-graph/target = 9.6G.
The lance-graph figure is the likely driver and is external to this task/repo.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
- name: Install Rust toolchain (per rust-toolchain.toml)
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.95.0
toolchain: 1.97.1
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- name: cargo check --workspace --all-targets
Expand Down
20 changes: 17 additions & 3 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,24 @@ serde = { version = "1.0", features = ["derive"] }
# "kv-lance lance 6.0.0 -> =7.0.0, lancedb 0.29.0 -> =0.30.0";
# surrealdb fork's surrealdb-core uses the same pins under the
# kv-lance feature.
#
# 2026-08-05 — realigned 7.0.0/0.30.0/df53 → 9.0.0/0.33.0/df54 to track the
# measured lance-graph bump (probe: lance-graph
# `.claude/plans/lance9-datafusion54-upgrade-probe-v1.md`). NOTE: there is no
# `lancedb` 0.34-0.36 Rust crate — the registry tops out at 0.33.0, which IS
# the lance-9 pairing (it pins `lance = "=9.0.0"`); 0.36 is the PyPI package,
# versioned independently. arrow stays 58 and object_store 0.13.2 across this
# bump — only datafusion crosses a major. These pins are still DORMANT (no
# OGAR crate consumes them yet), so this realignment cannot break a build; it
# keeps the "canonical, matches the rest of the AdaWorldAPI ecosystem" claim
# above TRUE rather than silently stale. Per the lance-graph operator ruling
# `E-LANCE-IS-UPSTREAM-AUTHORITATIVE-1`, this family is consumed from
# crates.io upstream and NEVER from a fork — the AdaWorldAPI/lance and
# /lancedb repos exist but are deliberately not depended on.
# ─────────────────────────────────────────────────────────────────────
lance = "=7.0.0"
lancedb = "=0.30.0"
datafusion = "53"
lance = "=9.0.0"
lancedb = "=0.33.0"
datafusion = "54"
arrow = "58"
arrow-array = "58"
arrow-schema = "58"
Expand Down
2 changes: 1 addition & 1 deletion crates/ogar-adapter-clickhouse-ddl/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ fn quote_ch_ident(name: &str) -> String {
&& name
.chars()
.next()
.map_or(false, |c| c.is_ascii_alphabetic() || c == '_')
.is_some_and(|c| c.is_ascii_alphabetic() || c == '_')
&& name.chars().all(|c| c.is_ascii_alphanumeric() || c == '_');
if bare {
name.to_string()
Expand Down
6 changes: 3 additions & 3 deletions crates/ogar-class-view/tests/cognition_step_mapping.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@ use ogar_vocab::ActionDef;
/// Lower an `ActionDef` onto the `UnifiedStep` shape. Total on the fields
/// `UnifiedStep` needs from an action:
/// - `step_id` <- `a.identity` (the numeric `StepId` is FNV-1a-derived
/// downstream via `UnifiedStep::id`, not stored here).
/// downstream via `UnifiedStep::id`, not stored here).
/// - `step_type` <- `a.predicate`.
/// - `status` <- `StepStatus::Pending` (the real initial variant; a
/// freshly lifted action has not started executing).
/// freshly lifted action has not started executing).
/// - `depends_on` <- `[]` (a.reads could seed this in a follow-up; out of
/// scope for this probe).
/// scope for this probe).
fn action_to_step(a: &ActionDef) -> UnifiedStep {
UnifiedStep {
step_id: a.identity.clone(),
Expand Down
5 changes: 1 addition & 4 deletions crates/ogar-emitter/src/do_adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -211,10 +211,7 @@ mod tests {
actions: vec![
AdapterAction {
predicate: "PostInvoice".to_string(),
writes: vec![
"Invoice.state".to_string(),
"Invoice.posted_at".to_string(),
],
writes: vec!["Invoice.state".to_string(), "Invoice.posted_at".to_string()],
reads: vec!["Invoice.lines".to_string()],
},
AdapterAction {
Expand Down
9 changes: 5 additions & 4 deletions crates/ogar-from-elixir/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,7 @@

use std::path::Path;

use ogar_vocab::{
ActionDef, ActionSubject, Association, AssociationKind, Attribute, Class, EnterEffect,
GuardFailurePolicy, KausalSpec, Language, ModalSpec, TemporalSpec,
};
use ogar_vocab::{ActionDef, Class};

/// The namespace prefix for OGIT-Elixir mappings.
///
Expand Down Expand Up @@ -285,6 +282,10 @@ fn extract_oban_actions(_module: &ElixirModule) -> Vec<ActionDef> {
#[cfg(test)]
mod tests {
use super::*;
use ogar_vocab::{
ActionSubject, Association, AssociationKind, Attribute, EnterEffect, GuardFailurePolicy,
KausalSpec, Language, ModalSpec, TemporalSpec,
};

/// Locked-shape test for an Ecto.Schema:
///
Expand Down
34 changes: 19 additions & 15 deletions crates/ogar-from-ruff/examples/compile_corpus.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
//! Port examples: "healthcare", "odoo", "woa", "q2"

use std::fs::File;
use std::io::{BufRead, BufReader, Write};
use std::io::{BufRead, BufReader};
use std::path::{Path, PathBuf};

use ogar_from_ruff::mint::compile_graph_csharp;
Expand All @@ -41,7 +41,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let args: Vec<String> = std::env::args().collect();

if args.len() < 3 {
eprintln!("Usage: {} <corpus.ndjson[.gz]> <domain> <port> [output.json[.gz]]", args[0]);
eprintln!(
"Usage: {} <corpus.ndjson[.gz]> <domain> <port> [output.json[.gz]]",
args[0]
);
eprintln!(" Domain: medcare | odoo | woa | q2 | ...");
eprintln!(" Port: healthcare | odoo | woa | q2 | ...");
std::process::exit(1);
Expand All @@ -65,20 +68,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
eprintln!("loaded ndjson file ({} bytes)", ndjson_text.len());

// Parse ndjson into Triple objects (validates predicate vocabulary).
let triples = from_ndjson(&ndjson_text)
.map_err(|e| format!("failed to parse ndjson: {}", e))?;
let triples =
from_ndjson(&ndjson_text).map_err(|e| format!("failed to parse ndjson: {}", e))?;
eprintln!("parsed {} triples", triples.len());

// Reassemble into a ModelGraph (arguments: triples first, then namespace/domain).
let graph = reassemble_model_graph(&triples, domain);
eprintln!("reassembled {} classes", graph.models.len());

let total_fields: usize = graph.models.iter().map(|m| m.fields.len()).sum();
let total_associations: usize = graph
.models
.iter()
.flat_map(|m| &m.associations)
.count();
let total_associations: usize = graph.models.iter().flat_map(|m| &m.associations).count();
eprintln!(
" {} total fields, {} total associations",
total_fields, total_associations
Expand All @@ -101,8 +100,15 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
};

// Report facet distribution.
let n_nonzero_classid = compiled.iter().filter(|c| c.facet.facet_classid() != 0).count();
eprintln!("facet: {} → classid 0x00000000, {} non-zero", compiled.len() - n_nonzero_classid, n_nonzero_classid);
let n_nonzero_classid = compiled
.iter()
.filter(|c| c.facet.facet_classid() != 0)
.count();
eprintln!(
"facet: {} → classid 0x00000000, {} non-zero",
compiled.len() - n_nonzero_classid,
n_nonzero_classid
);

// Serialize to JSON if output path is provided and serde feature is enabled.
#[cfg(feature = "serde")]
Expand All @@ -116,9 +122,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
#[cfg(not(feature = "serde"))]
{
if output_path.is_some() {
eprintln!(
"ERROR: JSON output requested, but serde feature is not enabled."
);
eprintln!("ERROR: JSON output requested, but serde feature is not enabled.");
eprintln!("Rebuild with: cargo run --features serde -- ...");
std::process::exit(1);
}
Expand All @@ -145,7 +149,7 @@ fn read_ndjson_corpus(path: &Path) -> Result<String, Box<dyn std::error::Error>>
path.display(),
gz_path.display()
)
.into())
.into());
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion rust-toolchain.toml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[toolchain]
channel = "1.95.0"
channel = "1.97.1"
components = ["rustfmt", "clippy"]
profile = "minimal"
Loading