diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 7ba0d16..cb33e88 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "hikmah-stack", "source": "./", "description": "Judgment infrastructure for agentic AI: decision quality, failure-mode diagnosis, evidence discipline, and durable delivery.", - "version": "2.0.0", + "version": "3.0.0", "author": { "name": "Juber Shaikh" }, diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index ea5e290..9e5f907 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "hikmah-stack", - "version": "2.0.0", - "description": "Judgment infrastructure for agentic AI: decision quality, failure-mode diagnosis, evidence discipline, and durable delivery.", + "version": "3.0.0", + "description": "Judgment and cognitive infrastructure for agentic AI: portable skills plus a deterministic Rust co-model kernel for memory, decisions, verification, and durable learning.", "author": { "name": "Juber Shaikh" }, diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 2926444..75dc915 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "hikmah-stack", - "version": "2.0.0", - "description": "Judgment infrastructure for agentic AI: portable skills for decisions, AI failure diagnosis, evidence discipline, and durable delivery.", + "version": "3.0.0", + "description": "Judgment and cognitive infrastructure for agentic AI: portable skills plus a deterministic Rust co-model kernel for memory, decisions, verification, and durable learning.", "author": { "name": "Juber Shaikh", "url": "https://github.com/CodeWithJuber" @@ -23,7 +23,7 @@ "interface": { "displayName": "Hikmah Stack", "shortDescription": "Judgment infrastructure for agentic AI", - "longDescription": "Five portable skills for human judgment, AI failure-mode diagnosis, structured decisions, delivery verification, and cross-skill orchestration.", + "longDescription": "Six portable skills plus a deterministic Rust cognitive kernel for human judgment, AI failure diagnosis, TraceWeave memory, structured decisions, delivery verification, and cross-skill orchestration.", "developerName": "Juber Shaikh", "category": "Productivity", "capabilities": [ @@ -33,7 +33,8 @@ "websiteURL": "https://github.com/CodeWithJuber/hikmah-stack", "defaultPrompt": [ "Use Hikmah Stack to structure this decision and expose uncertainty.", - "Use Agent Radar and Ship Guard to diagnose why this AI workflow keeps failing." + "Use Agent Radar and Ship Guard to diagnose why this AI workflow keeps failing.", + "Use Cognitive Kernel to design persistent model-independent memory for this agent." ] } } diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d7bfc18..d9f0686 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,7 +3,7 @@ ## Why ## Evidence / validation -- [ ] `python3 scripts/validate.py` +- [ ] `cargo test --workspace` and `cargo run -p hikmah-kernel -- validate --root .` - [ ] New empirical claims include dated primary sources and limitations - [ ] No secrets or unrelated generated files - [ ] Breaking skill names or behavior are documented diff --git a/.github/workflows/bootstrap-hikmah-v3.yml b/.github/workflows/bootstrap-hikmah-v3.yml deleted file mode 100644 index ffd76a7..0000000 --- a/.github/workflows/bootstrap-hikmah-v3.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: bootstrap-hikmah-v3 - -on: - push: - branches: - - agent/cognitive-kernel-v3 - paths: - - .hikmah-bootstrap/READY - workflow_dispatch: - -permissions: - contents: write - -jobs: - apply-build-test: - if: github.actor != 'github-actions[bot]' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Decode and apply v3 patch - run: | - cat .hikmah-bootstrap/chunk-* | base64 -d | gzip -d > /tmp/hikmah-v3.patch - git apply --index /tmp/hikmah-v3.patch - git rm -r .hikmah-bootstrap .github/workflows/bootstrap-hikmah-v3.yml - - uses: dtolnay/rust-toolchain@stable - with: - components: rustfmt, clippy - - name: Generate lockfile - run: cargo generate-lockfile - - name: Format - run: cargo fmt --all - - name: Lint - run: cargo clippy --workspace --all-targets -- -D warnings - - name: Test - run: cargo test --workspace - - name: Validate package - run: cargo run -p hikmah-kernel -- validate --root . - - name: Check Python compatibility fallback - run: python3 -m py_compile hooks/truth_gate.py - - name: Commit validated v3 tree - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add -A - git commit -m "Release Hikmah Stack v3.0.0 cognitive kernel" - git push origin HEAD:agent/cognitive-kernel-v3 diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index cbeebc9..8229528 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -12,7 +12,16 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Validate package - run: python3 scripts/validate.py - - name: Compile hook + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + - name: Rust format + run: cargo fmt --check + - name: Rust lint + run: cargo clippy --workspace --all-targets -- -D warnings + - name: Rust tests + run: cargo test --workspace + - name: Validate Hikmah package + run: cargo run -p hikmah-kernel -- validate --root . + - name: Compile Python compatibility fallback run: python3 -m py_compile hooks/truth_gate.py diff --git a/.gitignore b/.gitignore index 20d6cf8..f4b974c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,6 @@ __pycache__/ !.env.example .idea/ .vscode/ + +target/ +.hikmah/ diff --git a/.hikmah-bootstrap/chunk-00 b/.hikmah-bootstrap/chunk-00 deleted file mode 100644 index 873cac8..0000000 --- a/.hikmah-bootstrap/chunk-00 +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.hikmah-bootstrap/chunk-01 b/.hikmah-bootstrap/chunk-01 deleted file mode 100644 index 72a3cd3..0000000 --- a/.hikmah-bootstrap/chunk-01 +++ /dev/null @@ -1 +0,0 @@ -/3qKNFwhgyQupETqQlrSyBLLZpUsaSTZ1T0qDZQAEiRaIBKFBETTMiP61zzAxPnZ5wHOc5w3qSc561tr7VvmTgCUVdUdE8fRXSLysnNf1319ix1fElWM+Ua0FNMZjt9pmJeJdFgHrflJOzO/ZIddu20Y7PrOMk1ot0myoKVuIHltOFbPt2sQHWusa8sLjlr/qBUXEPNAizeetolNzotk7849a7N5ydaUtsQpcegtX5DJAvew0kEi5h1I0OPsolss++fjQr2G2SxJR/Akent6Tuebpo74oBItZwQFg5rS6VXbhwkxEx0qVcNFJatT+L2xVqifW+0VhxiLtd53r7+N7TtGIPXv/rfSozS0PB3quSxu7JhDtGZJeHjttom60CSQoovr5qqkrJvVecbGWO8MH7I1aXoYHl2Z2bZ2CIu5/pxhVvklmVXbGWcxwPWwO1hGMV0HxrQBmCps0J6hK50UuSaSYhNNRT2oRB5CL0PwiY0n9MINmYy2cfyGpeBDF3TomxYLszVseAgfdLaEcXaJeIsNG3TBazSyJ/nsUk9kMRYOPIFVkFmXl6eCcJNLOkTWHubCejTt2Z4k7qahMd65SPlQiZ9+PHLONGsY/X68YPXQtimyheiBhqSNp8rfONqdZc5CM2QgR9BpUVelNSvAgZhoONGOH5apMtix7ABmP5Ik1gY3U0r79//1vxGyw9IN/fnEEaJ3TZfLYghzW4he26NXYH3c5EvjbPbt534j0aBP+/ox4j65D081qeGZaqZ+G5XoUH4/Qd4qCWfICC6Z82ldB2oYg26N/51n4f4yFrMOPL/SEILL/JxlDroZw0rKq6DhxKIYZjR155K7PF5otjIMJeica/HxbEbr6eU9q7Zwkog4jNbPLTebadY5HVfSSIaXXkMYY2ASctlbCygvJiiaRCbSRC2RB1U1IhvnspSajNgqnNGM2samhGA8XmgQEsZ+KmIX9j2NFrZL0QJA+DrGj/5MAoNlM75ORxm0MhuNxmsvAq6G4bLNXZOmymG+drf8yOaOEy/a171TCQS2b4n6a79mY4Htu3XBwmaXlWNMLFE1uRlhjE9LTf7EU4sFzdxCFsvoCiSZjDkme5Kd4p/RGMrKmMmlTbFBqM3pOF8WXraN0xsDrft0OUbAPAyP41N2RC7SD1lhBM9I6A/zZC+oU8AaRBIQ6mQS6azQLOkt8LF7mkDK4Wuw7sCZIqI5jAOQSfHSJO2Dd+jLtOWMkAVVqpQQZrwXLtRyrCJu2VgkW+qVI8Hn6YwT8laYgzjX7kerRHPqQisRSdvXGNv9TBKJmEHJQtYljHHG3ROX6ZVozsEwOypF7Jj0O5gHbOrdj+L5EWcPvWKSusopWjLNpxocfdAxepymKFg13uYLFHLYPDspOClre5nJ8RpKklf/kiMxSc9m7VsS0F5Ww4fEnAIDuS4SxkazJP4vSSJ7odlvoEekL3HAGKvCIAuaHvaT2KhEEmVdAo5BWEB+zYY23+R+h7Stj1k5gVBCxdMFB4IgiFICWUigEHMFRqibquDgGBYqOBSLGt3bNal1mqmVaDC77jjjbTsyUS/mvjFigrgj5ASk19i0NR9vIZFsQTqmL8BGwwA0dECk8CDWzUbH4c1SrID7z49CMC8kO76QTK9LaIEKw0W3+mFIMqGqmdsQJWoQkfBtlZdi3uWXNtjc+fawk2609cuxl8qiDNFJiS7SAKQbbcn2Tupf1lAjiUFXuwnrSMa9TL3WGPJIGz9b5AsWo3iQrNjHXeiPg6SJwLTt/C2GuNKkKxZDtPcnbpuMiVNzFzIS1GBU5h3DJM8Y0Ei41MmXFVTaZ3L3NWWsZD7ydYmVMAvmZiS3Pvn222+/+dQoFvmsh9s9DgDMGodE7Ius1ZgQt+uJpTidLnp07AtawsZh42kOD9ibF09fHCbLGfQqcIQJW3obV9+QGvO5hgmeGx2xr3vyHT5nO5+hKO5srijulBVFo0fRogJCw2klRhKA3RLOBZDOJGMj92xZSF7PbAk3kAjnHRlWJYxII4Mwxp9U8xBFpqjkdaSl+D6OeSi7Im1OuPIjGBHYCM4c1tgJy5zVm+AVlMB92ngOuqqcwaQgkSU78WR3eX+D2NkbO04liIVHqXLBqaRGL2Tn5Y0dlfSiPZ9ny0LCmsc2qQ6cXC2M9PYK4hDNs3K+uZY1kfqkwsT039hZQelEj/RdcHg2cMA5r92NnRVMxhB7Q193VrCVgK+4F9bTND9g3cLQyLEVqvXEEj2itztOK+gaGQbPSSROmBL1rlm6sNVK3n7/4ufjV88fP39yzE8EP7dEGnr7+vjJT68kcOdd0/ux1YnjDWnMLey+vOLHP588PTZfKF/ZErenZDaaaHOWKCtpbi5M/XcrD04H+Gw1IlAezGE1Dg91KZpkfLoAoB0iNCan/70LW4ekDeLBQGUkN1rt1TOEisdVtGdtwUq66kNQbx9jUBCZnA7ml7Tphi0v6R/CBfAO8KHAzTKbE9UQG0kJU2CS0ydp+osRQj2U+Mo+M5qRWNElF0uj1ulXkHvibZqk7//S/JP9u4Nb6X7W6ezu7Q/u3UrD/BP/eclA8a8gB2UfiX77kuhX1jLFdTiGPWjqA7cYqJ5OclI2HCGoA/paMphnQx3ZG3Zhm5xgNhILxzuTJN55ptHqmGITYe7BX3EKtGCmWLOCryqK7MWCmBiYz8FGRYTURE2RPiTzAYaNggaZz9oZIA6SP71+8VwMFMViOFbIuvPxwuZ1QlgaT9X+YE6PfltoVYlGyuRBPhRzI7x96C9NAh1YVQ4zoI5oONw5jnzq7dBs+nFMSrO6Wf5h8yXIIMK5meFpOBPffW/DK9CkGJjM7Oq8hqFFOl/Fhqmw/7wJlH0IsWLOtD+R9KvbnOd4u7UHiCKTIMj+ChKRkHWcjxWBUskZRATSvArTg3OTFUJTeIYg37N0yE60lK3c4DCSwIkeqO7HbpTk8csTmtFLeJTzDxmDtJAwewEQFtWoF5k+YIx+A5oXTqOceWTO+JN+evVMKOyAVpE0QkHP6YA1Gom78DAaYaIzMCdlQj9kss4WaO48HR5S3jk8pZoFaSioThDuV+KEQAv4+0RgxyoewRqaAvtslo9prjhGiFlXQvOt9nna3NagMfQSgFqmY0x6A5+siVKmTQXxFJ0usRUvIpt943QLdqbNGMxTj6u4pLd1fMXEBlvGwl9mnBtBd5B9X5BIjKS8IrCMSfrNeF6iCOIbAdyFmIVYeMUwlG0u0vMZjz/0PGsXrNWf7WU1+yAdDBCJogaFUlInyyLwQJ+8OX7y5qdXmh0Zu6yM6v7B/Xv3bw06nXt37gzv3CnhgUdfFI4VvSXpk7duIXtyf98gjPmAJWWr6VIcR9vbqwDFOK/JgxQrZffdrrZi3DQ7tVBZ6sDaEWXHz3MqKp8TOfWln0AvtmwOIN879HPrTfu+WXI9AtoxTGOerURdspNRW+PmESfgsidZwrRhOA5Hilm/7m/V5SR6CYLOFH4oEXjOokmXCUO+ndNxhUVxYxgzcPF+CaGrMKI/NC9kSJOOkw/FxXWZqPvFmwbDJkGDWHfhAMjagXCGV6bAvwAusPgD/hBk2X7wl9ZbtluHSU3OpjiQVoZliKSli+kgm0NzHVO/nA2tcoGohmajwR4lPJQZa0c/WAeu/976WJ0tgf2EC3ivqFlPOTtK3quNLRIDzbuHN1fZ2Eb7jKZyLH4AmS3tVclWWC72gL5xoBomwA9UUeXSc2t31XQYHe7KdnV8vgFHxRjnfoK+M7hse1kcImyaDEtEzNXC6unB9MIVykYGOVuLXPClHBScw9yDYTifk75oLQ7Kj3Qjg56LGyphqSzbJK320MtSFUkTFB+6dzvEVapgZivTYaSscqSe9Qsqh6Iv8XMayw0QjhgOkwZAxqCY9HUTjdI14YL6Jt8OaXE5QTmEPrLh3fxmBZ9JfYFdZCl0fXCmrsVl4txm061SuDJPpQCXOauWAz7mO+vglFy2DXM1yMeesAAZRjaOPWOBaG0I1jKInPCla1aGrIpgAkc9NUHUDZ5BE1RgTd0I8ea8qiLXV0RfF7sSUzY9ZUzOI6be93zCaBWl26panCruTqhfDvzUBxafXFAdK+KgUfAzCwhdgF/Y8Wjy7cNqDqOfpJ3NFfTHyx1LLjOEkpZfxHOGQ/LRRQwzHF3QKanniG4haV+Ncb5yau1zxL9hktuRBEnBBAhCVOzbJrJJYwKlByz4p7EQFu6P+t4sdFQJw1HYoHGGwjYBtDvWq+iA2uhCByjI2ocsjTUJtM+IHlyGK8LCMeM3KTwJphFx7VEw1WKpCWWPh8aa4k19kU8UapWRVf/+7//B7j3FsYA398KgrUD7yhCvyRmF0qogSKS8lyTkVyPmHaDRwuBIwBcMGD8BFEIfXK53IA1ifFY+RhAgp9R7cCzqwkXJCe6mai+wg0lsoeiWGGCb4Q+McOLv1P3DUGaE7F+RGTxBQYUpoeAVUaGjLwcMMcL0QwynkO9LG1+M9e9sxPot4dmU8e/Y6NSIqVrUJxMa71FtQ3UCO0gnQraKs/eJYsYUxjyW8i4wAczjKSPg4dsMfQT7hJx7Ac42WOEdQCytMKqEIGMbGldAjU1UWNv1TV1N9ohOckbCLWKMCwDHpCxw/qd4nbE7dFiqNBJFdCM3c/4853wZIN4j1rxbgvPFU8cG0o2fKNTkpihHpWTU7W3wJUC9s4BQAOiEEUjPrPxBR5BDrzu+bCIGK5X8FeA2gJ4UP+g5cQYsYVHkg7HKUooQKcCvy7kgZ+Gn0ATNAvLogoWoY6x/tMF2UFU/zkm/+ujiYYZHbGr2xusaKimRS44i11CDywQBshwH+zE11pVxZoARmXOFDMvZLsyWN2nDhW5FRj8lQqwBgjS+gOwKqyiMSsRdFCDHrkhtRD3ZSsCkTyi+RxDVhACAbBGiFLYfcRiL8YRPRYvNQmo+n1ykl6gEYL5vyHlRpud19LsajFk1W0RSFIyZIXJrI5yqe6PR4P7+vShOVW3DHmrVPYGt+rpWUdypWCLGmGXixGqPKFsfQpVie5uWklkMB6gHyoBIXW5jhAJXJXeccyZUFghzzUOJxV5k4L0AwEz8BoZshvpNG/qqbiGDjoQMxwWsClMmndb8VcbG0c3K5hkLHiobBhnvKpoVy9NTtkFAqobUmBqYbIQJ0SCW5+cKWAd7KvVHEg4UK9CfLc52+13ISf6iOfgkQavmPL9WBC4pXuHKA/FmcvDHMpy8s5ngib9knDUgUVlgCqwUkWAlsXBR0t0tYa0j1jL5C+SW01QbwMRnc8luluRFenBxduljx8uqcjjVTNHwDxXSfnv7BLSZpvGQ9ixitYjojBHNZdzakv7lplGE34HJL5C0J2uoGkrg3fb2S7smXsOZxOh5SZrjqRTaECxnEoTYL4TppqfZ6zcWDGwTSChBeNvbz0kGHmYqD3/0c4jwPdAQp2+mUxepx3BhE4TlTsbZyNI1UkgZA9Dmte3sa/Kfl17L0XzM9/ENWmdnkFB/8iBn0waLDVMuRcMSi4MwTpZMiG3frEjD2Ukc7SdfVV1d2CA+Z7UWC3jI61/OSWuZxDnJu5PQI5nwQaaA89vbr23uFuMKLCDC4SPGBp2y3y11CbkFEeTpgnHZEV16aWElGMgdUYeTI2y/zNnXRVxPjQ9WA1yMKV7OnAQS8m4ppXehN6pg+ZkwaELgKRn1wPLklkn0KuBsmcNdPuYIzoXEIW5vf1dOLMMX1OEo4iBOmPitrWFnmJ+POWU4gIIGnJvEmN7nzlfCJ9H0SrzpJIo3XcmM8aQn1iPZCZbO+2NT8EyiHHEarIGJ6+3pFk1tQuzHzGGFBMrpPON89pJ2iiMuDf1K8urcJN27yO9qcQfRU5F5McHhVmV2Z4+JzIsSrjI6ZwD7jUaq2MDSHZapGeNUkGPpW2fs7Dd5jCrCKUI+WMmUicMeU58nKS2XBBV7EAP4KgiuxKSClvphqdbax90gPvaRiadGq5r5LvnjBpeDSRiS9vr4+evjpP0wOX7+5MVT/uvV8ZPHz57hr6fHz06+O371+M2x/HpyIk88fvIG//x8/Orkj/+Kv568eP76xbOTp/RkCOfzPz2gn2Ttf7+tAAby7hlIoxKcQABptKKlKCKSxUvo+nnDEaQkDfNjR4kLgjb7KTTJpsTpJKvBFwtKFhDd6VwmRvzFmtSBtYL2F6DmsKB7BmuCJiCXzYGSYDGWhG2U5UBZsDk0GBBzcFwDMEDvWGmAM37Gv7CTT/DUTSzjXqdq0cW9p6Ezk7fmAHK9zFw+CpQpSWKm0fh6FKjj9rbqWCB1fhY2CCon8kKRQKKQUfCMORCf0PzllLEqiVDhU5K7LJBJNiv5XdMlKFscczp7j+klkpqfsYUa1zUGHwnsrpNe3A68y8Kd2tMlco+yoQltdzZwrJq3i6yDmxk9T4WwuginF/xBQU5C7g1nSiibD/cWjJnsxm0L7V7YcXHYvwMTw+XXJbt7wbLuIJ0jQyx5z9d6H7JLg1HNvzk5532HNEe2TqDzEmZrxlAQuVlw1U12BWD2+R2bfs7GImpWwJ11/0vwTOqEDD9gStO0YYWHYMdBESjvIkahOTFnGgKie+1oUSXIZ3fP0qkALh+XWJovgwdMYj2nU9rP2AvIcExDU4EUW0h8OygbcUqmGgXdLDTli9/iYjvyzuRS3rowsBYBtL3HRBOEwqYTO3wSwb4D/j5t4pyOi7AW3sqPbXZ6kPE6RaYNolfgQLJfIGnCwHcXig8u+9+IVGXoMKOllQK8eMjSAGQtbFXY0pFHL9EdRcsGehRS9oG2DCDMcwVeN/jktEN/GZ8vz+GqgmuazwNSuwpV5k0dAXaWeZIDDxI7yKRe2Ko3oiuonDZRhDOdE5vOaQCw7Qzf6ZSz92y4L5HBIFuYTSFuUh2MD0NZLYp61CApotHSHeCBBnWSH5H3TMPxpHBhNS5/yKeJiuxgJOAFE5+hMw2KN+CUxG5XM+OupvtwbAHLBxUnkyhs6XihAaBTrvxwPhMRs89bJHAtPLYTzaYku17q/9go89ak6Z5d9ufjIetyRQ4fPoboLIwfufRlwGSNhQftXRYKTBeawrCnHUwKa7SP5NyI/W4cGraqRryyAU8rvMH/YU6HsUSqnc2G/iCWhiPvoGRqypThflY+ANtJ51JXS8D1YAeg9xR8nhY7dTFe3Okjq2IIKBAxDg5pxszSUfiAfwXUghmC/ERUhWFjFiZDvWmaTju0+L0ecq/4oBXjpVAE7ElmiLtTCg2SyoikW48jMug9g26AC1lXcwIwE6nIACFLTatYmRMecM5hGHTgl7QzYYNiza26PC1riTWyk5QMkUSx7W0x0tFnYECGdvXRMF+JX7FpgiaLCihtakoWf7pEfjgJSO3atGB5P7ss7zaS5ZHKjfyykJSyaH+OeGlGReJNyAlmCCm0sVm/DEBbig/jGXJ4YcovxqNxaqjEm7miWgqjHnE8rRxOP0tNtbKLTCISg1S1qn1U3WZcv3DM/CwvhGfSGI2VROwerqidbxkJcg+wVZ1+KS5mtmhhqV0dAYUe7HhWTRzx+UKB8uZDxoBmg5AWL4xBMx+xacey4LI1zepP7stHbKxR+m/rH4BqoTGSM0T4diJpHRCmFX2sa/6IbSWsBbKvR2hWl/Mfeb0MN3KFX60Q1c8BwDjlPB2vQoNYGMArVBpgBqlxuP6S21oZZ9RwsfBPaSzMJJ1wbreNSxSJbpEP08u4ubz3IymOoZncXtrIPH73zu5gd3B7lXncNeiZxe/eV7P4k7wt7CsI8WNSDv1CBgYbmESzQRapGhwlQgbi+MdxkRXW/zPRma5aJwxNZJxSnT1OoFBpFMQpiBaDBWyaVzBYVaUz9OLp+KOIFETfJ8RZ54ZLf+/JOOHOu7HzfZ5DgzqEv9QYvjl65Oxylit8n4Mbs9Eocw8ygMg6yTAICpW7w6zLeIpWWdQyeWoXF/A4L6BnPCU9TmSK52B7qmuCGl5MuWOB1Ubiaazd \ No newline at end of file diff --git a/.hikmah-bootstrap/chunk-02 b/.hikmah-bootstrap/chunk-02 deleted file mode 100644 index a9510a9..0000000 --- a/.hikmah-bootstrap/chunk-02 +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.hikmah-bootstrap/chunk-03 b/.hikmah-bootstrap/chunk-03 deleted file mode 100644 index 97abbec..0000000 --- a/.hikmah-bootstrap/chunk-03 +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.hikmah-bootstrap/chunk-04 b/.hikmah-bootstrap/chunk-04 deleted file mode 100644 index 3432966..0000000 --- a/.hikmah-bootstrap/chunk-04 +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/.hikmah-bootstrap/chunk-05 b/.hikmah-bootstrap/chunk-05 deleted file mode 100644 index b4bb85b..0000000 --- a/.hikmah-bootstrap/chunk-05 +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index f6fde1a..2c4279d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,9 +1,20 @@ # Agent instructions for this repository -Preserve the portable-core / host-adapter architecture. `skills/` is the source of truth. Do not add a dependency, MCP server, hook, network call, or privileged action merely to make the project look more sophisticated. +Preserve Hikmah Stack's **first-principles cognitive architecture**. + +1. `skills/`, `playbooks/`, and `lenses/` define portable doctrine. +2. `runtime/hikmah-kernel/` owns deterministic cognitive state and controls. +3. Host/model adapters must remain replaceable. +4. Do not add a graph, vector database, embedding model, MCP server, agent framework, or neural architecture merely because it is fashionable. Name the invariant/failure it solves and the metric that will prove the improvement. +5. Never persist hidden chain-of-thought. Persist inspectable facts, provenance, constraints, commitments, outcomes, corrections, preferences, and concise decision records. +6. Never allow model output to become durable verified truth without provenance and an explicit state transition. +7. Do not average away privacy, consent, security, or other hard blocks. +8. Keep sensitive-memory policy explicit; an append-only audit ledger is not automatically deletion-compliant. Before declaring a change complete: -1. Run `python3 scripts/validate.py`. -2. Inspect changed files. -3. Verify any factual compatibility claim against current primary documentation. -4. State limitations rather than inventing support that was not tested. +- run `cargo fmt --check`; +- run `cargo clippy --workspace --all-targets`; +- run `cargo test --workspace`; +- run `cargo run -p hikmah-kernel -- validate --root .`; +- inspect changed files and factual compatibility claims; +- turn discovered failures into regression cases when feasible. diff --git a/CHANGELOG.md b/CHANGELOG.md index ad097ea..049618b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ + # Changelog +## 3.0.0 - 2026-08-09 + +### Cognitive architecture +- Added **Hikmah Cognitive Kernel**, a deterministic Rust co-model runtime independent of transformer/neural hidden state. +- Added **TraceWeave** typed memory with hash-chained append-only provenance, dynamic multi-channel recall, redundancy suppression, structured conflicts, deadlines, and correction/supersession. +- Added parallel evidence, memory, risk, human-impact, and delivery deliberation lanes. +- Added deterministic multi-criteria decision evaluation with evidence-coverage penalties and hard blocks. +- Added model-agnostic `ProposalEngine` boundary for local, remote, symbolic, state-space, neural, or future proposal systems. + +### Playbooks and lenses +- Added remember/recall/consolidate, parallel-deliberation, and error-to-learning playbooks. +- Added memory-integrity, model-independence, and human-memory-inspiration lenses. +- Integrated persistent memory and outcome learning directly into Operator Core, Agent Radar, Decision Forge, Ship Guard, and Hikmah Orchestrator. + +### Research and assurance +- Added human-memory research notes, co-model architecture, memory architecture, and evaluation contract. +- Added an explicit no-perfect-engine rule: guarantees, heuristics, empirical evidence, and limitations must be separated. +- Rust Truth Gate is now primary; Python remains only a zero-install compatibility fallback. + ## 2.0.0 - 2026-08-09 ### Breaking diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cd99e7b..903261c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ Thanks for improving Hikmah Stack. 1. Keep the portable core under `skills/` vendor-light. 2. Put host-specific behavior in the appropriate adapter or hook file. 3. Add or update evidence notes for empirical factual claims. -4. Run `python3 scripts/validate.py`. +4. Run `cargo test --workspace` and `cargo run -p hikmah-kernel -- validate --root .`. 5. Inspect the diff for secrets, generated junk, unsupported completion claims, and accidental breaking renames. ## Skill quality bar @@ -17,3 +17,8 @@ A skill should state when it triggers, what problem it solves, boundaries, the w ## Evidence policy Prefer primary research or first-party technical documentation. Record the date and limitation. Do not smuggle a historical benchmark into a universal claim. + + +## Cognitive kernel changes + +Kernel changes should include a test for the invariant they alter. If proposing a graph, embedding model, neural module, external database, or MCP server, include the measured failure in the current design and the evaluation that would justify the added complexity. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..86fda19 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,346 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "blake3" +version = "1.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ae7bad254120e9e4c63bafc385310756f90c484eac0e36b8317cf09cb92a77" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures", +] + +[[package]] +name = "cc" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d262e149917187838d5b42777c8253bcb64500067342904e7d429499a6f277e" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "clap" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473c7e07f409a8d772161724aa8db6a765a2532a70f9667eeb7b49d3d02fbdca" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b48fea5a88e9ae728a2dcbedbfc0e730f7d60da42e1cb049a83c9fb8b789889" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d012d2b9d65aca7f18f4d9878a045bc17899bba951561ba5ec3c2ba1eed9a061" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" + +[[package]] +name = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b73573e6edcd2af0cdf47bd6cb58f0b3839491263c314eaad1ccf24430e1de" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hikmah-kernel" +version = "3.0.0" +dependencies = [ + "blake3", + "clap", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..2ce2aac --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,3 @@ +[workspace] +members = ["runtime/hikmah-kernel"] +resolver = "2" diff --git a/README.md b/README.md index 51a7f50..85be6f8 100644 --- a/README.md +++ b/README.md @@ -1,118 +1,146 @@ # Hikmah Stack -**Judgment infrastructure for agentic AI.** +**Judgment + cognitive infrastructure for agentic AI.** -Hikmah Stack is an open-source capability pack for AI agents that need better decision structure, stronger evidence discipline, clearer AI-failure diagnosis, and more reliable delivery. The core is portable `SKILL.md` content. Host-specific manifests adapt that same core to **ChatGPT/Codex** and **Claude Code**. +Hikmah Stack is an open-source, model-independent capability system for AI agents. Version **3.0.0** adds the **Hikmah Cognitive Kernel**, a deterministic Rust co-model runtime that owns persistent memory integrity, provenance, contradictions, commitments, decision scoring, parallel challenge lanes, and verification state outside a language model's hidden activations. -> Version **2.0.0** · MIT License · Maintained by [Juber Shaikh](https://github.com/CodeWithJuber) +> MIT · Maintained by [Juber Shaikh](https://github.com/CodeWithJuber) -## Why this is not “Claude-only” +## The idea -A language model by itself does not install a repository, execute hooks, or discover local tools. Those extension behaviors belong to the **host/runtime** around the model. Hikmah Stack therefore separates the portable brain from the host adapter: +Do not build an “agent brain” by stacking a bigger prompt, vector DB, graph, and another transformer. Start with cognitive invariants and choose a mechanism only when it earns its complexity. ```text - ┌──────────────────────────────┐ - │ Hikmah Stack │ - │ portable SKILL.md knowledge │ - └──────────────┬───────────────┘ - │ - ┌─────────────────┼─────────────────┐ - │ │ │ - ChatGPT / Codex Claude Code Other skill-aware - .codex-plugin/ .claude-plugin/ agents / MCP hosts + optional proposal engines + GPT / Claude / local LM / rules / search / future model + | + v ++------------------------------------------------------------------+ +| HIKMAH COGNITIVE KERNEL | +| TraceWeave | CounterTrace | Decision Forge | Deliberation | Gate | ++-------------------------------+----------------------------------+ + | + append-only provenance + outcome memory + | + portable Hikmah Stack skills ``` -OpenAI's current plugin architecture supports plugins containing skills, MCP servers, and hooks, with public plugins shared across ChatGPT and Codex. MCP and Agent Skills provide a broader portability layer for other compatible hosts. See [Compatibility](docs/COMPATIBILITY.md). +The kernel itself is **not a neural network and not a transformer**. Learned models are optional proposal engines behind a stable interface. That means a model can be swapped without deleting the agent's commitments, provenance, policy, or correction history. -## The capability stack +## Capability stack | Capability | Job | |---|---| -| **Operator Core** (`operator-core`) | Human judgment, leadership, pressure, ethics, communication, recovery, stewardship | -| **Agent Radar** (`agent-radar`) | Detect hallucination, loops, sycophancy, context loss, slop, opacity, cost leakage, brittle automation | -| **Decision Forge** (`decision-forge`) | Compare options, classify uncertainty, test reversibility, weigh risk, fairness, commitments, action | -| **Ship Guard** (`ship-guard`) | Acceptance criteria, verification, logging, rollback, handoffs, completion discipline | -| **Hikmah Orchestrator** (`hikmah-orchestrator`) | Route across the other capabilities and synthesize one coherent plan | -| **Truth Gate** | Conservative completion hygiene. Host-specific implementation, never a fake “fact checker” | +| **Operator Core** | Human judgment, leadership, pressure, ethics, communication, recovery, stewardship | +| **Agent Radar** | Hallucination, loops, context loss, sycophancy, slop, opacity, cost, memory failures | +| **Decision Forge** | Options, uncertainty, evidence coverage, hard constraints, reversibility, action | +| **Ship Guard** | Acceptance criteria, verification, rollback, handoffs, completion discipline, outcome write-back | +| **Hikmah Orchestrator** | Cross-skill routing and synthesis | +| **Cognitive Kernel** | Persistent memory, co-model runtime, contradiction handling, model-independent learning | +| **Truth Gate** | Narrow completion hygiene; Rust-first runtime with zero-install compatibility fallback | -## Design doctrine +## TraceWeave: memory without forcing a graph -1. **Evidence before confidence.** Consequential claims need proportionate checking. -2. **Justice and trust are decision gates.** Optimize without quietly transferring unfair cost or breaking commitments. -3. **Uncertainty is data.** Mark verified evidence, inference, and unknowns separately. -4. **Human accountability remains named.** AI may assist judgment; it does not inherit moral or professional responsibility. -5. **Action beats framework theater.** Every framework should change a choice, control, or deliverable. -6. **Durability beats generation volume.** Judge work by downstream usefulness and rework avoided. -7. **Consult knowledge before improvising.** Current primary sources and qualified specialists outrank confident memory. +A memory is an immutable **trace**: kind, content, provenance, confidence, salience, privacy, time, optional deadline, optional structured claim, and correction history. -## Install / test +At recall time, a **resonance wave** scores traces through lexical cues, tags, recency, salience, confidence, provenance, and prospective urgency. Redundant traces are suppressed. The recall “path” emerges for the current goal rather than being stored forever as graph edges. -### ChatGPT + Codex +Read [Memory](docs/MEMORY.md) and [Cognitive Kernel](docs/COGNITIVE_KERNEL.md). + +## Human-inspired, not brain cosplay + +Hikmah borrows testable principles from memory research: selective consolidation, replay, temporal structure, reconsolidation-like correction, bounded attention, and prospective memory. Biology inspires mechanisms; it does not prove them. Sources and limitations live in [Research Notes](docs/RESEARCH.md). -The repository includes the required `.codex-plugin/plugin.json` plus a repo-scoped marketplace file for development. +## Rust kernel ```bash -codex plugin marketplace add CodeWithJuber/hikmah-stack +cargo run -p hikmah-kernel -- validate --root . +cargo run -p hikmah-kernel -- init +cargo run -p hikmah-kernel -- remember \ + --kind observation \ + --content "Migration failed because the lock timed out" \ + --tag database --tag deployment --verified +cargo run -p hikmah-kernel -- recall --query "why did the deployment fail" +cargo run -p hikmah-kernel -- consolidate +cargo run -p hikmah-kernel -- commitments --within-hours 168 ``` -Public-directory publication is a separate OpenAI review/submission step after repository release. - -### Claude Code +A non-neural symbolic plan and a structured decision frame can be evaluated with: -```text -/plugin marketplace add CodeWithJuber/hikmah-stack -/plugin install hikmah-stack@hikmah-stack -/reload-plugins +```bash +cargo run -p hikmah-kernel -- plan --problem examples/plan-problem.json ``` -Local development: +Then: ```bash -claude --plugin-dir . +cargo run -p hikmah-kernel -- decide --frame examples/decision-frame.json ``` -### Other Agent Skills clients +The kernel also exposes a narrow `ProposalEngine` trait so neural, symbolic, search-based, state-space, or future architectures can be benchmarked behind the same cognitive contract. -Copy the desired folder from `skills/` into your agent's supported skills directory, or use the repository as a source if the host supports Git-backed skills. The skill content intentionally avoids depending on Claude-specific tool names. +## Playbooks -## Example requests +- [Remember → Recall → Consolidate](playbooks/remember-recall-consolidate.md) +- [Parallel Deliberation](playbooks/parallel-deliberation.md) +- [Error → Durable Learning](playbooks/error-to-learning.md) -- “Use Decision Forge to compare these three architecture options.” -- “Run Agent Radar on this coding session and tell me why it keeps looping.” -- “Apply Ship Guard before I call this migration production-ready.” -- “Use Operator Core for this team conflict, but separate values from facts.” -- “Use Hikmah Orchestrator across this entire situation and give me a single action plan.” +## Lenses -## Safety boundaries +- [Memory Integrity](lenses/memory-integrity.md) +- [Model Independence](lenses/model-independence.md) +- [Human Memory Inspiration](lenses/human-memory-inspiration.md) -Hikmah Stack is decision-support infrastructure, not a substitute for current medical, legal, financial, security, religious, or other qualified professional guidance. Higher stakes require stronger evidence and appropriate human review. The project does not claim its principles are infallible, and it must not label a claim “verified” merely because a model generated it. +## Design doctrine -## Repository map +1. Evidence before confidence. +2. Memory is typed, scoped, provenance-bearing state, not hidden chain-of-thought. +3. Corrections supersede; contradictions remain visible. +4. Models propose; durable state transitions are gated. +5. Human-impact, privacy, and hard safety constraints cannot be averaged away by a high score. +6. Parallel challenge beats one model grading itself. +7. Outcomes teach more than plans. +8. Unknown is a valid serialized state. +9. Novel architecture must beat a measurable baseline, not merely sound futuristic. +10. Never claim a perfect general engine; build a perfectibility loop where failures become tests and controls. -```text -.codex-plugin/ OpenAI ChatGPT/Codex manifest -.claude-plugin/ Claude Code manifest + marketplace -.agents/plugins/ OpenAI repo marketplace for local testing -skills/ Portable capability core -agents/ Claude-specific subagent adapter -hooks/ Claude prompt hook + Codex command hook -scripts/ Validation tooling -docs/ Architecture, compatibility, ethics, evidence -.github/ CI and contribution templates -``` +## Install as skills/plugin -## Validate +### ChatGPT + Codex ```bash -python3 scripts/validate.py -python3 hooks/truth_gate.py <<<'{"stop_hook_active":false,"last_assistant_message":"Done. TODO: upload it later."}' +codex plugin marketplace add CodeWithJuber/hikmah-stack +``` + +### Claude Code + +```text +/plugin marketplace add CodeWithJuber/hikmah-stack +/plugin install hikmah-stack@hikmah-stack +/reload-plugins ``` -CI runs the same structural checks on every push and pull request. +### Other skill-aware agents + +Use the folders under `skills/` as the portable layer. Host-specific adapters remain thin by design. + +## Repository map + +```text +skills/ portable judgment/cognition skills +runtime/hikmah-kernel/ deterministic Rust co-model runtime +playbooks/ operational cognitive loops +lenses/ reusable diagnostic perspectives +docs/ architecture, memory, co-model, research, ethics, evaluation +hooks/ host completion hooks; Rust-first Truth Gate +.codex-plugin/ OpenAI adapter +.claude-plugin/ Claude Code adapter +.github/ CI and open-source workflows +``` -## Contributing +## Safety / privacy -See [CONTRIBUTING.md](CONTRIBUTING.md), [GOVERNANCE.md](GOVERNANCE.md), and [SECURITY.md](SECURITY.md). New empirical claims belong in [docs/EVIDENCE.md](docs/EVIDENCE.md) with date, source, scope, and limitations. +Hikmah is decision-support infrastructure, not a substitute for current qualified medical, legal, financial, security, religious, or other professional judgment. The reference ledger refuses `sensitive` persistence by default. Production deployments needing sensitive durable memory should add an encrypted, deletion-capable vault rather than pretending an append-only log satisfies every privacy requirement. ## License diff --git a/SECURITY.md b/SECURITY.md index 47c2a4e..014c82a 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ Hikmah Stack is primarily an instruction package. It intentionally ships no cred ## Trust boundary -Plugin hooks are executable/runtime behavior and deserve separate review. The Codex hook is a small local Python script that reads Stop-event JSON from stdin and emits only a continuation decision. The Claude completion hook is prompt-based. Review both before enabling them in a sensitive environment. +Plugin hooks are executable/runtime behavior and deserve separate review. The Codex hook prefers the Rust `hikmah hook` runtime and keeps a small Python implementation only as a zero-install compatibility fallback. The Claude completion hook is prompt-based. Review both before enabling them in a sensitive environment. ## Reporting @@ -13,3 +13,10 @@ Do not publish exploitable security details before maintainers have had a reason ## Secrets Never commit API keys, tokens, passwords, private keys, session cookies, production database URLs, or customer data. CI validates structure but is not a substitute for dedicated secret scanning. + + +## Cognitive memory security + +Persistent memory creates additional threats: poisoning, scope bleed, stale/superseded activation, secret retention, and provenance laundering. The reference TraceWeave store rejects `sensitive` persistence by default. Deployments that need sensitive durable memory should provide encrypted storage and deletion semantics appropriate to their environment. + +The hash chain detects ledger tampering; it does not encrypt content and is not a substitute for access control. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 959892c..866d667 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,22 +1,44 @@ # Architecture -Hikmah Stack uses a **portable-core / host-adapter** architecture. +Hikmah Stack 3 uses a **portable skills + deterministic cognitive kernel + thin host adapters** architecture. -## Portable core +## Layer 1: portable cognitive doctrine -`skills/` is the source of truth. Each capability is a self-contained `SKILL.md` with optional references. It should remain useful even if every host-specific manifest is removed. +`skills/`, `playbooks/`, and `lenses/` describe the invariants and operating methods. They are the source of behavioral truth and should remain useful even when every vendor adapter is removed. -## Host adapters +## Layer 2: Hikmah Cognitive Kernel -- `.codex-plugin/plugin.json` packages the skills for ChatGPT/Codex and points Codex to its command-based hook. -- `.claude-plugin/plugin.json` exposes the same skill tree to Claude Code; `agents/hikmah-orchestrator.md` is a Claude-specific convenience adapter. -- `.agents/plugins/marketplace.json` exists for repo-scoped OpenAI development/testing. -- `.claude-plugin/marketplace.json` exists for Claude marketplace installation and legacy-compatible local discovery. +`runtime/hikmah-kernel/` is the non-neural co-model runtime. It stores inspectable state and performs operations that should not depend on one language model's hidden activations: -## Why hooks differ +- hash-chained TraceWeave memory ledger; +- structured claim conflict detection; +- contextual multi-channel recall and redundancy suppression; +- commitment/deadline recall; +- deterministic decision scoring with evidence coverage; +- parallel evidence/memory/risk/human-impact/delivery lanes; +- completion hygiene hook; +- repository validation; +- model-agnostic `ProposalEngine` interface. -Hook semantics are runtime-specific. The Claude adapter uses a narrow prompt-based Stop review. Current Codex hook execution supports command handlers, so Codex uses `hooks/codex.json` and `hooks/truth_gate.py` instead. The Python gate is intentionally conservative and does not pretend to fact-check model output. +## Layer 3: proposal engines -## Why there is no MCP server yet +A proposal engine is optional. It may be a frontier API model, small local model, retrieval+rules system, state-space model, symbolic search engine, or a future architecture. It cannot directly become durable truth merely by returning text. -The current product is instruction-heavy and does not need an external service or privileged action surface. Adding an MCP server solely to look “more agentic” would increase attack surface and maintenance without improving the core use case. Add MCP only when Hikmah Stack needs controlled tools, external state, authentication, or observable server-side behavior. +## Layer 4: host adapters + +- `.codex-plugin/` packages skills/hooks for ChatGPT/Codex. +- `.claude-plugin/` exposes the same portable core to Claude Code. +- `agents/hikmah-orchestrator.md` is a Claude-specific convenience adapter. +- `.agents/plugins/marketplace.json` supports repo-scoped OpenAI development/testing. + +## Rust-first Truth Gate + +The primary completion gate is `hikmah hook`. `hooks/truth_gate.sh` resolves an installed Hikmah binary first, then a local Rust toolchain. A small Python implementation remains only as a zero-install compatibility fallback so a source-installed plugin does not lose its completion hygiene on machines where the binary is not yet installed. + +## No forced graph/vector database + +Explicit graphs and embeddings are optional **views/channels**, not the memory ontology. TraceWeave keeps source records independent and computes associations dynamically during recall. Add a graph only when explicit relationships are themselves required; add embeddings only when deterministic cues measurably miss relevant memories. + +## Why no MCP server by default + +The kernel is local and file-backed. An MCP server becomes useful when remote/multi-process tools need controlled access to memory/actions. Until then, adding an always-on server increases attack surface without improving the cognitive contract. diff --git a/docs/COGNITIVE_KERNEL.md b/docs/COGNITIVE_KERNEL.md new file mode 100644 index 0000000..8ffc948 --- /dev/null +++ b/docs/COGNITIVE_KERNEL.md @@ -0,0 +1,83 @@ +# Hikmah Cognitive Kernel + +Hikmah Stack 3 introduces a **deterministic co-model runtime** beside the language model. The kernel is intentionally not a transformer, recurrent neural network, state-space network, or embedding model. It is an inspectable state-and-control system written in Rust. + +The language model becomes a **proposal surface**. It may suggest interpretations, plans, summaries, or candidate claims. The kernel owns memory integrity, provenance, contradictions, commitments, deterministic scoring, policy gates, verification state, and durable learning records. + +## First-principles invariants + +We did not begin with “use a graph/vector database/agent framework.” We began with properties a trustworthy cognitive system must preserve: + +1. **Identity:** know which memory, claim, commitment, or action is being referenced. +2. **Provenance:** know where consequential information came from and whether it was verified. +3. **Non-destructive correction:** new evidence can supersede an old belief without erasing history. +4. **Contradiction visibility:** incompatible claims coexist as an unresolved conflict until evidence resolves them. +5. **Contextual recall:** retrieval changes with the current goal, cues, time, and consequences. +6. **Selective forgetting:** access can decay without silently destroying the audit trail; true deletion needs a privacy-aware storage policy. +7. **Prospective memory:** future commitments are first-class memories, not prose buried in chat. +8. **Bounded attention:** only a small working set should dominate deliberation at once. +9. **Parallel challenge:** evidence, memory, risk, human impact, and delivery can be evaluated independently before arbitration. +10. **No hidden authority:** a generative model cannot directly rewrite durable truth or authorize irreversible action merely because it produced fluent text. +11. **Outcome learning:** completed actions must write back what actually happened, not only what was planned. +12. **Calibrated uncertainty:** “unknown” is a valid state and must survive serialization. + +## Cognitive cycle + +```text +SENSE -> ENCODE -> RECALL -> DELIBERATE -> DECIDE -> ACT -> VERIFY -> CONSOLIDATE + ^ | | | + | +------- contradiction ------------+ | + +-------------------- outcome / correction ----------------+ +``` + +Each transition produces inspectable artifacts. The kernel does not need a model to maintain this cycle. A model can be attached through `ProposalEngine`, but its output enters as untrusted proposals. + +## The six subsystems + +### 1. TraceWeave memory + +Durable memory is a collection of independent traces. Associations are **computed at recall time** from multiple channels instead of stored as permanent edges. See [MEMORY.md](MEMORY.md). + +### 2. Amanah Ledger + +Memory mutations are append-only, sequence-numbered, and hash-chained. A correction creates a new trace and can supersede an older trace. This makes history inspectable and tamper-evident. + +### 3. CounterTrace + +Structured claims may carry a `claim_key` and `claim_value`. When a new active trace asserts a different value for the same key, the kernel emits a conflict rather than selecting whichever sentence arrived last. + +### 4. Deliberation Lanes + +Evidence, memory integrity, irreversible risk, human impact, and delivery completeness run as independent lanes. The current Rust implementation executes these lanes concurrently and returns an explicit arbitration signal. + +### 5. Branch Loom planner + +A bounded symbolic planner explores explicit world states and actions without a neural network. It is intentionally simple and auditable: preconditions, additions, removals, goal facts, and a maximum depth. This gives the co-model a non-generative planning baseline against which future learned planners can be measured. + +### 6. Decision Forge runtime + +Decision frames use explicit criteria, weights, evidence coverage, hard blocks, and reversibility. Missing evidence reduces confidence instead of being silently treated as a zero or a guess. + +### 7. Model Port + +`ProposalEngine` is a trait, not an assumption about architecture. A future local co-model may be symbolic, search-based, state-space, neural, hybrid, or something not yet invented. The kernel contract stays stable. + +## Why not a knowledge graph? + +A graph is useful when explicit relations are themselves the product. It is not the default memory substrate here. Human recall does not appear to be a static traversal of a database graph; memories are distributed, linked, reconstructed, replayed, and selectively consolidated. Hikmah therefore stores **traces** and lets a contextual resonance function create a temporary activation path for each recall. + +If a domain genuinely needs explicit relations, a graph can be added as one **index or view** over traces. It must not become the ontology that every memory is forced to obey. + +## Why not “our own neural network” immediately? + +Novelty does not excuse skipping falsifiability. Training a new foundation architecture before we have a measurable cognitive contract would make it impossible to know whether improvement came from architecture, data, memory, prompting, or evaluation leakage. + +Hikmah inverts the order: + +1. define cognitive invariants; +2. implement deterministic state and evaluation; +3. measure failure modes; +4. attach multiple proposal engines behind the same interface; +5. only then invent/train new learned components for the bottlenecks the measurements reveal. + +This keeps architecture research honest and lets a non-neural co-model already provide value today. diff --git a/docs/CO_MODEL.md b/docs/CO_MODEL.md new file mode 100644 index 0000000..760c0c3 --- /dev/null +++ b/docs/CO_MODEL.md @@ -0,0 +1,79 @@ +# Co-Model Architecture + +A **co-model** is a second cognitive system that supervises and complements a generative model. Hikmah's co-model is deliberately useful even with no neural network attached. + +## Division of labor + +### Generative proposal engine +Good at: +- language; +- hypothesis generation; +- compression and reframing; +- code/text proposals; +- interpreting unstructured inputs. + +Not trusted to own: +- durable truth; +- provenance; +- irreversible authorization; +- commitment state; +- completion claims; +- deletion policy; +- self-evaluation as the sole judge. + +### Hikmah kernel +Owns: +- memory trace lifecycle; +- hash-chained event history; +- structured claim conflicts; +- bounded contextual recall; +- deterministic decision scoring; +- parallel challenge lanes; +- completion hygiene; +- policy and evaluation records. + +## The local-model roadmap + +The kernel exposes a `ProposalEngine` trait. This lets us benchmark radically different proposal mechanisms behind one cognitive contract: + +1. no-model deterministic baseline; +2. retrieval + rules + search; +3. small local language model; +4. state-space/recurrent model; +5. experimental non-attention architecture; +6. future learned memory module; +7. hybrid ensemble. + +We do **not** declare one architecture “best” before measuring it. State-space models, recurrent test-time memory, and other recent approaches are valuable research inputs, but they remain learned models with their own limitations. Hikmah's innovation is to make memory integrity and judgment architecture independent of that competition. + +## Non-neural reasoning path + +A fully local no-neural configuration can perform: + +- trace encoding; +- structured claim conflict detection; +- contextual recall; +- commitment recall; +- evidence/risk/human-impact/delivery lanes; +- weighted multi-criteria decisions; +- deterministic policies; +- bounded symbolic planning with Branch Loom; +- verification gates; +- outcome logging; +- future rule/search modules. + +Natural-language generation can be delegated to any attached model without giving that model custody of memory or policy. + +## Parallel cognition + +Hikmah does not ask one monolithic model to “think harder.” Independent lanes inspect different failure surfaces in parallel: + +```text + +-> Evidence lane ------+ +Input + Recall -----+-> Memory lane --------+ + +-> Risk lane ----------+--> Arbiter --> action state + +-> Human-impact lane --+ + +-> Delivery lane ------+ +``` + +This improves debuggability: a blocked action says **which lane blocked it and why**. diff --git a/docs/EVALUATION.md b/docs/EVALUATION.md new file mode 100644 index 0000000..4da83e7 --- /dev/null +++ b/docs/EVALUATION.md @@ -0,0 +1,40 @@ +# Evaluation Contract + +There is no “perfect engine” claim in Hikmah Stack. There is a **perfectibility loop**: every observed failure should become a reproducible case, an invariant, a test, a policy, or an explicitly accepted limitation. + +## Memory metrics + +- Recall precision@k for known relevant traces. +- Contradiction recall rate for structured conflicting claims. +- Provenance retention rate after consolidation/replay. +- Commitment recall before/at deadline. +- Stale-belief activation rate after supersession. +- Memory-poisoning rate from unverified model-generated claims. +- Sensitive-persistence violations. + +## Decision metrics + +- Missing-evidence visibility. +- Hard-block compliance. +- Ranking stability under irrelevant context. +- Reversibility preference when evidence is weak and expected value is otherwise close. +- Human-impact question surfacing for consequential actions. + +## Delivery metrics + +- False completion rate. +- Claimed-vs-observed test pass mismatch. +- Rollback information completeness. +- Outcome write-back coverage. + +## Runtime metrics + +- p50/p95 recall latency by trace count. +- Memory footprint. +- Ledger replay time. +- Hash-chain verification time. +- Determinism across identical inputs. + +## Architecture bake-off + +Any future local model must be tested behind the same `ProposalEngine` boundary. Compare candidate architectures on task quality **and** downstream repair, verification, memory pollution, latency, energy, and operator trust. A model that writes beautiful prose but causes more incorrect durable memories loses. diff --git a/docs/EVIDENCE.md b/docs/EVIDENCE.md index ffeb0f4..7d544be 100644 --- a/docs/EVIDENCE.md +++ b/docs/EVIDENCE.md @@ -39,3 +39,7 @@ When adding a statistic: 3. State at least one limitation or non-generalization. 4. Never turn a dated measurement into a universal law. 5. Re-check time-sensitive claims before a release. + +## Cognitive architecture research + +Human-memory and alternative-model research used to motivate TraceWeave design is maintained separately in [RESEARCH.md](RESEARCH.md), with explicit engineering lessons and limitations. diff --git a/docs/MEMORY.md b/docs/MEMORY.md new file mode 100644 index 0000000..93c63cd --- /dev/null +++ b/docs/MEMORY.md @@ -0,0 +1,95 @@ +# TraceWeave Memory + +TraceWeave is Hikmah Stack's human-inspired, machine-auditable memory architecture. It borrows principles from biological memory research without claiming to reproduce a brain. + +## Human inspiration, carefully stated + +Recent research supports several useful design ideas: memory representations can change during consolidation; replay can reactivate past experience; human hippocampal-entorhinal neurons encode temporal structure; and recall/consolidation are selective rather than a perfect recording. These findings motivate **dynamic association, replay, selectivity, and reconstruction**, not a literal neuron simulator. + +Research notes and limitations are recorded in [RESEARCH.md](RESEARCH.md). + +## Memory types + +Hikmah stores different cognitive responsibilities as different trace kinds: + +| Trace | Human analogue | Purpose | +|---|---|---| +| `observation` | perceptual/working input | a directly observed piece of current evidence | +| `episode` | episodic memory | what happened in a bounded event or session | +| `belief` | semantic memory | a proposition believed with explicit provenance/confidence | +| `procedure` | procedural memory | a reusable method or playbook | +| `commitment` | prospective memory | something that must happen later, optionally with a deadline | +| `preference` | personal/contextual preference | a stable preference, scoped and revisable | +| `constraint` | task/environment boundary | a condition that must remain true | +| `outcome` | feedback memory | what actually happened after an action | +| `correction` | reconsolidation input | evidence that updates or supersedes a prior trace | + +## A memory trace + +Every trace can carry: + +- stable ID; +- kind; +- content; +- tags; +- creation time and optional deadline; +- salience; +- confidence; +- privacy class; +- provenance source, locator, authority, and verification flag; +- optional structured `claim_key` / `claim_value`; +- optional `supersedes` link for correction. + +The point is not metadata maximalism. The point is to retain the minimum information required to answer: **what do we think we know, why, from where, when, how strongly, and what changed it?** + +## Resonance Recall + +TraceWeave does not store permanent semantic edges. A query produces a temporary activation path using several channels: + +```text +R = lexical + tag + recency + salience + confidence + provenance + prospective urgency +``` + +Weights are explicit in `runtime/hikmah-kernel/src/recall.rs` and therefore inspectable. The current implementation uses deterministic token overlap, not embeddings. An embedding/local-model channel may be added later behind an adapter, but it cannot replace provenance or contradiction controls. + +After scoring, **suppression** reduces redundant near-duplicate recalls. The result is a small, diverse working set rather than a dump of everything vaguely related. + +## Quiet Replay and consolidation + +Consolidation is not “summarize chat and save it.” Replay should inspect repeated episodes/observations, independent sources, outcomes, corrections, and contradictions. The reference kernel now groups compatible structured claims, counts independent sources, measures verification/confidence, and emits `ConsolidationProposal` records. Conflicting values prevent automatic eligibility. Durable promotion remains explicit. + +Important design rule: **replay produces a proposal; it does not silently manufacture truth.** + +## Reconsolidation + +A correction should not mutate yesterday's record in place. The system writes a new trace, records what it supersedes, and keeps the old trace marked superseded. This preserves both the current state and the history of how it changed. + +## Forgetting + +Human forgetting is not equivalent to deleting a row. Hikmah separates: + +1. **accessibility decay:** older, low-salience traces receive less recall weight; +2. **supersession:** old beliefs stop being active when replaced; +3. **retention deletion:** privacy/legal deletion is a storage operation, not a cognitive heuristic. + +The current append-only reference ledger deliberately refuses `sensitive` persistence unless policy explicitly enables it. A production deployment that stores sensitive payloads should use an encrypted vault with key destruction or another deletion-capable storage layer. Tamper evidence and right-to-delete must be designed together rather than hand-waved. + +## Working memory: Focus Capsule + +The policy defines a bounded working-set limit. The agent should deliberate over the smallest set of traces that changes the decision. More context is not automatically more cognition. + +## Prospective memory: Promise Queue + +Commitments are first-class traces. Deadline proximity contributes to recall, so “remember to do X” can become an inspectable pending obligation rather than a sentence that vanishes after context compaction. + +## Memory poisoning controls + +Before durable memory writes: + +- distinguish user statement from verified external fact; +- keep source/authority separate from confidence; +- do not auto-promote model output into belief; +- quarantine contradictory or suspicious claims rather than overwriting; +- never persist secrets merely because they appeared in conversation; +- scope preferences to the person/project/context that supplied them; +- attach outcomes to prior actions so failed plans do not become success-pattern memories. diff --git a/docs/RESEARCH.md b/docs/RESEARCH.md new file mode 100644 index 0000000..15459b4 --- /dev/null +++ b/docs/RESEARCH.md @@ -0,0 +1,63 @@ +# Research Notes: Human Memory and Alternative Model Architectures + +Verified: **2026-08-09**. These notes inform design hypotheses; they are not claims that Hikmah reproduces human cognition. + +## Dynamic/selective memory representations + +Tomé et al., *Nature Neuroscience* (2024), combined computational and mouse experiments and reported that memory engram composition/selectivity changes with consolidation, with inhibitory activity/plasticity important for selectivity. + +Source: https://www.nature.com/articles/s41593-023-01551-w + +**Design lesson:** durable memory should support changing accessibility and explicit correction rather than freezing the first representation forever. + +## Replay and distributed activation in humans + +Huang et al., *Nature Communications* (2024), used simultaneous EEG-fMRI and reported fast sequential replay associated with hippocampal and medial-prefrontal activity/connectivity during mental simulation. + +Source: https://www.nature.com/articles/s41467-024-51582-5 + +**Design lesson:** offline/reflective replay is a plausible inspiration for consolidation and cross-context learning, but software replay must remain evidence-preserving. + +## Temporal structure in human hippocampal-entorhinal neurons + +Tacikowski et al., *Nature* (2024), reported single-neuron representations related to temporal structure and replay in human hippocampal/entorhinal recordings. + +Source: https://www.nature.com/articles/s41586-024-07973-1 + +**Design lesson:** temporal order and sequence deserve first-class representation; not every relation needs a static semantic edge. + +## Memory construction and consolidation model + +Spens & Burgess, *Nature Human Behaviour* (2024), proposed a computational account in which hippocampal replay and generative systems interact to reconstruct experiences and schemas. + +Source: https://www.nature.com/articles/s41562-023-01799-z + +**Design lesson:** recall should not be treated as byte-perfect playback. Software, however, can preserve provenance even when summaries/reconstructions are generated. + +## Replay and planning + +Jensen, Hennequin & Mattar, *Nature Neuroscience* (2024), presented a recurrent planning model connecting replay to planning behavior. + +Source: https://www.nature.com/articles/s41593-024-01675-7 + +**Design lesson:** recall and planning can be coupled, but Hikmah keeps the memory ledger independent from the planner so a bad plan cannot rewrite its own evidence. + +## Alternative learned sequence models + +Sarrof, Veitsman & Hahn, NeurIPS 2024, analyzed linear state-space models and found strengths and limitations distinct from transformers on formal-language tasks. + +Source: https://proceedings.neurips.cc/paper_files/paper/2024/hash/485e0981e81766248b61fd1ec43c118f-Abstract-Conference.html + +**Design lesson:** “non-transformer” does not mean “solved.” Different learned architectures have different representational tradeoffs. The co-model contract should outlive them. + +## Test-time neural memory + +Behrouz, Zhong & Mirrokni introduced Titans (2024/2025), a neural long-term memory approach that learns at test time and was evaluated on long-context tasks. + +Source: https://arxiv.org/abs/2501.00663 + +Later independent analysis reported promising memory effects alongside reproducibility and chunking limitations. + +Source: https://arxiv.org/abs/2510.09551 + +**Design lesson:** learned memory can become an optional proposal/retrieval channel, but durable factual memory still needs provenance, conflict handling, and policy outside the learned weights. diff --git a/examples/decision-frame.json b/examples/decision-frame.json new file mode 100644 index 0000000..ea3e950 --- /dev/null +++ b/examples/decision-frame.json @@ -0,0 +1,25 @@ +{ + "question": "Which deployment path should we use?", + "criteria": [ + {"id": "safety", "weight": 0.4, "description": "Operational safety"}, + {"id": "reversibility", "weight": 0.25, "description": "Ease of rollback"}, + {"id": "speed", "weight": 0.15, "description": "Time to value"}, + {"id": "cost", "weight": 0.2, "description": "Total cost"} + ], + "options": [ + { + "name": "canary", + "scores": {"safety": 0.95, "reversibility": 0.95, "speed": 0.65, "cost": 0.7}, + "evidence_confidence": 0.9, + "hard_blocks": [], + "reversible": true + }, + { + "name": "big-bang", + "scores": {"safety": 0.45, "reversibility": 0.3, "speed": 0.95, "cost": 0.8}, + "evidence_confidence": 0.75, + "hard_blocks": [], + "reversible": false + } + ] +} diff --git a/examples/plan-problem.json b/examples/plan-problem.json new file mode 100644 index 0000000..a94f510 --- /dev/null +++ b/examples/plan-problem.json @@ -0,0 +1,10 @@ +{ + "initial": ["code_ready"], + "goal": ["production_verified"], + "max_depth": 8, + "actions": [ + {"name": "run_tests", "requires": ["code_ready"], "adds": ["tests_passed"], "removes": []}, + {"name": "deploy_canary", "requires": ["tests_passed"], "adds": ["canary_live"], "removes": []}, + {"name": "verify_canary", "requires": ["canary_live"], "adds": ["production_verified"], "removes": []} + ] +} diff --git a/hooks/codex.json b/hooks/codex.json index e4f0a14..48d001b 100644 --- a/hooks/codex.json +++ b/hooks/codex.json @@ -1,13 +1,13 @@ { - "description": "Hikmah Stack completion hygiene gate for Codex.", + "description": "Hikmah Stack completion hygiene gate. Prefers the Rust kernel, with a zero-install compatibility fallback.", "hooks": { "Stop": [ { "hooks": [ { "type": "command", - "command": "python3 ${PLUGIN_ROOT}/hooks/truth_gate.py", - "timeout": 5, + "command": "sh ${PLUGIN_ROOT}/hooks/truth_gate.sh", + "timeout": 8, "statusMessage": "Running Hikmah Truth Gate" } ] diff --git a/hooks/truth_gate.py b/hooks/truth_gate.py index 1395880..0c22b6e 100755 --- a/hooks/truth_gate.py +++ b/hooks/truth_gate.py @@ -1,5 +1,11 @@ #!/usr/bin/env python3 -"""Conservative Codex Stop hook for Hikmah Stack. +"""Zero-install compatibility fallback for Hikmah Truth Gate. + +The primary implementation is Rust (`runtime/hikmah-kernel`). This file remains +only so a source-installed plugin can keep its narrow Stop check on machines that +do not yet have the Hikmah binary or Rust toolchain. + +Conservative Codex Stop hook for Hikmah Stack. This hook does NOT fact-check. It only catches obvious unfinished placeholders or future-work promises in a response that simultaneously claims completion. diff --git a/hooks/truth_gate.sh b/hooks/truth_gate.sh new file mode 100755 index 0000000..34aad9c --- /dev/null +++ b/hooks/truth_gate.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env sh +set -eu + +ROOT="${PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-}}" + +if command -v hikmah >/dev/null 2>&1; then + exec hikmah hook +fi + +if [ -n "$ROOT" ] && [ -x "$ROOT/bin/hikmah" ]; then + exec "$ROOT/bin/hikmah" hook +fi + +if [ -n "$ROOT" ] && command -v cargo >/dev/null 2>&1 && [ -f "$ROOT/runtime/hikmah-kernel/Cargo.toml" ]; then + exec cargo run --quiet --manifest-path "$ROOT/runtime/hikmah-kernel/Cargo.toml" -- hook +fi + +# Zero-install compatibility only. Rust is the primary runtime. +if [ -n "$ROOT" ] && command -v python3 >/dev/null 2>&1 && [ -f "$ROOT/hooks/truth_gate.py" ]; then + exec python3 "$ROOT/hooks/truth_gate.py" +fi + +printf '{}\n' diff --git a/lenses/human-memory-inspiration.md b/lenses/human-memory-inspiration.md new file mode 100644 index 0000000..cbe3d0a --- /dev/null +++ b/lenses/human-memory-inspiration.md @@ -0,0 +1,16 @@ +# Lens: Human Memory Inspiration Without Cargo Culting + +Do not map software components to brain regions merely because the analogy sounds advanced. + +Borrow only a principle that solves a measured engineering problem: + +- **selectivity** -> bounded working set and suppression; +- **replay** -> offline consolidation proposals; +- **reconsolidation** -> versioned correction instead of overwrite; +- **temporal structure** -> sequence/deadline first-class fields; +- **distributed association** -> dynamic multi-cue resonance rather than one permanent link; +- **forgetting** -> accessibility decay separated from deletion; +- **prospective memory** -> explicit commitments/triggers; +- **procedural memory** -> durable playbooks/skills. + +Then test the software mechanism on its own metrics. Biology is inspiration, not proof. diff --git a/lenses/memory-integrity.md b/lenses/memory-integrity.md new file mode 100644 index 0000000..85d473e --- /dev/null +++ b/lenses/memory-integrity.md @@ -0,0 +1,12 @@ +# Lens: Memory Integrity + +Ask these before trusting remembered context: + +- Is this an observation, a belief, a preference, or a model-generated guess? +- What is the provenance and verification state? +- Is it scoped to the correct person/project/environment? +- Has a later correction superseded it? +- Is there a contradictory active claim? +- Did the associated action succeed, fail, or remain untested? +- Is the memory still relevant, or merely easy to retrieve? +- Is remembering it permissible under the privacy/retention policy? diff --git a/lenses/model-independence.md b/lenses/model-independence.md new file mode 100644 index 0000000..32c0cda --- /dev/null +++ b/lenses/model-independence.md @@ -0,0 +1,12 @@ +# Lens: Model Independence + +Whenever a design says “the model will remember/decide/check itself,” ask: + +1. What state must survive a model swap? +2. What must be deterministic or auditable outside learned weights? +3. Which outputs are proposals versus authoritative state transitions? +4. Can a weaker/local/offline model still operate the core workflow? +5. Can two different models be compared behind the same interface? +6. What failure becomes invisible if the same model generates and judges the answer? + +If a capability is essential to identity, memory integrity, policy, or audit, prefer a host/kernel mechanism over hidden model state. diff --git a/playbooks/error-to-learning.md b/playbooks/error-to-learning.md new file mode 100644 index 0000000..2602526 --- /dev/null +++ b/playbooks/error-to-learning.md @@ -0,0 +1,11 @@ +# Playbook: Error -> Durable Learning + +A system that merely apologizes does not learn. + +1. Capture the failed expectation and observed outcome as separate traces. +2. Identify the earliest point where the failure could have been detected. +3. Classify the failure: knowledge, memory, reasoning, tool, execution, verification, policy, or handoff. +4. Create the smallest durable correction: test, rule, memory correction, acceptance criterion, or playbook update. +5. Re-run the original case. +6. Add a nearby counterexample so the fix does not overfit one incident. +7. Record whether the correction actually reduced recurrence. diff --git a/playbooks/parallel-deliberation.md b/playbooks/parallel-deliberation.md new file mode 100644 index 0000000..639f3d7 --- /dev/null +++ b/playbooks/parallel-deliberation.md @@ -0,0 +1,13 @@ +# Playbook: Parallel Deliberation + +Do not make one monolithic reasoning pass carry every responsibility. + +Run five independent lanes: + +1. **Evidence:** Which consequential claims are verified, inferred, or unknown? +2. **Memory:** Are recalled facts stale, superseded, contradictory, poisoned, or from the wrong scope/person/project? +3. **Risk:** What is irreversible, high-blast-radius, security-sensitive, or hard to roll back? +4. **Human impact:** Who bears cost/risk, who consented, who owns the decision, and who has recourse? +5. **Delivery:** What acceptance criterion, test, artifact, rollback, or outcome record is missing? + +Merge only after each lane reports independently. A lane may veto when its hard constraint is violated. Do not average a security/privacy/consent block into a high aggregate score. diff --git a/playbooks/remember-recall-consolidate.md b/playbooks/remember-recall-consolidate.md new file mode 100644 index 0000000..ab08a1f --- /dev/null +++ b/playbooks/remember-recall-consolidate.md @@ -0,0 +1,25 @@ +# Playbook: Remember -> Recall -> Consolidate + +Use this whenever an agent has durable memory available. + +## Remember +1. Classify the trace: observation, episode, belief, procedure, commitment, preference, constraint, outcome, or correction. +2. Preserve provenance before compression. +3. Mark confidence separately from source authority. +4. Refuse secret/sensitive persistence unless the configured storage layer supports the required protection/deletion semantics. +5. If it is a structured claim, check for a competing active value. +6. Write the trace; never overwrite history in place. + +## Recall +1. Name the current goal, not just keywords. +2. Activate from multiple cues: words, tags, time, salience, confidence, provenance, and commitment urgency. +3. Suppress redundant memories so the working set stays small. +4. Pull corrections/conflicts beside the claim they challenge. +5. Label recalled content by source and status before using it in a consequential decision. + +## Consolidate +1. Replay outcomes and corrections, not only the original plan. +2. Look for repeated patterns across independent evidence. +3. Propose a belief/procedure; do not auto-promote it. +4. Preserve minority/conflicting evidence until resolved. +5. Turn repeated failure into a test, rule, or playbook change. diff --git a/runtime/hikmah-kernel/Cargo.toml b/runtime/hikmah-kernel/Cargo.toml new file mode 100644 index 0000000..d5bf424 --- /dev/null +++ b/runtime/hikmah-kernel/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "hikmah-kernel" +version = "3.0.0" +edition = "2021" +description = "Deterministic co-model runtime for Hikmah Stack" +license = "MIT" +repository = "https://github.com/CodeWithJuber/hikmah-stack" + +[lib] +name = "hikmah_kernel" +path = "src/lib.rs" + +[[bin]] +name = "hikmah" +path = "src/main.rs" + +[dependencies] +blake3 = "1.5" +clap = { version = "4.5", features = ["derive"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +thiserror = "2" diff --git a/runtime/hikmah-kernel/src/claims.rs b/runtime/hikmah-kernel/src/claims.rs new file mode 100644 index 0000000..f81abb6 --- /dev/null +++ b/runtime/hikmah-kernel/src/claims.rs @@ -0,0 +1,48 @@ +use crate::trace::Trace; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ClaimConflict { + pub claim_key: String, + pub existing_trace_id: String, + pub existing_value: String, + pub incoming_value: String, +} + +pub fn detect_conflicts<'a>( + incoming: &Trace, + existing: impl Iterator, +) -> Vec { + let (Some(key), Some(value)) = (&incoming.claim_key, &incoming.claim_value) else { + return Vec::new(); + }; + let normalized_value = normalize(value); + existing + .filter_map(|trace| { + let (Some(existing_key), Some(existing_value)) = (&trace.claim_key, &trace.claim_value) + else { + return None; + }; + if normalize(existing_key) == normalize(key) + && normalize(existing_value) != normalized_value + { + Some(ClaimConflict { + claim_key: key.clone(), + existing_trace_id: trace.id.clone(), + existing_value: existing_value.clone(), + incoming_value: value.clone(), + }) + } else { + None + } + }) + .collect() +} + +fn normalize(value: &str) -> String { + value + .split_whitespace() + .collect::>() + .join(" ") + .to_lowercase() +} diff --git a/runtime/hikmah-kernel/src/consolidation.rs b/runtime/hikmah-kernel/src/consolidation.rs new file mode 100644 index 0000000..0d2f617 --- /dev/null +++ b/runtime/hikmah-kernel/src/consolidation.rs @@ -0,0 +1,96 @@ +use crate::ledger::MemoryStore; +use serde::{Deserialize, Serialize}; +use std::collections::{BTreeMap, BTreeSet}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ConsolidationProposal { + pub claim_key: String, + pub claim_value: String, + pub support_trace_ids: Vec, + pub independent_sources: Vec, + pub conflicting_values: Vec, + pub confidence: f32, + pub eligible_for_promotion: bool, +} + +impl MemoryStore { + /// Quiet Replay: generate evidence-preserving consolidation proposals. + /// This never writes a new belief automatically. + pub fn consolidation_proposals(&self) -> Vec { + let mut grouped: BTreeMap>> = BTreeMap::new(); + for trace in self.active_traces() { + let (Some(key), Some(value)) = (&trace.claim_key, &trace.claim_value) else { + continue; + }; + grouped + .entry(normalize(key)) + .or_default() + .entry(normalize(value)) + .or_default() + .push(trace); + } + + let mut proposals = Vec::new(); + for (key, values) in grouped { + for (value, traces) in &values { + let sources: BTreeSet = traces + .iter() + .map(|trace| trace.provenance.source.clone()) + .collect(); + let average_confidence = if traces.is_empty() { + 0.0 + } else { + traces.iter().map(|trace| trace.confidence).sum::() / traces.len() as f32 + }; + let verification_ratio = if traces.is_empty() { + 0.0 + } else { + traces + .iter() + .filter(|trace| trace.provenance.verified) + .count() as f32 + / traces.len() as f32 + }; + let confidence = + (0.7 * average_confidence + 0.3 * verification_ratio).clamp(0.0, 1.0); + let conflicting_values = values + .keys() + .filter(|other| *other != value) + .cloned() + .collect::>(); + let eligible_for_promotion = traces.len() + >= self.policy().consolidation_min_support + && sources.len() >= self.policy().consolidation_min_independent_sources + && conflicting_values.is_empty(); + + proposals.push(ConsolidationProposal { + claim_key: key.clone(), + claim_value: value.clone(), + support_trace_ids: traces.iter().map(|trace| trace.id.clone()).collect(), + independent_sources: sources.into_iter().collect(), + conflicting_values, + confidence, + eligible_for_promotion, + }); + } + } + proposals.sort_by(|a, b| { + b.eligible_for_promotion + .cmp(&a.eligible_for_promotion) + .then_with(|| { + b.confidence + .partial_cmp(&a.confidence) + .unwrap_or(std::cmp::Ordering::Equal) + }) + }); + proposals + } +} + +fn normalize(value: &str) -> String { + value + .split_whitespace() + .collect::>() + .join(" ") + .to_lowercase() +} diff --git a/runtime/hikmah-kernel/src/council.rs b/runtime/hikmah-kernel/src/council.rs new file mode 100644 index 0000000..df0f43d --- /dev/null +++ b/runtime/hikmah-kernel/src/council.rs @@ -0,0 +1,94 @@ +use serde::{Deserialize, Serialize}; +use std::thread; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DeliberationInput { + pub unverified_consequential_claims: usize, + pub memory_conflicts: usize, + pub irreversible_actions: usize, + pub unresolved_human_impact_questions: usize, + pub missing_acceptance_criteria: usize, +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +#[serde(rename_all = "snake_case")] +pub enum Lane { + Evidence, + Memory, + Risk, + HumanImpact, + Delivery, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct LaneSignal { + pub lane: Lane, + pub severity: f32, + pub message: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CouncilResult { + pub can_proceed: bool, + pub signals: Vec, +} + +pub fn deliberate(input: &DeliberationInput) -> CouncilResult { + let signals = thread::scope(|scope| { + let evidence = scope.spawn(|| LaneSignal { + lane: Lane::Evidence, + severity: ratio(input.unverified_consequential_claims, 3), + message: format!( + "{} consequential claims still lack verification", + input.unverified_consequential_claims + ), + }); + let memory = scope.spawn(|| LaneSignal { + lane: Lane::Memory, + severity: ratio(input.memory_conflicts, 2), + message: format!("{} unresolved memory conflicts", input.memory_conflicts), + }); + let risk = scope.spawn(|| LaneSignal { + lane: Lane::Risk, + severity: ratio(input.irreversible_actions, 2), + message: format!( + "{} irreversible actions in scope", + input.irreversible_actions + ), + }); + let human_impact = scope.spawn(|| LaneSignal { + lane: Lane::HumanImpact, + severity: ratio(input.unresolved_human_impact_questions, 2), + message: format!( + "{} unresolved human-impact questions", + input.unresolved_human_impact_questions + ), + }); + let delivery = scope.spawn(|| LaneSignal { + lane: Lane::Delivery, + severity: ratio(input.missing_acceptance_criteria, 3), + message: format!( + "{} acceptance criteria are still missing", + input.missing_acceptance_criteria + ), + }); + + vec![ + evidence.join().expect("evidence lane panicked"), + memory.join().expect("memory lane panicked"), + risk.join().expect("risk lane panicked"), + human_impact.join().expect("human-impact lane panicked"), + delivery.join().expect("delivery lane panicked"), + ] + }); + + let can_proceed = signals.iter().all(|signal| signal.severity < 0.8); + CouncilResult { + can_proceed, + signals, + } +} + +fn ratio(value: usize, blocking_at: usize) -> f32 { + (value as f32 / blocking_at.max(1) as f32).clamp(0.0, 1.0) +} diff --git a/runtime/hikmah-kernel/src/decision.rs b/runtime/hikmah-kernel/src/decision.rs new file mode 100644 index 0000000..46e79bd --- /dev/null +++ b/runtime/hikmah-kernel/src/decision.rs @@ -0,0 +1,118 @@ +use crate::error::{KernelError, Result}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DecisionFrame { + pub question: String, + pub criteria: Vec, + pub options: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Criterion { + pub id: String, + pub weight: f64, + pub description: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DecisionOption { + pub name: String, + pub scores: BTreeMap, + pub evidence_confidence: f64, + #[serde(default)] + pub hard_blocks: Vec, + #[serde(default)] + pub reversible: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RankedOption { + pub name: String, + pub raw_score: f64, + pub confidence_adjusted_score: f64, + pub evidence_confidence: f64, + pub reversible: bool, + pub blocked: bool, + pub hard_blocks: Vec, + pub missing_criteria: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct DecisionResult { + pub question: String, + pub ranking: Vec, +} + +pub fn evaluate(frame: &DecisionFrame) -> Result { + if frame.criteria.is_empty() || frame.options.is_empty() { + return Err(KernelError::Invalid( + "decision frame requires at least one criterion and one option".into(), + )); + } + let total_weight: f64 = frame.criteria.iter().map(|c| c.weight.max(0.0)).sum(); + if total_weight <= f64::EPSILON { + return Err(KernelError::Invalid( + "decision criteria must contain positive weight".into(), + )); + } + + let mut ranking = Vec::new(); + for option in &frame.options { + if !(0.0..=1.0).contains(&option.evidence_confidence) { + return Err(KernelError::Invalid(format!( + "evidence_confidence for {} must be between 0 and 1", + option.name + ))); + } + let mut weighted = 0.0; + let mut observed_weight = 0.0; + let mut missing = Vec::new(); + for criterion in &frame.criteria { + match option.scores.get(&criterion.id) { + Some(score) if (0.0..=1.0).contains(score) => { + weighted += score * criterion.weight.max(0.0); + observed_weight += criterion.weight.max(0.0); + } + Some(_) => { + return Err(KernelError::Invalid(format!( + "score for {} / {} must be between 0 and 1", + option.name, criterion.id + ))); + } + None => missing.push(criterion.id.clone()), + } + } + let coverage = observed_weight / total_weight; + let raw_score = weighted / total_weight; + let confidence = option.evidence_confidence * coverage; + let confidence_adjusted_score = raw_score * (0.5 + 0.5 * confidence); + ranking.push(RankedOption { + name: option.name.clone(), + raw_score, + confidence_adjusted_score, + evidence_confidence: confidence, + reversible: option.reversible, + blocked: !option.hard_blocks.is_empty(), + hard_blocks: option.hard_blocks.clone(), + missing_criteria: missing, + }); + } + + ranking.sort_by(|a, b| { + a.blocked + .cmp(&b.blocked) + .then_with(|| { + b.confidence_adjusted_score + .partial_cmp(&a.confidence_adjusted_score) + .unwrap_or(std::cmp::Ordering::Equal) + }) + .then_with(|| b.reversible.cmp(&a.reversible)) + }); + + Ok(DecisionResult { + question: frame.question.clone(), + ranking, + }) +} diff --git a/runtime/hikmah-kernel/src/error.rs b/runtime/hikmah-kernel/src/error.rs new file mode 100644 index 0000000..9cd389a --- /dev/null +++ b/runtime/hikmah-kernel/src/error.rs @@ -0,0 +1,17 @@ +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum KernelError { + #[error("I/O error: {0}")] + Io(#[from] std::io::Error), + #[error("JSON error: {0}")] + Json(#[from] serde_json::Error), + #[error("integrity error at ledger sequence {seq}: {message}")] + Integrity { seq: u64, message: String }, + #[error("invalid input: {0}")] + Invalid(String), + #[error("trace not found: {0}")] + NotFound(String), +} + +pub type Result = std::result::Result; diff --git a/runtime/hikmah-kernel/src/focus.rs b/runtime/hikmah-kernel/src/focus.rs new file mode 100644 index 0000000..54d46a0 --- /dev/null +++ b/runtime/hikmah-kernel/src/focus.rs @@ -0,0 +1,41 @@ +use crate::recall::RecallResult; +use crate::trace::Trace; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct FocusItem { + pub trace: Trace, + pub activation: f32, + pub pinned: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct FocusCapsule { + pub capacity: usize, + pub items: Vec, +} + +impl FocusCapsule { + pub fn from_recall(results: Vec, capacity: usize) -> Self { + let capacity = capacity.max(1); + let items = results + .into_iter() + .take(capacity) + .map(|result| FocusItem { + trace: result.trace, + activation: result.score, + pinned: false, + }) + .collect(); + Self { capacity, items } + } + + pub fn pin(&mut self, trace_id: &str) -> bool { + if let Some(item) = self.items.iter_mut().find(|item| item.trace.id == trace_id) { + item.pinned = true; + true + } else { + false + } + } +} diff --git a/runtime/hikmah-kernel/src/hook.rs b/runtime/hikmah-kernel/src/hook.rs new file mode 100644 index 0000000..ff5be45 --- /dev/null +++ b/runtime/hikmah-kernel/src/hook.rs @@ -0,0 +1,88 @@ +use serde_json::{json, Value}; +use std::io::{Read, Write}; + +use crate::error::Result; + +pub fn run_stop_hook(mut input: impl Read, mut output: impl Write) -> Result<()> { + let mut buffer = String::new(); + input.read_to_string(&mut buffer)?; + let payload: Value = match serde_json::from_str(&buffer) { + Ok(value) => value, + Err(_) => { + writeln!(output, "{{}}")?; + return Ok(()); + } + }; + if payload + .get("stop_hook_active") + .and_then(Value::as_bool) + .unwrap_or(false) + { + writeln!(output, "{{}}")?; + return Ok(()); + } + + let text = payload + .get("last_assistant_message") + .and_then(Value::as_str) + .unwrap_or("") + .to_ascii_lowercase(); + let completion = contains_any( + &text, + &[ + "done", + "complete", + "completed", + "finished", + "ready", + "shipped", + "implemented", + "fixed", + ], + ); + let unfinished = contains_any( + &text, + &[ + "todo", + "tbd", + "fixme", + "placeholder", + "coming soon", + " bool { + words.iter().any(|word| { + text.split(|c: char| !c.is_alphanumeric() && c != '<' && c != '[') + .any(|token| token == *word) + || text.contains(word) + }) +} diff --git a/runtime/hikmah-kernel/src/ledger.rs b/runtime/hikmah-kernel/src/ledger.rs new file mode 100644 index 0000000..f853d74 --- /dev/null +++ b/runtime/hikmah-kernel/src/ledger.rs @@ -0,0 +1,280 @@ +use crate::claims::{detect_conflicts, ClaimConflict}; +use crate::error::{KernelError, Result}; +use crate::policy::KernelPolicy; +use crate::trace::{Trace, TraceStatus}; +use blake3::Hasher; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeMap; +use std::fs::{self, File, OpenOptions}; +use std::io::{BufRead, BufReader, Write}; +use std::path::{Path, PathBuf}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "type", rename_all = "snake_case")] +pub enum LedgerPayload { + Remember { trace: Trace }, + Supersede { old_id: String, new_id: String }, + Fulfill { id: String }, + Purge { id: String, reason: String }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct LedgerRecord { + pub seq: u64, + pub prev_hash: String, + pub payload: LedgerPayload, + pub hash: String, +} + +#[derive(Serialize)] +struct HashMaterial<'a> { + seq: u64, + prev_hash: &'a str, + payload: &'a LedgerPayload, +} + +#[derive(Debug, Clone)] +pub struct TraceEntry { + pub trace: Trace, + pub status: TraceStatus, +} + +#[derive(Debug)] +pub struct MemoryStore { + path: PathBuf, + policy: KernelPolicy, + records: Vec, + traces: BTreeMap, +} + +impl MemoryStore { + pub fn open(path: impl AsRef, policy: KernelPolicy) -> Result { + let path = path.as_ref().to_path_buf(); + if let Some(parent) = path.parent() { + if !parent.as_os_str().is_empty() { + fs::create_dir_all(parent)?; + } + } + if !path.exists() { + File::create(&path)?; + } + + let file = File::open(&path)?; + let reader = BufReader::new(file); + let mut records = Vec::new(); + let mut traces = BTreeMap::new(); + let mut expected_prev = String::from("GENESIS"); + let mut expected_seq = 1_u64; + + for line in reader.lines() { + let line = line?; + if line.trim().is_empty() { + continue; + } + let record: LedgerRecord = serde_json::from_str(&line)?; + if record.seq != expected_seq { + return Err(KernelError::Integrity { + seq: record.seq, + message: format!("expected sequence {expected_seq}"), + }); + } + if record.prev_hash != expected_prev { + return Err(KernelError::Integrity { + seq: record.seq, + message: "previous hash does not match".into(), + }); + } + let calculated = hash_record(record.seq, &record.prev_hash, &record.payload)?; + if calculated != record.hash { + return Err(KernelError::Integrity { + seq: record.seq, + message: "record hash does not match payload".into(), + }); + } + apply_payload(&mut traces, &record.payload)?; + expected_prev = record.hash.clone(); + expected_seq += 1; + records.push(record); + } + + Ok(Self { + path, + policy, + records, + traces, + }) + } + + pub fn remember(&mut self, mut trace: Trace) -> Result<(Trace, Vec)> { + trace.validate()?; + if trace.privacy == crate::trace::PrivacyClass::Sensitive + && !self.policy.allow_sensitive_persistence + { + return Err(KernelError::Invalid( + "sensitive persistence is disabled; use an encrypted vault adapter or lower the privacy class explicitly" + .into(), + )); + } + if trace.id.is_empty() { + trace.id = self.next_trace_id(&trace); + } + if self.traces.contains_key(&trace.id) { + return Err(KernelError::Invalid(format!( + "trace id already exists: {}", + trace.id + ))); + } + + let conflicts = detect_conflicts(&trace, self.active_traces()); + let payload = LedgerPayload::Remember { + trace: trace.clone(), + }; + self.append(payload)?; + if let Some(old_id) = trace.supersedes.clone() { + self.append(LedgerPayload::Supersede { + old_id, + new_id: trace.id.clone(), + })?; + } + Ok((trace, conflicts)) + } + + pub fn fulfill(&mut self, id: impl Into) -> Result<()> { + let id = id.into(); + if !self.traces.contains_key(&id) { + return Err(KernelError::NotFound(id)); + } + self.append(LedgerPayload::Fulfill { id }) + } + + pub fn purge(&mut self, id: impl Into, reason: impl Into) -> Result<()> { + let id = id.into(); + if !self.traces.contains_key(&id) { + return Err(KernelError::NotFound(id)); + } + self.append(LedgerPayload::Purge { + id, + reason: reason.into(), + }) + } + + pub fn all(&self) -> impl Iterator { + self.traces.values() + } + + pub fn active_traces(&self) -> impl Iterator { + self.traces + .values() + .filter(|entry| entry.status == TraceStatus::Active) + .map(|entry| &entry.trace) + } + + pub fn policy(&self) -> &KernelPolicy { + &self.policy + } + + pub fn record_count(&self) -> usize { + self.records.len() + } + + pub fn verify(&self) -> Result<()> { + let mut prev = String::from("GENESIS"); + for record in &self.records { + if record.prev_hash != prev { + return Err(KernelError::Integrity { + seq: record.seq, + message: "previous hash mismatch".into(), + }); + } + let calculated = hash_record(record.seq, &record.prev_hash, &record.payload)?; + if calculated != record.hash { + return Err(KernelError::Integrity { + seq: record.seq, + message: "hash mismatch".into(), + }); + } + prev = record.hash.clone(); + } + Ok(()) + } + + fn append(&mut self, payload: LedgerPayload) -> Result<()> { + let seq = self.records.len() as u64 + 1; + let prev_hash = self + .records + .last() + .map(|r| r.hash.clone()) + .unwrap_or_else(|| "GENESIS".to_string()); + let hash = hash_record(seq, &prev_hash, &payload)?; + let record = LedgerRecord { + seq, + prev_hash, + payload, + hash, + }; + let encoded = serde_json::to_string(&record)?; + let mut file = OpenOptions::new().append(true).open(&self.path)?; + writeln!(file, "{encoded}")?; + file.sync_data()?; + apply_payload(&mut self.traces, &record.payload)?; + self.records.push(record); + Ok(()) + } + + fn next_trace_id(&self, trace: &Trace) -> String { + let seed = format!( + "{}:{}:{}:{}", + self.records.len() + 1, + trace.created_at_ms, + trace.kind, + trace.content + ); + let hash = blake3::hash(seed.as_bytes()).to_hex().to_string(); + format!("tr_{}", &hash[..16]) + } +} + +fn hash_record(seq: u64, prev_hash: &str, payload: &LedgerPayload) -> Result { + let material = HashMaterial { + seq, + prev_hash, + payload, + }; + let bytes = serde_json::to_vec(&material)?; + let mut hasher = Hasher::new(); + hasher.update(&bytes); + Ok(hasher.finalize().to_hex().to_string()) +} + +fn apply_payload(traces: &mut BTreeMap, payload: &LedgerPayload) -> Result<()> { + match payload { + LedgerPayload::Remember { trace } => { + traces.insert( + trace.id.clone(), + TraceEntry { + trace: trace.clone(), + status: TraceStatus::Active, + }, + ); + } + LedgerPayload::Supersede { old_id, .. } => { + let entry = traces + .get_mut(old_id) + .ok_or_else(|| KernelError::NotFound(old_id.clone()))?; + entry.status = TraceStatus::Superseded; + } + LedgerPayload::Fulfill { id } => { + let entry = traces + .get_mut(id) + .ok_or_else(|| KernelError::NotFound(id.clone()))?; + entry.status = TraceStatus::Fulfilled; + } + LedgerPayload::Purge { id, .. } => { + let entry = traces + .get_mut(id) + .ok_or_else(|| KernelError::NotFound(id.clone()))?; + entry.status = TraceStatus::Purged; + } + } + Ok(()) +} diff --git a/runtime/hikmah-kernel/src/lib.rs b/runtime/hikmah-kernel/src/lib.rs new file mode 100644 index 0000000..425bb73 --- /dev/null +++ b/runtime/hikmah-kernel/src/lib.rs @@ -0,0 +1,20 @@ +pub mod claims; +pub mod consolidation; +pub mod council; +pub mod decision; +pub mod error; +pub mod focus; +pub mod hook; +pub mod ledger; +pub mod model_port; +pub mod planner; +pub mod policy; +pub mod prospective; +pub mod recall; +pub mod trace; +pub mod validate; + +pub use error::{KernelError, Result}; +pub use ledger::MemoryStore; +pub use recall::{RecallQuery, RecallResult}; +pub use trace::{PrivacyClass, Provenance, Trace, TraceKind, TraceStatus}; diff --git a/runtime/hikmah-kernel/src/main.rs b/runtime/hikmah-kernel/src/main.rs new file mode 100644 index 0000000..cd46bf9 --- /dev/null +++ b/runtime/hikmah-kernel/src/main.rs @@ -0,0 +1,235 @@ +use clap::{Parser, Subcommand}; +use hikmah_kernel::council::{deliberate, DeliberationInput}; +use hikmah_kernel::decision::{evaluate, DecisionFrame}; +use hikmah_kernel::hook::run_stop_hook; +use hikmah_kernel::planner::{plan, PlanProblem}; +use hikmah_kernel::policy::KernelPolicy; +use hikmah_kernel::recall::RecallQuery; +use hikmah_kernel::trace::{PrivacyClass, Trace, TraceKind}; +use hikmah_kernel::validate::validate_repo; +use hikmah_kernel::{MemoryStore, Result}; +use std::fs; +use std::io; +use std::path::PathBuf; +use std::str::FromStr; + +#[derive(Debug, Parser)] +#[command( + name = "hikmah", + version, + about = "Hikmah deterministic co-model kernel" +)] +struct Cli { + #[command(subcommand)] + command: Command, +} + +#[derive(Debug, Subcommand)] +enum Command { + Init { + #[arg(long, default_value = ".hikmah/memory.jsonl")] + store: PathBuf, + }, + Remember { + #[arg(long, default_value = ".hikmah/memory.jsonl")] + store: PathBuf, + #[arg(long)] + kind: String, + #[arg(long)] + content: String, + #[arg(long, default_value = "user")] + source: String, + #[arg(long = "tag")] + tags: Vec, + #[arg(long, default_value_t = 0.5)] + salience: f32, + #[arg(long, default_value_t = 0.5)] + confidence: f32, + #[arg(long, default_value = "private")] + privacy: String, + #[arg(long)] + claim_key: Option, + #[arg(long)] + claim_value: Option, + #[arg(long)] + supersedes: Option, + #[arg(long)] + verified: bool, + }, + Recall { + #[arg(long, default_value = ".hikmah/memory.jsonl")] + store: PathBuf, + #[arg(long)] + query: String, + #[arg(long = "tag")] + tags: Vec, + #[arg(long, default_value_t = 8)] + limit: usize, + }, + Commitments { + #[arg(long, default_value = ".hikmah/memory.jsonl")] + store: PathBuf, + #[arg(long, default_value_t = 168)] + within_hours: u64, + }, + Consolidate { + #[arg(long, default_value = ".hikmah/memory.jsonl")] + store: PathBuf, + }, + VerifyLedger { + #[arg(long, default_value = ".hikmah/memory.jsonl")] + store: PathBuf, + }, + Plan { + #[arg(long)] + problem: PathBuf, + }, + Decide { + #[arg(long)] + frame: PathBuf, + }, + Deliberate { + #[arg(long, default_value_t = 0)] + unverified_claims: usize, + #[arg(long, default_value_t = 0)] + memory_conflicts: usize, + #[arg(long, default_value_t = 0)] + irreversible_actions: usize, + #[arg(long, default_value_t = 0)] + human_impact_questions: usize, + #[arg(long, default_value_t = 0)] + missing_acceptance_criteria: usize, + }, + Hook, + Validate { + #[arg(long, default_value = ".")] + root: PathBuf, + }, +} + +fn main() { + if let Err(error) = run() { + eprintln!("hikmah: {error}"); + std::process::exit(1); + } +} + +fn run() -> Result<()> { + let cli = Cli::parse(); + match cli.command { + Command::Init { store } => { + let memory = MemoryStore::open(&store, KernelPolicy::default())?; + println!( + "{}", + serde_json::json!({"store": store, "records": memory.record_count()}) + ); + } + Command::Remember { + store, + kind, + content, + source, + tags, + salience, + confidence, + privacy, + claim_key, + claim_value, + supersedes, + verified, + } => { + let mut memory = MemoryStore::open(store, KernelPolicy::default())?; + let mut trace = Trace::new(TraceKind::from_str(&kind)?, content, source); + trace.tags = tags; + trace.salience = salience; + trace.confidence = confidence; + trace.privacy = PrivacyClass::from_str(&privacy)?; + trace.claim_key = claim_key; + trace.claim_value = claim_value; + trace.supersedes = supersedes; + trace.provenance.verified = verified; + let (trace, conflicts) = memory.remember(trace)?; + println!( + "{}", + serde_json::to_string_pretty(&serde_json::json!({ + "trace": trace, + "conflicts": conflicts + }))? + ); + } + Command::Recall { + store, + query, + tags, + limit, + } => { + let memory = MemoryStore::open(store, KernelPolicy::default())?; + let mut recall = RecallQuery::new(query); + recall.tags = tags; + recall.limit = limit; + println!("{}", serde_json::to_string_pretty(&memory.recall(&recall))?); + } + Command::Commitments { + store, + within_hours, + } => { + let memory = MemoryStore::open(store, KernelPolicy::default())?; + let now = hikmah_kernel::trace::now_ms(); + let within_ms = within_hours.saturating_mul(3_600_000); + println!( + "{}", + serde_json::to_string_pretty(&memory.commitments_due(now, within_ms))? + ); + } + Command::Consolidate { store } => { + let memory = MemoryStore::open(store, KernelPolicy::default())?; + println!( + "{}", + serde_json::to_string_pretty(&memory.consolidation_proposals())? + ); + } + Command::VerifyLedger { store } => { + let memory = MemoryStore::open(store, KernelPolicy::default())?; + memory.verify()?; + println!( + "{}", + serde_json::json!({"ok": true, "records": memory.record_count()}) + ); + } + Command::Plan { problem } => { + let text = fs::read_to_string(problem)?; + let problem: PlanProblem = serde_json::from_str(&text)?; + println!("{}", serde_json::to_string_pretty(&plan(&problem)?)?); + } + Command::Decide { frame } => { + let text = fs::read_to_string(frame)?; + let frame: DecisionFrame = serde_json::from_str(&text)?; + println!("{}", serde_json::to_string_pretty(&evaluate(&frame)?)?); + } + Command::Deliberate { + unverified_claims, + memory_conflicts, + irreversible_actions, + human_impact_questions, + missing_acceptance_criteria, + } => { + let result = deliberate(&DeliberationInput { + unverified_consequential_claims: unverified_claims, + memory_conflicts, + irreversible_actions, + unresolved_human_impact_questions: human_impact_questions, + missing_acceptance_criteria, + }); + println!("{}", serde_json::to_string_pretty(&result)?); + } + Command::Hook => run_stop_hook(io::stdin().lock(), io::stdout().lock())?, + Command::Validate { root } => { + let notes = validate_repo(root)?; + println!( + "{}", + serde_json::to_string_pretty(&serde_json::json!({"ok": true, "checks": notes}))? + ); + } + } + Ok(()) +} diff --git a/runtime/hikmah-kernel/src/model_port.rs b/runtime/hikmah-kernel/src/model_port.rs new file mode 100644 index 0000000..d594010 --- /dev/null +++ b/runtime/hikmah-kernel/src/model_port.rs @@ -0,0 +1,37 @@ +use crate::error::Result; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ProposalRequest { + pub goal: String, + pub context: Vec, + pub constraints: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Proposal { + pub text: String, + pub assumptions: Vec, + pub confidence: f32, +} + +/// Optional proposal engines sit outside the trusted kernel. +/// They may be transformers, state-space models, symbolic systems, remote APIs, +/// or future architectures. Their output is always treated as a proposal. +pub trait ProposalEngine { + fn name(&self) -> &str; + fn propose(&self, request: &ProposalRequest) -> Result>; +} + +#[derive(Debug, Default)] +pub struct NoModel; + +impl ProposalEngine for NoModel { + fn name(&self) -> &str { + "no-model" + } + + fn propose(&self, _request: &ProposalRequest) -> Result> { + Ok(Vec::new()) + } +} diff --git a/runtime/hikmah-kernel/src/planner.rs b/runtime/hikmah-kernel/src/planner.rs new file mode 100644 index 0000000..9e4a514 --- /dev/null +++ b/runtime/hikmah-kernel/src/planner.rs @@ -0,0 +1,102 @@ +use crate::error::{KernelError, Result}; +use serde::{Deserialize, Serialize}; +use std::collections::{BTreeSet, HashSet, VecDeque}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PlanProblem { + pub initial: Vec, + pub goal: Vec, + pub actions: Vec, + #[serde(default = "default_max_depth")] + pub max_depth: usize, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Action { + pub name: String, + #[serde(default)] + pub requires: Vec, + #[serde(default)] + pub adds: Vec, + #[serde(default)] + pub removes: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PlanResult { + pub found: bool, + pub actions: Vec, + pub final_state: Vec, + pub explored_states: usize, +} + +pub fn plan(problem: &PlanProblem) -> Result { + if problem.goal.is_empty() { + return Err(KernelError::Invalid("planning goal cannot be empty".into())); + } + let initial: BTreeSet = problem.initial.iter().cloned().collect(); + let goal: BTreeSet = problem.goal.iter().cloned().collect(); + if goal.is_subset(&initial) { + return Ok(PlanResult { + found: true, + actions: Vec::new(), + final_state: initial.into_iter().collect(), + explored_states: 1, + }); + } + + let mut queue = VecDeque::new(); + queue.push_back((initial.clone(), Vec::::new())); + let mut seen = HashSet::new(); + seen.insert(state_key(&initial)); + let mut explored = 0_usize; + + while let Some((state, path)) = queue.pop_front() { + explored += 1; + if path.len() >= problem.max_depth { + continue; + } + for action in &problem.actions { + let requires: BTreeSet = action.requires.iter().cloned().collect(); + if !requires.is_subset(&state) { + continue; + } + let mut next = state.clone(); + for fact in &action.removes { + next.remove(fact); + } + for fact in &action.adds { + next.insert(fact.clone()); + } + let mut next_path = path.clone(); + next_path.push(action.name.clone()); + if goal.is_subset(&next) { + return Ok(PlanResult { + found: true, + actions: next_path, + final_state: next.into_iter().collect(), + explored_states: explored, + }); + } + let key = state_key(&next); + if seen.insert(key) { + queue.push_back((next, next_path)); + } + } + } + + Ok(PlanResult { + found: false, + actions: Vec::new(), + final_state: initial.into_iter().collect(), + explored_states: explored, + }) +} + +fn state_key(state: &BTreeSet) -> String { + state.iter().cloned().collect::>().join("\u{1f}") +} + +fn default_max_depth() -> usize { + 12 +} diff --git a/runtime/hikmah-kernel/src/policy.rs b/runtime/hikmah-kernel/src/policy.rs new file mode 100644 index 0000000..4218e77 --- /dev/null +++ b/runtime/hikmah-kernel/src/policy.rs @@ -0,0 +1,24 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct KernelPolicy { + pub working_set_limit: usize, + pub recall_limit: usize, + pub minimum_recall_score: f32, + pub allow_sensitive_persistence: bool, + pub consolidation_min_support: usize, + pub consolidation_min_independent_sources: usize, +} + +impl Default for KernelPolicy { + fn default() -> Self { + Self { + working_set_limit: 12, + recall_limit: 8, + minimum_recall_score: 0.12, + allow_sensitive_persistence: false, + consolidation_min_support: 2, + consolidation_min_independent_sources: 2, + } + } +} diff --git a/runtime/hikmah-kernel/src/prospective.rs b/runtime/hikmah-kernel/src/prospective.rs new file mode 100644 index 0000000..c59c3c2 --- /dev/null +++ b/runtime/hikmah-kernel/src/prospective.rs @@ -0,0 +1,33 @@ +use crate::ledger::MemoryStore; +use crate::trace::{Trace, TraceKind}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct CommitmentDue { + pub trace: Trace, + pub overdue: bool, + pub due_in_ms: i128, +} + +impl MemoryStore { + pub fn commitments_due(&self, now_ms: u64, within_ms: u64) -> Vec { + let horizon = now_ms.saturating_add(within_ms); + let mut due = self + .active_traces() + .filter(|trace| trace.kind == TraceKind::Commitment) + .filter_map(|trace| { + let deadline = trace.deadline_ms?; + if deadline > horizon { + return None; + } + Some(CommitmentDue { + trace: trace.clone(), + overdue: deadline <= now_ms, + due_in_ms: deadline as i128 - now_ms as i128, + }) + }) + .collect::>(); + due.sort_by_key(|item| item.trace.deadline_ms.unwrap_or(u64::MAX)); + due + } +} diff --git a/runtime/hikmah-kernel/src/recall.rs b/runtime/hikmah-kernel/src/recall.rs new file mode 100644 index 0000000..8e06d41 --- /dev/null +++ b/runtime/hikmah-kernel/src/recall.rs @@ -0,0 +1,183 @@ +use crate::ledger::MemoryStore; +use crate::trace::{now_ms, Trace, TraceKind}; +use serde::{Deserialize, Serialize}; +use std::collections::BTreeSet; + +#[derive(Debug, Clone)] +pub struct RecallQuery { + pub text: String, + pub tags: Vec, + pub kinds: Vec, + pub limit: usize, + pub now_ms: u64, +} + +impl RecallQuery { + pub fn new(text: impl Into) -> Self { + Self { + text: text.into(), + tags: Vec::new(), + kinds: Vec::new(), + limit: 8, + now_ms: now_ms(), + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RecallChannels { + pub lexical: f32, + pub tag: f32, + pub recency: f32, + pub salience: f32, + pub confidence: f32, + pub provenance: f32, + pub prospective: f32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RecallResult { + pub trace: Trace, + pub score: f32, + pub channels: RecallChannels, +} + +impl MemoryStore { + pub fn recall(&self, query: &RecallQuery) -> Vec { + let query_terms = tokenize(&query.text); + let query_tags: BTreeSet = query + .tags + .iter() + .map(|t| t.trim().to_ascii_lowercase()) + .filter(|t| !t.is_empty()) + .collect(); + let limit = query.limit.min(self.policy().recall_limit).max(1); + let mut candidates: Vec = self + .active_traces() + .filter(|trace| query.kinds.is_empty() || query.kinds.contains(&trace.kind)) + .map(|trace| score_trace(trace, &query_terms, &query_tags, query.now_ms)) + .filter(|result| result.score >= self.policy().minimum_recall_score) + .collect(); + + candidates.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + .then_with(|| b.trace.created_at_ms.cmp(&a.trace.created_at_ms)) + }); + + diversify(candidates, limit) + } +} + +fn score_trace( + trace: &Trace, + query_terms: &BTreeSet, + query_tags: &BTreeSet, + now_ms: u64, +) -> RecallResult { + let trace_terms = tokenize(&trace.content); + let lexical = jaccard(query_terms, &trace_terms); + let trace_tags: BTreeSet = trace + .tags + .iter() + .map(|t| t.trim().to_ascii_lowercase()) + .filter(|t| !t.is_empty()) + .collect(); + let tag = jaccard(query_tags, &trace_tags); + let age_days = now_ms.saturating_sub(trace.created_at_ms) as f64 / 86_400_000.0; + let recency = (1.0 / (1.0 + age_days / 30.0)) as f32; + let provenance = (trace.provenance.authority + * if trace.provenance.verified { 1.0 } else { 0.65 }) + .clamp(0.0, 1.0); + let prospective = match (trace.kind, trace.deadline_ms) { + (TraceKind::Commitment, Some(deadline)) if deadline <= now_ms => 1.0, + (TraceKind::Commitment, Some(deadline)) => { + let days = deadline.saturating_sub(now_ms) as f64 / 86_400_000.0; + (1.0 / (1.0 + days / 7.0)) as f32 + } + (TraceKind::Commitment, None) => 0.35, + _ => 0.0, + }; + + let channels = RecallChannels { + lexical, + tag, + recency, + salience: trace.salience, + confidence: trace.confidence, + provenance, + prospective, + }; + let score = (0.42 * lexical + + 0.10 * tag + + 0.10 * recency + + 0.11 * trace.salience + + 0.10 * trace.confidence + + 0.10 * provenance + + 0.07 * prospective) + .clamp(0.0, 1.0); + + RecallResult { + trace: trace.clone(), + score, + channels, + } +} + +fn diversify(candidates: Vec, limit: usize) -> Vec { + let mut selected: Vec = Vec::new(); + for mut candidate in candidates { + let candidate_terms = tokenize(&candidate.trace.content); + let redundancy = selected + .iter() + .map(|existing| jaccard(&candidate_terms, &tokenize(&existing.trace.content))) + .fold(0.0_f32, f32::max); + candidate.score *= 1.0 - 0.35 * redundancy; + if candidate.score > 0.0 { + selected.push(candidate); + selected.sort_by(|a, b| { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + }); + if selected.len() > limit { + selected.pop(); + } + } + } + selected +} + +fn tokenize(text: &str) -> BTreeSet { + text.to_lowercase() + .split(|c: char| !c.is_alphanumeric() && c != '_') + .filter(|token| token.len() > 1) + .map(ToOwned::to_owned) + .collect() +} + +fn jaccard(a: &BTreeSet, b: &BTreeSet) -> f32 { + if a.is_empty() || b.is_empty() { + return 0.0; + } + let intersection = a.intersection(b).count() as f32; + let union = a.union(b).count() as f32; + if union == 0.0 { + 0.0 + } else { + intersection / union + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn jaccard_is_symmetric() { + let a = tokenize("alpha beta gamma"); + let b = tokenize("beta gamma delta"); + assert_eq!(jaccard(&a, &b), jaccard(&b, &a)); + } +} diff --git a/runtime/hikmah-kernel/src/trace.rs b/runtime/hikmah-kernel/src/trace.rs new file mode 100644 index 0000000..1b15ac4 --- /dev/null +++ b/runtime/hikmah-kernel/src/trace.rs @@ -0,0 +1,181 @@ +use serde::{Deserialize, Serialize}; +use std::fmt::{Display, Formatter}; +use std::str::FromStr; +use std::time::{SystemTime, UNIX_EPOCH}; + +use crate::error::{KernelError, Result}; + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "snake_case")] +pub enum TraceKind { + Observation, + Episode, + Belief, + Procedure, + Commitment, + Preference, + Constraint, + Outcome, + Correction, +} + +impl Display for TraceKind { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + let value = match self { + Self::Observation => "observation", + Self::Episode => "episode", + Self::Belief => "belief", + Self::Procedure => "procedure", + Self::Commitment => "commitment", + Self::Preference => "preference", + Self::Constraint => "constraint", + Self::Outcome => "outcome", + Self::Correction => "correction", + }; + f.write_str(value) + } +} + +impl FromStr for TraceKind { + type Err = KernelError; + + fn from_str(value: &str) -> Result { + match value.trim().to_ascii_lowercase().as_str() { + "observation" => Ok(Self::Observation), + "episode" => Ok(Self::Episode), + "belief" => Ok(Self::Belief), + "procedure" => Ok(Self::Procedure), + "commitment" => Ok(Self::Commitment), + "preference" => Ok(Self::Preference), + "constraint" => Ok(Self::Constraint), + "outcome" => Ok(Self::Outcome), + "correction" => Ok(Self::Correction), + other => Err(KernelError::Invalid(format!("unknown trace kind: {other}"))), + } + } +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)] +#[serde(rename_all = "snake_case")] +pub enum PrivacyClass { + Public, + #[default] + Private, + Sensitive, +} + +impl FromStr for PrivacyClass { + type Err = KernelError; + + fn from_str(value: &str) -> Result { + match value.trim().to_ascii_lowercase().as_str() { + "public" => Ok(Self::Public), + "private" => Ok(Self::Private), + "sensitive" => Ok(Self::Sensitive), + other => Err(KernelError::Invalid(format!( + "unknown privacy class: {other}" + ))), + } + } +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum TraceStatus { + Active, + Superseded, + Fulfilled, + Purged, +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct Provenance { + pub source: String, + pub locator: Option, + pub observed_at_ms: u64, + pub authority: f32, + pub verified: bool, +} + +impl Provenance { + pub fn new(source: impl Into) -> Self { + Self { + source: source.into(), + locator: None, + observed_at_ms: now_ms(), + authority: 0.5, + verified: false, + } + } +} + +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +pub struct Trace { + pub id: String, + pub kind: TraceKind, + pub content: String, + pub tags: Vec, + pub created_at_ms: u64, + pub deadline_ms: Option, + pub salience: f32, + pub confidence: f32, + pub privacy: PrivacyClass, + pub provenance: Provenance, + pub claim_key: Option, + pub claim_value: Option, + pub supersedes: Option, +} + +impl Trace { + pub fn new(kind: TraceKind, content: impl Into, source: impl Into) -> Self { + Self { + id: String::new(), + kind, + content: content.into(), + tags: Vec::new(), + created_at_ms: now_ms(), + deadline_ms: None, + salience: 0.5, + confidence: 0.5, + privacy: PrivacyClass::Private, + provenance: Provenance::new(source), + claim_key: None, + claim_value: None, + supersedes: None, + } + } + + pub fn validate(&self) -> Result<()> { + if self.content.trim().is_empty() { + return Err(KernelError::Invalid("trace content cannot be empty".into())); + } + if !(0.0..=1.0).contains(&self.salience) { + return Err(KernelError::Invalid( + "salience must be between 0 and 1".into(), + )); + } + if !(0.0..=1.0).contains(&self.confidence) { + return Err(KernelError::Invalid( + "confidence must be between 0 and 1".into(), + )); + } + if !(0.0..=1.0).contains(&self.provenance.authority) { + return Err(KernelError::Invalid( + "provenance authority must be between 0 and 1".into(), + )); + } + if self.claim_key.is_some() != self.claim_value.is_some() { + return Err(KernelError::Invalid( + "claim_key and claim_value must be supplied together".into(), + )); + } + Ok(()) + } +} + +pub fn now_ms() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_millis() as u64 +} diff --git a/runtime/hikmah-kernel/src/validate.rs b/runtime/hikmah-kernel/src/validate.rs new file mode 100644 index 0000000..03a3946 --- /dev/null +++ b/runtime/hikmah-kernel/src/validate.rs @@ -0,0 +1,114 @@ +use crate::error::{KernelError, Result}; +use serde_json::Value; +use std::collections::BTreeSet; +use std::fs; +use std::path::{Path, PathBuf}; + +pub fn validate_repo(root: impl AsRef) -> Result> { + let root = root.as_ref(); + let required = [ + ".codex-plugin/plugin.json", + ".claude-plugin/plugin.json", + "skills/operator-core/SKILL.md", + "skills/agent-radar/SKILL.md", + "skills/decision-forge/SKILL.md", + "skills/ship-guard/SKILL.md", + "skills/hikmah-orchestrator/SKILL.md", + "skills/cognitive-kernel/SKILL.md", + "docs/COGNITIVE_KERNEL.md", + "docs/MEMORY.md", + "runtime/hikmah-kernel/Cargo.toml", + ]; + let mut notes = Vec::new(); + for path in required { + let full = root.join(path); + if !full.is_file() { + return Err(KernelError::Invalid(format!( + "missing required file: {path}" + ))); + } + } + + for path in [ + ".codex-plugin/plugin.json", + ".claude-plugin/plugin.json", + ".agents/plugins/marketplace.json", + ".claude-plugin/marketplace.json", + "hooks/codex.json", + "hooks/hooks.json", + ] { + let text = fs::read_to_string(root.join(path))?; + let _: Value = serde_json::from_str(&text)?; + notes.push(format!("json ok: {path}")); + } + + let skills_dir = root.join("skills"); + let mut names = BTreeSet::new(); + for entry in fs::read_dir(&skills_dir)? { + let entry = entry?; + if !entry.file_type()?.is_dir() { + continue; + } + let skill_path = entry.path().join("SKILL.md"); + if !skill_path.is_file() { + return Err(KernelError::Invalid(format!( + "skill directory missing SKILL.md: {}", + entry.path().display() + ))); + } + let text = fs::read_to_string(&skill_path)?; + let name = parse_frontmatter_field(&text, "name").ok_or_else(|| { + KernelError::Invalid(format!("skill missing name: {}", skill_path.display())) + })?; + if !names.insert(name.clone()) { + return Err(KernelError::Invalid(format!( + "duplicate skill name: {name}" + ))); + } + if !text.contains("description:") { + return Err(KernelError::Invalid(format!( + "skill missing description: {}", + skill_path.display() + ))); + } + } + notes.push(format!("{} unique skills", names.len())); + + let version = plugin_version(root.join(".codex-plugin/plugin.json"))?; + let path = ".claude-plugin/plugin.json"; + let other = plugin_version(root.join(path))?; + if other != version { + return Err(KernelError::Invalid(format!( + "manifest version mismatch: {path} has {other}, expected {version}" + ))); + } + notes.push(format!("manifest version {version}")); + Ok(notes) +} + +fn plugin_version(path: PathBuf) -> Result { + let text = fs::read_to_string(path)?; + let value: Value = serde_json::from_str(&text)?; + value + .get("version") + .and_then(Value::as_str) + .map(ToOwned::to_owned) + .ok_or_else(|| KernelError::Invalid("plugin manifest missing version".into())) +} + +fn parse_frontmatter_field(text: &str, key: &str) -> Option { + let mut lines = text.lines(); + if lines.next()?.trim() != "---" { + return None; + } + for line in lines { + let trimmed = line.trim(); + if trimmed == "---" { + break; + } + if let Some(value) = trimmed.strip_prefix(&format!("{key}:")) { + return Some(value.trim().trim_matches('"').to_string()); + } + } + None +} diff --git a/runtime/hikmah-kernel/tests/planner.rs b/runtime/hikmah-kernel/tests/planner.rs new file mode 100644 index 0000000..9633fec --- /dev/null +++ b/runtime/hikmah-kernel/tests/planner.rs @@ -0,0 +1,36 @@ +use hikmah_kernel::planner::{plan, Action, PlanProblem}; + +#[test] +fn branch_loom_finds_short_symbolic_plan() { + let problem = PlanProblem { + initial: vec!["code_ready".into()], + goal: vec!["production_verified".into()], + actions: vec![ + Action { + name: "run_tests".into(), + requires: vec!["code_ready".into()], + adds: vec!["tests_passed".into()], + removes: vec![], + }, + Action { + name: "deploy_canary".into(), + requires: vec!["tests_passed".into()], + adds: vec!["canary_live".into()], + removes: vec![], + }, + Action { + name: "verify_canary".into(), + requires: vec!["canary_live".into()], + adds: vec!["production_verified".into()], + removes: vec![], + }, + ], + max_depth: 6, + }; + let result = plan(&problem).unwrap(); + assert!(result.found); + assert_eq!( + result.actions, + vec!["run_tests", "deploy_canary", "verify_canary"] + ); +} diff --git a/runtime/hikmah-kernel/tests/traceweave.rs b/runtime/hikmah-kernel/tests/traceweave.rs new file mode 100644 index 0000000..c097a45 --- /dev/null +++ b/runtime/hikmah-kernel/tests/traceweave.rs @@ -0,0 +1,56 @@ +use hikmah_kernel::policy::KernelPolicy; +use hikmah_kernel::recall::RecallQuery; +use hikmah_kernel::trace::{Trace, TraceKind}; +use hikmah_kernel::MemoryStore; +use std::fs; +use std::time::{SystemTime, UNIX_EPOCH}; + +fn temp_store(name: &str) -> std::path::PathBuf { + let nonce = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_nanos(); + std::env::temp_dir().join(format!("hikmah-{name}-{nonce}.jsonl")) +} + +#[test] +fn ledger_reopens_and_recall_finds_relevant_trace() { + let path = temp_store("recall"); + let mut store = MemoryStore::open(&path, KernelPolicy::default()).unwrap(); + let mut trace = Trace::new( + TraceKind::Observation, + "The deployment failed because the migration lock timed out", + "test", + ); + trace.tags = vec!["deployment".into(), "database".into()]; + trace.salience = 0.9; + trace.confidence = 0.9; + trace.provenance.verified = true; + store.remember(trace).unwrap(); + drop(store); + + let reopened = MemoryStore::open(&path, KernelPolicy::default()).unwrap(); + reopened.verify().unwrap(); + let results = reopened.recall(&RecallQuery::new("why did deployment migration fail")); + assert_eq!(results.len(), 1); + assert!(results[0].trace.content.contains("migration lock")); + let _ = fs::remove_file(path); +} + +#[test] +fn contradictory_structured_claims_are_not_silently_overwritten() { + let path = temp_store("conflict"); + let mut store = MemoryStore::open(&path, KernelPolicy::default()).unwrap(); + let mut first = Trace::new(TraceKind::Belief, "Service region is us-east-1", "config-a"); + first.claim_key = Some("service.region".into()); + first.claim_value = Some("us-east-1".into()); + first.provenance.verified = true; + store.remember(first).unwrap(); + + let mut second = Trace::new(TraceKind::Belief, "Service region is eu-west-1", "config-b"); + second.claim_key = Some("service.region".into()); + second.claim_value = Some("eu-west-1".into()); + let (_, conflicts) = store.remember(second).unwrap(); + assert_eq!(conflicts.len(), 1); + let _ = fs::remove_file(path); +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..05e6ca1 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,4 @@ +[toolchain] +channel = "stable" +profile = "minimal" +components = ["rustfmt", "clippy"] diff --git a/scripts/install-kernel.sh b/scripts/install-kernel.sh new file mode 100755 index 0000000..ec5bdb9 --- /dev/null +++ b/scripts/install-kernel.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env sh +set -eu + +if ! command -v cargo >/dev/null 2>&1; then + echo "Rust/Cargo is required to build the source checkout. Install Rust from the official Rust toolchain, then rerun." >&2 + exit 1 +fi + +ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) +cargo install --path "$ROOT/runtime/hikmah-kernel" --locked diff --git a/scripts/validate.py b/scripts/validate.py deleted file mode 100755 index 11b56d8..0000000 --- a/scripts/validate.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python3 -from __future__ import annotations -import json -import re -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[1] -EXPECTED_VERSION = "2.0.0" -EXPECTED_SKILLS = {"operator-core", "agent-radar", "decision-forge", "ship-guard", "hikmah-orchestrator"} - - -def fail(msg: str) -> None: - raise SystemExit(f"ERROR: {msg}") - - -def load_json(rel: str): - path = ROOT / rel - try: - return json.loads(path.read_text(encoding="utf-8")) - except Exception as exc: - fail(f"invalid JSON in {rel}: {exc}") - - -def parse_skill(path: Path): - text = path.read_text(encoding="utf-8") - if not text.startswith("---\n"): - fail(f"missing YAML frontmatter: {path.relative_to(ROOT)}") - end = text.find("\n---", 4) - if end < 0: - fail(f"unterminated frontmatter: {path.relative_to(ROOT)}") - front = text[4:end] - name_m = re.search(r"(?m)^name:\s*([a-z0-9-]+)\s*$", front) - version_m = re.search(r'(?m)^\s*version:\s*["\']?([^"\'\n]+)', front) - if not name_m: - fail(f"skill missing name: {path.relative_to(ROOT)}") - return name_m.group(1), (version_m.group(1).strip() if version_m else None), text - - -def main() -> None: - required = [ - ".codex-plugin/plugin.json", ".claude-plugin/plugin.json", - ".agents/plugins/marketplace.json", ".claude-plugin/marketplace.json", - "hooks/hooks.json", "hooks/codex.json", "hooks/truth_gate.py", - "README.md", "LICENSE", "SECURITY.md", "CONTRIBUTING.md", - "docs/ARCHITECTURE.md", "docs/COMPATIBILITY.md", "docs/ETHICS.md", "docs/EVIDENCE.md", - ] - for rel in required: - if not (ROOT / rel).exists(): - fail(f"missing required file: {rel}") - - codex = load_json(".codex-plugin/plugin.json") - claude = load_json(".claude-plugin/plugin.json") - load_json(".agents/plugins/marketplace.json") - load_json(".claude-plugin/marketplace.json") - codex_hooks = load_json("hooks/codex.json") - claude_hooks = load_json("hooks/hooks.json") - - for label, manifest in (("codex", codex), ("claude", claude)): - if manifest.get("name") != "hikmah-stack": - fail(f"{label} manifest name mismatch") - if manifest.get("version") != EXPECTED_VERSION: - fail(f"{label} manifest version mismatch") - if manifest.get("license") != "MIT": - fail(f"{label} manifest license must be MIT") - if manifest.get("author", {}).get("name") != "Juber Shaikh": - fail(f"{label} manifest author mismatch") - - if codex.get("skills") != "./skills/": - fail("Codex manifest must point to ./skills/") - if codex.get("hooks") != "./hooks/codex.json": - fail("Codex manifest must use the command-hook adapter") - - handler_types = [h.get("type") for group in codex_hooks.get("hooks", {}).values() for entry in group for h in entry.get("hooks", [])] - if not handler_types or any(t != "command" for t in handler_types): - fail("Codex hooks must use command handlers only") - if not claude_hooks.get("hooks", {}).get("Stop"): - fail("Claude Stop quality hook missing") - - found = set() - for skill_md in sorted((ROOT / "skills").glob("*/SKILL.md")): - name, version, text = parse_skill(skill_md) - if name != skill_md.parent.name: - fail(f"skill name/path mismatch: {skill_md.parent.name} vs {name}") - if name in found: - fail(f"duplicate skill name: {name}") - found.add(name) - if version != EXPECTED_VERSION: - fail(f"skill version mismatch in {name}: {version}") - if len(text) < 250: - fail(f"skill appears suspiciously short: {name}") - - if found != EXPECTED_SKILLS: - fail(f"skills mismatch; expected {sorted(EXPECTED_SKILLS)}, got {sorted(found)}") - - forbidden = ["sk_test_", "sk_live_", "BEGIN PRIVATE KEY", "ghp_", "github_pat_"] - for path in ROOT.rglob("*"): - if path.is_file() and ".git" not in path.parts: - try: - text = path.read_text(encoding="utf-8") - except UnicodeDecodeError: - continue - for token in forbidden: - if token in text and path.name not in {"validate.py"}: - fail(f"possible secret marker {token!r} in {path.relative_to(ROOT)}") - - print(f"OK: Hikmah Stack {EXPECTED_VERSION}; {len(found)} skills; manifests/hooks/docs validated") - - -if __name__ == "__main__": - main() diff --git a/skills/agent-radar/SKILL.md b/skills/agent-radar/SKILL.md index 9bb86af..75ee844 100644 --- a/skills/agent-radar/SKILL.md +++ b/skills/agent-radar/SKILL.md @@ -3,7 +3,7 @@ name: agent-radar description: > Use to diagnose AI-agent failure modes such as hallucination, looping, sycophancy, context loss, over-building, brittle automation, slop, hidden uncertainty, black-box behavior, cost leakage, or misplaced trust. Convert diagnosis into concrete controls and tests. metadata: - version: "2.0.0" + version: "3.0.0" source: "Hikmah Stack Agent Radar" --- @@ -176,3 +176,19 @@ Relationship Failures: Discount flattery → Filter foam → Audit the box → P The Human's Answer: Kindle, don't grow → Strive for yourself → Assign meaning → Keep learning → Verify, specify, write, ship, log For detailed chapter content, field practices, and anchors, see the `references/` directory. + + +## Memory Failure Radar + +Treat persistent memory as a new attack/failure surface: + +- **Context amnesia:** relevant commitments/constraints exist but are not recalled. +- **False memory:** model-generated inference is stored as observed fact. +- **Stale activation:** superseded information keeps outranking current evidence. +- **Memory poisoning:** untrusted input becomes durable belief or procedure. +- **Scope bleed:** one user/project/environment's memory is applied to another. +- **Reconsolidation drift:** repeated summaries slowly change the original claim while provenance disappears. +- **Outcome blindness:** a failed plan is remembered as a reusable method because the result was never written back. +- **Privacy retention:** sensitive material persists because cognitive convenience outranked deletion policy. + +When one appears, use the Memory Integrity lens and TraceWeave playbook before adding more context or a larger model. diff --git a/skills/cognitive-kernel/SKILL.md b/skills/cognitive-kernel/SKILL.md new file mode 100644 index 0000000..ee78de5 --- /dev/null +++ b/skills/cognitive-kernel/SKILL.md @@ -0,0 +1,91 @@ +--- +name: cognitive-kernel +description: > + Use when designing or operating persistent AI memory, local co-models, cognitive runtimes, + agent learning, parallel deliberation, model-independent state, provenance, contradiction + handling, or human-inspired memory systems. Prefer first-principles cognitive invariants over + defaulting to vector databases, knowledge graphs, transformers, or fashionable agent patterns. +metadata: + version: "3.0.0" + source: "Hikmah Cognitive Kernel" +--- + +# Cognitive Kernel — Persistent, Inspectable Intelligence + +Use this skill when the system needs to remain coherent across turns, sessions, model swaps, or failures. + +## Prime directive + +**Do not ask a generative model to be the sole owner of memory, truth, policy, and self-evaluation.** Put durable cognitive responsibilities into inspectable mechanisms. + +## Cognitive invariants + +1. Every durable memory has identity and provenance. +2. Confidence and source authority are separate fields. +3. Corrections supersede; they do not erase history. +4. Contradictions remain visible until resolved. +5. Recall is contextual and bounded. +6. Commitments are prospective memories, not prose reminders. +7. Outcomes write back after action. +8. Sensitive memory obeys storage/retention policy before convenience. +9. Models propose; deterministic gates authorize durable state transitions. +10. Higher stakes activate independent evidence, risk, human-impact, memory, and delivery checks. + +## TraceWeave memory cycle + +### Encode +Classify the incoming item as observation, episode, belief, procedure, commitment, preference, constraint, outcome, or correction. Preserve source, time, confidence, and scope. + +### Recall +Activate relevant traces by multiple cues. Do not rely on one embedding similarity score. Include correction/conflict/prospective urgency signals and suppress redundant results. + +### Deliberate +Run relevant challenge lanes independently. Do not let the same generator both invent evidence and certify it. + +### Decide +Use explicit criteria, hard constraints, reversibility, evidence coverage, and human accountability. + +### Verify +Compare claimed outcome with observable outcome. Missing verification is not success. + +### Consolidate +Replay episodes, outcomes, and corrections. Promote a durable belief/procedure only when repeated evidence justifies it. Consolidation is a proposal until accepted. + +## Architecture selection rule + +Do not begin with “graph/vector DB/RAG/transformer/RNN.” Begin with the invariant and then choose a mechanism: + +- exact identity -> keyed trace; +- audit history -> append/hash-chained ledger; +- contextual association -> dynamic resonance; +- contradiction -> structured claim comparison; +- deadline -> prospective queue; +- bounded attention -> focus capsule; +- independent challenge -> parallel lanes; +- language generation -> optional proposal engine; +- explicit relations -> graph view only when relations are the actual problem; +- fuzzy semantic search -> optional embedding channel only when deterministic cues are insufficient. + +## No-perfect-engine rule + +Never claim general perfection. For each module define: + +- what is guaranteed by construction; +- what is tested empirically; +- what remains heuristic; +- what requires a human or external authority; +- how a discovered failure becomes a regression case. + +## Use the implementation + +Reference runtime: `runtime/hikmah-kernel/`. + +Playbooks: +- `playbooks/remember-recall-consolidate.md` +- `playbooks/parallel-deliberation.md` +- `playbooks/error-to-learning.md` + +Lenses: +- `lenses/memory-integrity.md` +- `lenses/model-independence.md` +- `lenses/human-memory-inspiration.md` diff --git a/skills/decision-forge/SKILL.md b/skills/decision-forge/SKILL.md index 602796d..7b24c8f 100644 --- a/skills/decision-forge/SKILL.md +++ b/skills/decision-forge/SKILL.md @@ -3,7 +3,7 @@ name: decision-forge description: > Use when comparing options, making a consequential choice, planning strategy, assessing risk, resolving conflict, negotiating, or deciding under uncertainty. Structure evidence, alternatives, reversibility, fairness, commitments, and next actions. metadata: - version: "2.0.0" + version: "3.0.0" source: "Hikmah Stack Decision Forge" --- @@ -104,3 +104,18 @@ After every significant outcome: - The past is data, the future is unwritten — pay taxes to neither - Hold the mission, turn the heading - The lever you control is the only lever that moves the system + + +## Memory-Aware Decision Gate + +Before a consequential decision: + +1. recall active constraints and commitments; +2. retrieve prior outcomes that match the current failure/goal; +3. surface corrections and contradictory claims beside supporting memories; +4. separate precedent from current evidence; +5. mark which option scores are evidence-backed versus estimated; +6. reduce confidence when criteria are missing rather than inventing a value; +7. write the decision and later outcome back as separate traces. + +Use `hikmah decide` for a deterministic weighted comparison when a structured frame is available. diff --git a/skills/hikmah-orchestrator/SKILL.md b/skills/hikmah-orchestrator/SKILL.md index e9f7e84..79bca4a 100644 --- a/skills/hikmah-orchestrator/SKILL.md +++ b/skills/hikmah-orchestrator/SKILL.md @@ -5,7 +5,7 @@ description: > decision structure, and execution quality. Route deliberately across Operator Core, Agent Radar, Decision Forge, and Ship Guard, then synthesize one coherent action plan. metadata: - version: "2.0.0" + version: "3.0.0" --- # Hikmah Orchestrator — Cross-Skill Synthesis @@ -18,16 +18,18 @@ Use this skill when one lens is not enough. Do not stack frameworks for decorati - **Agent Radar**: AI failure modes, trust calibration, hallucination, loops, context loss, sycophancy, slop, opacity, cost. - **Decision Forge**: options, evidence, risk, reversibility, consultation, justice, commitments, action. - **Ship Guard**: specifications, acceptance criteria, verification, logging, rollback, handoffs, completion claims. +- **Cognitive Kernel**: persistent memory, model-independent state, contradiction handling, local co-model runtime, learning loops. ## Orchestration loop 1. **Name the decision or outcome.** State what must change, not just what is interesting. 2. **Classify the problem.** Clear, complicated, complex, or chaotic. -3. **Select the minimum useful skills.** Usually two are enough; use all four only when the situation truly spans them. +3. **Select the minimum useful skills.** Usually two are enough. Add Cognitive Kernel when state must persist across turns/sessions/models or when the system must learn from outcomes. 4. **Separate evidence from inference.** Mark what was checked, what is inferred, and what remains unknown. 5. **Apply consequence-sensitive rigor.** Higher stakes require stronger verification and qualified human input. -6. **Synthesize once.** Resolve contradictions between frameworks instead of presenting four parallel essays. -7. **End in executable moves.** Give owners, next actions, stop conditions, or acceptance criteria when the context supports them. +6. **Run independent challenge lanes when consequences justify it.** Evidence, memory, risk, human impact, and delivery should report before synthesis. +7. **Synthesize once.** Resolve contradictions between frameworks instead of presenting parallel essays. +8. **End in executable moves.** Give owners, next actions, stop conditions, or acceptance criteria when the context supports them. ## Non-negotiables diff --git a/skills/operator-core/SKILL.md b/skills/operator-core/SKILL.md index b03b747..2210299 100644 --- a/skills/operator-core/SKILL.md +++ b/skills/operator-core/SKILL.md @@ -3,7 +3,7 @@ name: operator-core description: > Use for judgment, leadership, discipline, communication, pressure, recovery, ethics, stewardship, personal effectiveness, or broad life/work operating principles. Apply durable principles without pretending they replace current domain evidence or professional advice. metadata: - version: "2.0.0" + version: "3.0.0" source: "Hikmah Stack Operator Core" --- @@ -149,3 +149,18 @@ People: Lead soft. Consult. Commit. Repel harm with better. Say it straight. Core: Trust after diligence. Read first. Hold the balance. Focus. Steward the legacy. For detailed chapter content, field practices, and anchors, see the `references/` directory. + + +## Cognitive Memory Protocol + +Human judgment is not only what you think now; it is what you remember, forget, correct, and carry forward. + +- **Encode distinctions:** observation is not belief; belief is not preference; preference is not commitment. +- **Preserve provenance:** confidence without source memory is counterfeit certainty. +- **Recall by purpose:** ask what memory changes the present decision, not what memory is easiest to retrieve. +- **Keep corrections alive:** when later evidence changes a belief, preserve the correction path so the old error is not rediscovered as insight. +- **Use prospective memory:** commitments need owner, trigger/deadline, and completion evidence. +- **Replay outcomes:** reflect on what actually happened after action; plans without outcome memory teach the wrong lesson. +- **Forget access, not accountability:** reduce attention to stale noise while keeping consequential history auditable under the retention policy. + +See `skills/cognitive-kernel/SKILL.md` and `docs/MEMORY.md`. diff --git a/skills/ship-guard/SKILL.md b/skills/ship-guard/SKILL.md index 4effd21..039a372 100644 --- a/skills/ship-guard/SKILL.md +++ b/skills/ship-guard/SKILL.md @@ -3,7 +3,7 @@ name: ship-guard description: > Use when building with AI agents, reviewing an implementation plan, defining acceptance criteria, preventing false completion claims, improving delivery discipline, reducing rework, or designing verification, logging, rollback, and handoff practices. metadata: - version: "2.0.0" + version: "3.0.0" source: "Hikmah Stack Ship Guard" --- @@ -121,3 +121,15 @@ When the squeeze comes: - Stability is a schedule, not a mood - The plan that cannot say "if" meets the night that says "no" - Twelve rules, one terminal window + + +## Durable Completion Loop + +Shipping is not the end of cognition. Before calling work complete: + +1. verify the requested artifact/result exists; +2. capture the evidence of verification; +3. record unresolved limitations explicitly; +4. write the observed outcome, not merely “done,” into durable memory when memory is enabled; +5. fulfill or supersede the corresponding commitment trace; +6. if failure occurred, route it through `playbooks/error-to-learning.md` so the next agent inherits the correction.