chore: git-audit improvements, usage logging, cron updates
This commit is contained in:
parent
ab80442bef
commit
b5cbd61224
|
|
@ -318,6 +318,14 @@ Automated document processing pipeline for scanned paperwork.
|
|||
- [ ] 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!)
|
||||
- [ ] 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
|
||||
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
Binary file not shown.
|
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
"last_updated": "2026-02-05T03:00:03.898951Z",
|
||||
"last_updated": "2026-02-07T21:19:36.196418Z",
|
||||
"source": "api",
|
||||
"session_percent": 6,
|
||||
"session_resets": "2026-02-05T03:59:59.856689+00:00",
|
||||
"weekly_percent": 87,
|
||||
"weekly_resets": "2026-02-07T18:59:59.856739+00:00",
|
||||
"sonnet_percent": 0
|
||||
"session_percent": 10,
|
||||
"session_resets": "2026-02-08T00:00:00.167212+00:00",
|
||||
"weekly_percent": 2,
|
||||
"weekly_resets": "2026-02-14T19:00:00.167234+00:00",
|
||||
"sonnet_percent": 2
|
||||
}
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
# Email Triage Instructions
|
||||
|
||||
*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
|
||||
|
||||
|
|
@ -195,6 +195,17 @@ This keeps the delivery schedule current without cluttering Shopping folder.
|
|||
- Anything Sophia-related
|
||||
- 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
|
||||
|
||||
### 2026-02-01
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
1770499645
|
||||
|
|
@ -1,10 +1,12 @@
|
|||
{
|
||||
"lastBriefing": 1738685392,
|
||||
"lastTechScan": 1738685392,
|
||||
"lastBriefing": 1738911244,
|
||||
"lastTechScan": 1738926660,
|
||||
"lastMemoryReview": 1738926660,
|
||||
"lastChecks": {
|
||||
"briefing": "2026-02-04T11:09:52-05:00",
|
||||
"techScan": "2026-02-04T11:09:52-05:00",
|
||||
"email": "2026-02-04T13:12:00-05:00",
|
||||
"techScan": "2026-02-07T06:11:00-05:00",
|
||||
"memoryReview": "2026-02-07T06:11:00-05:00",
|
||||
"email": "2026-02-07T06:11:00-05:00",
|
||||
"calendar": null,
|
||||
"weather": "2026-02-04T11:09:52-05:00"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
null
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -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
|
||||
|
|
@ -1,58 +1,72 @@
|
|||
#!/bin/bash
|
||||
# Git audit: check all projects in ~/dev/ for unpushed changes
|
||||
# Reports anomalies only (unpushed commits, uncommitted changes, missing remotes)
|
||||
# Run hourly via cron
|
||||
# Git audit: check ~/dev/ repos for unpushed changes
|
||||
# Hourly: only fetch repos with local changes (dirty or ahead)
|
||||
# --full: fetch all repos (daily at 6am)
|
||||
# Reports anomalies only — silence = healthy
|
||||
|
||||
DEV_DIR="/home/johan/dev"
|
||||
CLAWD_DIR="/home/johan/clawd"
|
||||
STATE_FILE="/home/johan/clawd/memory/git-audit-lastfull.txt"
|
||||
ANOMALIES=""
|
||||
FULL=false
|
||||
|
||||
for dir in "$DEV_DIR"/*/; do
|
||||
[ ! -d "$dir/.git" ] && continue
|
||||
# Full sweep if --full flag or last full was >20h ago
|
||||
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")
|
||||
cd "$dir"
|
||||
audit_repo() {
|
||||
local dir="$1"
|
||||
local repo=$(basename "$dir")
|
||||
|
||||
# Check for remote
|
||||
if ! git remote get-url origin &>/dev/null; then
|
||||
ANOMALIES+="❌ $repo: NO REMOTE — needs git@zurich.inou.com:$repo.git\n"
|
||||
continue
|
||||
if ! git -C "$dir" remote get-url origin >/dev/null 2>&1; then
|
||||
ANOMALIES+="❌ $repo: NO REMOTE\n"
|
||||
return
|
||||
fi
|
||||
|
||||
# Check for uncommitted changes
|
||||
DIRTY=$(git status --porcelain 2>/dev/null)
|
||||
# Uncommitted changes
|
||||
local DIRTY=$(git -C "$dir" status --porcelain 2>/dev/null)
|
||||
local DIRTY_COUNT=0
|
||||
if [ -n "$DIRTY" ]; then
|
||||
COUNT=$(echo "$DIRTY" | wc -l)
|
||||
ANOMALIES+="⚠️ $repo: $COUNT uncommitted file(s)\n"
|
||||
DIRTY_COUNT=$(echo "$DIRTY" | wc -l)
|
||||
fi
|
||||
|
||||
# Check for unpushed commits (fetch first to be accurate, with timeout)
|
||||
timeout 10 git fetch origin --quiet 2>/dev/null
|
||||
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
||||
if [ -n "$BRANCH" ]; then
|
||||
AHEAD=$(git rev-list --count "origin/$BRANCH..HEAD" 2>/dev/null)
|
||||
if [ -n "$AHEAD" ] && [ "$AHEAD" -gt 0 ]; then
|
||||
ANOMALIES+="🔺 $repo: $AHEAD unpushed commit(s) on $BRANCH\n"
|
||||
# Current branch
|
||||
local BRANCH=$(git -C "$dir" rev-parse --abbrev-ref HEAD 2>/dev/null)
|
||||
local AHEAD=0
|
||||
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
|
||||
|
||||
# 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
|
||||
|
||||
[ "$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
|
||||
|
||||
# Also check ~/clawd/ workspace
|
||||
cd /home/johan/clawd
|
||||
if [ -d .git ]; then
|
||||
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
|
||||
[ -d "$CLAWD_DIR/.git" ] && audit_repo "$CLAWD_DIR"
|
||||
|
||||
$FULL && date +%s > "$STATE_FILE"
|
||||
|
||||
if [ -n "$ANOMALIES" ]; then
|
||||
echo -e "Git audit found issues:\n$ANOMALIES"
|
||||
|
|
|
|||
Loading…
Reference in New Issue