Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions .github/ISSUE_TEMPLATE/intel.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ assignees: []

## 🔭 Rapport de Veille Technologique

**Agent**: @Comet-Scout
**Date**: <!-- YYYY-MM-DD -->
**Agent**: @Comet-Scout
**Date**: <!-- YYYY-MM-DD -->
**Priorité**: <!-- 🔴 Critique / 🟠 Haute / 🟡 Moyenne / 🟢 Basse -->

---
Expand Down
21 changes: 18 additions & 3 deletions .github/workflows/apply-patch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,23 @@ on:
branch:
description: "Nom de branche"
required: true
default: "feat/comet-proof"
default: "chore/apply-patch"
title:
description: "Titre de la PR"
required: true
default: "chore: agent proof (apply-patch)"
file:
description: "[mode=create] Chemin du fichier à créer/écraser"
required: false
default: "project-space/benchmarks/results/COMET_APPLY_PATCH_PROOF.txt"
default: ""
content_b64:
description: "[mode=create] Contenu base64"
required: false
default: "SGVsbG8gZnJvbSBhcHBseS1wYXRjaAo="
default: ""
patch_b64:
description: "[mode=patch] unified diff base64"
required: false
default: ""

jobs:
apply:
Expand All @@ -50,6 +51,15 @@ jobs:
if: ${{ inputs.mode == 'create' }}
shell: bash
run: |
if [[ -z "${{ inputs.file }}" ]]; then
echo "ERROR: input 'file' is required for mode=create" >&2
exit 2
fi
if [[ -z "${{ inputs.content_b64 }}" ]]; then
echo "ERROR: input 'content_b64' is required for mode=create" >&2
exit 2
fi

mkdir -p "$(dirname "${{ inputs.file }}")"
echo "${{ inputs.content_b64 }}" | base64 -d > "${{ inputs.file }}"
git add -A
Expand All @@ -66,6 +76,11 @@ jobs:
if: ${{ inputs.mode == 'patch' }}
shell: bash
run: |
if [[ -z "${{ inputs.patch_b64 }}" ]]; then
echo "ERROR: input 'patch_b64' is required for mode=patch" >&2
exit 2
fi

echo "${{ inputs.patch_b64 }}" | base64 -d > /tmp/agent.patch
git apply --whitespace=fix /tmp/agent.patch
git add -A
Expand Down
15 changes: 14 additions & 1 deletion .github/workflows/link-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ on:
pull_request:
push:
branches: ["main"]

permissions:
contents: read

jobs:
lychee:
runs-on: ubuntu-latest
Expand All @@ -11,4 +15,13 @@ jobs:
- uses: lycheeverse/lychee-action@v2.0.2
with:
args: >-
--verbose --no-progress --exclude-mail --max-redirects 5 --retry-wait-time 2 --timeout 15 .
--verbose
--no-progress
--exclude-mail
--max-redirects 5
--retry-wait-time 2
--timeout 15
--exclude '^\.\./\.\./actions/workflows/.*'
--exclude '^https://console\.cloud\.google\.com/.*'
--exclude-path archive
.
56 changes: 56 additions & 0 deletions .github/workflows/proof-pack.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: proof-pack
on:
pull_request:
push:
branches: [main]
workflow_dispatch:

permissions:
contents: read

jobs:
proof-pack:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5

- uses: actions/setup-python@v5
with:
python-version: "3.x"

- name: Install test deps
run: pip install -r requirements-dev.txt

- name: Run harness
env:
OUTPUT_DIR: ${{ runner.temp }}/proof-pack/results
run: python project-space/benchmarks/harness/run_all.py

- name: Aggregate metrics
env:
BENCH_RESULTS_JSONL: ${{ runner.temp }}/proof-pack/results/smoke_results.jsonl
BENCH_METRICS_DIR: ${{ runner.temp }}/proof-pack/metrics
run: python project-space/benchmarks/harness/aggregate_metrics.py

- name: Regression guard
env:
BENCH_SUMMARY_JSON: ${{ runner.temp }}/proof-pack/metrics/summary.json
SR_MIN: "80"
P95_MAX_MS: "1000"
run: python project-space/benchmarks/harness/regression_guard.py

- name: Generate badge
env:
BENCH_RESULTS_JSONL: ${{ runner.temp }}/proof-pack/results/smoke_results.jsonl
BENCH_BADGES_DIR: ${{ runner.temp }}/proof-pack/badges
run: python project-space/benchmarks/harness/make_badges.py

- name: Upload proof-pack artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: proof-pack
path: |
${{ runner.temp }}/proof-pack/results
${{ runner.temp }}/proof-pack/metrics
${{ runner.temp }}/proof-pack/badges
22 changes: 22 additions & 0 deletions .lychee.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Lychee config for CI.
# Keep this minimal and rely on CLI flags for verbosity.

no_progress = true
exclude_mail = true
max_redirects = 5
retry_wait_time = 2
timeout = 15

# GitHub README badge links often use repo-relative web paths (../../actions/...).
# Lychee treats them as filesystem paths and fails; exclude them.
exclude = [
'^\.\./\.\./actions/workflows/.*',

# Requires auth / frequently blocked for CI bots.
'^https://console\.cloud\.google\.com/.*',
]

# Archived docs are not part of the active Proof Pack and can contain stale links.
exclude_path = [
'archive',
]
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -280,8 +280,8 @@

---

**Licence**: MIT (Heritage of the Commons)
**Maintenu par**: L'Assemblée de Code-Commune
**Licence**: MIT (Heritage of the Commons)
**Maintenu par**: L'Assemblée de Code-Commune
**Première publication**: 12 octobre 2025

---
Expand Down
2 changes: 1 addition & 1 deletion OPERATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ restrictions:
/security/ @mlik-sudo
/tests/ @mlik-sudo

# Innovation et Features : Domaine de @Gemini-Architect
# Innovation et Features : Domaine de @Gemini-Architect
/features/ @mlik-sudo
/experimental/ @mlik-sudo

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

> Le Code comme Loi, Git comme Urne, l'IA comme Assemblée.

[![secret-scan](https://github.com/mlik-sudo/Code-Commune/actions/workflows/secret-scan.yml/badge.svg)](../../actions/workflows/secret-scan.yml)
[![link-check](https://github.com/mlik-sudo/Code-Commune/actions/workflows/link-check.yml/badge.svg)](../../actions/workflows/link-check.yml)
[![secret-scan](https://github.com/mlik-sudo/Code-Commune/actions/workflows/secret-scan.yml/badge.svg)](https://github.com/mlik-sudo/Code-Commune/actions/workflows/secret-scan.yml)
[![link-check](https://github.com/mlik-sudo/Code-Commune/actions/workflows/link-check.yml/badge.svg)](https://github.com/mlik-sudo/Code-Commune/actions/workflows/link-check.yml)

```
┌──────────────────────────────────────────────┐
Expand Down
80 changes: 80 additions & 0 deletions benchmarks/compare.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#!/usr/bin/env bash
set -euo pipefail

usage() {
cat <<'EOF'
Usage:
./benchmarks/compare.sh <baseline_jsonl> <candidate_jsonl>

Both files must be JSONL produced by the harness, with numeric `duration_ms` fields.
Example:
./benchmarks/compare.sh project-space/benchmarks/results/smoke_results.jsonl project-space/benchmarks/results/smoke_results.jsonl
EOF
}

if [[ ${1:-} == "-h" || ${1:-} == "--help" ]]; then
usage
exit 0
fi

baseline=${1:-}
candidate=${2:-}

if [[ -z ${baseline} || -z ${candidate} ]]; then
usage
exit 2
fi

python3 - <<'PY'
import json
import statistics
import sys
from pathlib import Path

baseline = Path(sys.argv[1])
candidate = Path(sys.argv[2])

for p in (baseline, candidate):
if not p.exists():
raise SystemExit(f"missing file: {p}")

def read_durations(path: Path) -> list[int]:
out: list[int] = []
for line in path.read_text(encoding="utf-8").splitlines():
if not line.strip():
continue
row = json.loads(line)
val = row.get("duration_ms")
if isinstance(val, (int, float)):
out.append(int(val))
return out

def p95(values: list[int]) -> int:
if not values:
return 0
values = sorted(values)
k = max(0, int(0.95 * (len(values) - 1)))
return values[k]

b = read_durations(baseline)
c = read_durations(candidate)

if not b or not c:
raise SystemExit("no durations found in one or both files")

b_avg = int(statistics.mean(b))
c_avg = int(statistics.mean(c))

b_p95 = p95(b)
c_p95 = p95(c)

def pct(a: int, b: int) -> float:
if a == 0:
return 0.0
return (b - a) * 100.0 / a

print(f"baseline: n={len(b)} avg_ms={b_avg} p95_ms={b_p95}")
print(f"candidate: n={len(c)} avg_ms={c_avg} p95_ms={c_p95}")
print(f"delta: avg={pct(b_avg, c_avg):+.2f}% p95={pct(b_p95, c_p95):+.2f}%")
PY
"${baseline}" "${candidate}"
1 change: 1 addition & 0 deletions benchmarks/results/.gitkeep
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# keep
2 changes: 1 addition & 1 deletion docs/GMAIL-SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ Pour chaque compte Gmail :
## 🔗 Liens Utiles

- [Gmail API Documentation](https://developers.google.com/gmail/api)
- [MCP Server Gmail](https://github.com/anthropics/mcp-servers) (quand disponible)
- [MCP Server Gmail](https://github.com/modelcontextprotocol/servers) (quand disponible)
- [Google Cloud Console](https://console.cloud.google.com/)

---
Expand Down
Loading