Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
891a374
feat: implement solver registry architecture core
pesap May 2, 2026
be8307e
refactor: isolate scip integration
pesap May 2, 2026
dc371f5
fix: incremental fixes
pesap May 3, 2026
137833a
refactor: split CLI execution backends
pesap May 3, 2026
11085b2
docs: add architecture refactor plan and sentrux rules
pesap May 4, 2026
47be428
feat: scaffold architecture seam crates
pesap May 4, 2026
7a8ba6b
refactor: simplify solver contract seam migration
pesap May 4, 2026
346b8c8
chore: stabilize autoresearch sentrux harness and checks gate
pesap May 4, 2026
fcb62b9
refactor: extract inspect modeling builders into dedicated module
pesap May 4, 2026
11a509f
refactor: rename cli debug module to debug_shell to remove sentrux cy…
pesap May 4, 2026
10a1e47
refactor: lower inline selector parser complexity in expressions_domains
pesap May 4, 2026
7791d81
refactor: remove solver preflight direct dependency on arco-contracts…
pesap May 4, 2026
8778e53
refactor: route solver trait status/error imports through solver crat…
pesap May 4, 2026
962257b
refactor: split surface math-block rewrite scanner into focused brace…
pesap May 4, 2026
9de30ba
refactor: decompose xpress solve_model into cohesive helpers to remov…
pesap May 4, 2026
d446135
refactor: decompose algebra tokenizer into focused token parsers to c…
pesap May 4, 2026
17f6088
refactor: route arco-ops request/validation seam away from contracts+…
pesap May 4, 2026
75d46a1
refactor: introduce kdl artifacts seam and reroute compile-type impor…
pesap May 4, 2026
796cfd2
refactor: revert kdl artifacts seam and restore direct compile import…
pesap May 4, 2026
402e97b
refactor: reintroduce kdl artifacts seam for export/scip/debug shell …
pesap May 4, 2026
0c8e28a
fix(kdl): lower reduce projection reports (#227)
pesap May 6, 2026
67cba37
refactor: introduce runtime workspace seam
pesap May 6, 2026
d1f3e92
refactor: introduce model and algebra seams
pesap May 6, 2026
8ffdf67
fix: honor external process solver profiles
pesap May 6, 2026
b70d9a2
refactor: move scip adapter to target seams
pesap May 6, 2026
b1db533
refactor: introduce exchange seam
pesap May 6, 2026
bd1e38a
refactor(architecture): route solve flows through arco-ops seam
pesap May 6, 2026
79f11ab
fix(build): restore compatible solver feature wiring
pesap May 6, 2026
8ad9628
fix(cli): allow solver show when legacy solver.json exists
pesap May 6, 2026
bed5ebb
docs(examples): add nodal allocation lowering and export walkthrough
pesap May 6, 2026
a13040d
fix(reports): support tuple-domain variable report emission
pesap May 6, 2026
17fc71e
refactor(kdl): remove legacy paths and normalize report lowering
pesap May 6, 2026
bc577a0
refactor(architecture): route surfaces through ops
pesap May 6, 2026
e60e9cc
refactor(architecture): split compile from kdl
pesap May 6, 2026
f8e1111
chore: architecture changes
pesap May 7, 2026
bfdfe8f
docs(architecture): preserve refactor planning state
pesap May 7, 2026
61d01a1
refactor(architecture): add primitive model seams
pesap May 7, 2026
cec247f
refactor(kdl): build primitive model documents
pesap May 7, 2026
a9578a5
chore(sentrux): align architecture gate direction
pesap May 7, 2026
3ae81e4
docs(architecture): record primitive refactor progress
pesap May 7, 2026
1fb4042
refactor(format): replace exchange seam
pesap May 7, 2026
e3d0391
refactor(model): freeze primitive builder output
pesap May 7, 2026
a5dd237
feat(model): add dense indexed parameter tables
pesap May 7, 2026
573393e
refactor(model): absorb expression primitives
pesap May 7, 2026
6abbd07
feat(format): export model views as mps
pesap May 7, 2026
8746805
fix(model): reexport constraint ids from expr seam
pesap May 7, 2026
d03b36a
refactor(solver): absorb contract crate
pesap May 7, 2026
0cb2e62
feat(solver): route model views through registry
pesap May 7, 2026
02ddadb
refactor(python): use ops for core bindings
pesap May 7, 2026
a251d88
refactor(workspace): retire algebra crate seam
pesap May 7, 2026
3d02f4b
refactor(workspace): delete algebra crate
pesap May 7, 2026
8998c54
refactor(format): retire legacy export crates
pesap May 7, 2026
268297f
refactor(solver): route adapters through model views
pesap May 7, 2026
53a2528
refactor(workspace): retire compile target crates
pesap May 7, 2026
62ec940
refactor(architecture): tighten ops seams and decouple blocks core
pesap May 7, 2026
659cd01
refactor(workspace): rescue and ship local architecture migration
pesap May 7, 2026
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
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -573,8 +573,10 @@ bindings/python/licenses/
# Local agent scratch space
.opencode/

# Hiding LLM plan
# Local one-off plan notes (keep repo plans tracked)
docs/plan*
!docs/plans/
!docs/plans/**/*.md

#
artifacts/
Expand Down
302 changes: 302 additions & 0 deletions .sentrux/rules.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,302 @@
# Target-state architectural rules for Arco.
#
# These rules describe ARCHITECTURE_REFACTOR_PLAN.md, not the current
# transitional workspace. A violation is migration debt unless the architecture
# plan changes first.
#
# Layer order convention:
# order = 0 is the most foundational layer.
# Lower-order layers may depend on higher-order layers (Sentrux checks from low to high).

[constraints]
max_cycles = 0
max_coupling = "C"
max_cc = 25
no_god_files = false

# ---------------------------------------------------------------------------
# Target layers
# ---------------------------------------------------------------------------

[[layers]]
name = "primitive_model"
paths = ["crates/arco-model/src/**"]
order = 5

[[layers]]
name = "diagnostics"
paths = ["crates/arco-diagnostics/src/**"]
order = 5

[[layers]]
name = "solver_primitives"
paths = ["crates/arco-solver/src/**"]
order = 5

[[layers]]
name = "support_tooling"
paths = ["crates/arco-tools/src/**"]
order = 5

[[layers]]
name = "runtime_execution"
paths = ["crates/arco-runtime/src/**"]
order = 4

[[layers]]
name = "authoring_surfaces"
paths = [
"crates/arco-kdl/src/**",
"crates/arco-json/src/**",
"crates/arco-yaml/src/**",
]
order = 4

[[layers]]
name = "validation"
paths = ["crates/arco-validate/src/**"]
order = 4

[[layers]]
name = "format_primitives"
paths = [
"crates/arco-format/src/**",
]
order = 5

[[layers]]
name = "concrete_formats"
paths = [
"crates/arco-lp/src/**",
"crates/arco-mps/src/**",
"crates/arco-nl/src/**",
]
order = 6

[[layers]]
name = "solver_adapters"
paths = [
"crates/arco-highs/src/**",
"crates/arco-ipopt/src/**",
"crates/arco-xpress/src/**",
"crates/arco-scip/src/**",
]
order = 3


[[layers]]
name = "operations_adapter"
paths = ["crates/arco-ops/src/**"]
order = 2

[[layers]]
name = "block_composition"
paths = ["crates/arco-blocks/src/**"]
order = 1

[[layers]]
name = "interaction_surfaces"
paths = [
"crates/arco-cli/src/**",
"bindings/python/src/**",
]
order = 0

# ---------------------------------------------------------------------------
# Interaction surfaces: use arco-ops only among Arco crates.
# ---------------------------------------------------------------------------

[[boundaries]]
from = "crates/arco-cli/src/**"
to = "crates/arco-model/src/**"
reason = "CLI must use arco-ops instead of primitive model APIs directly"

[[boundaries]]
from = "crates/arco-cli/src/**"
to = "crates/arco-blocks/src/**"
reason = "CLI must consume block composition through arco-ops adapters"

[[boundaries]]
from = "crates/arco-cli/src/**"
to = "crates/arco-kdl/src/**"
reason = "CLI must use arco-ops instead of authoring surfaces directly"

[[boundaries]]
from = "crates/arco-cli/src/**"
to = "crates/arco-validate/src/**"
reason = "CLI must use arco-ops instead of validation directly"

[[boundaries]]
from = "crates/arco-cli/src/**"
to = "crates/arco-format/src/**"
reason = "CLI must use arco-ops instead of format primitives directly"

[[boundaries]]
from = "crates/arco-cli/src/**"
to = "crates/arco-solver/src/**"
reason = "CLI must use arco-ops instead of solver primitives directly"

[[boundaries]]
from = "crates/arco-cli/src/**"
to = "crates/arco-runtime/src/**"
reason = "CLI must use arco-ops instead of runtime execution directly"

[[boundaries]]
from = "bindings/python/src/**"
to = "crates/arco-kdl/src/**"
reason = "Python bindings must use arco-ops instead of authoring surfaces directly"

[[boundaries]]
from = "bindings/python/src/**"
to = "crates/arco-validate/src/**"
reason = "Python bindings must use arco-ops instead of validation directly"

[[boundaries]]
from = "bindings/python/src/**"
to = "crates/arco-format/src/**"
reason = "Python bindings must use arco-ops instead of format primitives directly"

[[boundaries]]
from = "bindings/python/src/**"
to = "crates/arco-solver/src/**"
reason = "Python bindings must use arco-ops instead of solver primitives directly"

[[boundaries]]
from = "bindings/python/src/**"
to = "crates/arco-runtime/src/**"
reason = "Python bindings must use arco-ops instead of runtime execution directly"

[[boundaries]]
from = "bindings/python/src/**"
to = "crates/arco-highs/src/**"
reason = "Python bindings must not couple directly to solver adapters"

[[boundaries]]
from = "bindings/python/src/**"
to = "crates/arco-ipopt/src/**"
reason = "Python bindings must not couple directly to solver adapters"

[[boundaries]]
from = "bindings/python/src/**"
to = "crates/arco-xpress/src/**"
reason = "Python bindings must not couple directly to solver adapters"

[[boundaries]]
from = "bindings/python/src/**"
to = "crates/arco-scip/src/**"
reason = "Python bindings must not couple directly to solver adapters"

[[boundaries]]
from = "crates/arco-kdl/src/**"
to = "crates/arco-solver/src/**"
reason = "KDL must stay solver-policy-neutral"

[[boundaries]]
from = "crates/arco-kdl/src/**"
to = "crates/arco-runtime/src/**"
reason = "KDL must not own runtime execution mechanics"

[[boundaries]]
from = "crates/arco-kdl/src/**"
to = "crates/arco-format/src/**"
reason = "KDL must not own format/export behavior"

[[boundaries]]
from = "crates/arco-kdl/src/**"
to = "crates/arco-highs/src/**"
reason = "KDL must not couple to concrete solver adapters"

[[boundaries]]
from = "crates/arco-kdl/src/**"
to = "crates/arco-ipopt/src/**"
reason = "KDL must not couple to concrete solver adapters"

[[boundaries]]
from = "crates/arco-kdl/src/**"
to = "crates/arco-xpress/src/**"
reason = "KDL must not couple to concrete solver adapters"

[[boundaries]]
from = "crates/arco-kdl/src/**"
to = "crates/arco-scip/src/**"
reason = "KDL must not couple to concrete solver adapters"

[[boundaries]]
from = "crates/arco-validate/src/**"
to = "crates/arco-kdl/src/**"
reason = "Validation must run over primitive model views, not KDL internals"

[[boundaries]]
from = "crates/arco-format/src/**"
to = "crates/arco-kdl/src/**"
reason = "Format primitives must not depend on authoring-surface internals"

[[boundaries]]
from = "crates/arco-format/src/**"
to = "crates/arco-solver/src/**"
reason = "Format primitives/concrete formats must not own solver selection policy"

[[boundaries]]
from = "crates/arco-solver/src/**"
to = "crates/arco-kdl/src/**"
reason = "Solver primitives must stay authoring-surface neutral"

[[boundaries]]
from = "crates/arco-solver/src/**"
to = "crates/arco-highs/src/**"
reason = "Solver primitives must stay adapter-neutral"

[[boundaries]]
from = "crates/arco-solver/src/**"
to = "crates/arco-ipopt/src/**"
reason = "Solver primitives must stay adapter-neutral"

[[boundaries]]
from = "crates/arco-solver/src/**"
to = "crates/arco-xpress/src/**"
reason = "Solver primitives must stay adapter-neutral"

[[boundaries]]
from = "crates/arco-solver/src/**"
to = "crates/arco-scip/src/**"
reason = "Solver primitives must stay adapter-neutral"

[[boundaries]]
from = "crates/arco-ops/src/**"
to = "crates/arco-highs/src/**"
reason = "arco-ops should use solver primitives instead of concrete adapters directly"

[[boundaries]]
from = "crates/arco-ops/src/**"
to = "crates/arco-ipopt/src/**"
reason = "arco-ops should use solver primitives instead of concrete adapters directly"

[[boundaries]]
from = "crates/arco-ops/src/**"
to = "crates/arco-xpress/src/**"
reason = "arco-ops should use solver primitives instead of concrete adapters directly"

[[boundaries]]
from = "crates/arco-ops/src/**"
to = "crates/arco-scip/src/**"
reason = "arco-ops should use solver primitives instead of concrete adapters directly"

[[boundaries]]
from = "crates/arco-blocks/src/**"
to = "crates/arco-kdl/src/**"
reason = "Block composition must not depend on authoring-surface internals"

[[boundaries]]
from = "crates/arco-blocks/src/**"
to = "crates/arco-validate/src/**"
reason = "Block composition must route validation through arco-ops"

[[boundaries]]
from = "crates/arco-blocks/src/**"
to = "crates/arco-format/src/**"
reason = "Block composition must route format/export through arco-ops"

[[boundaries]]
from = "crates/arco-blocks/src/**"
to = "crates/arco-solver/src/**"
reason = "Block composition must route solving through arco-ops"
Loading
Loading