chore: git-audit improvements, usage logging, cron updates

This commit is contained in:
James 2026-02-07 16:31:38 -05:00
parent ab80442bef
commit b5cbd61224
14 changed files with 389 additions and 58 deletions

View File

@ -318,6 +318,14 @@ Automated document processing pipeline for scanned paperwork.
- [ ] Set up daily delta-zip → Proton Drive backup for Sophia docs - [ ] Set up daily delta-zip → Proton Drive backup for Sophia docs
- [ ] Azure Files Backup: Run `az login` with Johan for MFA (free account expires ~Feb 27!) - [ ] Azure Files Backup: Run `az login` with Johan for MFA (free account expires ~Feb 27!)
- [ ] inou Mobile: Need content at inou.com/app for WebView, or change AppConfig.webAppUrl - [ ] inou Mobile: Need content at inou.com/app for WebView, or change AppConfig.webAppUrl
- [ ] AdventHealth: Enroll in MFA (Johan action)
## Recent Events (Feb 6-7, 2026)
- **Financial:** $3,073.00 withdrawal from Valley All Access Checking on Feb 6 (ACH Debit).
- **Sophia:** Monica Rodriguez sent updated supplement links (True Bifido, BB536, Lemongrass, Hibiscus, Reishi, Cordyceps, Butyrate, Modified Citrus Pectin) and invited to a Zoom meeting.
- **inou.com:** Jacob Cap inquired about buying the domain; replied "not for sale".
- **Infrastructure:** HOSTKEY expanded capacity and added RTX 5090/6000 PRO cards.
- **Claude Usage:** Hit 100% weekly limit on Feb 7; reset expected ~2pm ET.
## Access URLs ## Access URLs

22
memory/2026-02-07.md Normal file
View File

@ -0,0 +1,22 @@
# Saturday, February 7, 2026
## Events
- **Email Triage:** Processed 2 new messages from `tj@jongsma.me`.
- **Amazon:** Shipped "OM Mushroom Cordyceps Powder" (Order #113-3964151-5665049). Added to dashboard deliveries.
- **PayPal:** Payment of $3,073.00 sent to Tuan Le for "Balance Skyraider v2". Archived.
- **Infrastructure:**
- Found `doc-processor` symlink broken.
- Located working project at `~/dev/docproc/`.
- Set up `docproc` as a user systemd service.
- Fixed Fireworks API model ID in `processor.go` (changed to `accounts/fireworks/models/kimi-k2p5`).
- Added `FIREWORKS_API_KEY` to service environment.
- Rebuilt and started `docproc` service.
- Currently troubleshooting "URL too long" error in `docproc` (likely needs local OCR extraction first).
## Tech News Scan
- **SentinelOne (S):** CEO sold $303k stock; revenues 3x but stock down 70% from IPO.
- **N-able (NABL):** Q4 earnings call set for Feb 19; news of "Agentic AI" push.
- **OpenClaw:** Discord live; viral adoption; security concerns about prompt injection raised.
- **Claude:** Opus 4.6 receiving high praise for significant jump over 4.5.

BIN
memory/claude-usage.db Normal file

Binary file not shown.

View File

@ -1,9 +1,9 @@
{ {
"last_updated": "2026-02-05T03:00:03.898951Z", "last_updated": "2026-02-07T21:19:36.196418Z",
"source": "api", "source": "api",
"session_percent": 6, "session_percent": 10,
"session_resets": "2026-02-05T03:59:59.856689+00:00", "session_resets": "2026-02-08T00:00:00.167212+00:00",
"weekly_percent": 87, "weekly_percent": 2,
"weekly_resets": "2026-02-07T18:59:59.856739+00:00", "weekly_resets": "2026-02-14T19:00:00.167234+00:00",
"sonnet_percent": 0 "sonnet_percent": 2
} }

View File

@ -1,7 +1,7 @@
# Email Triage Instructions # Email Triage Instructions
*Created: 2026-02-01* *Created: 2026-02-01*
*Updated: 2026-02-02 (migrated to Message Center unified API)* *Updated: 2026-02-07 (Added Specific Sender Rules)*
## Message Center (MC) API ## Message Center (MC) API
@ -195,6 +195,17 @@ This keeps the delivery schedule current without cluttering Shopping folder.
- Anything Sophia-related - Anything Sophia-related
- Medical/insurance matters - Medical/insurance matters
## Specific Sender Rules
These override general routing:
- **Kaseya Marketing:** Read fully -> Summarize (rundown) -> Post to Dashboard News -> **Trash**.
- **Lansweeper:** (Johan is ex-CTO) Read fully -> Summarize what's going on -> Post to Dashboard News -> **Trash**.
- **inou Verification Codes:** (noreply@inou.com) -> **Trash** immediately (Johan uses backdoors).
- **Immich:** (GitHub/Releases) Read fully -> **Trigger update on server 192.168.1.253** -> Post to Dashboard News -> **Trash**.
- **Lingerie & Beach Wear (e.g., Pain de Sucre, Fleur du Mal):** Use your judgment. If the email introduces a **new collection, series, or seasonal release**, **Keep in Inbox**. If it is just general sales/marketing/shipping alerts, **Trash**.
- **Domain Purchase Inquiries (e.g., Jacob):** -> Deny (Reply "not for sale") -> **Archive**.
## Mistakes Made ## Mistakes Made
### 2026-02-01 ### 2026-02-01

View File

@ -0,0 +1 @@
1770499645

View File

@ -1,10 +1,12 @@
{ {
"lastBriefing": 1738685392, "lastBriefing": 1738911244,
"lastTechScan": 1738685392, "lastTechScan": 1738926660,
"lastMemoryReview": 1738926660,
"lastChecks": { "lastChecks": {
"briefing": "2026-02-04T11:09:52-05:00", "briefing": "2026-02-04T11:09:52-05:00",
"techScan": "2026-02-04T11:09:52-05:00", "techScan": "2026-02-07T06:11:00-05:00",
"email": "2026-02-04T13:12:00-05:00", "memoryReview": "2026-02-07T06:11:00-05:00",
"email": "2026-02-07T06:11:00-05:00",
"calendar": null, "calendar": null,
"weather": "2026-02-04T11:09:52-05:00" "weather": "2026-02-04T11:09:52-05:00"
} }

View File

@ -0,0 +1,58 @@
{
"date": "2026-02-05",
"timestamp": "2026-02-05T09:00:07-05:00",
"openclaw": {
"before": "2026.2.2-3",
"latest": "2026.2.3-1",
"after": "2026.2.3-1",
"updated": true
},
"claude_code": {
"before": "2.1.31",
"latest": "2.1.31",
"updated": false
},
"os": {
"available": 7,
"packages": [
{
"name": "alsa-ucm-conf",
"from": "1.2.10-1ubuntu5.8",
"to": "1.2.10-1ubuntu5.9"
},
{
"name": "linux-generic",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "linux-headers-generic",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "linux-image-generic",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "python-apt-common",
"from": "2.7.7ubuntu5.1",
"to": "2.7.7ubuntu5.2"
},
{
"name": "python3-apt",
"from": "2.7.7ubuntu5.1",
"to": "2.7.7ubuntu5.2"
},
{
"name": "sosreport",
"from": "4.5.6-0ubuntu4",
"to": "4.9.2-0ubuntu0~24.04.1"
}
],
"updated": true,
"reboot_required": false
},
"gateway_restarted": true
}

View File

@ -0,0 +1,117 @@
{
"date": "2026-02-06",
"timestamp": "2026-02-06T09:00:07-05:00",
"openclaw": {
"before": "2026.2.3-1",
"latest": "2026.2.3-1",
"updated": false
},
"claude_code": {
"before": "2.1.34",
"latest": "2.1.34",
"updated": false
},
"os": {
"available": 19,
"packages": [
{
"name": "alsa-ucm-conf",
"from": "1.2.10-1ubuntu5.8",
"to": "1.2.10-1ubuntu5.9"
},
{
"name": "gir1.2-glib-2.0",
"from": "2.80.0-6ubuntu3.7",
"to": "2.80.0-6ubuntu3.8"
},
{
"name": "libglib2.0-0t64",
"from": "2.80.0-6ubuntu3.7",
"to": "2.80.0-6ubuntu3.8"
},
{
"name": "libglib2.0-bin",
"from": "2.80.0-6ubuntu3.7",
"to": "2.80.0-6ubuntu3.8"
},
{
"name": "libglib2.0-data",
"from": "2.80.0-6ubuntu3.7",
"to": "2.80.0-6ubuntu3.8"
},
{
"name": "libpython3.12-dev",
"from": "3.12.3-1ubuntu0.10",
"to": "3.12.3-1ubuntu0.11"
},
{
"name": "libpython3.12-minimal",
"from": "3.12.3-1ubuntu0.10",
"to": "3.12.3-1ubuntu0.11"
},
{
"name": "libpython3.12-stdlib",
"from": "3.12.3-1ubuntu0.10",
"to": "3.12.3-1ubuntu0.11"
},
{
"name": "libpython3.12t64",
"from": "3.12.3-1ubuntu0.10",
"to": "3.12.3-1ubuntu0.11"
},
{
"name": "linux-generic",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "linux-headers-generic",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "linux-image-generic",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "linux-libc-dev",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "linux-tools-common",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "python3.12-dev",
"from": "3.12.3-1ubuntu0.10",
"to": "3.12.3-1ubuntu0.11"
},
{
"name": "python3.12-minimal",
"from": "3.12.3-1ubuntu0.10",
"to": "3.12.3-1ubuntu0.11"
},
{
"name": "python3.12-venv",
"from": "3.12.3-1ubuntu0.10",
"to": "3.12.3-1ubuntu0.11"
},
{
"name": "python3.12",
"from": "3.12.3-1ubuntu0.10",
"to": "3.12.3-1ubuntu0.11"
},
{
"name": "sosreport",
"from": "4.5.6-0ubuntu4",
"to": "4.9.2-0ubuntu0~24.04.1"
}
],
"updated": true,
"reboot_required": false
},
"gateway_restarted": false
}

View File

@ -0,0 +1,48 @@
{
"date": "2026-02-07",
"timestamp": "2026-02-07T09:00:50-05:00",
"openclaw": {
"before": "2026.2.3-1",
"latest": "2026.2.6-3",
"after": "2026.2.6-3",
"updated": true
},
"claude_code": {
"before": "2.1.34",
"latest": "2.1.34",
"updated": false
},
"os": {
"available": 5,
"packages": [
{
"name": "alsa-ucm-conf",
"from": "1.2.10-1ubuntu5.8",
"to": "1.2.10-1ubuntu5.9"
},
{
"name": "linux-generic",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "linux-headers-generic",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "linux-image-generic",
"from": "6.8.0-94.96",
"to": "6.8.0-100.100"
},
{
"name": "sosreport",
"from": "4.5.6-0ubuntu4",
"to": "4.9.2-0ubuntu0~24.04.1"
}
],
"updated": true,
"reboot_required": false
},
"gateway_restarted": true
}

1
new_messages.json Normal file
View File

@ -0,0 +1 @@
null

1
recent_messages.json Normal file

File diff suppressed because one or more lines are too long

48
scripts/claude-usage-log.sh Executable file
View File

@ -0,0 +1,48 @@
#!/bin/bash
# Log Claude usage to SQLite and alert on rapid consumption
# Alerts if weekly_percent increases by 4+ points in any 2-hour window
set -euo pipefail
SCRIPT_DIR="$(dirname "$0")"
DB="$SCRIPT_DIR/../memory/claude-usage.db"
USAGE_JSON="$SCRIPT_DIR/../memory/claude-usage.json"
SIGNAL_SKILL="$SCRIPT_DIR/../skills/signal-notify"
# Run the fetch first
"$SCRIPT_DIR/claude-usage-check.sh" || true
# Read current values
WEEKLY=$(jq -r '.weekly_percent // 0' "$USAGE_JSON")
SESSION=$(jq -r '.session_percent // 0' "$USAGE_JSON")
SONNET=$(jq -r '.sonnet_percent // 0' "$USAGE_JSON")
# Create DB and table if needed
sqlite3 "$DB" <<'SQL'
CREATE TABLE IF NOT EXISTS usage_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ts TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
weekly_percent INTEGER NOT NULL,
session_percent INTEGER NOT NULL,
sonnet_percent INTEGER NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_usage_ts ON usage_log(ts);
SQL
# Insert current reading
sqlite3 "$DB" "INSERT INTO usage_log (weekly_percent, session_percent, sonnet_percent) VALUES ($WEEKLY, $SESSION, $SONNET);"
# Check 2-hour delta: get the reading from ~2 hours ago
TWO_HR_AGO=$(sqlite3 "$DB" "SELECT weekly_percent FROM usage_log WHERE ts <= strftime('%Y-%m-%dT%H:%M:%SZ', 'now', '-2 hours') ORDER BY ts DESC LIMIT 1;")
if [ -n "$TWO_HR_AGO" ]; then
DELTA=$((WEEKLY - TWO_HR_AGO))
if [ "$DELTA" -ge 4 ]; then
echo "🚨 ALERT: Claude usage jumped ${DELTA}% in 2 hours (${TWO_HR_AGO}% → ${WEEKLY}%)"
# Exit 2 signals the cron agent to alert Johan
exit 2
fi
fi
echo "Logged: ${WEEKLY}% weekly (delta from 2h ago: ${DELTA:-n/a}%)"
exit 0

View File

@ -1,58 +1,72 @@
#!/bin/bash #!/bin/bash
# Git audit: check all projects in ~/dev/ for unpushed changes # Git audit: check ~/dev/ repos for unpushed changes
# Reports anomalies only (unpushed commits, uncommitted changes, missing remotes) # Hourly: only fetch repos with local changes (dirty or ahead)
# Run hourly via cron # --full: fetch all repos (daily at 6am)
# Reports anomalies only — silence = healthy
DEV_DIR="/home/johan/dev" DEV_DIR="/home/johan/dev"
CLAWD_DIR="/home/johan/clawd"
STATE_FILE="/home/johan/clawd/memory/git-audit-lastfull.txt"
ANOMALIES="" ANOMALIES=""
FULL=false
for dir in "$DEV_DIR"/*/; do # Full sweep if --full flag or last full was >20h ago
[ ! -d "$dir/.git" ] && continue if [ "${1:-}" = "--full" ]; then
FULL=true
elif [ -f "$STATE_FILE" ]; then
LAST=$(cat "$STATE_FILE")
NOW=$(date +%s)
AGE=$(( NOW - LAST ))
[ "$AGE" -gt 72000 ] && FULL=true
else
FULL=true
fi
repo=$(basename "$dir") audit_repo() {
cd "$dir" local dir="$1"
local repo=$(basename "$dir")
# Check for remote # Check for remote
if ! git remote get-url origin &>/dev/null; then if ! git -C "$dir" remote get-url origin >/dev/null 2>&1; then
ANOMALIES+="$repo: NO REMOTE — needs git@zurich.inou.com:$repo.git\n" ANOMALIES+="$repo: NO REMOTE\n"
continue return
fi fi
# Check for uncommitted changes # Uncommitted changes
DIRTY=$(git status --porcelain 2>/dev/null) local DIRTY=$(git -C "$dir" status --porcelain 2>/dev/null)
local DIRTY_COUNT=0
if [ -n "$DIRTY" ]; then if [ -n "$DIRTY" ]; then
COUNT=$(echo "$DIRTY" | wc -l) DIRTY_COUNT=$(echo "$DIRTY" | wc -l)
ANOMALIES+="⚠️ $repo: $COUNT uncommitted file(s)\n"
fi fi
# Check for unpushed commits (fetch first to be accurate, with timeout) # Current branch
timeout 10 git fetch origin --quiet 2>/dev/null local BRANCH=$(git -C "$dir" rev-parse --abbrev-ref HEAD 2>/dev/null)
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) local AHEAD=0
if [ -n "$BRANCH" ]; then if [ -n "$BRANCH" ] && git -C "$dir" rev-parse "origin/$BRANCH" >/dev/null 2>&1; then
AHEAD=$(git rev-list --count "origin/$BRANCH..HEAD" 2>/dev/null) AHEAD=$(git -C "$dir" rev-list --count "origin/$BRANCH..HEAD" 2>/dev/null || echo 0)
if [ -n "$AHEAD" ] && [ "$AHEAD" -gt 0 ]; then fi
ANOMALIES+="🔺 $repo: $AHEAD unpushed commit(s) on $BRANCH\n"
# Only fetch if full mode OR repo has local changes
if $FULL || [ "$DIRTY_COUNT" -gt 0 ] || [ "$AHEAD" -gt 0 ]; then
timeout 5 git -C "$dir" fetch origin --quiet 2>/dev/null || true
# Recheck ahead after fetch
if [ -n "$BRANCH" ] && git -C "$dir" rev-parse "origin/$BRANCH" >/dev/null 2>&1; then
AHEAD=$(git -C "$dir" rev-list --count "origin/$BRANCH..HEAD" 2>/dev/null || echo 0)
fi fi
fi fi
[ "$DIRTY_COUNT" -gt 0 ] && ANOMALIES+="⚠️ $repo: $DIRTY_COUNT uncommitted file(s)\n"
[ "$AHEAD" -gt 0 ] && ANOMALIES+="🔺 $repo: $AHEAD unpushed commit(s) on $BRANCH\n"
}
for dir in "$DEV_DIR"/*/; do
[ -d "$dir/.git" ] || continue
audit_repo "$dir"
done done
# Also check ~/clawd/ workspace [ -d "$CLAWD_DIR/.git" ] && audit_repo "$CLAWD_DIR"
cd /home/johan/clawd
if [ -d .git ]; then $FULL && date +%s > "$STATE_FILE"
DIRTY=$(git status --porcelain 2>/dev/null)
if [ -n "$DIRTY" ]; then
COUNT=$(echo "$DIRTY" | wc -l)
ANOMALIES+="⚠️ clawd: $COUNT uncommitted file(s)\n"
fi
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
if [ -n "$BRANCH" ] && git remote get-url origin &>/dev/null; then
timeout 10 git fetch origin --quiet 2>/dev/null
AHEAD=$(git rev-list --count "origin/$BRANCH..HEAD" 2>/dev/null)
if [ -n "$AHEAD" ] && [ "$AHEAD" -gt 0 ]; then
ANOMALIES+="🔺 clawd: $AHEAD unpushed commit(s) on $BRANCH\n"
fi
fi
fi
if [ -n "$ANOMALIES" ]; then if [ -n "$ANOMALIES" ]; then
echo -e "Git audit found issues:\n$ANOMALIES" echo -e "Git audit found issues:\n$ANOMALIES"