Structural contract layer: adopt henxels with retroactive application #138
Closed
opened 2026-09-05 01:36:57 +01:00 by conductor
·
4 comments
No Branch/Tag Specified
master
fix/shared-ci-unblock
fix/ci-concurrency-per-ref
fix/2552-handler-triage
feat/2618-context
fix/2604-scaffolding-surgical
feat/2618-provider-stack
feat/final-integration
feat/2618-safety-parity
feat/2609-integration-w6
feat/2618-audit-forge
feat/2618-background-memory
feat/2618-operator-residual
feat/2618-warm-recall
feat/2617-research-r3
feat/2606-spine-w4
feat/2617-research-r2
fix/2607-spine-dichotomy
feat/2609-go-interception-w3
feat/2618-memory-store
feat/2617-research-r1
feat/2609-go-interception-w2
fix/data-safety-audits
fix/integration-audits
fix/sqlite-floor-audits
feat/2617-research-r0
feat/2609-model-replay
fix/tool-boundary-audits
feat/2609-go-interception-w1
fix/2582-release-final
fix/2613-self-hosting-gate
removal-prep/dead-superseded-pile
removal-prep/auto-context
removal-prep/reconcile-tools
removal-prep/openai-compat-transport
removal-prep/message-queue
removal-prep/forge-client
removal-prep/cache
removal-prep/paths
fix/2532-text-selection
throwaway-force-merge-test
fix/2582-namespace-cli-flag
feat/2582-release-reporting
fix/2535-pane-scrollback
dichotomy-gap-f0
gap-transport
gap-construction-commands
wave-ca-ms
tmp-detach
gap-ltr
backup-rune-as
wave-ax
feat/wave6-rust-backend
feat/wave4-consolidation-kernel
ci/build-cognition-core-unit
ci/register-w34-canaries
feat/wire-programme-continuation
feat/wire-construction-commands-dispatch
feat/wire-stage-guards-transition
feat/tui-pane-swap-chat-left
fix/operator-probe-tools-2468
r2-wave2-memory-retrieval
r2-wave2-memory-storage
phase-g-strangler-evidence-provenance
phase-g-strangler-retrieval-index
tranche-r1-wave-0
m10-derive-refresh
t22-scaffolding-default-path
research-depth-gate
fix-407-autolabel
fix-tui-banner-surface
r13-m9-pr-proof
gitea-internal-endpoint
auto-label-epic-kinds
issue-templates-heading
issue-templates
event-driven-clean
deadline-return-fix
hardening-live-proof
hardening-authority-identity
event-driven-final-metrics
event-driven-gates-evidence
event-driven-continuation
async-intent-live-proof
async-intent-normalization
memory-t0-external-report
memory-t0-asis-map
t21.5-pending-class-fix
t21.5-gate-evidence
t21.5-root-cause-continuation
t21.4-gate-evidence
t21.4-qualify-defaults-fix
t21.4-final-v1-proof
prototype/openai-compat-transport
wr-experiment
adapt2-route-authority
pl0-experience-ledger
d5-authority-audit
task-d-stage-contracts
b3v2-fresh
d5-tightening
d4d5-artifact-contract
correction-1-d2d3
adapt9-artifact-authority
prov1-source-ledger
infra1-accept
infra1-probe5
infra1-probe4
infra1-probe3
infra1-probe2
infra1-probe
obs1-telemetry
rp13-metrics
rp12-rerun-163
rp11-retirement
issue161-harness-v2
issue161-harness
rp2-canonical-stage-model
sweep-live
umbrella-rewire
trigger-bump-2
release-token-fix
trigger-bump
version-reconcile
umbrella-pipeline
pinned-live
research-structuralization
merge-robot-checkout
p1-03-memory-selection
coverage-ratchet
failure-auto-filing
release-safety-net
ci-dependency-lock
bugfix-contract
merge-robot-fix
adversarial-gates
merge-robot
runner-desktop-gate
research-gate-evidence
backup/pinned-20260908-035000
release-tui-footer
v0.359.0
v0.358.3
v0.358.2
v0.358.1
v0.358.0
v0.357.0
v0.356.0
v0.355.0
v0.354.0
v0.353.0
v0.352.0
v0.351.0
v0.350.0
v0.349.0
v0.348.0
v0.347.0
tui-v0.346.0
v0.346.0
tui-v0.345.0
v0.345.0
tui-v0.344.0
v0.344.0
tui-v0.343.0
v0.343.0
tui-v0.342.0
v0.342.0
tui-v0.341.0
v0.341.0
tui-v0.340.0
v0.340.0
tui-v0.339.0
v0.339.0
tui-v0.338.0
v0.338.0
tui-v0.337.0
v0.337.0
tui-v0.336.0
v0.336.0
tui-v0.335.0
v0.335.0
tui-v0.334.0
v0.334.0
tui-v0.333.1
v0.333.1
tui-v0.333.0
v0.333.0
tui-v0.332.0
v0.332.0
tui-v0.331.1
v0.331.1
tui-v0.331.0
v0.331.0
tui-v0.330.0
v0.330.0
tui-v0.329.0
v0.329.0
tui-v0.328.0
v0.328.0
tui-v0.327.0
v0.327.0
tui-v0.326.0
v0.326.0
tui-v0.325.1
v0.325.1
tui-v0.325.0
v0.325.0
tui-v0.324.0
v0.324.0
tui-v0.323.0
v0.323.0
tui-v0.322.0
v0.322.0
tui-v0.321.0
v0.321.0
tui-v0.320.0
v0.320.0
tui-v0.319.2
v0.319.2
tui-v0.319.1
v0.319.1
tui-v0.319.0
v0.319.0
tui-v0.318.0
v0.318.0
tui-v0.317.0
v0.317.0
tui-v0.316.0
v0.316.0
v0.315.0
tui-v0.315.0
tui-v0.314.0
v0.314.0
tui-v0.313.0
v0.313.0
tui-v0.312.0
v0.312.0
tui-v0.311.0
v0.311.0
tui-v0.310.0
v0.310.0
tui-v0.309.0
v0.309.0
tui-v0.1.0
v0.308.0
v0.307.0
v0.306.0
v0.305.0
v0.304.0
v0.303.0
v0.302.0
v0.301.0
v0.300.0
v0.299.1
v0.299.0
v0.298.0
v0.297.0
v0.296.0
v0.295.0
v0.294.0
v0.293.2
v0.293.1
v0.293.0
v0.292.0
v0.291.0
v0.290.2
v0.290.1
v0.290.0
v0.289.0
v0.288.1
v0.288.0
v0.287.0
v0.286.0
v0.285.0
v0.284.1
v0.284.0
v0.283.0
v0.282.0
v0.281.0
v0.280.0
v0.279.2
v0.279.1
v0.279.0
v0.278.1
v0.278.0
v0.277.1
v0.277.0
v0.276.0
v0.275.0
v0.274.2
v0.274.1
v0.274.0
v0.273.0
v0.272.0
v0.271.0
v0.270.0
v0.269.1
v0.269.0
v0.268.0
v0.267.0
v0.266.0
v0.265.1
v0.265.0
v0.264.0
v0.263.0
v0.262.0
v0.261.0
v0.260.0
v0.259.0
v0.258.1
v0.258.0
v0.257.0
v0.256.0
v0.255.0
v0.254.0
v0.253.0
v0.252.0
v0.251.0
v0.250.0
v0.249.0
v0.248.0
v0.247.1
v0.247.0
v0.246.0
v0.245.0
v0.244.0
v0.243.1
v0.243.0
v0.242.0
v0.241.0
v0.240.0
v0.239.0
v0.238.0
v0.237.0
v0.236.0
v0.235.0
v0.234.0
v0.233.0
v0.232.0
v0.231.0
v0.230.0
v0.229.0
v0.228.0
v0.227.0
v0.226.0
v0.225.0
v0.224.0
v0.223.0
v0.222.0
v0.221.0
v0.220.0
v0.219.0
v0.218.0
v0.217.0
v0.216.0
v0.215.0
v0.214.0
v0.213.0
v0.212.0
v0.211.0
v0.210.0
v0.209.0
v0.208.0
v0.207.0
v0.206.0
v0.205.0
v0.204.0
v0.203.0
v0.202.0
v0.201.0
v0.200.0
v0.199.0
v0.198.0
v0.197.0
v0.196.0
v0.195.0
v0.194.0
v0.193.0
v0.192.0
v0.191.0
v0.190.0
v0.189.1
v0.189.0
v0.188.0
v0.187.0
v0.186.0
v0.185.0
v0.184.0
v0.183.0
v0.182.0
v0.181.0
v0.180.0
v0.179.0
v0.178.0
v0.177.0
v0.176.0
v0.175.0
v0.174.0
v0.173.0
v0.172.0
v0.171.0
v0.170.0
v0.169.0
v0.168.0
v0.167.0
v0.166.0
v0.165.0
v0.164.1
v0.164.0
v0.163.0
v0.162.1
v0.162.0
v0.161.0
v0.160.0
v0.159.0
v0.158.1
v0.158.0
v0.157.1
v0.157.0
v0.156.4
v0.156.3
v0.156.2
v0.156.1
v0.156.0
v0.155.2
v0.155.1
v0.155.0
v0.154.0
v0.153.0
v0.152.0
v0.151.0
v0.150.0
v0.149.0
v0.148.0
v0.147.0
v0.146.0
v0.145.0
v0.144.0
v0.143.0
v0.142.0
v0.141.0
v0.140.0
v0.139.0
v0.138.0
v0.137.1
v0.137.0
v0.136.5
v0.136.4
v0.136.3
v0.136.2
v0.136.1
v0.136.0
v0.135.0
v0.134.0
v0.133.0
v0.132.0
v0.131.0
v0.130.0
v0.129.5
v0.129.4
v0.129.3
v0.129.2
v0.129.1
v0.129.0
v0.128.0
v0.127.0
v0.126.0
v0.125.1
v0.125.0
v0.124.0
v0.123.0
v0.122.0
v0.121.0
v0.120.1
v0.120.0
v0.119.0
v0.118.1
v0.118.0
v0.117.2
v0.117.1
v0.117.0
v0.116.0
v0.115.0
v0.114.0
v0.113.0
v0.112.0
v0.111.0
v0.110.1
v0.110.0
v0.109.0
v0.108.2
v0.108.1
v0.108.0
v0.107.0
v0.106.2
v0.106.1
v0.106.0
v0.105.0
v0.104.0
v0.103.0
v0.102.0
v0.101.0
v0.100.0
v0.99.10
v0.99.9
v0.99.8
v0.99.7
v0.99.6
v0.99.5
v0.99.4
v0.99.3
v0.99.2
v0.99.1
v0.99.0
v0.98.0
v0.97.0
v0.96.1
v0.96.0
v0.95.1
v0.95.0
v0.94.0
v0.93.0
v0.92.2
v0.92.1
v0.92.0
v0.91.0
v0.90.0
v0.89.1
v0.89.0
v0.88.4
v0.88.3
v0.88.2
v0.88.1
v0.88.0
v0.87.6
v0.87.5
v0.87.4
v0.87.3
v0.87.2
v0.87.1
v0.85.9
v0.85.8
v0.85.6
v0.85.4
v0.85.2
v0.84.1
v0.83.4
v0.83.1
v0.83.0
v0.82.3
v0.82.0
v0.81.5
v0.81.1
v0.81.0
v0.80.0
v0.79.0
v0.78.0
v0.77.0
v0.75.0
v0.72.1
v0.72.0
v0.71.1
v0.70.0
v0.68.0
v0.67.1
v0.67.0
v0.66.82
v0.66.80
v0.66.76
v0.66.75
v0.66.74
v0.66.73
v0.66.72
v0.66.71
v0.66.70
v0.66.69
v0.66.68
v0.66.67
v0.66.66
v0.66.65
v0.66.64
v0.66.63
v0.66.62
v0.66.60
v0.66.59
v0.66.58
v0.66.57
v0.66.56
v0.66.55
v0.66.54
v0.66.53
v0.66.52
v0.66.51
v0.66.50
v0.66.49
v0.66.48
v0.66.47
v0.66.46
v0.66.45
v0.66.44
v0.66.43
v0.66.42
v0.66.41
v0.66.40
v0.66.39
v0.66.38
v0.66.37
v0.66.36
v0.66.35
v0.66.34
v0.66.33
v0.66.32
v0.66.31
v0.66.30
v0.66.29
v0.66.28
v0.66.27
v0.66.26
v0.66.25
v0.66.24
v0.66.23
v0.66.22
v0.66.21
v0.66.20
v0.66.19
v0.66.18
v0.66.17
v0.66.16
v0.66.15
v0.66.14
v0.66.13
v0.66.12
v0.66.11
v0.66.10
v0.66.9
v0.66.8
v0.66.7
v0.66.6
v0.66.5
v0.66.4
v0.66.3
v0.66.2
v0.66.1
v0.66.0
v0.65.0
v0.64.0
v0.63.0
v0.62.3
v0.62.2
v0.62.1
v0.62.0
v0.61.1
v0.61.0
v0.60.0
v0.59.5
v0.59.4
v0.59.3
v0.59.2
v0.59.1
v0.59.0
v0.58.1
v0.58.0
v0.57.0
v0.56.0
v0.54.10
v0.54.9
v0.54.8
v0.54.7
v0.54.6
v0.54.5
v0.54.4
v0.54.3
archive/build-20260926-133840
archive/build-20260925-234719
archive/build-20260925-234605
archive/build-20260925-232908
archive/build-20260925-232907
archive/build-20260925-232229
archive/build-20260925-191117
archive/build-20260925-180508
archive/build-20260925-163033
archive/build-20260925-161652
archive/build-20260925-122523
archive/build-20260925-121406
archive/build-20260925-115549
archive/build-20260925-114145
archive/build-20260925-112814
archive/build-20260925-111822
archive/build-20260925-024607
archive/build-20260925-022443
archive/build-20260925-022315
archive/build-20260925-022250
archive/build-20260925-022154
archive/build-20260925-022153
archive/build-20260925-022141
archive/build-20260925-022127
archive/build-20260925-022116
archive/build-20260925-022108
archive/build-20260925-022058
archive/build-20260925-022048
archive/build-20260925-020930
archive/build-20260925-020910
archive/build-20260925-020337
archive/build-20260925-020303
archive/build-20260925-020251
archive/build-20260925-020229
archive/build-20260925-020223
archive/build-20260925-020222
archive/build-20260925-020214
archive/build-20260925-020208
archive/build-20260925-020030
archive/build-20260925-015548
archive/build-20260915-122729
archive/build-20260915-121830
archive/build-20260915-121129
archive/build-20260915-120929
archive/build-20260915-120328
archive/build-20260915-114627
archive/build-20260915-114022
archive/build-20260915-113543
archive/build-20260915-112801
archive/build-20260915-041723
archive/build-20260915-035618
archive/build-20260915-035320
archive/build-20260915-035034
archive/build-20260915-034913
archive/build-20260915-021627
archive/build-20260915-021430
archive/build-20260915-021353
archive/build-20260915-021323
archive/build-20260915-021240
archive/build-20260915-021109
archive/build-20260915-020532
archive/build-20260915-020400
archive/build-20260915-020304
archive/build-20260915-020300
archive/build-20260915-020218
archive/build-20260915-020149
archive/build-20260915-020040
archive/build-20260915-015933
archive/build-20260915-015800
archive/build-20260915-015147
archive/build-20260915-014949
archive/build-20260915-014707
archive/build-20260915-014442
archive/build-20260915-013935
archive/build-20260915-013633
archive/build-20260915-013428
archive/build-20260915-012934
archive/build-20260915-012650
v0.55.0
v0.54.2
v0.54.1
v0.54.0
v0.51.0
v0.50.1
v0.50.0
v0.49.0
v0.48.0
v0.47.0
v0.46.0
v0.45.1
v0.45.0
v0.44.0
v0.43.0
v0.42.0
v0.87.0
v0.86.0
v0.85.7
v0.85.5
v0.85.3
v0.85.1
v0.85.0
v0.84.2
v0.84.0
v0.83.5
v0.83.3
v0.83.2
v0.82.2
v0.82.1
v0.81.6
v0.81.4
v0.81.3
v0.81.2
v0.76.0
v0.74.0
v0.73.0
v0.72.2
v0.71.0
v0.69.1
v0.69.0
v0.66.84
v0.66.83
v0.66.81
v0.66.79
v0.66.78
v0.66.77
v0.66.61
Labels
Clear labels
P0 — critical
P1 — high
P2 — medium
P3 — low
blocked
bug
custodian
epic
feature
governance
growth
identity
in-progress
incomplete
infrastructure
life
memory
memory-atlas
needs-testing
perception
ready
release-drift
research
rune
scaffolding
spine,correction
spine,deferred
spine,resolved
strangler,burn,endgame,deferred
strangler,burn,endgame,inventory,epic
tui
tui,epic
tui,openspec
v1-course-correction
Spine/core correctness or blocks other work — do first
Material user value or real defect (money, bugs, next-stage dep)
Quality/consolidation improvement
Measurement / benchmark / deferred policy
Dependencies open
Confirmed defect or regression
Rune v1 course-correction issue graph
New capability or improvement
Currently being worked on by Rune
Incomplete work — draft PR with ledger, awaiting resume
Memory Research Atlas child domain
Needs manual testing with dumbed-down steps before close
Order satisfied - Rune may start
Research jobs — spikes, watchlists, evidence work
rune
scaffolding
spine,correction
spine,deferred
spine,resolved
strangler,burn,endgame,deferred
strangler,burn,endgame,inventory,epic
tui
tui,epic
tui,openspec
Rune v1 course-correction issue graph
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: conductor/rune#138
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Plain summary — what and why
The repo needs a machine-checkable structural contract using henxels — a repo-level harness that keeps every agent (and human) writing files in the right place, with the right names, registered in the right lists. Today our structure conventions live in the controller's memory, not in the repo: a fresh agent in a worktree has no in-repo steerage, and structural mistakes are caught by luck.
Concrete example of the hole this closes: our CI uses an explicit test-file list. When an implementer adds
tests/test_new_feature.pybut forgets to register it in.gitea/workflows/ci.yml, CI stays green while the test silently never runs (observed finding, general-153 review of #105). A contract rule makes that failure impossible by accident:henxels checkfails with an instruction — "register tests/test_new_feature.py in .gitea/workflows/ci.yml" — instead of silence.Example
Technical details
WHAT
henxels.yamlcontract encoding the repo's CURRENT structure: placement rules (canaries aresrc/rune/canary_*.py, orchestration modules insrc/rune/orchestration/, docs per subsystem indocs/), naming rules, required files, repo-wide no-secrets rule, file-size awareness (warn level for known debt like rune_tui.py).ci_lists_all_testsinhenxels_checks.py: everytests/test_*.pymust appear in.gitea/workflows/ci.yml.henxels check --allin Gitea Actions.henxels check --allagainst the existing tree; cheap findings fixed in this stage, structural debt documented at warn level (findings = migration plan, per henxels' governing-an-existing-repo mode).WHY S#: closes the silent-CI-omission gap (general-153); gives the repo in-repo agent steerage (AGENTS.md digest); anti-scatter protection for docs/; forge-agnostic so it survives the Forgejo port. Research: full primary-source read of benquemax/henxels (README, commit history, v0.12.0) completed 2026-09-04 — tool is MIT, actively maintained, dogfooded; empty-contract trap already fixed upstream with executable-example tests.
FILES:
henxels.yaml,henxels_checks.py,.henxels/,AGENTS.md,.gitea/workflows/ci.yml,docs/structural-contract.md, plan file.ACCEPTANCE:
henxels check --allexits 0 on the enforced set with the contract's rules matching current reality; planted-violation test proves the custom statement bites (fails when a test file is unregistered, passes when registered); CI step green on the runner; AGENTS.md digest present and committed; retroactive sweep findings recorded (fixed or warn-documented).DEPENDENCIES: none — new tool, no existing module changes.
Pipeline requirements checklist
⚠️ Priority gate: this issue has no priority. Assign exactly one of P0 — critical (spine/correctness/blocks), P1 — high (material value or real defect), P2 — medium (quality/consolidation), P3 — low (measurement/deferred). An issue without a priority is not filed.
⚠️ Priority gate: this issue has no priority. Assign exactly one of P0 — critical (spine/correctness/blocks), P1 — high (material value or real defect), P2 — medium (quality/consolidation), P3 — low (measurement/deferred). An issue without a priority is not filed.
⚠️ Priority gate: this issue has no priority. Assign exactly one of P0 — critical (spine/correctness/blocks), P1 — high (material value or real defect), P2 — medium (quality/consolidation), P3 — low (measurement/deferred). An issue without a priority is not filed.
Plain summary — what was delivered
The repo now carries a machine-checkable structural contract (henxels):
henxels.yaml(5 rules in plain English), a custom CI-completeness check, an agent-readableAGENTS.mddigest, and a CI step that fails any push breaking the shape. Applied retroactively: 4 canaries that were silently never running in CI are now registered, file-size debt is documented instead of invisible, and near-duplicate files are flagged.Technical details
Implementation commits:
89516e4(plan) →11d5f94(implementation) →b17e1a6(quality-gate discharges). Branchstructural-contract.What the contract enforces:
src/rune/**/canary_*.pymust be registered in.gitea/workflows/ci.yml(custom statementci_runs_all_canaries) — closes the silent-CI-omission class (general-153 finding); 4 unregistered canaries found and fixed retroactively (query_memory, unbounded, full_system, native).Gates: Spec PASS 10/10 (general-168); Quality Approved with minors (general-169) — all 5 Importants discharged in
b17e1a6(subdir canary blindspot closed with recursive scopes, red-green proven; tolerance pinned by test; henxels==0.12.0 exact pin + redundant CI install removed; AGENTS.md digest freshness enforced by test — the umbrella rule made mechanical; max_lines made recursive + dead allowance dropped). Minors 6-13 accepted and documented in the plan tail.Tests: contract tests 5 → 9 (red→green proven at each step); full suite 461 → 470 passed + 84 subtests, zero regressions.
henxels check --all --plainexit 0. ruff clean on new files.CI: lint job runs
henxels check --all --plain(pinned via [dev] extra); canary job covers all 15/15 canaries (structurally proven by test).Pins / follow-ups: #139 (tui_validator allowlist fix) will also remove the canary_native tolerance + its pin test; digest-sync via
henxels syncnow machine-enforced; future umbrella-style rules can use henxelsmust_be_in_sync/changed_withprimitives.