From 4cb19df926ff1094c0372763005359c89e108a09 Mon Sep 17 00:00:00 2001 From: Cain-Ish Date: Fri, 24 Jul 2026 20:16:15 +0200 Subject: [PATCH 1/2] =?UTF-8?q?fix(portability):=200.34.2=20=E2=80=94=20pa?= =?UTF-8?q?renthesize=20the=20jq=20score=20pipeline;=20older-jq=20object-v?= =?UTF-8?q?alue=20grammar=20broke=20Linux=20CI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit test-merge-persona-signals went red on the Linux lane: the score expression was a bare pipeline as an object value ({score: a | b / c}), which newer jq parses but the CI runner's older jq rejects ('unexpected /, expecting }'). The whole value now sits in one enclosing group — the conservative grammar every jq accepts. Repo-wide sweep found no other multiline object-value pipeline sites. Local suite green; the Linux lane is the real verdict on this PR. Pushed-after-Windows-green-only is the exact cross-platform class this repo documents; the release CI failure was caught in post-push review, not before — recorded for the failure chronicle. Co-Authored-By: Claude Fable 5 --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- scripts/merge-persona-signals.sh | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 632dfa3..30081e8 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "second-brain", "source": "./", "description": "Self-evolving AI second brain. Auto-learns from sessions, discovers tools, maintains a local knowledge base, and self-critiques code quality.", - "version": "0.34.1" + "version": "0.34.2" }, { "name": "cost-router", diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index d2277de..4a9d2db 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "second-brain", "description": "Self-evolving AI second brain. Automatically learns from sessions, discovers tools, maintains a local knowledge base, and self-critiques code quality — getting smarter with every interaction.", - "version": "0.34.1", + "version": "0.34.2", "author": { "name": "second-brain" }, diff --git a/scripts/merge-persona-signals.sh b/scripts/merge-persona-signals.sh index 015b451..70230e8 100755 --- a/scripts/merge-persona-signals.sh +++ b/scripts/merge-persona-signals.sh @@ -116,14 +116,17 @@ MERGED=$(echo "$MERGED" | jq -c \ # duplicate USER.md pin. SCORED=$(echo "$MERGED" | jq -c ' map(. + {score: - ((if .count >= 11 then 0.85 + # The WHOLE value expression is parenthesized: an object value that is a bare + # pipeline (`{k: a | b / c}`) parses on newer jq but is a SYNTAX ERROR on the + # older jq CI ships — the object-value grammar there needs one enclosing group. + (((if .count >= 11 then 0.85 elif .count >= 6 then 0.7 elif .count >= 3 then 0.5 else 0.3 end) - 0.02 * ((((now - ((((.last_seen // "") + "T00:00:00Z") | fromdateiso8601?) // now)) / 604800) | floor) | if . < 0 then 0 else . end)) | (if . < 0.1 then 0.1 else . end) - | (. * 100 | round) / 100 + | ((. * 100 | round) / 100)) }) | {keep: map(select(.graduated == true or .score >= 0.2)), pruned: map(select(.graduated != true and .score < 0.2) | .signal)} From d386f5c49cefa43b9090c3fc7ea61f9ec3a680d2 Mon Sep 17 00:00:00 2001 From: Cain-Ish Date: Fri, 24 Jul 2026 20:27:35 +0200 Subject: [PATCH 2/2] =?UTF-8?q?chore(security):=20dev-settings=20deny=20li?= =?UTF-8?q?st=20=E2=80=94=20sudo,=20chmod=20777,=20rm=20-rf=20/,=20ssh?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audit-adopted subset: least-agency denies for catastrophic shell shapes in the repo dev environment. Deliberately NOT adopted: a blanket rm -rf deny (scratch cleanup is routine; the persona-tool-guard's PreToolUse rules own risky-bash detection with warn/ask verdicts — a stronger mechanism than settings globs) and redirect-pattern denies (mid-command glob matching is unreliable; the flow-guard scans egress content at PreToolUse instead). The scanner's hooks.json findings were wrong-surface: deny lists do not live in a hooks manifest, and the PreToolUse guard coverage it reported missing is exactly what hooks/hooks.json wires (symlink/persona/wiki-write/flow guards, liveness-probed by tests). Co-Authored-By: Claude Fable 5 --- .claude/settings.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.claude/settings.json b/.claude/settings.json index 3af9a01..93ec661 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -4,5 +4,13 @@ "source": "local", "path": "." } + }, + "permissions": { + "deny": [ + "Bash(sudo *)", + "Bash(chmod 777 *)", + "Bash(rm -rf /*)", + "Bash(ssh *)" + ] } }