Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
892aeb4
fix: [C1] implement PathValidation enforcement
EmanueleCannizzaro Feb 16, 2026
e4f5c7d
docs: improve PARITY_PLAN.md with accurate OpenClaw comparison
EmanueleCannizzaro Feb 16, 2026
0327d66
fix: [C1] apply sandbox to background and yield-mode commands
EmanueleCannizzaro Feb 16, 2026
6dbfcfd
feat: implement Landlock kernel-level filesystem restrictions (Phase 3)
EmanueleCannizzaro Feb 16, 2026
0b460b9
Merge remote-tracking branch 'upstream/main'
EmanueleCannizzaro Feb 16, 2026
654fd02
feat: make Bubblewrap respect deny_read and deny_write lists (Phase 4)
EmanueleCannizzaro Feb 16, 2026
ccef896
feat: implement deny_exec enforcement across all sandbox modes (Phase 5)
EmanueleCannizzaro Feb 16, 2026
9c68adc
test: add comprehensive integration tests for sandbox enforcement
EmanueleCannizzaro Feb 16, 2026
97a730a
feat: add /elevated command infrastructure (partial)
EmanueleCannizzaro Feb 16, 2026
5341dc2
feat: complete per-session elevated mode via WebSocket
EmanueleCannizzaro Feb 16, 2026
a846844
Merge pull request #33 from aecs4u/feature/elevated-bash
aecs4u Feb 16, 2026
43899f7
Merge remote-tracking branch 'upstream/main'
EmanueleCannizzaro Feb 16, 2026
17e92eb
fix: add missing dependencies and update golden test file
EmanueleCannizzaro Feb 16, 2026
5929a85
fix: apply Landlock sandbox restrictions at gateway startup
EmanueleCannizzaro Feb 16, 2026
e6a4c58
fix: add missing rpassword dependency
EmanueleCannizzaro Feb 16, 2026
226d4a4
docs: add PicoClaw comparison and reorder tables
EmanueleCannizzaro Feb 16, 2026
64d1bd0
feat: implement security hardening and operational features (Sprint 1…
EmanueleCannizzaro Feb 16, 2026
419e45b
feat: add WebAuthn/Passkey authentication (Phase 3.1)
EmanueleCannizzaro Feb 16, 2026
9f8f168
feat: add AutoGPT-inspired desktop GUI
EmanueleCannizzaro Feb 16, 2026
908073b
feat(messenger): add Telegram integration
EmanueleCannizzaro Feb 16, 2026
313e6d1
feat(messenger): add Matrix integration
EmanueleCannizzaro Feb 16, 2026
ac165c4
feat(messenger): add Slack integration
EmanueleCannizzaro Feb 16, 2026
0bd4dfc
feat(messenger): add Discord integration
EmanueleCannizzaro Feb 16, 2026
b3ff8f7
docs: add messenger integrations overview
EmanueleCannizzaro Feb 16, 2026
44d26b8
Merge branch 'main' into feature/messenger-discord
EmanueleCannizzaro Feb 16, 2026
bd34e1c
Merge branch 'main' into feature/messenger-slack
EmanueleCannizzaro Feb 16, 2026
a8313a5
Merge branch 'main' into feature/messenger-telegram
EmanueleCannizzaro Feb 16, 2026
842623a
Merge branch 'main' into feature/messenger-matrix
EmanueleCannizzaro Feb 16, 2026
64fcc09
Merge feature/messenger-discord into main
EmanueleCannizzaro Feb 16, 2026
7864046
Merge feature/messenger-telegram into main
EmanueleCannizzaro Feb 16, 2026
b08c7d1
Merge feature/messenger-matrix into main
EmanueleCannizzaro Feb 16, 2026
63233c9
feat: implement DM pairing security and presence/typing indicators
EmanueleCannizzaro Feb 16, 2026
09c1b15
docs: restructure PARITY_PLAN.md with RustyClaw as reference implemen…
EmanueleCannizzaro Feb 16, 2026
f7d71eb
Add web-ui: Progressive Web App for mobile control
EmanueleCannizzaro Feb 16, 2026
898cdd2
Merge feature/web-ui into main
EmanueleCannizzaro Feb 16, 2026
38f4f46
Add Gmail messenger integration
EmanueleCannizzaro Feb 16, 2026
0937257
Merge feature/messenger-gmail into main
EmanueleCannizzaro Feb 16, 2026
1f2efa9
feat: add Slack messenger implementation
EmanueleCannizzaro Feb 16, 2026
c703998
doc: verify bwrap sandbox implementation
EmanueleCannizzaro Feb 16, 2026
90ffe7b
Add Remote Gateway support with health monitoring
EmanueleCannizzaro Feb 16, 2026
dab866f
Add comprehensive Tailscale integration
EmanueleCannizzaro Feb 16, 2026
b02a490
Add Voice features framework (STT/TTS)
EmanueleCannizzaro Feb 16, 2026
01ff2d5
Update PARITY_PLAN.md with completed features
EmanueleCannizzaro Feb 16, 2026
40e1eec
Add comprehensive Sandbox documentation
EmanueleCannizzaro Feb 16, 2026
5471473
Add Browser Automation documentation and profile management
EmanueleCannizzaro Feb 16, 2026
d6bd693
Add combined Landlock+Bubblewrap and Docker sandbox modes
EmanueleCannizzaro Feb 16, 2026
f03d644
Add comprehensive development roadmap with IronClaw feature adoption
EmanueleCannizzaro Feb 16, 2026
c4183a9
Enhance README with security features and roadmap
EmanueleCannizzaro Feb 16, 2026
2444580
Reorganize project: move docs to docs/ and UI apps to apps/
EmanueleCannizzaro Feb 16, 2026
eeb5404
Add AutoGPT to ecosystem analysis and create 7 filtered feature issues
EmanueleCannizzaro Feb 16, 2026
aa6d12f
Add comprehensive prioritized development roadmap (44 features)
EmanueleCannizzaro Feb 16, 2026
c8aa67c
Implement DORA metrics tracking for software delivery performance
EmanueleCannizzaro Feb 16, 2026
2688938
Add 8 messenger channel integrations and supporting documentation
EmanueleCannizzaro Feb 16, 2026
9d5bae1
Update DORA metrics badges [skip ci]
github-actions[bot] Feb 16, 2026
a307b74
Document comprehensive messenger channel-adapter architecture
EmanueleCannizzaro Feb 16, 2026
1862b3f
feat: implement roadmap easy wins for personality files and web searc…
EmanueleCannizzaro Feb 16, 2026
f352c2c
chore: close implemented roadmap issues
EmanueleCannizzaro Feb 16, 2026
8c530d5
feat(config,secrets): add config validation and secure secret handling
EmanueleCannizzaro Feb 16, 2026
47b24c1
feat(retry): add structured retry/backoff engine
EmanueleCannizzaro Feb 16, 2026
c69bb68
feat(safety): introduce unified safety layer facade
EmanueleCannizzaro Feb 16, 2026
89fafe7
feat(security): add gateway CSRF protection
EmanueleCannizzaro Feb 16, 2026
7690887
feat(heartbeat): add proactive gateway heartbeat monitoring
EmanueleCannizzaro Feb 16, 2026
16a5276
Implement Phase 1 Quick Wins features (P1)
EmanueleCannizzaro Feb 16, 2026
0e2bb2c
Implement Local Embeddings (P1.4) - Phase 1 Complete!
EmanueleCannizzaro Feb 16, 2026
44a57d0
Update README.md with Phase 1 completion
EmanueleCannizzaro Feb 16, 2026
1808f5d
Implement routines engine foundation and update repository info
EmanueleCannizzaro Feb 17, 2026
31fbe52
Add event pattern matcher for routines engine
EmanueleCannizzaro Feb 17, 2026
7c79ea7
Complete routines engine execution core
EmanueleCannizzaro Feb 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .dora/change-failure-rate.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"schemaVersion": 1,
"label": "Change Failure Rate",
"message": "50.0%",
"color": "red"
}
6 changes: 6 additions & 0 deletions .dora/deployment-frequency.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"schemaVersion": 1,
"label": "Deployment Frequency",
"message": ".28/day",
"color": "green"
}
6 changes: 6 additions & 0 deletions .dora/lead-time.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"schemaVersion": 1,
"label": "Lead Time",
"message": "0h",
"color": "brightgreen"
}
6 changes: 6 additions & 0 deletions .dora/mttr.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"schemaVersion": 1,
"label": "MTTR",
"message": "0h",
"color": "brightgreen"
}
282 changes: 282 additions & 0 deletions .github/workflows/dora-metrics.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
name: DORA Metrics

on:
schedule:
# Run daily at 00:00 UTC
- cron: '0 0 * * *'
workflow_dispatch:
push:
tags:
- 'v*'
release:
types: [published]

permissions:
contents: write
issues: read
pull-requests: read

jobs:
calculate-dora-metrics:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Full history for accurate lead time calculation
token: ${{ secrets.GITHUB_TOKEN }}

- name: Calculate Deployment Frequency
id: deployment-frequency
run: |
# Count releases in last 7 days
SEVEN_DAYS_AGO=$(date -d '7 days ago' +%Y-%m-%d)
DEPLOYMENTS=$(git tag --sort=-creatordate --format='%(creatordate:short)' | \
awk -v date="$SEVEN_DAYS_AGO" '$1 >= date' | wc -l)
FREQ=$(echo "scale=2; $DEPLOYMENTS / 7" | bc)
echo "frequency=$FREQ" >> $GITHUB_OUTPUT
echo "count=$DEPLOYMENTS" >> $GITHUB_OUTPUT

- name: Calculate Lead Time for Changes
id: lead-time
run: |
# Calculate average time from commit to release for last 5 releases
LEAD_TIMES=$(git for-each-ref --sort=-creatordate --count=5 --format='%(refname:short)' refs/tags | \
while read tag; do
# Get tag creation time
TAG_DATE=$(git log -1 --format=%ct $tag)
# Get commit time for the tagged commit
COMMIT=$(git rev-list -n 1 $tag)
COMMIT_DATE=$(git log -1 --format=%ct $COMMIT)
# Lead time is difference between tag and commit
DIFF=$((TAG_DATE - COMMIT_DATE))
# Only output if positive (tag should be after commit)
if [ $DIFF -gt 0 ]; then
echo $DIFF
fi
done)

if [ -z "$LEAD_TIMES" ]; then
AVG_LEAD_TIME=0
HOURS=0
else
AVG_LEAD_TIME=$(echo "$LEAD_TIMES" | awk '{sum+=$1; count+=1} END {if (count > 0) print int(sum/count); else print 0}')
HOURS=$(echo "scale=1; $AVG_LEAD_TIME / 3600" | bc)
fi
echo "seconds=$AVG_LEAD_TIME" >> $GITHUB_OUTPUT
echo "hours=$HOURS" >> $GITHUB_OUTPUT

- name: Calculate Change Failure Rate
id: change-failure-rate
run: |
# Count releases vs hotfixes/reverts in last 30 days
THIRTY_DAYS_AGO=$(date -d '30 days ago' +%Y-%m-%d)
TOTAL=$(git tag --sort=-creatordate --format='%(creatordate:short)' | \
awk -v date="$THIRTY_DAYS_AGO" '$1 >= date' | wc -l)

# Count commits with hotfix/rollback/revert in message since 30 days ago
FAILURES=$(git log --since="$THIRTY_DAYS_AGO" --grep="hotfix\|rollback\|revert" --oneline | wc -l)

if [ "$TOTAL" -eq 0 ]; then
CFR="0"
else
CFR=$(echo "scale=1; ($FAILURES / $TOTAL) * 100" | bc)
fi
echo "rate=$CFR" >> $GITHUB_OUTPUT
echo "failures=$FAILURES" >> $GITHUB_OUTPUT
echo "total=$TOTAL" >> $GITHUB_OUTPUT

- name: Calculate MTTR
id: mttr
run: |
# Calculate average time to close incident-labeled issues
# Use gh CLI to fetch issues
set +e # Don't fail if no incidents found
INCIDENTS_JSON=$(gh issue list --label incident --state closed --limit 20 --json number,createdAt,closedAt 2>/dev/null)

if [ -z "$INCIDENTS_JSON" ] || [ "$INCIDENTS_JSON" = "[]" ]; then
echo "hours=0" >> $GITHUB_OUTPUT
echo "count=0" >> $GITHUB_OUTPUT
else
# Calculate average resolution time in hours
MTTR=$(echo "$INCIDENTS_JSON" | jq -r '
map(select(.closedAt != null)) |
map(((.closedAt | fromdateiso8601) - (.createdAt | fromdateiso8601)) / 3600) |
if length > 0 then (add / length) else 0 end
')
COUNT=$(echo "$INCIDENTS_JSON" | jq 'length')
echo "hours=$(printf "%.1f" $MTTR)" >> $GITHUB_OUTPUT
echo "count=$COUNT" >> $GITHUB_OUTPUT
fi
env:
GH_TOKEN: ${{ github.token }}

- name: Generate DORA Report
run: |
# Helper function to determine performance level
get_df_level() {
if (( $(echo "$1 >= 1" | bc -l) )); then echo "Elite ✅"
elif (( $(echo "$1 >= 0.14" | bc -l) )); then echo "High 🟢"
elif (( $(echo "$1 >= 0.03" | bc -l) )); then echo "Medium 🟡"
else echo "Low 🔴"; fi
}

get_lt_level() {
if (( $(echo "$1 <= 24" | bc -l) )); then echo "Elite ✅"
elif (( $(echo "$1 <= 168" | bc -l) )); then echo "High 🟢"
elif (( $(echo "$1 <= 720" | bc -l) )); then echo "Medium 🟡"
else echo "Low 🔴"; fi
}

get_cfr_level() {
if (( $(echo "$1 <= 15" | bc -l) )); then echo "Elite/High ✅"
elif (( $(echo "$1 <= 30" | bc -l) )); then echo "Medium 🟡"
else echo "Low 🔴"; fi
}

get_mttr_level() {
if (( $(echo "$1 <= 1" | bc -l) )); then echo "Elite ✅"
elif (( $(echo "$1 <= 24" | bc -l) )); then echo "High 🟢"
elif (( $(echo "$1 <= 168" | bc -l) )); then echo "Medium 🟡"
else echo "Low 🔴"; fi
}

cat << EOF >> $GITHUB_STEP_SUMMARY
# 📊 DORA Metrics Report

**Generated**: $(date -u +"%Y-%m-%d %H:%M UTC")
**Repository**: ${{ github.repository }}

## Four Key Metrics

| Metric | Value | Performance Level |
|--------|-------|-------------------|
| **Deployment Frequency** | ${{ steps.deployment-frequency.outputs.frequency }}/day (${{ steps.deployment-frequency.outputs.count }} in 7d) | $(get_df_level ${{ steps.deployment-frequency.outputs.frequency }}) |
| **Lead Time for Changes** | ${{ steps.lead-time.outputs.hours }}h | $(get_lt_level ${{ steps.lead-time.outputs.hours }}) |
| **Change Failure Rate** | ${{ steps.change-failure-rate.outputs.rate }}% (${{ steps.change-failure-rate.outputs.failures }}/${{ steps.change-failure-rate.outputs.total }}) | $(get_cfr_level ${{ steps.change-failure-rate.outputs.rate }}) |
| **Mean Time to Recovery** | ${{ steps.mttr.outputs.hours }}h (${{ steps.mttr.outputs.count }} incidents) | $(get_mttr_level ${{ steps.mttr.outputs.hours }}) |

## 📈 Performance Benchmarks (DORA 2023)

| Level | Deployment Frequency | Lead Time | Change Failure Rate | MTTR |
|-------|---------------------|-----------|-------------------|------|
| **Elite** | Multiple/day | <1 day | <15% | <1 hour |
| **High** | Weekly-Monthly | 1-7 days | <15% | <1 day |
| **Medium** | Monthly-Biannually | 1-4 weeks | 15-30% | 1-7 days |
| **Low** | <Biannually | >4 weeks | >30% | >7 days |

## 🎯 Recommendations

EOF

# Add specific recommendations based on metrics
if (( $(echo "${{ steps.deployment-frequency.outputs.frequency }} < 0.14" | bc -l) )); then
echo "- ⚠️ **Increase deployment frequency**: Consider CD pipeline improvements or feature flagging" >> $GITHUB_STEP_SUMMARY
fi

if (( $(echo "${{ steps.lead-time.outputs.hours }} > 168" | bc -l) )); then
echo "- ⚠️ **Reduce lead time**: Streamline PR review process and automate testing" >> $GITHUB_STEP_SUMMARY
fi

if (( $(echo "${{ steps.change-failure-rate.outputs.rate }} > 15" | bc -l) )); then
echo "- ⚠️ **Improve change quality**: Enhance test coverage and pre-deployment validation" >> $GITHUB_STEP_SUMMARY
fi

if (( $(echo "${{ steps.mttr.outputs.hours }} > 24" | bc -l) )); then
echo "- ⚠️ **Accelerate recovery**: Improve monitoring, alerting, and rollback procedures" >> $GITHUB_STEP_SUMMARY
fi

echo "" >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
echo "*DORA metrics track software delivery performance. Learn more at [dora.dev](https://dora.dev/)*" >> $GITHUB_STEP_SUMMARY

- name: Create metrics badge JSON
run: |
mkdir -p .dora

# Helper function to get badge color
get_df_color() {
if (( $(echo "$1 >= 1" | bc -l) )); then echo "brightgreen"
elif (( $(echo "$1 >= 0.14" | bc -l) )); then echo "green"
elif (( $(echo "$1 >= 0.03" | bc -l) )); then echo "yellow"
else echo "red"; fi
}

get_lt_color() {
if (( $(echo "$1 <= 24" | bc -l) )); then echo "brightgreen"
elif (( $(echo "$1 <= 168" | bc -l) )); then echo "green"
elif (( $(echo "$1 <= 720" | bc -l) )); then echo "yellow"
else echo "red"; fi
}

get_cfr_color() {
if (( $(echo "$1 <= 15" | bc -l) )); then echo "brightgreen"
elif (( $(echo "$1 <= 30" | bc -l) )); then echo "yellow"
else echo "red"; fi
}

get_mttr_color() {
if (( $(echo "$1 <= 1" | bc -l) )); then echo "brightgreen"
elif (( $(echo "$1 <= 24" | bc -l) )); then echo "green"
elif (( $(echo "$1 <= 168" | bc -l) )); then echo "yellow"
else echo "red"; fi
}

# Deployment Frequency badge
cat << EOF > .dora/deployment-frequency.json
{
"schemaVersion": 1,
"label": "Deployment Frequency",
"message": "${{ steps.deployment-frequency.outputs.frequency }}/day",
"color": "$(get_df_color ${{ steps.deployment-frequency.outputs.frequency }})"
}
EOF

# Lead Time badge
cat << EOF > .dora/lead-time.json
{
"schemaVersion": 1,
"label": "Lead Time",
"message": "${{ steps.lead-time.outputs.hours }}h",
"color": "$(get_lt_color ${{ steps.lead-time.outputs.hours }})"
}
EOF

# Change Failure Rate badge
cat << EOF > .dora/change-failure-rate.json
{
"schemaVersion": 1,
"label": "Change Failure Rate",
"message": "${{ steps.change-failure-rate.outputs.rate }}%",
"color": "$(get_cfr_color ${{ steps.change-failure-rate.outputs.rate }})"
}
EOF

# MTTR badge
cat << EOF > .dora/mttr.json
{
"schemaVersion": 1,
"label": "MTTR",
"message": "${{ steps.mttr.outputs.hours }}h",
"color": "$(get_mttr_color ${{ steps.mttr.outputs.hours }})"
}
EOF

- name: Commit and push badge data
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add .dora/

if git diff --staged --quiet; then
echo "No changes to commit"
else
git commit -m "Update DORA metrics badges [skip ci]

Deployment Frequency: ${{ steps.deployment-frequency.outputs.frequency }}/day
Lead Time: ${{ steps.lead-time.outputs.hours }}h
Change Failure Rate: ${{ steps.change-failure-rate.outputs.rate }}%
MTTR: ${{ steps.mttr.outputs.hours }}h"

# Push to main branch (will fail gracefully on tag builds)
git push origin HEAD:main || echo "Push skipped (expected on tag/fork builds)"
fi
Loading
Loading