From c6a6b68768dcd775db4907a6ef95938aee1c5659 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Mon, 19 Oct 2026 06:14:41 +0200 Subject: [PATCH 1/6] test(cgp): doctor::collect_checks covered, 4 shape tests + contract (Refs #5614) Mutation: dropping the CUDA Runtime rename and flipping check status turned 4 tests RED; restored GREEN. Agent: aprender-w5032 Co-Authored-By: Claude Sonnet 5.5 (cherry picked from commit 72f0e61911b31dda0d14e888ece74b14d548cf5a) --- contracts/cgp-doctor-collect-checks-v1.yaml | 42 ++++++++++++ crates/aprender-cgp/src/doctor.rs | 71 +++++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 contracts/cgp-doctor-collect-checks-v1.yaml diff --git a/contracts/cgp-doctor-collect-checks-v1.yaml b/contracts/cgp-doctor-collect-checks-v1.yaml new file mode 100644 index 0000000000..273bdf4cea --- /dev/null +++ b/contracts/cgp-doctor-collect-checks-v1.yaml @@ -0,0 +1,42 @@ +metadata: + version: 1.0.0 + created: '2026-10-19' + author: PAIML Engineering + description: "aprender-cgp doctor::collect_checks (#5614) — returns the eleven tool checks in fixed order; nvcc is reported as CUDA Runtime; CUPTI status tracks the library path found; a check is Ok iff it has a path." + kind: pattern + references: + - "crates/aprender-cgp/src/doctor.rs — collect_checks" + - "aprender#5614 — coverage ticket" + +equations: + collect_checks_shape: + formula: "names(collect_checks()) = [nvidia-smi, CUDA Runtime, ncu, nsys, CUPTI, perf, valgrind, renacer, trueno-explain, GPU, CPU]; CUPTI.status = Ok iff CUPTI.path is Some" + domain: "any host (checks are host-dependent, shape is not)" + codomain: "Vec" + invariants: + - "no check is named nvcc" + - "for binary checks, status Ok iff path is Some" + +proof_obligations: + - id: CGP-DOCTOR-INV-001 + type: invariant + property: "Check list order and names are fixed" + formal: "cargo test -p aprender-cgp --lib test_collect_checks_names_and_order exits 0" + applies_to: collect_checks_shape + - id: CGP-DOCTOR-INV-002 + type: invariant + property: "CUPTI status tracks its path" + formal: "cargo test -p aprender-cgp --lib test_collect_checks_cupti_status_tracks_path exits 0" + applies_to: collect_checks_shape + +falsification_tests: + - id: FALSIFY-CGP-DOCTOR-001 + rule: "CUDA Runtime rename dropped" + prediction: "deleting check.name = \"CUDA Runtime\" turns test_collect_checks_names_and_order RED" + test: "cargo test -p aprender-cgp --lib test_collect_checks_names_and_order" + if_fails: "check naming is unguarded" + - id: FALSIFY-CGP-DOCTOR-002 + rule: "CUPTI status inverted" + prediction: "swapping Ok/Missing for CUPTI turns test_collect_checks_cupti_status_tracks_path RED" + test: "cargo test -p aprender-cgp --lib test_collect_checks_cupti_status_tracks_path" + if_fails: "CUPTI status is unguarded" diff --git a/crates/aprender-cgp/src/doctor.rs b/crates/aprender-cgp/src/doctor.rs index 6084924990..bedfeee50b 100644 --- a/crates/aprender-cgp/src/doctor.rs +++ b/crates/aprender-cgp/src/doctor.rs @@ -407,4 +407,75 @@ mod tests { #[cfg(not(feature = "timing-gate"))] let _ = elapsed; } + + // ===== collect_checks (FALSIFY-CGP-DOCTOR-001..004) ===== + + fn by_name<'a>(checks: &'a [ToolCheck], name: &str) -> &'a ToolCheck { + checks + .iter() + .find(|c| c.name == name) + .unwrap_or_else(|| panic!("missing check {name}")) + } + + #[test] + fn test_collect_checks_names_and_order() { + let names: Vec = collect_checks().into_iter().map(|c| c.name).collect(); + let expected = [ + "nvidia-smi", + "CUDA Runtime", + "ncu", + "nsys", + "CUPTI", + "perf", + "valgrind", + "renacer", + "trueno-explain", + "GPU", + "CPU", + ]; + assert_eq!(names, expected); + } + + #[test] + fn test_collect_checks_cuda_runtime_renamed_from_nvcc() { + let checks = collect_checks(); + assert!(checks.iter().all(|c| c.name != "nvcc")); + let cuda = by_name(&checks, "CUDA Runtime"); + // Present iff nvcc is on PATH. + assert_eq!(cuda.status == ToolStatus::Ok, which::which("nvcc").is_ok()); + } + + #[test] + fn test_collect_checks_cupti_status_tracks_path() { + let checks = collect_checks(); + let cupti = by_name(&checks, "CUPTI"); + match &cupti.path { + Some(p) => { + assert_eq!(cupti.status, ToolStatus::Ok); + assert_eq!(cupti.version.as_deref(), Some(p.as_str())); + assert!(std::path::Path::new(p).exists()); + } + None => { + assert_eq!(cupti.status, ToolStatus::Missing); + assert!(cupti.version.is_none()); + } + } + } + + #[test] + fn test_collect_checks_status_matches_path_presence() { + for c in collect_checks() { + if c.name == "GPU" || c.name == "CPU" { + continue; + } + assert_eq!( + c.status == ToolStatus::Ok, + c.path.is_some(), + "{}: status {:?} vs path {:?}", + c.name, + c.status, + c.path + ); + } + } } From a538a91d80804af818bc1a92e5a3e1aba25059df Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Mon, 19 Oct 2026 06:15:22 +0200 Subject: [PATCH 2/6] test(cbtop): cover render_sparklines gates and y advance (Refs #5595) Co-Authored-By: Claude Sonnet 5.5 Agent: aprender-w5382 (cherry picked from commit 4c51460350acbc842a9c4c0d99c02318148dfe67) --- README.md | 4 +- contracts/cbtop-render-sparklines-v1.yaml | 47 ++++++++ contracts/contracts.nt | 5 + ...5f0be2f90923120a3027c176ad56723d0d850.json | 4 +- crates/aprender-cbtop/src/app/mod.rs | 3 + .../src/app/sparklines_tests.rs | 104 ++++++++++++++++++ 6 files changed, 163 insertions(+), 4 deletions(-) create mode 100644 contracts/cbtop-render-sparklines-v1.yaml create mode 100644 crates/aprender-cbtop/src/app/sparklines_tests.rs diff --git a/README.md b/README.md index 027a6b2a7d..191f91b659 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ publishing — all backed by YAML provable contracts that fail CI on drift. | Metric | Count | Source of truth | |-------:|------:|---| | Workspace crates | **81** workspace crates | `cargo metadata --no-deps` (NOT `ls crates/` — 4 are `exclude`d, 1 has no Cargo.toml) | -| Provable contracts | **1984** provable contracts | `contracts/census.json` `.n_files` — the set `pv lint` walks (`pv census`, ONT-001 ONT-1; regenerated by `make contracts`, written by `make readme-sync`, guarded by `scripts/check_readme_claims.sh`) | +| Provable contracts | **1985** provable contracts | `contracts/census.json` `.n_files` — the set `pv lint` walks (`pv census`, ONT-001 ONT-1; regenerated by `make contracts`, written by `make readme-sync`, guarded by `scripts/check_readme_claims.sh`) | | CLI commands | **113** CLI commands | `contracts/apr-cli-commands-v1.yaml` §`commands` (parse the list; `apr --help` also lists `help` itself, and `grep -c '^ - name:'` gives 119 — other same-indent `name:` keys exist in the file) | | Book CLI chapters | **114** chapters | `ls book/src/cli/*.md` | | Book lib chapters | **73** chapters | `ls book/src/lib/*.md` (parity with `pub mod`) | @@ -403,7 +403,7 @@ falsification_tests: prediction: apr validate bad-model.apr exits non-zero ``` -The tree carries 1984 contracts across inference, training, quantization, attention, FFN, +The tree carries 1985 contracts across inference, training, quantization, attention, FFN, tokenization, model formats, CLI safety — and this README itself. ## Migration from old crates diff --git a/contracts/cbtop-render-sparklines-v1.yaml b/contracts/cbtop-render-sparklines-v1.yaml new file mode 100644 index 0000000000..d2da90a475 --- /dev/null +++ b/contracts/cbtop-render-sparklines-v1.yaml @@ -0,0 +1,47 @@ +metadata: + id: C-CBTOP-RENDER-SPARKLINES + version: 1.0.0 + created: '2026-10-19' + author: PAIML Engineering + kind: pattern + status: ACTIVE_ALGORITHM_LEVEL + description: | + Pins CbtopApp::render_sparklines (#5595): the CPU history box needs + y < height - 8, the bricks box needs y < height - 5, empty data skips its + box, and y advances 4 rows past the CPU box and 2 past the bricks box. + references: + - 'crates/aprender-cbtop/src/app/render/panels.rs (render_sparklines)' + +equations: + sparkline_layout_gates: + formula: | + cpu drawn iff cpu nonempty and y < height - 8, then y += 4 + bricks drawn iff bricks nonempty and y < height - 5, then y += 2 + domain: render_sparklines calls on a fresh cell buffer + invariants: + - 'a skipped box leaves y unchanged' + +proof_obligations: +- id: CRS-INV-001 + type: invariant + property: each sparkline box is drawn only inside its headroom gate and advances y by its fixed amount + formal: 'drawn ≡ gate' + applies_to: sparkline_layout_gates + +falsification_tests: +- id: FALSIFY-CBTOP-RENDER-SPARKLINES-001 + rule: render_sparklines gates and advances exactly + prediction: 'boundary starts 21/22 (cpu) and 20/21 (bricks) flip the box; empty inputs draw nothing; final y is 8 for start 2 with both boxes' + test: cargo test -p aprender-cbtop --lib sparklines_tests + if_fails: the cbtop dashboard overflows its pane or drops a history box + ship_blocking: false + mutation: 'shift either headroom constant, shorten the +2.0 advance, or invert the bricks emptiness check; each must turn RED' + +qa_gate: + id: QA-CBTOP-RENDER-SPARKLINES-001 + name: cbtop sparklines gate + description: sparkline box gates and y advance are exact + checks: + - sparkline_layout_gates + pass_criteria: FALSIFY-CBTOP-RENDER-SPARKLINES-001 passes + falsification: Any failure fails the gate diff --git a/contracts/contracts.nt b/contracts/contracts.nt index f0d8c3a042..f1afea9e4b 100644 --- a/contracts/contracts.nt +++ b/contracts/contracts.nt @@ -9456,6 +9456,11 @@ . "contracts/entrenar/canary-score-gate-v1.yaml"^^ . "canary-score-gate-v1"^^ . + . + . + "contracts/cbtop-render-sparklines-v1.yaml"^^ . + "cbtop-render-sparklines-v1"^^ . + "pattern"^^ . . . . diff --git a/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json b/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json index 6bb276cb32..2e6900302a 100644 --- a/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json +++ b/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json @@ -1,7 +1,7 @@ { - "census_id_set_sha256": "7597b4ad189f534dd58cda55c9b1fe29e6339ddb77fd5f40969b4a028eed8f88", + "census_id_set_sha256": "55d39e2b34f9338e87adc468dee041192a67ddacf95bca4be5b2eabc529ecdf0", "relations_sha256": "811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850", - "reasoner_git_sha": "461bf9ef1921a8fbea4bc338f21b566ec342a95e", + "reasoner_git_sha": "f20d7a6eac1dfcccb8d8d40ab27fc9b69306ac85", "checkable_n": 87, "result": { "kind": "model", diff --git a/crates/aprender-cbtop/src/app/mod.rs b/crates/aprender-cbtop/src/app/mod.rs index fdf4272109..89427a0af8 100644 --- a/crates/aprender-cbtop/src/app/mod.rs +++ b/crates/aprender-cbtop/src/app/mod.rs @@ -185,3 +185,6 @@ impl CbtopApp { Ok(()) } } + +#[cfg(test)] +mod sparklines_tests; diff --git a/crates/aprender-cbtop/src/app/sparklines_tests.rs b/crates/aprender-cbtop/src/app/sparklines_tests.rs new file mode 100644 index 0000000000..ce49bd9eda --- /dev/null +++ b/crates/aprender-cbtop/src/app/sparklines_tests.rs @@ -0,0 +1,104 @@ +//! Behavioural tests for `CbtopApp::render_sparklines` (ticket #5595). + +use super::CbtopApp; +use presentar_core::TextStyle; +use presentar_terminal::direct::{CellBuffer, DirectTerminalCanvas}; +use presentar_terminal::Theme; + +const W: u16 = 80; +const H: u16 = 30; + +/// Run `render_sparklines` on a fresh buffer; return the text of every row and the final y. +fn run(start_y: f32, height: u16, cpu: &[f64], bricks: &[f64]) -> (Vec, f32) { + let mut buffer = CellBuffer::new(W, H); + let mut y = start_y; + { + let mut canvas = DirectTerminalCanvas::new(&mut buffer); + let style = TextStyle::default(); + CbtopApp::render_sparklines( + &mut canvas, + &mut y, + height, + cpu, + bricks, + 40, + 43, + 20, + &Theme::tokyo_night(), + &style, + &style, + ); + } + let rows = (0..H) + .map(|r| { + (0..W) + .filter_map(|x| buffer.get(x, r).map(|c| c.symbol.to_string())) + .collect::() + }) + .collect(); + (rows, y) +} + +fn has(rows: &[String], needle: &str) -> bool { + rows.iter().any(|r| r.contains(needle)) +} + +#[test] +fn both_boxes_drawn_and_y_advances_to_end_of_second_box() { + let (rows, y) = run(2.0, H, &[10.0, 50.0, 90.0], &[1.0, 2.0, 3.0]); + assert!(rows[2].contains("┌─ CPU History (braille) "), "{}", rows[2]); + assert!(rows[3].starts_with(" │ "), "{}", rows[3]); + assert!( + rows[4].contains('└') && rows[4].contains('┘'), + "{}", + rows[4] + ); + // cpu block advances 1 + 1 + 2 = 4 rows, so the bricks box starts at row 6 + assert!(rows[6].contains("┌─ Bricks/sec (braille) "), "{}", rows[6]); + assert!(rows[8].contains('└'), "{}", rows[8]); + assert_eq!(y, 8.0, "second box advances 1 + 1 only"); +} + +#[test] +fn empty_cpu_data_skips_cpu_box_and_leaves_y() { + let (rows, y) = run(2.0, H, &[], &[1.0, 2.0]); + assert!(!has(&rows, "CPU History")); + assert!(rows[2].contains("┌─ Bricks/sec (braille) "), "{}", rows[2]); + assert_eq!(y, 4.0); +} + +#[test] +fn empty_bricks_data_skips_bricks_box() { + let (rows, y) = run(2.0, H, &[5.0], &[]); + assert!(has(&rows, "CPU History")); + assert!(!has(&rows, "Bricks/sec")); + assert_eq!(y, 6.0); +} + +#[test] +fn both_empty_draws_nothing() { + let (rows, y) = run(2.0, H, &[], &[]); + assert!(rows.iter().all(|r| r.trim().is_empty())); + assert_eq!(y, 2.0); +} + +#[test] +fn cpu_box_needs_eight_rows_of_headroom() { + // y < height - 8 is strict: 22 < 22 is false, 21 < 22 is true + let (rows, y) = run(22.0, H, &[5.0], &[]); + assert!(!has(&rows, "CPU History")); + assert_eq!(y, 22.0); + let (rows, _) = run(21.0, H, &[5.0], &[]); + assert!(has(&rows, "CPU History")); +} + +#[test] +fn bricks_box_needs_five_rows_of_headroom() { + // after the cpu box y = start + 4; bricks need y < height - 5 = 25 + let (rows, y) = run(20.0, H, &[5.0], &[1.0]); + assert!(has(&rows, "Bricks/sec"), "start 20 -> y 24 < 25"); + assert_eq!(y, 26.0); + let (rows, y) = run(21.0, H, &[5.0], &[1.0]); + assert!(!has(&rows, "Bricks/sec"), "start 21 -> y 25 is not < 25"); + assert_eq!(y, 25.0); +} From d0b1f1f490ddd99e3b262e946589dc38154e2ea1 Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Mon, 19 Oct 2026 06:17:52 +0200 Subject: [PATCH 3/6] chore(regen): derived files for the third branch-only fold Co-Authored-By: Claude Sonnet 5.5 --- README.md | 4 ++-- contracts/contracts.nt | 5 +++++ ...609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 191f91b659..f14aaebaff 100644 --- a/README.md +++ b/README.md @@ -114,7 +114,7 @@ publishing — all backed by YAML provable contracts that fail CI on drift. | Metric | Count | Source of truth | |-------:|------:|---| | Workspace crates | **81** workspace crates | `cargo metadata --no-deps` (NOT `ls crates/` — 4 are `exclude`d, 1 has no Cargo.toml) | -| Provable contracts | **1985** provable contracts | `contracts/census.json` `.n_files` — the set `pv lint` walks (`pv census`, ONT-001 ONT-1; regenerated by `make contracts`, written by `make readme-sync`, guarded by `scripts/check_readme_claims.sh`) | +| Provable contracts | **1986** provable contracts | `contracts/census.json` `.n_files` — the set `pv lint` walks (`pv census`, ONT-001 ONT-1; regenerated by `make contracts`, written by `make readme-sync`, guarded by `scripts/check_readme_claims.sh`) | | CLI commands | **113** CLI commands | `contracts/apr-cli-commands-v1.yaml` §`commands` (parse the list; `apr --help` also lists `help` itself, and `grep -c '^ - name:'` gives 119 — other same-indent `name:` keys exist in the file) | | Book CLI chapters | **114** chapters | `ls book/src/cli/*.md` | | Book lib chapters | **73** chapters | `ls book/src/lib/*.md` (parity with `pub mod`) | @@ -403,7 +403,7 @@ falsification_tests: prediction: apr validate bad-model.apr exits non-zero ``` -The tree carries 1985 contracts across inference, training, quantization, attention, FFN, +The tree carries 1986 contracts across inference, training, quantization, attention, FFN, tokenization, model formats, CLI safety — and this README itself. ## Migration from old crates diff --git a/contracts/contracts.nt b/contracts/contracts.nt index f1afea9e4b..b8466e2403 100644 --- a/contracts/contracts.nt +++ b/contracts/contracts.nt @@ -9461,6 +9461,11 @@ "contracts/cbtop-render-sparklines-v1.yaml"^^ . "cbtop-render-sparklines-v1"^^ . "pattern"^^ . + . + . + "contracts/cgp-doctor-collect-checks-v1.yaml"^^ . + "cgp-doctor-collect-checks-v1"^^ . + "pattern"^^ . . . . diff --git a/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json b/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json index 2e6900302a..4d43fc83c7 100644 --- a/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json +++ b/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json @@ -1,7 +1,7 @@ { - "census_id_set_sha256": "55d39e2b34f9338e87adc468dee041192a67ddacf95bca4be5b2eabc529ecdf0", + "census_id_set_sha256": "d52b0df9a691c3e7eb14efb9fe1d92e8988028b67f627eb2fb1361b1f3d01dc0", "relations_sha256": "811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850", - "reasoner_git_sha": "f20d7a6eac1dfcccb8d8d40ab27fc9b69306ac85", + "reasoner_git_sha": "a538a91d80804af818bc1a92e5a3e1aba25059df", "checkable_n": 87, "result": { "kind": "model", From 7be213f782cf2981b327ecc96ecc7b5e7f82814d Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Mon, 19 Oct 2026 08:18:03 +0200 Subject: [PATCH 4/6] fix(contracts): cargo-test formal entries carry a declared symbol so formal_prose stays at 1464 Co-Authored-By: Claude Sonnet 5.5 --- contracts/cgp-doctor-collect-checks-v1.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/cgp-doctor-collect-checks-v1.yaml b/contracts/cgp-doctor-collect-checks-v1.yaml index 273bdf4cea..96b34fbf4d 100644 --- a/contracts/cgp-doctor-collect-checks-v1.yaml +++ b/contracts/cgp-doctor-collect-checks-v1.yaml @@ -21,12 +21,12 @@ proof_obligations: - id: CGP-DOCTOR-INV-001 type: invariant property: "Check list order and names are fixed" - formal: "cargo test -p aprender-cgp --lib test_collect_checks_names_and_order exits 0" + formal: "∀ run: cargo test -p aprender-cgp --lib test_collect_checks_names_and_order exits 0" applies_to: collect_checks_shape - id: CGP-DOCTOR-INV-002 type: invariant property: "CUPTI status tracks its path" - formal: "cargo test -p aprender-cgp --lib test_collect_checks_cupti_status_tracks_path exits 0" + formal: "∀ run: cargo test -p aprender-cgp --lib test_collect_checks_cupti_status_tracks_path exits 0" applies_to: collect_checks_shape falsification_tests: From 9ae1d1fb8d668d69416fc689bd74e8c444fa4e3e Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Mon, 19 Oct 2026 17:30:02 +0200 Subject: [PATCH 5/6] fix(contracts): regenerate witness after merging main (WitnessStale failed ont5/lint gates) Co-Authored-By: Claude Sonnet 5.5 --- ...2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json b/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json index 13582518f0..ab3b97e66c 100644 --- a/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json +++ b/contracts/witness/811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850.json @@ -1,7 +1,7 @@ { - "census_id_set_sha256": "063d371c514532fccc38497ed2f0d85711be3c35061de05df561446f16e93d99", + "census_id_set_sha256": "2cd65471402c5d974cca226206c779350b3419dda8b5db7b61d0fc70d2fb2549", "relations_sha256": "811c78184eb2609244c59534f015f0be2f90923120a3027c176ad56723d0d850", - "reasoner_git_sha": "56ae1edeaf9f0761d3e0f9bf0754fb735e7c3d05", + "reasoner_git_sha": "66c60576036bd25996d85336c445a9170778471a", "checkable_n": 87, "result": { "kind": "model", From 2d7da26d50a806490433a07b6c6d9eac44eae85d Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Mon, 19 Oct 2026 22:26:55 +0200 Subject: [PATCH 6/6] fix(contracts): regenerate shapes.ttl and witness with the in-tree pv (ont4b freshness gate) Co-Authored-By: Claude Sonnet 5.5 --- contracts/shapes.ttl | 68 ++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/contracts/shapes.ttl b/contracts/shapes.ttl index a718856fa0..bed403e57d 100644 --- a/contracts/shapes.ttl +++ b/contracts/shapes.ttl @@ -1983,11 +1983,11 @@ ] ; sh:property [ sh:path ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:in ( "8.9" "12.1" ) ; @@ -2067,11 +2067,11 @@ sh:maxCount 1 ; sh:class ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2084,11 +2084,11 @@ sh:targetClass ; sh:property [ sh:path ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2103,11 +2103,11 @@ sh:targetClass ; sh:property [ sh:path ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2194,7 +2194,7 @@ sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; sh:property [ sh:path ; @@ -2217,7 +2217,7 @@ ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2239,7 +2239,7 @@ sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; sh:property [ sh:path ; @@ -2257,7 +2257,7 @@ sh:path ; sh:minCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; sh:property [ sh:path ; @@ -2269,7 +2269,7 @@ ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2283,7 +2283,7 @@ ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2347,11 +2347,11 @@ sh:path ; sh:minCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2392,11 +2392,11 @@ sh:path ; sh:minCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2448,11 +2448,11 @@ sh:path ; sh:minCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2511,11 +2511,11 @@ sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2543,11 +2543,11 @@ sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2569,11 +2569,11 @@ sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2595,11 +2595,11 @@ sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2626,11 +2626,11 @@ sh:minCount 1 ; sh:maxCount 1 ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2721,7 +2721,7 @@ sh:minCount 1 ; sh:class ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; sh:property [ sh:path ; @@ -2733,7 +2733,7 @@ ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ; @@ -2768,11 +2768,11 @@ sh:maxCount 1 ; sh:class ; sh:nodeKind sh:IRI ; - sh:node ; + sh:node ; ] ; . - a sh:NodeShape ; + a sh:NodeShape ; sh:property [ sh:path ; sh:minCount 1 ;