CC0-licensed methodology for estimating the environmental and social costs of AI conversations (20+ categories), plus a reusable toolkit for automated impact tracking in Claude Code sessions.
82 lines
2.5 KiB
Bash
Executable file
82 lines
2.5 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
#
|
|
# annotate-impact.sh — Annotate the most recent impact log entry with
|
|
# positive impact data.
|
|
#
|
|
# Usage: ./annotate-impact.sh
|
|
# Interactive: prompts for value assessment of the last logged session.
|
|
#
|
|
# This adds value-side data to complement the cost data captured
|
|
# automatically by the PreCompact hook.
|
|
|
|
set -euo pipefail
|
|
|
|
PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(cd "$(dirname "$0")/../.." && pwd)}"
|
|
LOG_FILE="$PROJECT_DIR/.claude/impact/impact-log.jsonl"
|
|
|
|
if [ ! -f "$LOG_FILE" ]; then
|
|
echo "No impact log found. Run a conversation with compaction first."
|
|
exit 1
|
|
fi
|
|
|
|
# Show the last entry
|
|
LAST=$(tail -1 "$LOG_FILE")
|
|
echo "Last log entry:"
|
|
echo "$LAST" | jq .
|
|
echo ""
|
|
|
|
SESSION_ID=$(echo "$LAST" | jq -r '.session_id')
|
|
TIMESTAMP=$(echo "$LAST" | jq -r '.timestamp')
|
|
|
|
echo "Annotating session $SESSION_ID (snapshot $TIMESTAMP)"
|
|
echo ""
|
|
|
|
# Gather value data
|
|
read -rp "Brief summary of value produced: " VALUE_SUMMARY
|
|
|
|
read -rp "Estimated reach (number of people affected) [1]: " REACH
|
|
REACH=${REACH:-1}
|
|
|
|
echo "Counterfactual (would the user have achieved this without the conversation?):"
|
|
echo " 1. Yes, same speed (no value added)"
|
|
echo " 2. Yes, but slower"
|
|
echo " 3. Yes, but lower quality"
|
|
echo " 4. No (could not have done it alone)"
|
|
read -rp "Choice [2]: " CF_CHOICE
|
|
CF_CHOICE=${CF_CHOICE:-2}
|
|
case "$CF_CHOICE" in
|
|
1) COUNTERFACTUAL="same_speed" ;;
|
|
2) COUNTERFACTUAL="slower" ;;
|
|
3) COUNTERFACTUAL="lower_quality" ;;
|
|
4) COUNTERFACTUAL="impossible" ;;
|
|
*) COUNTERFACTUAL="unknown" ;;
|
|
esac
|
|
|
|
echo "Net assessment:"
|
|
echo " 1. Clearly net-positive"
|
|
echo " 2. Probably net-positive"
|
|
echo " 3. Uncertain"
|
|
echo " 4. Probably net-negative"
|
|
echo " 5. Clearly net-negative"
|
|
read -rp "Choice [3]: " NET_CHOICE
|
|
NET_CHOICE=${NET_CHOICE:-3}
|
|
case "$NET_CHOICE" in
|
|
1) NET_ASSESSMENT="clearly_positive" ;;
|
|
2) NET_ASSESSMENT="probably_positive" ;;
|
|
3) NET_ASSESSMENT="uncertain" ;;
|
|
4) NET_ASSESSMENT="probably_negative" ;;
|
|
5) NET_ASSESSMENT="clearly_negative" ;;
|
|
*) NET_ASSESSMENT="unknown" ;;
|
|
esac
|
|
|
|
# Write annotation as a separate log entry linked by session_id
|
|
ANNOTATION_FILE="$PROJECT_DIR/.claude/impact/annotations.jsonl"
|
|
|
|
ANNOT_TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
|
|
cat >> "$ANNOTATION_FILE" <<EOF
|
|
{"timestamp":"$ANNOT_TIMESTAMP","snapshot_timestamp":"$TIMESTAMP","session_id":"$SESSION_ID","value_summary":"$VALUE_SUMMARY","estimated_reach":$REACH,"counterfactual":"$COUNTERFACTUAL","net_assessment":"$NET_ASSESSMENT"}
|
|
EOF
|
|
|
|
echo ""
|
|
echo "Annotation saved to $ANNOTATION_FILE"
|