From 9dc94a7b3ae8c7e340f9961774bcf20ca25c91f1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 23 Mar 2026 14:19:54 +0000 Subject: [PATCH] feat: create SkyEye Governance Layer with infra manifest, quota ledger, and service guards Add the skyeye/ directory structure including: - infra-manifest.json: infrastructure inventory and quota definitions - quota-ledger.json: billing cycle tracking and health summary - guards/: per-service guard configs (GitHub, Drive, Notion, Actions, Gemini) - guards/guard-template.json: template for new service guards - scripts/: placeholder files for scan-engine, optimizer, guard-factory, quota-tracker, self-healer, and weekly-scan - scan-report/, logs/daily/, logs/weekly/: empty dirs for future output Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- skyeye/guards/actions-guard.json | 40 +++++++++++++++ skyeye/guards/drive-guard.json | 40 +++++++++++++++ skyeye/guards/gemini-guard.json | 40 +++++++++++++++ skyeye/guards/github-guard.json | 40 +++++++++++++++ skyeye/guards/guard-template.json | 40 +++++++++++++++ skyeye/guards/notion-guard.json | 40 +++++++++++++++ skyeye/infra-manifest.json | 82 +++++++++++++++++++++++++++++++ skyeye/logs/daily/.gitkeep | 0 skyeye/logs/weekly/.gitkeep | 0 skyeye/quota-ledger.json | 43 ++++++++++++++++ skyeye/scan-report/.gitkeep | 0 skyeye/scripts/guard-factory.js | 0 skyeye/scripts/optimizer.js | 0 skyeye/scripts/quota-tracker.js | 0 skyeye/scripts/scan-engine.js | 0 skyeye/scripts/self-healer.js | 0 skyeye/scripts/weekly-scan.js | 0 17 files changed, 365 insertions(+) create mode 100644 skyeye/guards/actions-guard.json create mode 100644 skyeye/guards/drive-guard.json create mode 100644 skyeye/guards/gemini-guard.json create mode 100644 skyeye/guards/github-guard.json create mode 100644 skyeye/guards/guard-template.json create mode 100644 skyeye/guards/notion-guard.json create mode 100644 skyeye/infra-manifest.json create mode 100644 skyeye/logs/daily/.gitkeep create mode 100644 skyeye/logs/weekly/.gitkeep create mode 100644 skyeye/quota-ledger.json create mode 100644 skyeye/scan-report/.gitkeep create mode 100644 skyeye/scripts/guard-factory.js create mode 100644 skyeye/scripts/optimizer.js create mode 100644 skyeye/scripts/quota-tracker.js create mode 100644 skyeye/scripts/scan-engine.js create mode 100644 skyeye/scripts/self-healer.js create mode 100644 skyeye/scripts/weekly-scan.js diff --git a/skyeye/guards/actions-guard.json b/skyeye/guards/actions-guard.json new file mode 100644 index 00000000..fe05ab6e --- /dev/null +++ b/skyeye/guards/actions-guard.json @@ -0,0 +1,40 @@ +{ + "guard_id": "GUARD-ACTIONS", + "target_service": "GitHub Actions", + "status": "active", + "mode": "buffer", + "buffer_policy": { + "enabled": true, + "buffer_path": "buffer/actions-staging/", + "max_buffer_age_hours": 24, + "flush_strategy": "scheduled", + "flush_schedule_cst": ["21:30"] + }, + "quota_policy": { + "monthly_limit": 2000, + "current_month_used": 0, + "daily_soft_limit": 67, + "warning_threshold_percent": 70, + "critical_threshold_percent": 90, + "on_warning": "reduce_frequency", + "on_critical": "emergency_only" + }, + "trigger_policy": { + "default_frequency": "3_per_day", + "min_frequency": "1_per_day", + "max_frequency": "6_per_day", + "auto_adjust": true, + "adjust_based_on": ["quota_remaining", "message_volume", "error_rate"] + }, + "health_check": { + "enabled": true, + "method": "workflow_status_check", + "interval_hours": 6, + "last_check": null, + "last_status": "healthy", + "consecutive_failures": 0, + "max_failures_before_alert": 3 + }, + "last_updated_by": "skyeye-init", + "last_updated_at": "2026-03-23T12:00:00Z" +} diff --git a/skyeye/guards/drive-guard.json b/skyeye/guards/drive-guard.json new file mode 100644 index 00000000..322e980c --- /dev/null +++ b/skyeye/guards/drive-guard.json @@ -0,0 +1,40 @@ +{ + "guard_id": "GUARD-DRIVE", + "target_service": "Google Drive API", + "status": "active", + "mode": "buffer", + "buffer_policy": { + "enabled": true, + "buffer_path": "buffer/drive-staging/", + "max_buffer_age_hours": 24, + "flush_strategy": "scheduled", + "flush_schedule_cst": ["21:30"] + }, + "quota_policy": { + "monthly_limit": 15, + "current_month_used": 0, + "daily_soft_limit": 0, + "warning_threshold_percent": 70, + "critical_threshold_percent": 90, + "on_warning": "reduce_frequency", + "on_critical": "emergency_only" + }, + "trigger_policy": { + "default_frequency": "3_per_day", + "min_frequency": "1_per_day", + "max_frequency": "6_per_day", + "auto_adjust": true, + "adjust_based_on": ["quota_remaining", "message_volume", "error_rate"] + }, + "health_check": { + "enabled": true, + "method": "api_ping", + "interval_hours": 6, + "last_check": null, + "last_status": "healthy", + "consecutive_failures": 0, + "max_failures_before_alert": 3 + }, + "last_updated_by": "skyeye-init", + "last_updated_at": "2026-03-23T12:00:00Z" +} diff --git a/skyeye/guards/gemini-guard.json b/skyeye/guards/gemini-guard.json new file mode 100644 index 00000000..6e50cc4c --- /dev/null +++ b/skyeye/guards/gemini-guard.json @@ -0,0 +1,40 @@ +{ + "guard_id": "GUARD-GEMINI", + "target_service": "Google Gemini API", + "status": "active", + "mode": "buffer", + "buffer_policy": { + "enabled": true, + "buffer_path": "buffer/gemini-staging/", + "max_buffer_age_hours": 24, + "flush_strategy": "scheduled", + "flush_schedule_cst": ["21:30"] + }, + "quota_policy": { + "monthly_limit": 1500, + "current_month_used": 0, + "daily_soft_limit": 50, + "warning_threshold_percent": 70, + "critical_threshold_percent": 90, + "on_warning": "reduce_frequency", + "on_critical": "emergency_only" + }, + "trigger_policy": { + "default_frequency": "3_per_day", + "min_frequency": "1_per_day", + "max_frequency": "6_per_day", + "auto_adjust": true, + "adjust_based_on": ["quota_remaining", "message_volume", "error_rate"] + }, + "health_check": { + "enabled": true, + "method": "api_ping", + "interval_hours": 6, + "last_check": null, + "last_status": "healthy", + "consecutive_failures": 0, + "max_failures_before_alert": 3 + }, + "last_updated_by": "skyeye-init", + "last_updated_at": "2026-03-23T12:00:00Z" +} diff --git a/skyeye/guards/github-guard.json b/skyeye/guards/github-guard.json new file mode 100644 index 00000000..0b407374 --- /dev/null +++ b/skyeye/guards/github-guard.json @@ -0,0 +1,40 @@ +{ + "guard_id": "GUARD-GITHUB", + "target_service": "GitHub API", + "status": "active", + "mode": "buffer", + "buffer_policy": { + "enabled": true, + "buffer_path": "buffer/inbox/", + "max_buffer_age_hours": 24, + "flush_strategy": "scheduled", + "flush_schedule_cst": ["21:30"] + }, + "quota_policy": { + "monthly_limit": 2000, + "current_month_used": 0, + "daily_soft_limit": 67, + "warning_threshold_percent": 70, + "critical_threshold_percent": 90, + "on_warning": "reduce_frequency", + "on_critical": "emergency_only" + }, + "trigger_policy": { + "default_frequency": "3_per_day", + "min_frequency": "1_per_day", + "max_frequency": "6_per_day", + "auto_adjust": true, + "adjust_based_on": ["quota_remaining", "message_volume", "error_rate"] + }, + "health_check": { + "enabled": true, + "method": "api_ping", + "interval_hours": 6, + "last_check": null, + "last_status": "healthy", + "consecutive_failures": 0, + "max_failures_before_alert": 3 + }, + "last_updated_by": "skyeye-init", + "last_updated_at": "2026-03-23T12:00:00Z" +} diff --git a/skyeye/guards/guard-template.json b/skyeye/guards/guard-template.json new file mode 100644 index 00000000..4f9ff7e4 --- /dev/null +++ b/skyeye/guards/guard-template.json @@ -0,0 +1,40 @@ +{ + "guard_id": "GUARD-[SERVICE_NAME]", + "target_service": "[Service Name]", + "status": "initializing", + "mode": "buffer", + "buffer_policy": { + "enabled": true, + "buffer_path": "buffer/[service]-staging/", + "max_buffer_age_hours": 24, + "flush_strategy": "scheduled", + "flush_schedule_cst": ["21:30"] + }, + "quota_policy": { + "monthly_limit": "[TO_BE_FILLED]", + "current_month_used": 0, + "daily_soft_limit": 0, + "warning_threshold_percent": 70, + "critical_threshold_percent": 90, + "on_warning": "reduce_frequency", + "on_critical": "emergency_only" + }, + "trigger_policy": { + "default_frequency": "3_per_day", + "min_frequency": "1_per_day", + "max_frequency": "6_per_day", + "auto_adjust": true, + "adjust_based_on": ["quota_remaining", "message_volume", "error_rate"] + }, + "health_check": { + "enabled": true, + "method": "[TO_BE_FILLED]", + "interval_hours": 6, + "last_check": null, + "last_status": "unknown", + "consecutive_failures": 0, + "max_failures_before_alert": 3 + }, + "last_updated_by": "skyeye-init", + "last_updated_at": "2026-03-23T12:00:00Z" +} diff --git a/skyeye/guards/notion-guard.json b/skyeye/guards/notion-guard.json new file mode 100644 index 00000000..d141b9ba --- /dev/null +++ b/skyeye/guards/notion-guard.json @@ -0,0 +1,40 @@ +{ + "guard_id": "GUARD-NOTION", + "target_service": "Notion API", + "status": "active", + "mode": "buffer", + "buffer_policy": { + "enabled": true, + "buffer_path": "buffer/notion-staging/", + "max_buffer_age_hours": 24, + "flush_strategy": "scheduled", + "flush_schedule_cst": ["21:30"] + }, + "quota_policy": { + "monthly_limit": 3, + "current_month_used": 0, + "daily_soft_limit": 0, + "warning_threshold_percent": 70, + "critical_threshold_percent": 90, + "on_warning": "reduce_frequency", + "on_critical": "emergency_only" + }, + "trigger_policy": { + "default_frequency": "3_per_day", + "min_frequency": "1_per_day", + "max_frequency": "6_per_day", + "auto_adjust": true, + "adjust_based_on": ["quota_remaining", "message_volume", "error_rate"] + }, + "health_check": { + "enabled": true, + "method": "api_ping", + "interval_hours": 6, + "last_check": null, + "last_status": "healthy", + "consecutive_failures": 0, + "max_failures_before_alert": 3 + }, + "last_updated_by": "skyeye-init", + "last_updated_at": "2026-03-23T12:00:00Z" +} diff --git a/skyeye/infra-manifest.json b/skyeye/infra-manifest.json new file mode 100644 index 00000000..07473850 --- /dev/null +++ b/skyeye/infra-manifest.json @@ -0,0 +1,82 @@ +{ + "version": "1.0.0", + "last_scan": "2026-03-23T12:00:00Z", + "last_scan_by": "skyeye-weekly-scan", + "infrastructure": { + "github": { + "service": "GitHub", + "plan": "Free", + "repos": [ + { + "name": "qinfendebingshuo/guanghulab", + "role": "main", + "guard": "buffer/" + }, + { + "name": "WENZHUOXI/guanghu-awen", + "role": "sub-repo", + "persona": "PER-ZQ001", + "guard": ".github/persona-brain/" + } + ], + "quotas": { + "actions_minutes_per_month": 2000, + "actions_current_used": 0, + "actions_budget_allocated": { + "buffer_collect": 270, + "buffer_flush": 90, + "skyeye_checkin": 180, + "skyeye_weekly_scan": 30, + "other_workflows": 200, + "emergency_reserve": 1230 + }, + "storage_limit_gb": 0.5, + "lfs_bandwidth_gb": 1 + } + }, + "google_drive": { + "service": "Google Drive", + "plan": "Google One / Free 15GB", + "guard": "buffer/drive-staging/", + "quotas": { + "storage_gb": 15, + "current_used_gb": 0, + "apps_script_daily_triggers": 20, + "apps_script_runtime_min_per_day": 90, + "drive_api_queries_per_100s": 20000 + } + }, + "notion": { + "service": "Notion", + "plan": "Plus", + "guard": "霜砚(PER-SY001)", + "quotas": { + "api_requests_per_second": 3, + "blocks_per_page": 10000, + "file_upload_mb": 5, + "guest_limit": 100 + } + }, + "gemini": { + "service": "Google Gemini", + "plan": "Free / Pro", + "guard": "buffer/gemini-staging/", + "quotas": { + "requests_per_minute": 15, + "requests_per_day": 1500, + "context_window_tokens": 1000000, + "personal_context_files": 100 + } + }, + "github_actions": { + "service": "GitHub Actions", + "plan": "Free", + "guard": "skyeye/guards/actions-guard.json", + "quotas": { + "concurrent_jobs": 20, + "minutes_per_month": 2000, + "job_timeout_hours": 6 + } + } + } +} diff --git a/skyeye/logs/daily/.gitkeep b/skyeye/logs/daily/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/skyeye/logs/weekly/.gitkeep b/skyeye/logs/weekly/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/skyeye/quota-ledger.json b/skyeye/quota-ledger.json new file mode 100644 index 00000000..e780d1df --- /dev/null +++ b/skyeye/quota-ledger.json @@ -0,0 +1,43 @@ +{ + "ledger_version": "1.0.0", + "billing_cycle": { + "start": "2026-03-01", + "end": "2026-03-31" + }, + "services": { + "github_actions": { + "limit": 2000, + "used": 0, + "remaining": 2000, + "allocated": { + "buffer_system": 360, + "skyeye_daily": 180, + "skyeye_weekly": 30, + "sub_repo_checkins": 200, + "emergency": 1230 + }, + "daily_entries": [] + }, + "google_drive": { + "storage_limit_gb": 15, + "storage_used_gb": 0, + "apps_script_triggers_today": 0, + "apps_script_triggers_limit": 20 + }, + "notion_api": { + "rate_limit_per_second": 3, + "requests_today": 0, + "errors_today": 0 + }, + "gemini": { + "daily_limit": 1500, + "daily_used": 0, + "per_minute_limit": 15 + } + }, + "health_summary": { + "overall": "healthy", + "alerts": [], + "last_updated": "2026-03-23T12:00:00Z" + } +} diff --git a/skyeye/scan-report/.gitkeep b/skyeye/scan-report/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/skyeye/scripts/guard-factory.js b/skyeye/scripts/guard-factory.js new file mode 100644 index 00000000..e69de29b diff --git a/skyeye/scripts/optimizer.js b/skyeye/scripts/optimizer.js new file mode 100644 index 00000000..e69de29b diff --git a/skyeye/scripts/quota-tracker.js b/skyeye/scripts/quota-tracker.js new file mode 100644 index 00000000..e69de29b diff --git a/skyeye/scripts/scan-engine.js b/skyeye/scripts/scan-engine.js new file mode 100644 index 00000000..e69de29b diff --git a/skyeye/scripts/self-healer.js b/skyeye/scripts/self-healer.js new file mode 100644 index 00000000..e69de29b diff --git a/skyeye/scripts/weekly-scan.js b/skyeye/scripts/weekly-scan.js new file mode 100644 index 00000000..e69de29b