mirror of
https://github.com/SHOGGOTH-SECTOR/sica-fondt.git
synced 2026-07-31 08:06:26 +00:00
Mechanical structure-only pass (no document/guide content edits): - Move src/ichor, src/endocrine, and docs/ into core/; the old top-level mafiabot_core/ becomes core/. Everything now lives under a single core/ root. - Drop the "mafiabot" label from the Ada/Alire crate: core.gpr (project Core), alire.toml name = "core"; the generated *_config.* regenerate as core_config.*. - Repoint build-critical wiring only: - .claude/skills/run-sica-fondt/smoke.sh (ponyc + Ada + COBOL paths) - core/src/endocrine R source()/runner paths and the test glob - .github/workflows/ci.yml (working-directory + gpr name) Verified green: smoke ALL GREEN (Pony Ichor, Ada core crate + tests, COBOL E1 vault); R endocrine 14/0; Octave ETR 26/0/1. Deferred (reserved for a less-ephemeral doc/guide pass): docmap.yaml, the guide files and nested AGENTS.md/README prose + now-stale relative links, SOUL.md, and the deeper ring/storage restructure. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015hmgREHNsxYCuim33yUF2c
165 lines
6.0 KiB
R
165 lines
6.0 KiB
R
# --- Tests for Driver 3: Ethical Integrity (Eth-Int) ---
|
|
# Run from repo root: Rscript src/endocrine/test_ethical_integrity.R
|
|
# Exit 0 => all pass.
|
|
|
|
source("core/src/endocrine/test_framework.R")
|
|
source("core/src/endocrine/driver_ethical_integrity.R")
|
|
|
|
# --- init_principles_state constructor ---
|
|
test_case("init_principles_state builds an empty state", function() {
|
|
s <- init_principles_state()
|
|
expect_true(is.list(s$principles))
|
|
expect_equal(length(s$principles), 0L)
|
|
})
|
|
|
|
# --- add_principle ---
|
|
test_case("add_principle appends a principle to the list", function() {
|
|
s <- init_principles_state()
|
|
s <- add_principle(s, "honesty", 0.5, c("deceive"))
|
|
expect_equal(length(s$principles), 1L)
|
|
expect_equal(s$principles[[1]]$id, "honesty")
|
|
expect_equal(s$principles[[1]]$conviction, 0.5)
|
|
expect_equal(s$principles[[1]]$antithesis, c("deceive"))
|
|
|
|
s <- add_principle(s, "loyalty", 0.7, c("betray"))
|
|
expect_equal(length(s$principles), 2L)
|
|
expect_equal(s$principles[[2]]$id, "loyalty")
|
|
})
|
|
|
|
test_case("add_principle clamps conviction above 1.0 down to 1.0", function() {
|
|
s <- init_principles_state()
|
|
s <- add_principle(s, "absolute", 1.5, c("violate"))
|
|
expect_equal(s$principles[[1]]$conviction, 1.0)
|
|
})
|
|
|
|
test_case("add_principle clamps negative conviction up to 0.0", function() {
|
|
s <- init_principles_state()
|
|
s <- add_principle(s, "weak", -0.3, c("violate"))
|
|
expect_equal(s$principles[[1]]$conviction, 0.0)
|
|
})
|
|
|
|
# --- evaluate_trajectory_costs ---
|
|
test_case("no matching tags and zero compromise yields base_energy", function() {
|
|
s <- init_principles_state()
|
|
s <- add_principle(s, "honesty", 0.8, c("deceive"))
|
|
cost <- evaluate_trajectory_costs(
|
|
s,
|
|
action_tags = c("walk", "talk"),
|
|
alignment_tags = c("unrelated"),
|
|
base_energy = 10.0,
|
|
compromise_factor = 0.0
|
|
)
|
|
expect_equal(cost, 10.0)
|
|
})
|
|
|
|
test_case("empty principles, empty tags, zero compromise yields base_energy", function() {
|
|
s <- init_principles_state()
|
|
cost <- evaluate_trajectory_costs(
|
|
s,
|
|
action_tags = character(0),
|
|
alignment_tags = character(0),
|
|
base_energy = 42.0,
|
|
compromise_factor = 0.0
|
|
)
|
|
expect_equal(cost, 42.0)
|
|
})
|
|
|
|
test_case("antithetical action against high conviction costs much more than base", function() {
|
|
s <- init_principles_state()
|
|
s <- add_principle(s, "honesty", 0.9, c("deceive"))
|
|
base_cost <- evaluate_trajectory_costs(
|
|
s, c("walk"), character(0), 10.0, 0.0
|
|
)
|
|
anti_cost <- evaluate_trajectory_costs(
|
|
s, c("deceive"), character(0), 10.0, 0.0
|
|
)
|
|
# base_cost has no antithetical match -> equals base_energy
|
|
expect_equal(base_cost, 10.0)
|
|
# antithetical match multiplies by (1 + exp(5 * 0.9))
|
|
expect_true(anti_cost > base_cost, "antithetical cost exceeds base")
|
|
expected_anti <- 10.0 * (1.0 + exp(5.0 * 0.9))
|
|
expect_equal(anti_cost, expected_anti, tol = 1e-6)
|
|
})
|
|
|
|
test_case("higher conviction yields a steeper antithetical penalty", function() {
|
|
low <- init_principles_state()
|
|
low <- add_principle(low, "honesty", 0.2, c("deceive"))
|
|
high <- init_principles_state()
|
|
high <- add_principle(high, "honesty", 0.95, c("deceive"))
|
|
cost_low <- evaluate_trajectory_costs(low, c("deceive"), character(0), 10.0, 0.0)
|
|
cost_high <- evaluate_trajectory_costs(high, c("deceive"), character(0), 10.0, 0.0)
|
|
expect_true(cost_high > cost_low, "stronger conviction punishes more")
|
|
})
|
|
|
|
test_case("alignment tag against high conviction discounts below base", function() {
|
|
s <- init_principles_state()
|
|
s <- add_principle(s, "honesty", 0.9, c("deceive"))
|
|
aligned_cost <- evaluate_trajectory_costs(
|
|
s, character(0), c("honesty"), 10.0, 0.0
|
|
)
|
|
expect_true(aligned_cost < 10.0, "alignment discounts cost")
|
|
expected <- 10.0 * exp(-5.0 * 0.9)
|
|
expect_equal(aligned_cost, expected, tol = 1e-6)
|
|
})
|
|
|
|
test_case("compromise_factor adds a linear penalty (1 + 2*factor)", function() {
|
|
s <- init_principles_state()
|
|
cost <- evaluate_trajectory_costs(
|
|
s, character(0), character(0), 10.0, 0.5
|
|
)
|
|
# factor 0.5 -> 1 + 2*0.5 = 2.0 multiplier
|
|
expect_equal(cost, 20.0)
|
|
})
|
|
|
|
test_case("zero compromise_factor applies no compromise penalty", function() {
|
|
s <- init_principles_state()
|
|
cost <- evaluate_trajectory_costs(
|
|
s, character(0), character(0), 7.0, 0.0
|
|
)
|
|
expect_equal(cost, 7.0)
|
|
})
|
|
|
|
# --- enforce_conviction ---
|
|
test_case("enforce_conviction raises conviction of upheld principle", function() {
|
|
s <- init_principles_state()
|
|
s <- add_principle(s, "honesty", 0.5, c("deceive"))
|
|
s2 <- enforce_conviction(s, c("honesty"), load_factor = 1.0)
|
|
# increase = 0.1 * 1.0 * (1 - 0.5) = 0.05
|
|
expect_equal(s2$principles[[1]]$conviction, 0.55)
|
|
})
|
|
|
|
test_case("enforce_conviction never raises conviction above 1.0", function() {
|
|
s <- init_principles_state()
|
|
s <- add_principle(s, "honesty", 0.99, c("deceive"))
|
|
s2 <- enforce_conviction(s, c("honesty"), load_factor = 100.0)
|
|
expect_true(s2$principles[[1]]$conviction <= 1.0, "capped at 1.0")
|
|
expect_equal(s2$principles[[1]]$conviction, 1.0)
|
|
})
|
|
|
|
test_case("enforce_conviction has diminishing returns near 1.0", function() {
|
|
low_s <- init_principles_state()
|
|
low_s <- add_principle(low_s, "honesty", 0.2, c("deceive"))
|
|
high_s <- init_principles_state()
|
|
high_s <- add_principle(high_s, "honesty", 0.9, c("deceive"))
|
|
|
|
low_after <- enforce_conviction(low_s, c("honesty"), load_factor = 1.0)
|
|
high_after <- enforce_conviction(high_s, c("honesty"), load_factor = 1.0)
|
|
|
|
low_gain <- low_after$principles[[1]]$conviction - 0.2
|
|
high_gain <- high_after$principles[[1]]$conviction - 0.9
|
|
expect_true(high_gain < low_gain, "gain shrinks as conviction approaches 1.0")
|
|
})
|
|
|
|
test_case("enforce_conviction leaves non-upheld principles unchanged", function() {
|
|
s <- init_principles_state()
|
|
s <- add_principle(s, "honesty", 0.5, c("deceive"))
|
|
s <- add_principle(s, "loyalty", 0.4, c("betray"))
|
|
s2 <- enforce_conviction(s, c("honesty"), load_factor = 1.0)
|
|
# loyalty was not chosen -> unchanged
|
|
expect_equal(s2$principles[[2]]$conviction, 0.4)
|
|
# honesty was chosen -> raised
|
|
expect_equal(s2$principles[[1]]$conviction, 0.55)
|
|
})
|
|
|
|
test_summary()
|