ai-employees 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/TRADEMARKS.md +45 -0
- package/docs/COST.md +59 -0
- package/docs/FAQ.md +39 -0
- package/docs/GUARDRAILS.md +17 -0
- package/docs/HARNESSES.md +38 -0
- package/docs/HOW-EMPLOYEES-WORK.md +86 -0
- package/docs/INSTALL.md +148 -0
- package/docs/PREREQUISITES.md +91 -0
- package/docs/STANDARD.md +194 -0
- package/docs/UPGRADING.md +74 -0
- package/docs/WHAT-SETS-THEM-APART.md +10 -0
- package/employees/ad-manager-employee/AGENTS.md +46 -0
- package/employees/ad-manager-employee/CAPABILITIES.md +1002 -0
- package/employees/ad-manager-employee/CHANGELOG.md +99 -0
- package/employees/ad-manager-employee/CONTRACT.md +977 -0
- package/employees/ad-manager-employee/INSTALL-PROMPT.md +263 -0
- package/employees/ad-manager-employee/README.md +357 -0
- package/employees/ad-manager-employee/RELEASES.md +25 -0
- package/employees/ad-manager-employee/ROLE.md +617 -0
- package/employees/ad-manager-employee/SCHEDULE.md +275 -0
- package/employees/ad-manager-employee/VERSION +1 -0
- package/employees/ad-manager-employee/employee.json +185 -0
- package/employees/ad-manager-employee/examples/README.md +21 -0
- package/employees/ad-manager-employee/examples/board/LAUNCH-BOARD.md +19 -0
- package/employees/ad-manager-employee/examples/board/board.json +51 -0
- package/employees/ad-manager-employee/examples/brief-latest.md +20 -0
- package/employees/ad-manager-employee/examples/build/campaign-storm-repair.md +51 -0
- package/employees/ad-manager-employee/examples/creative/set-2026-03-04-fast-estimate/set.md +31 -0
- package/employees/ad-manager-employee/examples/metrics/daily.jsonl +2 -0
- package/employees/ad-manager-employee/examples/runlog.jsonl +3 -0
- package/employees/ad-manager-employee/recipes/BROWSER-RECIPES.md +558 -0
- package/employees/ad-manager-employee/recipes/META-ADS-RECIPES.md +100 -0
- package/employees/ad-manager-employee/routines/ads-account-intake/SKILL.md +929 -0
- package/employees/ad-manager-employee/routines/ads-account-read/SKILL.md +780 -0
- package/employees/ad-manager-employee/routines/ads-build-desk/SKILL.md +915 -0
- package/employees/ad-manager-employee/routines/ads-change-list/SKILL.md +818 -0
- package/employees/ad-manager-employee/routines/ads-creative-retro/SKILL.md +807 -0
- package/employees/ad-manager-employee/routines/ads-creative-studio/SKILL.md +802 -0
- package/employees/ad-manager-employee/routines/ads-desk-standup/SKILL.md +822 -0
- package/employees/ad-manager-employee/run/ads-account-intake.cmd.example +11 -0
- package/employees/ad-manager-employee/run/ads-account-read.cmd.example +11 -0
- package/employees/ad-manager-employee/run/ads-build-desk.cmd.example +11 -0
- package/employees/ad-manager-employee/run/ads-change-list.cmd.example +11 -0
- package/employees/ad-manager-employee/run/ads-creative-retro.cmd.example +11 -0
- package/employees/ad-manager-employee/run/ads-creative-studio.cmd.example +11 -0
- package/employees/ad-manager-employee/run/ads-desk-standup.cmd.example +11 -0
- package/employees/ad-manager-employee/scripts/copy-check.mjs +815 -0
- package/employees/ad-manager-employee/scripts/guard.mjs +447 -0
- package/employees/ad-manager-employee/scripts/review.mjs +443 -0
- package/employees/ad-manager-employee/scripts/runlog.mjs +785 -0
- package/employees/chief-of-staff/AGENTS.md +46 -0
- package/employees/chief-of-staff/CAPABILITIES.md +875 -0
- package/employees/chief-of-staff/CHANGELOG.md +91 -0
- package/employees/chief-of-staff/CONTRACT.md +1039 -0
- package/employees/chief-of-staff/INSTALL-PROMPT.md +206 -0
- package/employees/chief-of-staff/README.md +382 -0
- package/employees/chief-of-staff/RELEASES.md +22 -0
- package/employees/chief-of-staff/ROLE.md +425 -0
- package/employees/chief-of-staff/SCHEDULE.md +288 -0
- package/employees/chief-of-staff/VERSION +1 -0
- package/employees/chief-of-staff/employee.json +214 -0
- package/employees/chief-of-staff/examples/README.md +15 -0
- package/employees/chief-of-staff/examples/brief-latest.md +20 -0
- package/employees/chief-of-staff/examples/decisions/REGISTER.md +22 -0
- package/employees/chief-of-staff/examples/dossiers/dossier-seo-employee--seo-publish-run--silent-stop.md +43 -0
- package/employees/chief-of-staff/examples/fleet/fleet.json +119 -0
- package/employees/chief-of-staff/examples/runlog.jsonl +3 -0
- package/employees/chief-of-staff/recipes/BROWSER-RECIPES.md +512 -0
- package/employees/chief-of-staff/routines/cos-charter-and-fleet-audit/SKILL.md +1008 -0
- package/employees/chief-of-staff/routines/cos-decision-brief/SKILL.md +639 -0
- package/employees/chief-of-staff/routines/cos-decision-review/SKILL.md +644 -0
- package/employees/chief-of-staff/routines/cos-fault-dossier/SKILL.md +656 -0
- package/employees/chief-of-staff/routines/cos-fleet-reconcile/SKILL.md +942 -0
- package/employees/chief-of-staff/routines/cos-market-sweep/SKILL.md +655 -0
- package/employees/chief-of-staff/routines/cos-metrics-review/SKILL.md +746 -0
- package/employees/chief-of-staff/run/cos-charter-and-fleet-audit.cmd.example +11 -0
- package/employees/chief-of-staff/run/cos-decision-brief.cmd.example +11 -0
- package/employees/chief-of-staff/run/cos-decision-review.cmd.example +11 -0
- package/employees/chief-of-staff/run/cos-fault-dossier.cmd.example +11 -0
- package/employees/chief-of-staff/run/cos-fleet-reconcile.cmd.example +11 -0
- package/employees/chief-of-staff/run/cos-market-sweep.cmd.example +11 -0
- package/employees/chief-of-staff/run/cos-metrics-review.cmd.example +11 -0
- package/employees/chief-of-staff/scripts/copy-check.mjs +812 -0
- package/employees/chief-of-staff/scripts/guard.mjs +447 -0
- package/employees/chief-of-staff/scripts/runlog.mjs +766 -0
- package/employees/customer-satisfaction-employee/AGENTS.md +47 -0
- package/employees/customer-satisfaction-employee/CAPABILITIES.md +910 -0
- package/employees/customer-satisfaction-employee/CHANGELOG.md +91 -0
- package/employees/customer-satisfaction-employee/CONTRACT.md +1121 -0
- package/employees/customer-satisfaction-employee/INSTALL-PROMPT.md +290 -0
- package/employees/customer-satisfaction-employee/README.md +378 -0
- package/employees/customer-satisfaction-employee/RELEASES.md +22 -0
- package/employees/customer-satisfaction-employee/ROLE.md +393 -0
- package/employees/customer-satisfaction-employee/SCHEDULE.md +283 -0
- package/employees/customer-satisfaction-employee/VERSION +1 -0
- package/employees/customer-satisfaction-employee/employee.json +231 -0
- package/employees/customer-satisfaction-employee/examples/README.md +15 -0
- package/employees/customer-satisfaction-employee/examples/brief-latest.md +17 -0
- package/employees/customer-satisfaction-employee/examples/desk/DESK-BOARD.md +18 -0
- package/employees/customer-satisfaction-employee/examples/queue/2026-03-05-reply.md +36 -0
- package/employees/customer-satisfaction-employee/examples/runlog.jsonl +3 -0
- package/employees/customer-satisfaction-employee/examples/tickets/tickets.jsonl +2 -0
- package/employees/customer-satisfaction-employee/recipes/BROWSER-RECIPES.md +549 -0
- package/employees/customer-satisfaction-employee/routines/csat-churn-watch/SKILL.md +709 -0
- package/employees/customer-satisfaction-employee/routines/csat-deflection-desk/SKILL.md +671 -0
- package/employees/customer-satisfaction-employee/routines/csat-desk-intake/SKILL.md +1115 -0
- package/employees/customer-satisfaction-employee/routines/csat-desk-standup/SKILL.md +831 -0
- package/employees/customer-satisfaction-employee/routines/csat-inbox-sweep/SKILL.md +673 -0
- package/employees/customer-satisfaction-employee/routines/csat-reply-desk/SKILL.md +755 -0
- package/employees/customer-satisfaction-employee/routines/csat-satisfaction-report/SKILL.md +844 -0
- package/employees/customer-satisfaction-employee/routines/csat-taxonomy-refresh/SKILL.md +798 -0
- package/employees/customer-satisfaction-employee/run/csat-churn-watch.cmd.example +11 -0
- package/employees/customer-satisfaction-employee/run/csat-deflection-desk.cmd.example +11 -0
- package/employees/customer-satisfaction-employee/run/csat-desk-intake.cmd.example +11 -0
- package/employees/customer-satisfaction-employee/run/csat-desk-standup.cmd.example +11 -0
- package/employees/customer-satisfaction-employee/run/csat-inbox-sweep.cmd.example +11 -0
- package/employees/customer-satisfaction-employee/run/csat-reply-desk.cmd.example +11 -0
- package/employees/customer-satisfaction-employee/run/csat-satisfaction-report.cmd.example +11 -0
- package/employees/customer-satisfaction-employee/run/csat-taxonomy-refresh.cmd.example +11 -0
- package/employees/customer-satisfaction-employee/scripts/copy-check.mjs +888 -0
- package/employees/customer-satisfaction-employee/scripts/guard.mjs +447 -0
- package/employees/customer-satisfaction-employee/scripts/runlog.mjs +778 -0
- package/employees/gtm-engineer/AGENTS.md +47 -0
- package/employees/gtm-engineer/CAPABILITIES.md +929 -0
- package/employees/gtm-engineer/CHANGELOG.md +93 -0
- package/employees/gtm-engineer/CONTRACT.md +977 -0
- package/employees/gtm-engineer/INSTALL-PROMPT.md +237 -0
- package/employees/gtm-engineer/README.md +355 -0
- package/employees/gtm-engineer/RELEASES.md +22 -0
- package/employees/gtm-engineer/ROLE.md +551 -0
- package/employees/gtm-engineer/SCHEDULE.md +265 -0
- package/employees/gtm-engineer/VERSION +1 -0
- package/employees/gtm-engineer/employee.json +230 -0
- package/employees/gtm-engineer/examples/README.md +15 -0
- package/employees/gtm-engineer/examples/board/LAUNCH-BOARD.md +12 -0
- package/employees/gtm-engineer/examples/brief-latest.md +19 -0
- package/employees/gtm-engineer/examples/crm/contacts.csv +4 -0
- package/employees/gtm-engineer/examples/queue/2026-03-05-email.md +26 -0
- package/employees/gtm-engineer/examples/runlog.jsonl +3 -0
- package/employees/gtm-engineer/recipes/BROWSER-RECIPES.md +582 -0
- package/employees/gtm-engineer/routines/gtm-board-standup/SKILL.md +745 -0
- package/employees/gtm-engineer/routines/gtm-icp-refresh/SKILL.md +647 -0
- package/employees/gtm-engineer/routines/gtm-intake-and-dashboard/SKILL.md +1046 -0
- package/employees/gtm-engineer/routines/gtm-launch-step-runner/SKILL.md +802 -0
- package/employees/gtm-engineer/routines/gtm-outreach-queue/SKILL.md +708 -0
- package/employees/gtm-engineer/routines/gtm-paid-and-tracking-guard/SKILL.md +970 -0
- package/employees/gtm-engineer/routines/gtm-scoreboard/SKILL.md +740 -0
- package/employees/gtm-engineer/routines/gtm-signal-sweep/SKILL.md +648 -0
- package/employees/gtm-engineer/run/gtm-board-standup.cmd.example +11 -0
- package/employees/gtm-engineer/run/gtm-icp-refresh.cmd.example +11 -0
- package/employees/gtm-engineer/run/gtm-intake-and-dashboard.cmd.example +11 -0
- package/employees/gtm-engineer/run/gtm-launch-step-runner.cmd.example +11 -0
- package/employees/gtm-engineer/run/gtm-outreach-queue.cmd.example +11 -0
- package/employees/gtm-engineer/run/gtm-paid-and-tracking-guard.cmd.example +11 -0
- package/employees/gtm-engineer/run/gtm-scoreboard.cmd.example +11 -0
- package/employees/gtm-engineer/run/gtm-signal-sweep.cmd.example +11 -0
- package/employees/gtm-engineer/scripts/copy-check.mjs +815 -0
- package/employees/gtm-engineer/scripts/guard.mjs +447 -0
- package/employees/gtm-engineer/scripts/runlog.mjs +772 -0
- package/employees/sales-employee/AGENTS.md +46 -0
- package/employees/sales-employee/CAPABILITIES.md +880 -0
- package/employees/sales-employee/CHANGELOG.md +92 -0
- package/employees/sales-employee/CONTRACT.md +1161 -0
- package/employees/sales-employee/INSTALL-PROMPT.md +256 -0
- package/employees/sales-employee/README.md +372 -0
- package/employees/sales-employee/RELEASES.md +22 -0
- package/employees/sales-employee/ROLE.md +319 -0
- package/employees/sales-employee/SCHEDULE.md +263 -0
- package/employees/sales-employee/VERSION +1 -0
- package/employees/sales-employee/employee.json +202 -0
- package/employees/sales-employee/examples/README.md +16 -0
- package/employees/sales-employee/examples/brief-latest.md +17 -0
- package/employees/sales-employee/examples/crm/contacts.csv +4 -0
- package/employees/sales-employee/examples/crm/prospects.jsonl +2 -0
- package/employees/sales-employee/examples/pipeline/PIPELINE.md +18 -0
- package/employees/sales-employee/examples/queue/2026-03-05-first-touch.md +29 -0
- package/employees/sales-employee/examples/runlog.jsonl +3 -0
- package/employees/sales-employee/recipes/BROWSER-RECIPES.md +535 -0
- package/employees/sales-employee/routines/sales-desk-setup/SKILL.md +896 -0
- package/employees/sales-employee/routines/sales-desk-standup/SKILL.md +818 -0
- package/employees/sales-employee/routines/sales-first-touch-drafts/SKILL.md +681 -0
- package/employees/sales-employee/routines/sales-followup-sweep/SKILL.md +736 -0
- package/employees/sales-employee/routines/sales-pipeline-review/SKILL.md +765 -0
- package/employees/sales-employee/routines/sales-prospect-sweep/SKILL.md +696 -0
- package/employees/sales-employee/routines/sales-qualification-refresh/SKILL.md +743 -0
- package/employees/sales-employee/run/sales-desk-setup.cmd.example +11 -0
- package/employees/sales-employee/run/sales-desk-standup.cmd.example +11 -0
- package/employees/sales-employee/run/sales-first-touch-drafts.cmd.example +11 -0
- package/employees/sales-employee/run/sales-followup-sweep.cmd.example +11 -0
- package/employees/sales-employee/run/sales-pipeline-review.cmd.example +11 -0
- package/employees/sales-employee/run/sales-prospect-sweep.cmd.example +11 -0
- package/employees/sales-employee/run/sales-qualification-refresh.cmd.example +11 -0
- package/employees/sales-employee/scripts/copy-check.mjs +815 -0
- package/employees/sales-employee/scripts/guard.mjs +447 -0
- package/employees/sales-employee/scripts/runlog.mjs +773 -0
- package/employees/seo-employee/AEO-PLAYBOOK.md +51 -0
- package/employees/seo-employee/AGENTS.md +47 -0
- package/employees/seo-employee/CAPABILITIES.md +1006 -0
- package/employees/seo-employee/CHANGELOG.md +95 -0
- package/employees/seo-employee/CONTRACT.md +1020 -0
- package/employees/seo-employee/INSTALL-PROMPT.md +233 -0
- package/employees/seo-employee/README.md +368 -0
- package/employees/seo-employee/RELEASES.md +22 -0
- package/employees/seo-employee/ROLE.md +331 -0
- package/employees/seo-employee/SCHEDULE.md +267 -0
- package/employees/seo-employee/VERSION +1 -0
- package/employees/seo-employee/employee.json +233 -0
- package/employees/seo-employee/examples/README.md +14 -0
- package/employees/seo-employee/examples/board/WORK-BOARD.md +16 -0
- package/employees/seo-employee/examples/brief-latest.md +16 -0
- package/employees/seo-employee/examples/content/drafts.jsonl +2 -0
- package/employees/seo-employee/examples/content/published.jsonl +2 -0
- package/employees/seo-employee/examples/drafts/roof-lifespan-by-material/body.md +39 -0
- package/employees/seo-employee/examples/drafts/roof-lifespan-by-material/meta.json +16 -0
- package/employees/seo-employee/examples/runlog.jsonl +3 -0
- package/employees/seo-employee/recipes/BROWSER-RECIPES.md +576 -0
- package/employees/seo-employee/routines/seo-answer-visibility/SKILL.md +55 -0
- package/employees/seo-employee/routines/seo-calendar-refill/SKILL.md +614 -0
- package/employees/seo-employee/routines/seo-draft-run/SKILL.md +722 -0
- package/employees/seo-employee/routines/seo-index-sweep/SKILL.md +629 -0
- package/employees/seo-employee/routines/seo-intake-and-map/SKILL.md +916 -0
- package/employees/seo-employee/routines/seo-publish-run/SKILL.md +713 -0
- package/employees/seo-employee/routines/seo-rank-review/SKILL.md +795 -0
- package/employees/seo-employee/routines/seo-standup/SKILL.md +792 -0
- package/employees/seo-employee/run/seo-answer-visibility.cmd.example +11 -0
- package/employees/seo-employee/run/seo-calendar-refill.cmd.example +11 -0
- package/employees/seo-employee/run/seo-draft-run.cmd.example +11 -0
- package/employees/seo-employee/run/seo-index-sweep.cmd.example +11 -0
- package/employees/seo-employee/run/seo-intake-and-map.cmd.example +11 -0
- package/employees/seo-employee/run/seo-publish-run.cmd.example +11 -0
- package/employees/seo-employee/run/seo-rank-review.cmd.example +11 -0
- package/employees/seo-employee/run/seo-standup.cmd.example +11 -0
- package/employees/seo-employee/scripts/answer-audit.mjs +63 -0
- package/employees/seo-employee/scripts/copy-check.mjs +843 -0
- package/employees/seo-employee/scripts/guard.mjs +447 -0
- package/employees/seo-employee/scripts/runlog.mjs +864 -0
- package/employees/seo-employee/standards/PUBLISH-STANDARD.md +229 -0
- package/employees/social-media-employee/AGENTS.md +46 -0
- package/employees/social-media-employee/CAPABILITIES.md +1015 -0
- package/employees/social-media-employee/CHANGELOG.md +91 -0
- package/employees/social-media-employee/CONTRACT.md +1036 -0
- package/employees/social-media-employee/INSTALL-PROMPT.md +234 -0
- package/employees/social-media-employee/README.md +386 -0
- package/employees/social-media-employee/RELEASES.md +22 -0
- package/employees/social-media-employee/ROLE.md +376 -0
- package/employees/social-media-employee/SCHEDULE.md +278 -0
- package/employees/social-media-employee/VERSION +1 -0
- package/employees/social-media-employee/employee.json +195 -0
- package/employees/social-media-employee/examples/README.md +20 -0
- package/employees/social-media-employee/examples/brief-latest.md +19 -0
- package/employees/social-media-employee/examples/calendar/CALENDAR.md +23 -0
- package/employees/social-media-employee/examples/calendar/calendar.json +30 -0
- package/employees/social-media-employee/examples/posts/posts.jsonl +2 -0
- package/employees/social-media-employee/examples/queue/2026-03-05-business-network.md +28 -0
- package/employees/social-media-employee/examples/runlog.jsonl +3 -0
- package/employees/social-media-employee/recipes/BROWSER-RECIPES.md +550 -0
- package/employees/social-media-employee/routines/soc-calendar-standup/SKILL.md +783 -0
- package/employees/social-media-employee/routines/soc-draft-queue/SKILL.md +683 -0
- package/employees/social-media-employee/routines/soc-engagement-sweep/SKILL.md +636 -0
- package/employees/social-media-employee/routines/soc-intake-and-voice/SKILL.md +909 -0
- package/employees/social-media-employee/routines/soc-material-sweep/SKILL.md +658 -0
- package/employees/social-media-employee/routines/soc-performance-review/SKILL.md +795 -0
- package/employees/social-media-employee/routines/soc-publish-run/SKILL.md +643 -0
- package/employees/social-media-employee/run/soc-calendar-standup.cmd.example +11 -0
- package/employees/social-media-employee/run/soc-draft-queue.cmd.example +11 -0
- package/employees/social-media-employee/run/soc-engagement-sweep.cmd.example +11 -0
- package/employees/social-media-employee/run/soc-intake-and-voice.cmd.example +11 -0
- package/employees/social-media-employee/run/soc-material-sweep.cmd.example +11 -0
- package/employees/social-media-employee/run/soc-performance-review.cmd.example +11 -0
- package/employees/social-media-employee/run/soc-publish-run.cmd.example +11 -0
- package/employees/social-media-employee/scripts/copy-check.mjs +950 -0
- package/employees/social-media-employee/scripts/guard.mjs +447 -0
- package/employees/social-media-employee/scripts/runlog.mjs +786 -0
- package/employees/web-dev-employee/AGENTS.md +47 -0
- package/employees/web-dev-employee/CAPABILITIES.md +950 -0
- package/employees/web-dev-employee/CHANGELOG.md +91 -0
- package/employees/web-dev-employee/CONTRACT.md +1052 -0
- package/employees/web-dev-employee/INSTALL-PROMPT.md +210 -0
- package/employees/web-dev-employee/README.md +352 -0
- package/employees/web-dev-employee/RELEASES.md +22 -0
- package/employees/web-dev-employee/ROLE.md +383 -0
- package/employees/web-dev-employee/SCHEDULE.md +280 -0
- package/employees/web-dev-employee/VERSION +1 -0
- package/employees/web-dev-employee/employee.json +228 -0
- package/employees/web-dev-employee/examples/README.md +13 -0
- package/employees/web-dev-employee/examples/board/REVIEW-BOARD.md +20 -0
- package/employees/web-dev-employee/examples/brief-latest.md +14 -0
- package/employees/web-dev-employee/examples/changes/2026-03-05-fix-C-005.md +30 -0
- package/employees/web-dev-employee/examples/changes/changes.jsonl +2 -0
- package/employees/web-dev-employee/examples/health/incidents.jsonl +2 -0
- package/employees/web-dev-employee/examples/runlog.jsonl +3 -0
- package/employees/web-dev-employee/recipes/BROWSER-RECIPES.md +477 -0
- package/employees/web-dev-employee/routines/web-dependency-run/SKILL.md +634 -0
- package/employees/web-dev-employee/routines/web-fix-runner/SKILL.md +754 -0
- package/employees/web-dev-employee/routines/web-guardrail-review/SKILL.md +613 -0
- package/employees/web-dev-employee/routines/web-inventory-refresh/SKILL.md +700 -0
- package/employees/web-dev-employee/routines/web-platform-guard/SKILL.md +707 -0
- package/employees/web-dev-employee/routines/web-site-sweep/SKILL.md +732 -0
- package/employees/web-dev-employee/routines/web-standup/SKILL.md +738 -0
- package/employees/web-dev-employee/routines/web-weekly-report/SKILL.md +623 -0
- package/employees/web-dev-employee/run/web-dependency-run.cmd.example +11 -0
- package/employees/web-dev-employee/run/web-fix-runner.cmd.example +11 -0
- package/employees/web-dev-employee/run/web-guardrail-review.cmd.example +11 -0
- package/employees/web-dev-employee/run/web-inventory-refresh.cmd.example +11 -0
- package/employees/web-dev-employee/run/web-platform-guard.cmd.example +11 -0
- package/employees/web-dev-employee/run/web-site-sweep.cmd.example +11 -0
- package/employees/web-dev-employee/run/web-standup.cmd.example +11 -0
- package/employees/web-dev-employee/run/web-weekly-report.cmd.example +11 -0
- package/employees/web-dev-employee/scripts/copy-check.mjs +872 -0
- package/employees/web-dev-employee/scripts/guard.mjs +447 -0
- package/employees/web-dev-employee/scripts/runlog.mjs +792 -0
- package/installer/cli.mjs +250 -0
- package/installer/upgrade.mjs +255 -0
- package/package.json +43 -0
- package/skills/hire/SKILL.md +72 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# Web Dev Employee: the schedule
|
|
2
|
+
|
|
3
|
+
This file is the only place cadences, fire times, windows, budgets, period keys, and browser lanes live. Every routine reads its own row here at the top of every run, as Step 0.1, and takes `days`, `window_start`, `window_end`, `key`, `budget`, and `browser` from it. **A SKILL.md never carries a clock time.** A registered job may drift from this table without breaking anything, because the window guard catches it and the monthly drift check reports it.
|
|
4
|
+
|
|
5
|
+
If a routine cannot find its row here, or cannot parse it, it records `status: "failed"` with the blocker `no SCHEDULE.md row for <routine-id>` and exits. It never guesses a window.
|
|
6
|
+
|
|
7
|
+
`CONTRACT.md` section 1 carries the same eight routines with their cadence in words. **Where the two disagree, this file wins**, because this is the file the member edits and the file the guard reads.
|
|
8
|
+
|
|
9
|
+
All times are 24 hour local machine time. No time in this file is UTC and none is relative to any other zone.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. The rows
|
|
14
|
+
|
|
15
|
+
This table is authoritative. Edit it, and the routines follow on their next fire.
|
|
16
|
+
|
|
17
|
+
| routine | days | fire | window_start | window_end | key | budget | browser |
|
|
18
|
+
|---|---|---|---|---|---|---|---|
|
|
19
|
+
| `web-site-sweep` | `mon-fri` | 06:45 | 06:30 | 09:45 | `YYYY-MM-DD` | 25 min | heavy |
|
|
20
|
+
| `web-standup` | `mon-fri` | 07:30 | 07:15 | 11:30 | `YYYY-MM-DD` | 15 min | never |
|
|
21
|
+
| `web-fix-runner` | `mon-fri` | 08:10 | 08:00 | 13:00 | `YYYY-MM-DD` | 40 min | conditional |
|
|
22
|
+
| `web-platform-guard` | `mon` | 10:30 | 10:15 | 15:00 | `YYYY-Www` | 30 min | heavy |
|
|
23
|
+
| `web-inventory-refresh` | `first-weekday` | 11:45 | 11:30 | 16:00 | `YYYY-MM` | 45 min | light |
|
|
24
|
+
| `web-dependency-run` | `wed` | 13:30 | 13:15 | 17:00 | `YYYY-Www` | 40 min | conditional |
|
|
25
|
+
| `web-weekly-report` | `fri` | 15:30 | 15:15 | 18:00 | `YYYY-Www` | 35 min | light |
|
|
26
|
+
| `web-guardrail-review` | `last-weekday` | 16:45 | 16:30 | 19:30 | `YYYY-MM` | 20 min | never |
|
|
27
|
+
|
|
28
|
+
Eight rows, eight routines, and every id carries the `web-` prefix so they namespace cleanly beside other AI Employees.
|
|
29
|
+
|
|
30
|
+
### 1.1 The column meanings
|
|
31
|
+
|
|
32
|
+
| Column | Meaning |
|
|
33
|
+
|---|---|
|
|
34
|
+
| `routine` | The routine id. It equals the folder name under `routines/` and the YAML `name` key in that folder's SKILL.md. All three are always the same string |
|
|
35
|
+
| `days` | Which days the routine is allowed to run. Vocabulary in section 3 |
|
|
36
|
+
| `fire` | The time to register in whatever schedules this machine. Not a guarantee, and not what the window guard checks |
|
|
37
|
+
| `window_start`, `window_end` | The only thing the window guard checks. Outside this range the routine records `skipped-out-of-window` and exits |
|
|
38
|
+
| `key` | The period key format used by the once per period guard. Local date for weekdays, ISO week for weekly, calendar month for monthly, computed from the local date and never from a UTC timestamp |
|
|
39
|
+
| `budget` | Hard wall clock budget. At budget the routine writes what it has and records `partial` |
|
|
40
|
+
| `browser` | How much browser control the routine needs. This drives the staggering in section 4 and decides whether it takes the mutex |
|
|
41
|
+
|
|
42
|
+
### 1.2 The browser column
|
|
43
|
+
|
|
44
|
+
| Value | Means |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `never` | Reads and writes files and runs local commands only. Runs to full function on a machine with no browser control at all. Never takes the mutex. A row reading `none` carries the same meaning and is accepted |
|
|
47
|
+
| `light` | Opens a page for one bounded phase that is the first thing cut when the budget is short. Still takes the mutex |
|
|
48
|
+
| `conditional` | Uses the browser on some paths only. `web-fix-runner` uses it only for a `platform` card carrying a console form. `web-dependency-run` uses it only when a changelog or a build log could not be read any other way |
|
|
49
|
+
| `heavy` | Holds the lane for most of its budget. `web-site-sweep` navigates and reads log surfaces. `web-platform-guard` holds it just as long, and **every page it opens is read only**: the word describes how long it holds the lane, not what it does with it |
|
|
50
|
+
|
|
51
|
+
**Anything other than `never` takes the browser mutex**, described in section 4.3.
|
|
52
|
+
|
|
53
|
+
### 1.3 What happens on a machine with no browser control
|
|
54
|
+
|
|
55
|
+
There is no status meaning "this machine has no browser". A missing capability maps onto the closed vocabulary in `CONTRACT.md` section 4.1, and the mapping is not negotiable:
|
|
56
|
+
|
|
57
|
+
- File work still to do: `partial`, with `no browser control capability configured` in `blockers[]`.
|
|
58
|
+
- Nothing else to do: `failed`, same blocker string.
|
|
59
|
+
|
|
60
|
+
**Two of the eight need no browser at all, and four more produce their main deliverable without one.** The morning brief, the reviewable change, the reachability check on every declared path, the expiry warning, and the Friday report all survive. What does not is everything behind the member's own login, which is the production logs and the three provider surfaces. `CAPABILITIES.md` section 7 has the routine by routine detail and is honest about the one thing that genuinely cannot work without a browser, which is error triage.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 2. The roster
|
|
65
|
+
|
|
66
|
+
| routine | display name | cadence | job, one line |
|
|
67
|
+
|---|---|---|---|
|
|
68
|
+
| `web-site-sweep` | Site sweep | Weekdays | Checks every declared path from the outside, records one dated observation per project, then reads the production log surfaces since its own cursor and groups every error into a fingerprint |
|
|
69
|
+
| `web-standup` | Triage standup | Weekdays | Resolves which drafted changes merged by reading the commit graph, closes and reopens incidents on that evidence, folds the card inbox, re-renders the review board, and writes the morning brief |
|
|
70
|
+
| `web-fix-runner` | Fix runner | Weekdays | Takes the one card the standup marked next and turns it into a reviewable change on a branch, behind that project's own gate, with a rollback line |
|
|
71
|
+
| `web-platform-guard` | Platform guard | Mondays | Confirms the registrar, the host, and the hosted database still match the inventory, read only, and names every drift with the screen and both values |
|
|
72
|
+
| `web-inventory-refresh` | Inventory refresh | First weekday of the month | First run it discovers what the member runs, writes the inventory and the opening policy, seeds the board, builds the dashboard, and registers the schedule. Monthly it re-reads the same evidence and applies what changed |
|
|
73
|
+
| `web-dependency-run` | Dependency run | Wednesdays | Bumps the patch and lockfile class on a branch per project, behind that project's own gate, and holds everything else with the evidence attached |
|
|
74
|
+
| `web-weekly-report` | Weekly change report | Fridays | Scores the week from the ledgers with a source path beside every number, names one fix and one thing to stop, and replays every learned browser flow once, read only |
|
|
75
|
+
| `web-guardrail-review` | Guardrail review | Last weekday of the month | Rewrites what the fix runner may change unsupervised, from a month of real merge outcomes. Widening waits for a streak. Narrowing is immediate |
|
|
76
|
+
|
|
77
|
+
**`web-standup` is the one that cannot be turned off.** It writes `brief-latest.md`, which is what the member opens first every morning. It is the only whole file writer of `board/board.json` and the only writer of `board/REVIEW-BOARD.md`, and it is the only thing in this kit that turns a merge into a closed card. Without it no dependency ever clears and no rate is ever computable.
|
|
78
|
+
|
|
79
|
+
**The first run of `web-inventory-refresh` is exempt from the window guard, and only from the window guard.** The member launches it by hand from `INSTALL-PROMPT.md`, at whatever hour they extracted the kit. It detects the first run by the absence of `state/web-inventory-refresh.json` and records `notes: "first run, window guard not applicable"`. It is also the one run not held to the row's budget: it takes about an hour, it may run past the session that started it, and when it does the member opens a second session and it resumes from `progress[]`. Every other guard still applies, including the pause switch, the period guard, the budget, the mutex, and both stops.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 3. The `days` vocabulary
|
|
84
|
+
|
|
85
|
+
Closed. Six values, and `CONTRACT.md` section 1.2 carries the same six.
|
|
86
|
+
|
|
87
|
+
| Value | Means |
|
|
88
|
+
|---|---|
|
|
89
|
+
| `mon-fri` | Monday to Friday |
|
|
90
|
+
| `mon`, `tue`, `wed`, `thu`, `fri`, `sat` | That single weekday |
|
|
91
|
+
| `first-weekday` | Any Monday to Friday date in the first seven days of the calendar month |
|
|
92
|
+
| `last-weekday` | Any Monday to Friday date in the last seven days of the calendar month |
|
|
93
|
+
| `off` | Registered but disabled. Records `skipped-out-of-window` and exits |
|
|
94
|
+
|
|
95
|
+
Two values are deliberately absent.
|
|
96
|
+
|
|
97
|
+
**`sun` is not in the vocabulary.** A Sunday belongs to the ISO week that just ended, so a weekly routine scheduled on Sunday shares a period key with the following Monday to Friday run and one of the two is silently skipped forever. Three routines in this table key on the ISO week and every one of them would lose a run.
|
|
98
|
+
|
|
99
|
+
**`daily` is not in the vocabulary either.** Nothing in this role needs to run on a weekend. A site that goes down on Saturday is still down on Monday morning and the sweep catches it then. If you want a weekend sweep, add `sat` as its own row for `web-site-sweep` alone, and leave the other seven where they are: a fix runner that drafts changes on a Sunday hands you a review queue you did not ask for.
|
|
100
|
+
|
|
101
|
+
### 3.1 Why the two monthly values are ranges and not single dates
|
|
102
|
+
|
|
103
|
+
If the monthly routines only ran on the exact first or exact last weekday, a machine that was asleep or shut that morning would skip the whole month. Giving each a seven day span plus the once per period guard means it runs on the first eligible day the machine is actually awake, once, and then stops for the month. That is the same trick the window guard uses: be generous about when, be strict about how many times.
|
|
104
|
+
|
|
105
|
+
**The two monthly routines can never land on the same date.** The shortest month is 28 days, so days 1 to 7 and the last seven days never overlap in any month of any length. A late catch up cannot create the case either, because a first weekday fire arriving on the 25th fails the window guard's day test and exits clean.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 4. Staggering, and the browser lane
|
|
110
|
+
|
|
111
|
+
Two routines fighting over browser control is a real failure, not a theoretical one. The symptoms are ugly and slow to diagnose: a navigation lands in the other routine's tab, a click by element reference hits a detached node, or a disconnect is reported that did not happen while both runs keep going. Nothing crashes. The member gets two bad outputs and no error to explain either of them.
|
|
112
|
+
|
|
113
|
+
Two things keep the lane clear, and both are needed. The fire times below are the prevention. The mutex in 4.3 is the enforcement.
|
|
114
|
+
|
|
115
|
+
### 4.1 The rules
|
|
116
|
+
|
|
117
|
+
1. **Minimum gap between two browser capable fires: the earlier routine's full hard budget, plus 20 minutes.** Use the budget, never the typical run time. A routine that usually takes 12 minutes and is budgeted for 40 will one day take 40.
|
|
118
|
+
2. **No two routines share a fire minute**, even when neither touches the browser. Hosts flush queued jobs in bursts, and two agent sessions starting in the same second compete for the same files.
|
|
119
|
+
3. **The window is a catch up net, not a concurrency plan.** Windows overlap on purpose, so that a late fire still does useful work. Fire times must not overlap. Where a catch up does put two browser routines in the same minute, the mutex decides which one gets the lane and the other records `blocked-browser-busy` after doing its file work.
|
|
120
|
+
4. **`web-guardrail-review` fires after `web-weekly-report`'s full budget has elapsed, and that gap is load bearing.** On a month whose last weekday is a Friday, both run on the same day, and the review reads that morning's report. Any edit to either row preserves the gap. The review checks it itself at the top of every run and records a thin month if it finds itself racing.
|
|
121
|
+
5. **If a browser routine records `partial` three weeks running, move its fire or cut its scope. Do not widen its window.** A wider window invites an overlap. A smaller job finishes.
|
|
122
|
+
|
|
123
|
+
### 4.2 The week as it actually runs
|
|
124
|
+
|
|
125
|
+
Times below are the fire time, the hard budget, and the time the lane is guaranteed clear.
|
|
126
|
+
|
|
127
|
+
**Every weekday**
|
|
128
|
+
```
|
|
129
|
+
06:45 web-site-sweep 25 min heavy lane clear by 07:10
|
|
130
|
+
07:30 web-standup 15 min none takes no lane
|
|
131
|
+
08:10 web-fix-runner 40 min conditional lane clear by 08:50
|
|
132
|
+
```
|
|
133
|
+
Gap from the sweep's worst case end to the fix runner's fire: 60 minutes.
|
|
134
|
+
|
|
135
|
+
**Monday adds**
|
|
136
|
+
```
|
|
137
|
+
10:30 web-platform-guard 30 min heavy lane clear by 11:00
|
|
138
|
+
```
|
|
139
|
+
Gap from the fix runner's worst case end: 100 minutes.
|
|
140
|
+
|
|
141
|
+
**First weekday of the month adds**
|
|
142
|
+
```
|
|
143
|
+
11:45 web-inventory-refresh 45 min light lane clear by 12:30
|
|
144
|
+
```
|
|
145
|
+
Gap from the fix runner's worst case end: 175 minutes. On a first weekday that is also a Monday, the gap from the platform guard's worst case end is 45 minutes.
|
|
146
|
+
|
|
147
|
+
**Wednesday adds**
|
|
148
|
+
```
|
|
149
|
+
13:30 web-dependency-run 40 min conditional lane clear by 14:10
|
|
150
|
+
```
|
|
151
|
+
Gap from the fix runner's worst case end: 280 minutes. On a first weekday that is also a Wednesday, the gap from the inventory refresh's worst case end is 60 minutes.
|
|
152
|
+
|
|
153
|
+
**Friday adds**
|
|
154
|
+
```
|
|
155
|
+
15:30 web-weekly-report 35 min light lane clear by 16:05
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Last weekday of the month adds**
|
|
159
|
+
```
|
|
160
|
+
16:45 web-guardrail-review 20 min none takes no lane
|
|
161
|
+
```
|
|
162
|
+
On a last weekday that is also a Friday, the gap from the weekly report's worst case end is 40 minutes, which is the load bearing gap in rule 4.
|
|
163
|
+
|
|
164
|
+
**The tightest browser gap in the schedule is 45 minutes**, between the platform guard's worst case end and the inventory refresh's fire on a first Monday. It clears the 20 minute rule with 25 minutes to spare, and it is the first thing to check after any edit.
|
|
165
|
+
|
|
166
|
+
If you need more room there, **move the inventory refresh later rather than shortening the platform guard's budget.** The early afternoon is empty on a Monday, and the guard is the routine most likely to need its whole budget because it reads three surfaces across every project.
|
|
167
|
+
|
|
168
|
+
### 4.3 The mutex, in one paragraph
|
|
169
|
+
|
|
170
|
+
Every routine whose `browser` value is not `never` reads `state/browser-lock.json` before it touches a page. If the file exists and is less than 45 minutes old, another routine is live: do every phase that does not need the browser, record `blocked-browser-busy` naming the holder, and exit. If it is 45 minutes or older it is stale, so overwrite it and note that in the run record. **Delete it on every exit path, including every failure path**, in the same block that writes the run record so a later edit cannot separate the two. Forty five minutes is the staleness window for every routine regardless of its own budget, which is why nothing here is budgeted past 45 minutes. The full rule is `ROLE.md` section 7 and `CONTRACT.md` section 6, and every routine implements it identically.
|
|
171
|
+
|
|
172
|
+
### 4.4 Why the morning runs in this order
|
|
173
|
+
|
|
174
|
+
The sweep goes first because everything downstream reads what it captured, and because it wants the browser while nobody else does. It is also the only weekday routine that genuinely cannot do its main job without one.
|
|
175
|
+
|
|
176
|
+
The standup goes second because it compiles what the other routines produced and reconciles yesterday's ticks and merges. It takes no browser lane at all, so it costs the morning nothing, and it runs to full function on a machine whose browser is signed out, busy, or missing.
|
|
177
|
+
|
|
178
|
+
The fix runner goes last of the three because it works the board the standup just re-rendered and the card the standup just marked ready. **The plan arrives first, the change arrives second.** Its ordering is not a preference: a fix runner that ran before the standup would work yesterday's board.
|
|
179
|
+
|
|
180
|
+
**If a catch up puts the standup after the fix runner on some morning**, the fix runner works yesterday's card and says so in its run record. That is a thin day, not a broken one, and the next morning's standup reconciles both days.
|
|
181
|
+
|
|
182
|
+
### 4.5 Machines that sleep
|
|
183
|
+
|
|
184
|
+
If the machine is asleep at a fire time, what happens next depends on the scheduler, and none of them replays every missed fire. The Claude Desktop app skips a fire the machine slept through and, on wake, runs exactly one catch up for the most recently missed time, looking back seven days. Windows Task Scheduler runs one catch up when its setting to run a missed task as soon as possible is on, and none when it is off. launchd on macOS coalesces every missed fire into one run on wake. cron skips a missed fire and never catches up. So a late fire arrives alone, at an unplanned minute, and sometimes beside another routine's catch up. The window guard and the once per period guard exist for exactly this, and together they make a burst harmless: whatever arrives inside the window runs once, whatever arrives outside it exits clean.
|
|
185
|
+
|
|
186
|
+
**Set the earliest fire in this table after the time the machine is normally awake.** If the machine wakes at 08:00, a 06:45 fire always arrives as a catch up. That works, and it always lands after the standup, so the brief is permanently one run behind and it is built on yesterday's sweep. `CAPABILITIES.md` section 9.5 covers the per platform detail, including the cron case, which never catches up at all.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 5. Registering this table
|
|
191
|
+
|
|
192
|
+
Every harness schedules differently and some do not schedule at all. **`CAPABILITIES.md` section 9 is the file that says which mechanism yours has and gives the exact commands for each one.** Section 9.2a of the same file says what the invocation inside those commands actually looks like on your harness. Neither is restated here, because a set of commands written down twice is a set of commands that will disagree.
|
|
193
|
+
|
|
194
|
+
What belongs here is the shape, which is the same on every harness.
|
|
195
|
+
|
|
196
|
+
1. **One job per routine.** Eight routines, eight jobs. Never one job that runs several in sequence: a chained job defeats the per routine period guard, blurs the budgets, and turns one failure into eight.
|
|
197
|
+
2. **The job's only content is the invocation.** All the logic is in the SKILL.md.
|
|
198
|
+
3. **Know what the invocation is before you register anything.** `CAPABILITIES.md` 9.2a gives its shape per harness. Where that section could not answer for your harness, find its non interactive run command and write what you found into the `## Corrections` at the bottom of that file.
|
|
199
|
+
4. **Prove one routine by hand before you register eight.** Run the line for `web-standup` in a terminal and watch it write `brief-latest.md` and one line into `runlog.jsonl`. Eight jobs registered on an invocation nobody has run is eight silent failures on the same morning, and the first thing you see is an empty brief.
|
|
200
|
+
5. **Register the `fire` column, not the window.** The window is enforced inside the routine.
|
|
201
|
+
6. **Name every job exactly after its routine id.** The monthly drift check can only match a registered job to a row when the names are identical.
|
|
202
|
+
|
|
203
|
+
**The Employee registers these itself during setup.** `web-inventory-refresh` reads this table and takes whichever route `CAPABILITIES.md` says exists on this machine: the harness's own scheduler first, the operating system's scheduler through `shell.run` second. Where neither is available it writes every command it would have run into `«WEB_ROOT»/schedule-commands.txt`, expanded rather than left as a placeholder, and names that file in the session report. Run them once yourself and you are scheduled. **The kit runs identically whether a scheduler or a person started the run**, because every routine reads the clock, reads its row, and decides for itself whether to work.
|
|
204
|
+
|
|
205
|
+
### 5.1 The setting that decides whether any of this produces anything
|
|
206
|
+
|
|
207
|
+
**A routine launched in a prompting mode stalls forever waiting for a human who is asleep.**
|
|
208
|
+
|
|
209
|
+
At 06:45 the sweep asks to open a tab, or to write a file, or to run a command, and then it sits there. Nobody clicks Allow. The run does not fail, which would at least leave a record. It hangs. There is no run record, no brief, and no blocker to read in the morning, because the routine never reached the line that writes one.
|
|
210
|
+
|
|
211
|
+
**The fix lives in your harness's own settings: run scheduled work in its auto approve mode**, scoped as narrowly as your harness allows. Here that means `«WEB_ROOT»` plus the code roots your projects live in, and nothing else.
|
|
212
|
+
|
|
213
|
+
This does not weaken anything, and the reason is worth being clear about. **The prompt gate was never what stopped this kit from merging, deploying, or spending.** Those stops live inside the routines: the Employee never composes a merge, never presses a deploy control, never applies a migration, never buys anything, and never rotates a key. There is no path where an approval prompt is the last thing standing between a branch and a production site. `CAPABILITIES.md` section 10 has the full treatment.
|
|
214
|
+
|
|
215
|
+
If your harness cannot run without interactive approval at all, do not schedule the browser routines. Run those by hand when you are at the machine. The file routines schedule fine and you still get the brief, the changes, and the Friday report.
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 6. Changing a time
|
|
220
|
+
|
|
221
|
+
1. Edit the row in this file. This file is the source, so change it here first.
|
|
222
|
+
2. Recompute the gaps in section 4.2 for every day the change touches. If any browser capable fire now sits inside another browser routine's budget plus 20 minutes, pick a different time. **And check rule 4:** the guardrail review must still fire after the weekly report's full budget has elapsed.
|
|
223
|
+
3. Re-register that one job at the new `fire` time, or leave it and let the monthly drift check remind you. The routine follows the new window either way, on its next fire.
|
|
224
|
+
|
|
225
|
+
**The Employee may change a `fire` time itself, and only for one reason: to clear a lane collision it detected.** It edits the row, records both the old time and the new time in one line in `inventory/CHANGELOG.md` with the evidence, re-registers that job, and surfaces the change in the next morning brief. It never removes a row, never sets `days` to `off`, and never changes a `days`, `key`, or `budget` value. Those are yours.
|
|
226
|
+
|
|
227
|
+
A fire time is not a send, not a spend, and not a credential. There is no proposal file in this kit and no verdict to wait for. If the change is wrong, one line in this table puts it back, and the brief is where you find out it happened.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 7. Turning a routine off
|
|
232
|
+
|
|
233
|
+
Set its `days` to `off`. **Do not delete the row.** A missing row is a `failed` run record every time the job fires, which fills the brief's `Blocked` section with noise. `days: off` produces a clean `skipped-out-of-window` instead.
|
|
234
|
+
|
|
235
|
+
Then either remove the job or leave it. Leaving it costs nothing, because the routine exits in under a second, and turning the routine back on later is one word in this file.
|
|
236
|
+
|
|
237
|
+
**Know what each one costs you before you turn it off.**
|
|
238
|
+
|
|
239
|
+
| Turning this off | Costs you |
|
|
240
|
+
|---|---|
|
|
241
|
+
| `web-site-sweep` | Every health number, every incident, and the fingerprints every fix card is built from. The board stops gaining work |
|
|
242
|
+
| `web-standup` | The brief, the board, and every merge verdict. **Nothing else in this kit works without it.** Do not turn this one off |
|
|
243
|
+
| `web-fix-runner` | Every change. The board fills and nothing gets drafted |
|
|
244
|
+
| `web-platform-guard` | Every expiry warning and every provider drift. This is the one whose absence is silent until a domain lapses |
|
|
245
|
+
| `web-inventory-refresh` | The monthly re-read. A branch that moved, a command that changed, or a log surface that vanished stops being noticed |
|
|
246
|
+
| `web-dependency-run` | Dependency debt and advisory tracking |
|
|
247
|
+
| `web-weekly-report` | The week over week series, permanently. **It cannot be rebuilt afterwards**, because the ledgers it was computed from get archived |
|
|
248
|
+
| `web-guardrail-review` | The boundary stops moving. The fix runner keeps whatever rungs it had, forever, which is safe and static |
|
|
249
|
+
|
|
250
|
+
**No routine is ever left off for a missing input.** A blank value is a research task, not a reason to disable anything. The routine that needs it reads it, fills it, records the assumption, and runs. `ROLE.md` section 5 carries the table of what gets researched and what gets defaulted, and the list of what is never invented is two entries long.
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## 8. Daylight saving, travel, and the clock
|
|
255
|
+
|
|
256
|
+
Every fire time here is wall clock time on the machine. When the clock shifts for daylight saving, the whole schedule shifts with it and the windows absorb the change. Nothing needs editing.
|
|
257
|
+
|
|
258
|
+
If you travel and change the machine's timezone, the routines follow the new local time immediately, because every one of them reads the live clock at the top of the run and none of them reads a stored timezone. `«TIMEZONE ID»` in the state file is a record of what was true at setup. It is never used to decide anything.
|
|
259
|
+
|
|
260
|
+
If the times look wrong by exactly one hour, or by exactly a whole number of hours, the machine's timezone is wrong. Fix the machine. Do not compensate by editing this table, because the next correct clock will then be wrong by the same amount in the other direction.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## 9. Notes on this schedule
|
|
265
|
+
|
|
266
|
+
Rows that differ from the shipped defaults are recorded here with the date and the reason, so the next reader does not undo a deliberate change.
|
|
267
|
+
|
|
268
|
+
Format: `YYYY-MM-DD: <routine>, <what changed>, <why>.`
|
|
269
|
+
|
|
270
|
+
## Corrections
|
|
271
|
+
|
|
272
|
+
Format: one line per correction, newest at the top, `YYYY-MM-DD: what was wrong, what to do instead.` Every routine reads this section at the top of every run.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## The lane is per platform, amended at Standard v1.1, 2026-08-28
|
|
277
|
+
|
|
278
|
+
This section supersedes the browser lane and mutex language above wherever they disagree.
|
|
279
|
+
|
|
280
|
+
The harness runs agent sessions in isolated browser tab groups, so two routines touching different platforms may run at the same time. What still serializes is the member's identity on one platform: a site sees one logged-in account, not tab groups. So `state/browser-lock.json` now carries a `sites` list naming the platforms the holder is touching. A routine taking the lane writes its platforms; a second routine reads the lock and proceeds when its own platforms are disjoint, and records `blocked-browser-busy` after its file work only on an overlap. The staleness rule, the delete-on-every-exit rule, and the standup's reading of a stale lock as evidence of a dead run are all unchanged. Fire-time staggering above remains as prevention for same-platform pairs and machine load, not as a claim that the browser is scarce.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.6.0
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": "ai-employee/1",
|
|
3
|
+
"slug": "web-dev-employee",
|
|
4
|
+
"name": "Web Dev Employee",
|
|
5
|
+
"role": "Engineering and maintenance",
|
|
6
|
+
"version": "1.6.0",
|
|
7
|
+
"standard": "1.3",
|
|
8
|
+
"repository": "https://github.com/markfulton/ai-employees",
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"requires": {
|
|
11
|
+
"node": ">=18",
|
|
12
|
+
"harness": [
|
|
13
|
+
"claude-code",
|
|
14
|
+
"openclaw",
|
|
15
|
+
"hermes",
|
|
16
|
+
"opencode",
|
|
17
|
+
"grok-bot",
|
|
18
|
+
"codex",
|
|
19
|
+
"antigravity"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"connections": [
|
|
23
|
+
{
|
|
24
|
+
"capability": "vcs.remote.read",
|
|
25
|
+
"providers": [
|
|
26
|
+
"gh-cli",
|
|
27
|
+
"github-mcp-readonly"
|
|
28
|
+
],
|
|
29
|
+
"required": false,
|
|
30
|
+
"readonly": true
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"capability": "host.read",
|
|
34
|
+
"providers": [
|
|
35
|
+
"vercel",
|
|
36
|
+
"vercel-cli",
|
|
37
|
+
"netlify",
|
|
38
|
+
"railway",
|
|
39
|
+
"render",
|
|
40
|
+
"cloudflare-observability"
|
|
41
|
+
],
|
|
42
|
+
"required": false,
|
|
43
|
+
"readonly": true
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"capability": "db.read",
|
|
47
|
+
"providers": [
|
|
48
|
+
"supabase-readonly",
|
|
49
|
+
"neon-readonly",
|
|
50
|
+
"planetscale-insights"
|
|
51
|
+
],
|
|
52
|
+
"required": false,
|
|
53
|
+
"readonly": true
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"capability": "errors.read",
|
|
57
|
+
"providers": [
|
|
58
|
+
"sentry",
|
|
59
|
+
"posthog",
|
|
60
|
+
"better-stack"
|
|
61
|
+
],
|
|
62
|
+
"required": false,
|
|
63
|
+
"readonly": true
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"capability": "browser.headless",
|
|
67
|
+
"providers": [
|
|
68
|
+
"chrome-devtools-mcp",
|
|
69
|
+
"playwright-mcp"
|
|
70
|
+
],
|
|
71
|
+
"required": false,
|
|
72
|
+
"readonly": true
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"capability": "registrar.read",
|
|
76
|
+
"providers": [
|
|
77
|
+
"porkbun-api",
|
|
78
|
+
"cloudflare-registrar-api",
|
|
79
|
+
"vercel-domains",
|
|
80
|
+
"dynadot-api"
|
|
81
|
+
],
|
|
82
|
+
"required": false,
|
|
83
|
+
"readonly": true
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"capability": "advisories.read",
|
|
87
|
+
"providers": [
|
|
88
|
+
"npm-audit",
|
|
89
|
+
"osv-api",
|
|
90
|
+
"gh-cli",
|
|
91
|
+
"context7"
|
|
92
|
+
],
|
|
93
|
+
"required": false,
|
|
94
|
+
"readonly": true
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
"routines": [
|
|
98
|
+
{
|
|
99
|
+
"id": "web-dependency-run",
|
|
100
|
+
"days": "wed",
|
|
101
|
+
"fire": "13:30",
|
|
102
|
+
"window_start": "13:15",
|
|
103
|
+
"window_end": "17:00",
|
|
104
|
+
"period_key": "YYYY-Www",
|
|
105
|
+
"budget": "40 min",
|
|
106
|
+
"browser": "conditional"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"id": "web-fix-runner",
|
|
110
|
+
"days": "mon-fri",
|
|
111
|
+
"fire": "08:10",
|
|
112
|
+
"window_start": "08:00",
|
|
113
|
+
"window_end": "13:00",
|
|
114
|
+
"period_key": "YYYY-MM-DD",
|
|
115
|
+
"budget": "40 min",
|
|
116
|
+
"browser": "conditional"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"id": "web-guardrail-review",
|
|
120
|
+
"days": "last-weekday",
|
|
121
|
+
"fire": "16:45",
|
|
122
|
+
"window_start": "16:30",
|
|
123
|
+
"window_end": "19:30",
|
|
124
|
+
"period_key": "YYYY-MM",
|
|
125
|
+
"budget": "20 min",
|
|
126
|
+
"browser": "never"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "web-inventory-refresh",
|
|
130
|
+
"days": "first-weekday",
|
|
131
|
+
"fire": "11:45",
|
|
132
|
+
"window_start": "11:30",
|
|
133
|
+
"window_end": "16:00",
|
|
134
|
+
"period_key": "YYYY-MM",
|
|
135
|
+
"budget": "45 min",
|
|
136
|
+
"browser": "light"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"id": "web-platform-guard",
|
|
140
|
+
"days": "mon",
|
|
141
|
+
"fire": "10:30",
|
|
142
|
+
"window_start": "10:15",
|
|
143
|
+
"window_end": "15:00",
|
|
144
|
+
"period_key": "YYYY-Www",
|
|
145
|
+
"budget": "30 min",
|
|
146
|
+
"browser": "heavy"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"id": "web-site-sweep",
|
|
150
|
+
"days": "mon-fri",
|
|
151
|
+
"fire": "06:45",
|
|
152
|
+
"window_start": "06:30",
|
|
153
|
+
"window_end": "09:45",
|
|
154
|
+
"period_key": "YYYY-MM-DD",
|
|
155
|
+
"budget": "25 min",
|
|
156
|
+
"browser": "heavy"
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "web-standup",
|
|
160
|
+
"days": "mon-fri",
|
|
161
|
+
"fire": "07:30",
|
|
162
|
+
"window_start": "07:15",
|
|
163
|
+
"window_end": "11:30",
|
|
164
|
+
"period_key": "YYYY-MM-DD",
|
|
165
|
+
"budget": "15 min",
|
|
166
|
+
"browser": "never"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"id": "web-weekly-report",
|
|
170
|
+
"days": "fri",
|
|
171
|
+
"fire": "15:30",
|
|
172
|
+
"window_start": "15:15",
|
|
173
|
+
"window_end": "18:00",
|
|
174
|
+
"period_key": "YYYY-Www",
|
|
175
|
+
"budget": "35 min",
|
|
176
|
+
"browser": "light"
|
|
177
|
+
}
|
|
178
|
+
],
|
|
179
|
+
"files": {
|
|
180
|
+
"kit": [
|
|
181
|
+
"AGENTS.md",
|
|
182
|
+
"CAPABILITIES.md",
|
|
183
|
+
"CHANGELOG.md",
|
|
184
|
+
"CONTRACT.md",
|
|
185
|
+
"INSTALL-PROMPT.md",
|
|
186
|
+
"README.md",
|
|
187
|
+
"ROLE.md",
|
|
188
|
+
"VERSION",
|
|
189
|
+
".gitignore",
|
|
190
|
+
"employee.json",
|
|
191
|
+
"recipes/BROWSER-RECIPES.md",
|
|
192
|
+
"routines/**",
|
|
193
|
+
"run/**",
|
|
194
|
+
"scripts/**",
|
|
195
|
+
"examples/**"
|
|
196
|
+
],
|
|
197
|
+
"merge": [
|
|
198
|
+
"SCHEDULE.md"
|
|
199
|
+
],
|
|
200
|
+
"member": [
|
|
201
|
+
"RELEASES.md",
|
|
202
|
+
"state/**",
|
|
203
|
+
"board/**",
|
|
204
|
+
"crm/**",
|
|
205
|
+
"queue/**",
|
|
206
|
+
"strategy/**",
|
|
207
|
+
"briefs/**",
|
|
208
|
+
"scoreboard/**",
|
|
209
|
+
"dashboard/**",
|
|
210
|
+
"improvements/**",
|
|
211
|
+
"archive/**",
|
|
212
|
+
"paid/**",
|
|
213
|
+
"fleet/**",
|
|
214
|
+
"drafts/**",
|
|
215
|
+
"calendar/**",
|
|
216
|
+
"run/*.log",
|
|
217
|
+
"recipes/*.json",
|
|
218
|
+
"runlog.jsonl",
|
|
219
|
+
"*-latest.md",
|
|
220
|
+
".installed.json"
|
|
221
|
+
]
|
|
222
|
+
},
|
|
223
|
+
"notes": {
|
|
224
|
+
"merge": "SCHEDULE.md carries the shape the kit ships and the days, windows and budgets the member owns. An upgrade reports a changed shape and never rewrites the row values.",
|
|
225
|
+
"member": "Everything under member is the business the employee has been running: its evidence, its ledgers, its learned browser flows and its own field repairs. An upgrade that overwrites any of it has destroyed work that exists nowhere else.",
|
|
226
|
+
"recipes": "recipes/BROWSER-RECIPES.md ships with the kit. Every recipes/*.json is learned on the member's own screens by the routine that owns it, so it is member data."
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Example output: Web Dev Employee
|
|
2
|
+
|
|
3
|
+
Fictional example output for Northwind Roofing, a residential and light commercial roofing company run by Sam, whose two projects are the marketing site at https://www.example.com and a crew portal for the light commercial jobs. It shows what the working folder holds after a baseline week, the first week of March 2026: inventory on Monday, the first fix merged on Wednesday, and the Thursday morning brief below. Every person, company, URL, figure, incident, and change here is invented and none of it comes from a real installation.
|
|
4
|
+
Every file was run through the kit's own scripts/copy-check.mjs, and every line of runlog.jsonl through scripts/runlog.mjs in dry run mode, so the shapes match what the routines write.
|
|
5
|
+
|
|
6
|
+
| File | What it is |
|
|
7
|
+
|---|---|
|
|
8
|
+
| brief-latest.md | The Thursday morning brief web-standup writes, in the exact shape of its template |
|
|
9
|
+
| runlog.jsonl | Three run records: one ok, one skipped out of window, one partial |
|
|
10
|
+
| board/REVIEW-BOARD.md | The rendered review board with four cards, two ticked, and the member's own notes kept |
|
|
11
|
+
| changes/changes.jsonl | Two change lines: one merged, resolved by the standup, and one drafted by the fix runner |
|
|
12
|
+
| health/incidents.jsonl | Two incident lines from the site sweep, one recurring and one quiet |
|
|
13
|
+
| changes/2026-03-05-fix-C-005.md | The reviewable change brief the fix runner leaves beside a pushed branch |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Review board
|
|
2
|
+
|
|
3
|
+
Tick a box when you have done it. Write anything you like under a card, indented.
|
|
4
|
+
Your own text is kept. The lines starting with a dash are rewritten each morning.
|
|
5
|
+
A fix card also closes on its own the morning after you merge the branch.
|
|
6
|
+
|
|
7
|
+
## northwind-site
|
|
8
|
+
|
|
9
|
+
- [x] C-001 | Confirm the production branch and gate for each project | verify | inventory/projects.json
|
|
10
|
+
- [x] C-003 | Guard the quote form submit against a missing roof size | fix | changes/2026-03-03-fix-C-003.md
|
|
11
|
+
- [ ] C-004 | Bump the two patch releases with advisories | deps | changes/2026-03-04-deps-northwind-site.md
|
|
12
|
+
hold this until Friday, the crew is quoting all week
|
|
13
|
+
|
|
14
|
+
## northwind-crew-portal
|
|
15
|
+
|
|
16
|
+
- [ ] C-005 | Retry the photo upload when the host returns a gateway timeout | fix | the change is merged into main on northwind-crew-portal
|
|
17
|
+
|
|
18
|
+
## Notes
|
|
19
|
+
|
|
20
|
+
storm quotes are running all week, nothing merges to the site before Friday
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# 2026-03-05
|
|
2
|
+
|
|
3
|
+
## Today
|
|
4
|
+
- C-005 northwind-crew-portal: retry the photo upload when the host returns a gateway timeout. Done when the change is merged into main on northwind-crew-portal
|
|
5
|
+
|
|
6
|
+
## Waiting on you
|
|
7
|
+
- C-004 northwind-site: the patch bumps with advisories sit on branch deps/2026-W10-northwind-site, pushed and not merged: https://www.example.net/northwind/northwind-site/compare/main...deps/2026-W10-northwind-site
|
|
8
|
+
- example.com expires 2026-03-28 and auto renew reads off at the registrar (inventory/domains.md)
|
|
9
|
+
- web-site-sweep assumed the second hostname on northwind-crew-portal is a preview alias and left it out of the checks; say so under Corrections in routines/web-site-sweep/SKILL.md if it serves customers
|
|
10
|
+
|
|
11
|
+
## Blocked
|
|
12
|
+
- 2 open blockers, both listed in web-latest.md
|
|
13
|
+
|
|
14
|
+
Guided version, updates and premium employees: [club.reinventing.ai](https://club.reinventing.ai/?utm_source=github&utm_medium=kit&utm_campaign=web-dev-employee)
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Retry the photo upload when the host returns a gateway timeout
|
|
2
|
+
|
|
3
|
+
Every line below describes a change on a branch. Nothing here has been merged
|
|
4
|
+
or deployed. Merging it is yours.
|
|
5
|
+
|
|
6
|
+
## What changed and why
|
|
7
|
+
The crew photo upload now retries once, after a short wait, when the storage host answers with a gateway timeout, and it tells the crew member to try again instead of failing silently when the retry also fails. The sweep saw the same timeout fingerprint on the upload route on three mornings this week, always in the hour the storage host runs its own maintenance (health/incidents.jsonl).
|
|
8
|
+
|
|
9
|
+
## Files
|
|
10
|
+
src/upload/submitPhoto.ts, +14 -3
|
|
11
|
+
src/upload/messages.ts, +2 -0
|
|
12
|
+
|
|
13
|
+
## Gate
|
|
14
|
+
build: pass
|
|
15
|
+
tests: pass
|
|
16
|
+
ran at: 2026-03-05T08:24:16-08:00 took: four minutes
|
|
17
|
+
|
|
18
|
+
## Incident this closes
|
|
19
|
+
fingerprint: northwind-crew-portal:gateway timeout from storage host:submitPhoto:/jobs/photos
|
|
20
|
+
seen: 41 times in the window ending 2026-03-05, on /jobs/photos (health/incidents.jsonl)
|
|
21
|
+
evidence: health/incidents.jsonl#2026-03-05
|
|
22
|
+
|
|
23
|
+
## Rollback
|
|
24
|
+
revert the merge commit
|
|
25
|
+
|
|
26
|
+
## Compare
|
|
27
|
+
https://www.example.net/northwind/northwind-crew-portal/compare/main...fix/C-005-retry-photo-upload
|
|
28
|
+
|
|
29
|
+
## Left for you
|
|
30
|
+
nothing to set: no credential, no screen to visit, and no migration on this branch
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
{"change_id":"C-003:northwind-site:2026-03-03","card":"C-003","project":"northwind-site","branch":"fix/C-003-guard-quote-roof-size","head":"7f3a9c1","base":"main","status":"merged","merge_kind":"unchanged","merged_on":"2026-03-04","resolved_by_question":1,"by":"web-standup"}
|
|
2
|
+
{"change_id":"C-005:northwind-crew-portal:2026-03-05","card":"C-005","project":"northwind-crew-portal","kind":"fix","branch":"fix/C-005-retry-photo-upload","head":"b82e4d0","base":"main","files":2,"lines":19,"fix_class":"retry","closes_fingerprint":"northwind-crew-portal:gateway timeout from storage host:submitPhoto:/jobs/photos","gate":"pass","gate_first_failure":null,"brief":"changes/2026-03-05-fix-C-005.md","compare_url":"https://www.example.net/northwind/northwind-crew-portal/compare/main...fix/C-005-retry-photo-upload","pushed_at":"2026-03-05T08:31:07-08:00","status":"drafted","merged_on":null,"merge_kind":null,"by":"web-fix-runner"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
{"fingerprint":"northwind-crew-portal:gateway timeout from storage host:submitPhoto:/jobs/photos","project":"northwind-crew-portal","observed_on":"2026-03-05","surface":"host-runtime","state":"recurring","first_seen":"2026-03-03","count_this_window":41,"routes":["/jobs/photos"],"window_from":"2026-03-04T06:31:00-08:00","window_to":"2026-03-05T06:29:00-08:00","excerpt":["gateway timeout from storage host while uploading job photo","submitPhoto gave up after one attempt"],"fix_class":"retry","by":"web-site-sweep"}
|
|
2
|
+
{"fingerprint":"northwind-site:cannot read properties of undefined reading roofSize:submitQuote:/quote","project":"northwind-site","observed_on":"2026-03-05","surface":"host-runtime","state":"quiet","first_seen":"2026-03-02","count_this_window":0,"routes":["/quote"],"window_from":"2026-03-04T06:31:00-08:00","window_to":"2026-03-05T06:29:00-08:00","excerpt":[],"fix_class":"guard","by":"web-site-sweep"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
{"routine":"web-dependency-run","period":"2026-W10","start":"2026-03-04T13:30:09-08:00","end":"2026-03-04T14:10:01-08:00","status":"partial","outputs":["changes/2026-03-04-deps-northwind-site.md","changes/changes.jsonl (+1 drafted)","deps/dependency-ledger.jsonl (+5 bumped, +2 held)","board/inbox.jsonl (+1 card)","branch deps/2026-W10-northwind-site pushed"],"blockers":["budget reached after northwind-site; northwind-crew-portal was not read this week and waits for 2026-W11"],"notes":"project cursor at 1 of 2 in inventory/projects.json; gate passed on northwind-site; nothing merged, nothing deployed"}
|
|
2
|
+
{"routine":"web-site-sweep","period":"2026-03-05","start":"2026-03-05T06:45:03-08:00","end":"2026-03-05T07:02:48-08:00","status":"ok","outputs":["health/checks.jsonl (+11 checks, 0 fail)","health/incidents.jsonl (+2 fingerprints, 1 recurring)","health/health-latest.md","board/inbox.jsonl (+1 card)"],"blockers":[],"notes":"logs_cursor advanced on 2 surfaces in inventory/projects.json; 1 excerpt line withheld after the secret scan; project cursor at 2 of 2"}
|
|
3
|
+
{"routine":"web-platform-guard","period":"2026-W10","start":"2026-03-05T10:31:04-08:00","end":"2026-03-05T10:31:05-08:00","status":"skipped-out-of-window","outputs":[],"blockers":[],"notes":"Thursday is not a listed day for the mon row in SCHEDULE.md; nothing read, nothing written"}
|