@hybridlabor-api/aos 4.9.0 → 4.11.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.
Files changed (30) hide show
  1. package/.agents/{agents.md → AGENTS.md} +2 -0
  2. package/.agents/nodes.json +2 -0
  3. package/.claude/hooks/memb-inject.mjs +29 -1
  4. package/.claude/workflows/startcycle-dispatch.mjs +23 -1
  5. package/.opencode/commands/startcycle-graph.md +57 -0
  6. package/.opencode/plugins/bdb-aos.js +130 -5
  7. package/CLAUDE.md +0 -571
  8. package/THIRD_PARTY_NOTICES.md +38 -0
  9. package/bin/aos-doctor.mjs +1 -1
  10. package/installer.js +127 -66
  11. package/package.json +3 -3
  12. package/skills/basic/bdb-eventagency-skill/SKILL.md +252 -0
  13. package/skills/basic/bdb-shipping-skill/SKILL.md +161 -0
  14. package/skills/basic/godmode-eventtech/SKILL.md +4 -1
  15. package/skills/global_config/aos-project-init/SKILL.md +2 -0
  16. package/skills/global_config/aos-project-init/assets/AGENTS.template.md +1 -1
  17. package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +1 -1
  18. package/skills/global_config/aos-setup/SKILL.md +1 -1
  19. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +1 -1
  20. package/skills/global_config/ask-tim/SKILL.md +3 -3
  21. package/skills/global_config/deja-memory/SKILL.md +3 -1
  22. package/skills/global_config/plan-canvas/SKILL.md +9 -2
  23. package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/ui.js +10 -2
  24. package/skills/global_config/plan-canvas/scripts/plan-canvas.js +1 -1
  25. package/skills/global_config/read-the-damn-docs/SKILL.md +175 -0
  26. package/skills/global_config/writing-plans/SKILL.md +12 -12
  27. package/skills/global_config/writing-plans-legacy/SKILL.md +15 -2
  28. package/.claude/CLAUDE.md +0 -12
  29. package/mcps/RhinoMCP/docs/content/docs/getting-started/gemini.md +0 -61
  30. /package/{GEMINI.md → RULES.md} +0 -0
package/installer.js CHANGED
@@ -2921,7 +2921,7 @@ async function installMcpsForTarget(paths, ctx) {
2921
2921
  }
2922
2922
  log.step(`Installed selected MCP servers to ${mcpCodeTarget}`);
2923
2923
 
2924
- const nodeMcps = ['adobe_uxp_mcp', 'unreal_mcp', 'tdmcp', 'touchdesigner-mcp', 'davinci-resolve-mcp', 'after-effects-mcp', 'computer-use-mcp'];
2924
+ const nodeMcps = ['adobe_uxp_mcp', 'unreal_mcp', 'tdmcp', 'touchdesigner-mcp', 'davinci-resolve-mcp', 'after-effects-mcp', 'computer-use-mcp', 'mcsc'];
2925
2925
  for (const mcpFolder of nodeMcps.filter(m => selectedMcps.includes(m))) {
2926
2926
  const targetFolder = path.join(mcpCodeTarget, mcpFolder);
2927
2927
  if (fs.existsSync(path.join(targetFolder, 'package.json'))) {
@@ -3469,13 +3469,17 @@ function compileCodexAgents(agents, targetDir, pipelineConfig = null) {
3469
3469
 
3470
3470
 
3471
3471
  function injectHarnessRules() {
3472
- const geminiMdSrc = path.join(srcDir, 'GEMINI.md');
3472
+ const rulesMdSrc = path.join(srcDir, 'RULES.md');
3473
3473
  const agentsMdSrc = path.join(srcDir, '.agents', 'agents.md');
3474
3474
 
3475
- if (fs.existsSync(geminiMdSrc)) {
3476
- installStep(`install GEMINI.md to ${path.join(geminiDir, 'GEMINI.md')}`, () => {
3477
- copyDirRecursiveSync(geminiMdSrc, path.join(geminiDir, 'GEMINI.md'));
3478
- log.step(`Installed GEMINI.md to ${path.join(geminiDir, 'GEMINI.md')}`);
3475
+ if (fs.existsSync(rulesMdSrc)) {
3476
+ installStep(`install RULES.md to ${path.join(geminiDir, 'RULES.md')}`, () => {
3477
+ copyDirRecursiveSync(rulesMdSrc, path.join(geminiDir, 'RULES.md'));
3478
+ // Keep GEMINI.md in sync for backwards compatibility with Antigravity CLI harnesses
3479
+ try {
3480
+ fs.copyFileSync(rulesMdSrc, path.join(geminiDir, 'GEMINI.md'));
3481
+ } catch (e) { logDebug(e, 'sync GEMINI.md fallback'); }
3482
+ log.step(`Installed RULES.md to ${path.join(geminiDir, 'RULES.md')}`);
3479
3483
  }, 'The harness injection below still runs.');
3480
3484
 
3481
3485
  // Dispatcher scripts must land in ~/.claude/workflows/, because that is
@@ -3495,7 +3499,7 @@ function injectHarnessRules() {
3495
3499
 
3496
3500
  const startcycleWorkflowSrc = path.join(srcDir, '.agents', 'workflows', 'startcycle.md');
3497
3501
  const sources = installStep('read the global rule sources', () => ({
3498
- globalRules: fs.readFileSync(geminiMdSrc, 'utf8'),
3502
+ globalRules: fs.readFileSync(rulesMdSrc, 'utf8'),
3499
3503
  startcycleContent: fs.existsSync(startcycleWorkflowSrc) ? fs.readFileSync(startcycleWorkflowSrc, 'utf8') : '',
3500
3504
  agentsMdContent: fs.existsSync(agentsMdSrc) ? fs.readFileSync(agentsMdSrc, 'utf8') : ''
3501
3505
  }), 'Cursor, Claude, Copilot and Codex keep their current instruction files.');
@@ -3670,6 +3674,106 @@ function injectHarnessRules() {
3670
3674
  }
3671
3675
  }
3672
3676
 
3677
+ // Copy the OpenCode plugin + command payload and register both in
3678
+ // opencode.jsonc. This is the single copy site: the Quick Update path
3679
+ // (injectHarnessRules -> installGlobalHooks) and the fresh-install path
3680
+ // (universalHarnessSync -> syncOpencodeConfig) both reach it, so a version that
3681
+ // adds or changes the plugin can no longer ship to one path and miss the other.
3682
+ //
3683
+ // `data` is mutated in place when the caller owns the config write (Universal
3684
+ // Sync merges MCP servers in the same pass and writes once). When `data` is
3685
+ // omitted the function loads and saves the config itself, which is what lets the
3686
+ // Quick Update path register the plugin as well as copy it.
3687
+ function installOpencodePlugin({ targetHome = homeDir, configPath = null, data = null } = {}) {
3688
+ const opencodeDir = configPath
3689
+ ? path.dirname(configPath)
3690
+ : (process.platform === 'win32'
3691
+ ? path.join(process.env.APPDATA || targetHome, 'opencode')
3692
+ : path.join(targetHome, '.config', 'opencode'));
3693
+
3694
+ const pluginSrc = path.join(srcDir, '.opencode', 'plugins', 'bdb-aos.js');
3695
+ let pluginInstalled = false;
3696
+ if (fs.existsSync(pluginSrc)) {
3697
+ const pluginDest = path.join(opencodeDir, 'plugins', 'bdb-aos.js');
3698
+ try {
3699
+ fs.mkdirSync(path.dirname(pluginDest), { recursive: true });
3700
+ fs.copyFileSync(pluginSrc, pluginDest);
3701
+ try { fs.chmodSync(pluginDest, 0o644); } catch (e) { logDebug(e, 'chmod opencode plugin'); }
3702
+ pluginInstalled = true;
3703
+ log.step(`Installed OpenCode plugin to ${pluginDest}`);
3704
+ } catch (e) {
3705
+ log.warn(`Could not install OpenCode plugin: ${e.message}`);
3706
+ }
3707
+ }
3708
+
3709
+ // Slash-command payloads. Without these the /startcycle-graph command has no
3710
+ // native resolution and only survives as a raw-text match in the plugin.
3711
+ const commandsSrc = path.join(srcDir, '.opencode', 'commands');
3712
+ if (fs.existsSync(commandsSrc)) {
3713
+ try {
3714
+ copyDirRecursiveSync(commandsSrc, path.join(opencodeDir, 'commands'));
3715
+ log.step(`Installed OpenCode commands to ${path.join(opencodeDir, 'commands')}`);
3716
+ } catch (e) {
3717
+ log.warn(`Could not install OpenCode commands: ${e.message}`);
3718
+ }
3719
+ }
3720
+
3721
+ if (!pluginInstalled) return data;
3722
+
3723
+ const ownsWrite = data === null;
3724
+ let beforeSerialized = null;
3725
+ if (ownsWrite) {
3726
+ if (!configPath) return data;
3727
+ const existing = readJsoncFile(configPath) || {};
3728
+ // Snapshot before mutating: `data` becomes the same object, so
3729
+ // comparing afterwards would always report "unchanged".
3730
+ beforeSerialized = JSON.stringify(existing, null, 2);
3731
+ data = existing;
3732
+ }
3733
+
3734
+ // Register the plugin.
3735
+ if (!Array.isArray(data.plugin)) data.plugin = [];
3736
+ const pluginPathNormalized = path.join(opencodeDir, 'plugins', 'bdb-aos.js').replace(/\\/g, '/');
3737
+ const alreadyRegistered = data.plugin.some(p => {
3738
+ const str = typeof p === 'string' ? p : (Array.isArray(p) ? p[0] : '');
3739
+ return str.includes('bdb-aos');
3740
+ });
3741
+ if (!alreadyRegistered) data.plugin.push(pluginPathNormalized);
3742
+
3743
+ // Skill paths. `.agents/skills` stays project-relative on purpose: it is the
3744
+ // per-project contract, and OpenCode resolves it against each project, so it
3745
+ // is meaningful in a bootstrapped project and inert elsewhere. The absolute
3746
+ // ~/.agents/skills is added only when it is really there -- registering a
3747
+ // path that does not exist is the defect this replaces.
3748
+ const homeAgentsSkills = path.join(targetHome, '.agents', 'skills').replace(/\\/g, '/');
3749
+ const desired = ['.agents/skills'];
3750
+ if (fs.existsSync(homeAgentsSkills)) desired.unshift(homeAgentsSkills);
3751
+ if (!data.skills || typeof data.skills !== 'object' || !Array.isArray(data.skills.paths)) {
3752
+ data.skills = { paths: desired.slice() };
3753
+ } else {
3754
+ for (const p of desired) {
3755
+ if (!data.skills.paths.includes(p)) data.skills.paths.push(p);
3756
+ }
3757
+ }
3758
+
3759
+ if (ownsWrite) {
3760
+ // Write only on a real change. readJsoncFile strips comments, so
3761
+ // serialising an unchanged config would silently eat a user's comments
3762
+ // for no benefit. When a write is genuinely needed the comments in the
3763
+ // file are lost -- acceptable, and worth saying out loud in the PR.
3764
+ const serialized = JSON.stringify(data, null, 2);
3765
+ if (beforeSerialized === serialized) return data;
3766
+ try {
3767
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
3768
+ fs.writeFileSync(configPath, serialized, { mode: 0o600 });
3769
+ try { fs.chmodSync(configPath, 0o600); } catch (e) { logDebug(e, 'chmod opencode config'); }
3770
+ } catch (e) {
3771
+ log.warn(`Could not write ${configPath}: ${e.message}`);
3772
+ }
3773
+ }
3774
+ return data;
3775
+ }
3776
+
3673
3777
  // Deliver the hook scripts to ~/.claude/hooks/ and wire them in settings.json.
3674
3778
  // Both the full install and Quick Update funnel through here. Quick Update used
3675
3779
  // to do neither: it refreshes skills and submodules, but hooks are harness
@@ -3729,22 +3833,15 @@ function installGlobalHooks({ targetHome = homeDir, targetGemini = geminiDir } =
3729
3833
  mergeCodexTomlHooks(path.join(targetHome, '.codex', 'config.toml'));
3730
3834
 
3731
3835
  // 4. OpenCode CLI
3732
- const opencodeDir = process.platform === 'win32'
3733
- ? path.join(process.env.APPDATA || targetHome, 'opencode')
3734
- : path.join(targetHome, '.config', 'opencode');
3735
- const opencodePluginSrc = path.join(srcDir, '.opencode', 'plugins', 'bdb-aos.js');
3736
- if (fs.existsSync(opencodePluginSrc)) {
3737
- const opencodePluginsDir = path.join(opencodeDir, 'plugins');
3738
- const opencodePluginDest = path.join(opencodePluginsDir, 'bdb-aos.js');
3739
- try {
3740
- fs.mkdirSync(opencodePluginsDir, { recursive: true });
3741
- fs.copyFileSync(opencodePluginSrc, opencodePluginDest);
3742
- try { fs.chmodSync(opencodePluginDest, 0o644); } catch (e) { logDebug(e, 'chmod opencode plugin'); }
3743
- log.step(`Installed OpenCode plugin to ${opencodePluginDest}`);
3744
- } catch (e) {
3745
- log.warn(`Could not install OpenCode plugin: ${e.message}`);
3746
- }
3747
- }
3836
+ installOpencodePlugin({
3837
+ targetHome,
3838
+ configPath: path.join(
3839
+ process.platform === 'win32'
3840
+ ? path.join(process.env.APPDATA || targetHome, 'opencode')
3841
+ : path.join(targetHome, '.config', 'opencode'),
3842
+ 'opencode.jsonc'
3843
+ ),
3844
+ });
3748
3845
 
3749
3846
  // 5. Global CLI launcher binaries (aos-config, aos-dashboard, aos-uninstall)
3750
3847
  installGlobalBinaries();
@@ -4774,47 +4871,10 @@ async function universalHarnessSync(primaryMcpConfigPath, installedModules = [])
4774
4871
  }
4775
4872
  }
4776
4873
 
4777
- // Wire BDB AOS Plugin for OpenCode
4778
- const opencodeDir = path.dirname(targetPath);
4779
- const pluginsDir = path.join(opencodeDir, 'plugins');
4780
- const pluginFile = path.join(pluginsDir, 'bdb-aos.js');
4781
- const pluginSrc = path.join(srcDir, '.opencode', 'plugins', 'bdb-aos.js');
4782
-
4783
- try {
4784
- if (fs.existsSync(pluginSrc)) {
4785
- fs.mkdirSync(pluginsDir, { recursive: true });
4786
- fs.copyFileSync(pluginSrc, pluginFile);
4787
- try { fs.chmodSync(pluginFile, 0o644); } catch (e) { logDebug(e, 'chmod pluginFile'); }
4788
- }
4789
- } catch (pluginErr) {
4790
- log.warn(`Could not install OpenCode plugin: ${pluginErr.message}`);
4791
- }
4792
-
4793
- // Register plugin in opencode.jsonc if plugin file exists
4794
- if (fs.existsSync(pluginFile)) {
4795
- if (!Array.isArray(data.plugin)) {
4796
- data.plugin = [];
4797
- }
4798
- const pluginPathNormalized = pluginFile.replace(/\\/g, '/');
4799
- const alreadyRegistered = data.plugin.some(p => {
4800
- const str = typeof p === 'string' ? p : (Array.isArray(p) ? p[0] : '');
4801
- return str.includes('bdb-aos');
4802
- });
4803
- if (!alreadyRegistered) {
4804
- data.plugin.push(pluginPathNormalized);
4805
- }
4806
- }
4807
-
4808
- // Register skills paths for OpenCode
4809
- if (!data.skills || typeof data.skills !== 'object') {
4810
- data.skills = { paths: [".agents/skills"] };
4811
- } else if (Array.isArray(data.skills.paths)) {
4812
- if (!data.skills.paths.includes(".agents/skills")) {
4813
- data.skills.paths.push(".agents/skills");
4814
- }
4815
- } else {
4816
- data.skills.paths = [".agents/skills"];
4817
- }
4874
+ // Wire BDB AOS Plugin for OpenCode. `data` is handed in because this
4875
+ // function owns the write -- it merges MCP servers in the same pass.
4876
+ // homeDir matches how the opencode harness entry builds its path.
4877
+ installOpencodePlugin({ targetHome: homeDir, configPath: targetPath, data });
4818
4878
 
4819
4879
  fs.mkdirSync(path.dirname(targetPath), { recursive: true });
4820
4880
  fs.writeFileSync(targetPath, JSON.stringify(data, null, 2), { mode: 0o600 });
@@ -4914,7 +4974,7 @@ async function runQuickUpdate(installState) {
4914
4974
  pruneRemovedSkills(_sessionManifest);
4915
4975
  s.stop('Skills refreshed');
4916
4976
 
4917
- // Everything injectHarnessRules() delivers -- GEMINI.md, the dispatcher
4977
+ // Everything injectHarnessRules() delivers -- RULES.md, the dispatcher
4918
4978
  // workflows the skills point at, the compiled subagent definitions, the
4919
4979
  // harness rule files and the gate + memory hooks -- used to be
4920
4980
  // fresh-install-only. v4.4.1 split just the hooks out of it for Quick
@@ -5087,7 +5147,7 @@ async function main() {
5087
5147
  path.join(srcDir, '.cursor'),
5088
5148
  path.join(srcDir, '.github'),
5089
5149
  path.join(srcDir, '.codex-plugin'),
5090
- path.join(srcDir, 'GEMINI.md'),
5150
+ path.join(srcDir, 'RULES.md'),
5091
5151
  path.join(srcDir, 'AGENTS.md'),
5092
5152
  path.join(srcDir, 'CLAUDE.md'),
5093
5153
  path.join(srcDir, 'CODEX.md'),
@@ -5493,6 +5553,7 @@ module.exports = {
5493
5553
  mergeCodexHooks: mergeCodexTomlHooks,
5494
5554
  mergeCodexTomlMcpServers,
5495
5555
  installGlobalHooks,
5556
+ installOpencodePlugin,
5496
5557
  installProjectHarness,
5497
5558
  promptMcpSelection,
5498
5559
  mirrorMcpServersTo,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hybridlabor-api/aos",
3
- "version": "4.9.0",
3
+ "version": "4.11.0",
4
4
  "description": "AOS — A Curated AI AGENT OS. Optimized agent skills and add-ons like memB, OpenWiki, Heimdall Token Saver, and Godmode architectures.",
5
5
  "main": "installer.js",
6
6
  "engines": {
@@ -27,7 +27,7 @@
27
27
  "plugin:build": "node scripts/build-plugin-manifest.mjs",
28
28
  "plugin:check": "node scripts/build-plugin-manifest.mjs --check",
29
29
  "doctor": "node bin/aos-doctor.mjs",
30
- "test": "node scripts/validate-skills.mjs --selftest && node scripts/validate-skills.mjs && node scripts/build-plugin-manifest.mjs --check && node tests/aos-store.test.mjs && node tests/aos-doctor.test.mjs && node tests/build-plugin-manifest.test.mjs"
30
+ "test": "node scripts/validate-skills.mjs --selftest && node scripts/validate-skills.mjs && node scripts/build-plugin-manifest.mjs --check && node --test tests/opencode-graph-gate.test.js && node --test tests/cross-harness-hooks.test.js && node tests/aos-store.test.mjs && node tests/aos-doctor.test.mjs && node tests/build-plugin-manifest.test.mjs"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public"
@@ -45,7 +45,7 @@
45
45
  "bin/",
46
46
  "lib/",
47
47
  "mcp_config.json",
48
- "GEMINI.md",
48
+ "RULES.md",
49
49
  "CODEX.md",
50
50
  "CLAUDE.md",
51
51
  "THIRD_PARTY_NOTICES.md",
@@ -0,0 +1,252 @@
1
+ ---
2
+ name: bdb-eventagency-skill
3
+ description: "Use for event agency operations: client intake, project scoping, vendor management, crew coordination, production planning, pre-show logistics, and post-show wrap. Delegates technical execution to godmode-eventtech and bdbmediastorm."
4
+ category: media-eventtech
5
+ source: talkvalue/event-agency-skills
6
+ ---
7
+
8
+ # BDB Event Agency Skill
9
+
10
+ The **agency-ops layer** for Hybridlabor Global — the business and production-coordination side of running an event company. This skill owns everything that happens *before, around, and after* the show. It does not own the technical execution itself.
11
+
12
+ Techniques adapted from [talkvalue/event-agency-skills](https://github.com/talkvalue/event-agency-skills) (Apache-2.0). Prose only — no upstream code, no scripts, no dependencies.
13
+
14
+ ---
15
+
16
+ ## 1. Routing Table
17
+
18
+ | Task | Route to |
19
+ |---|---|
20
+ | Signal flow, protocol binding, OSC/DMX, hardware limits, MCP orchestration | `godmode-eventtech` |
21
+ | Live show architecture brainstorming, creative direction | `bdbmediastorm` |
22
+ | Lighting cue execution, patch, playback | `bdb-grandma3-mcp` |
23
+ | Video clip, layer, and output control | `bdb-resolume-mcp` |
24
+ | 3D scene, render, spatial build | `godmode-3d-creation` |
25
+ | Client intake, scoping, budget, scheduling, vendor, crew, pre-show logistics, post-show wrap | **stay in this skill** |
26
+
27
+ **Boundary rule:** if the question is *"what should this look like"* or *"what signal goes where"*, route out. If it is *"who is bringing it, what did they promise, and what happens when they don't"*, it stays here. This skill never issues a technical execution instruction — it routes.
28
+
29
+ ---
30
+
31
+ ## 2. Client & Project Intake
32
+
33
+ An event request is not a booking until these are known. Anything guessed here becomes a change order later.
34
+
35
+ ### Required fields before committing
36
+
37
+ | Field | Why it is required | If missing |
38
+ |---|---|---|
39
+ | **Date** (and whether date or time is flexible) | Drives every downstream deadline in this skill | Cannot scope. Ask first. |
40
+ | **Venue** (named, or shortlist with constraints) | Venue holds all vendor access; determines power, load-in window, noise curfew | Cannot plan load-in or vendor sequencing |
41
+ | **Brief** — what must happen, who must be in the room | Distinguishes an event from a venue rental | Ask: *"What does success look like when the last guest leaves?"* |
42
+ | **Budget range** — a band, not a number | Drives the action policy: which classes are `never` vs `criteria` | Do not quote. Scope verbally only. |
43
+ | **Technical rider** | AV, staging, power, network, FOH position | Route to `godmode-eventtech` for feasibility |
44
+ | **Attendance estimate** | Drives catering counts, staffing, registration, capacity | Cannot close catering or staffing |
45
+ | **Client contact + decision authority** | Who can actually say yes | Every later "we'll confirm" is a no |
46
+
47
+ ### Scoping questions to ask before any commitment
48
+
49
+ 1. **Who signs?** Not "the client" — a name. The person who can approve a change order on show day.
50
+ 2. **What is non-negotiable?** Date, venue, budget, talent, or brand. Everything else is negotiable; know which one is not.
51
+ 3. **What has been promised already, in writing, to anyone?** Sponsors and speakers hold commitments that predate you.
52
+ 4. **What is the failure mode we are least able to absorb?** Late AV is a catastrophe; late florals are an inconvenience. Escalation urgency (§4) follows from this answer.
53
+ 5. **Is there a technical rider yet?** If not, that is a Phase 0 action, not a show-week action.
54
+
55
+ ### Scope statement rule
56
+
57
+ Produce a written scope before any deposit. It must name: date, venue, attendance band, the ten action classes with their modes (default-deny — see `.aos/factory.yaml`), what is explicitly out of scope, and the change-order trigger. A scope without an out-of-scope list will be expanded by the client by default.
58
+
59
+ ---
60
+
61
+ ## 3. Inbox Triage
62
+
63
+ Run this at the start of a working day on an active event, before a production meeting, or after time away. It produces a **point-in-time snapshot**, not a live feed.
64
+
65
+ ### Stakeholder classification
66
+
67
+ | Type | Key signals | Default tier |
68
+ |---|---|---|
69
+ | **Vendor** | AV, catering, security, decor, transport, staffing, rentals, print | 2 |
70
+ | **Client** | Contracting organisation, corporate domain, C-suite/VP | 2 |
71
+ | **Sponsor** | Activation budget or in-kind contribution — **distinct from the client even when the client also sponsors** | 3 |
72
+ | **Speaker** | Bureau domain, rider, session, keynote, bio/headshot request | 3 |
73
+ | **Venue** | Hotel, convention centre, outdoor site, venue coordinator, venue-employed catering manager | 2 |
74
+ | **Internal** | Own domain, team aliases, automated notifications | 3 |
75
+
76
+ When a thread is ambiguous, default to the type with the higher production impact: **Vendor > Venue > Speaker** for operational threads.
77
+
78
+ ### Priority tiers
79
+
80
+ | Tier | Label | Response window | Criteria |
81
+ |---|---|---|---|
82
+ | **1** | Immediate | 1–2 hours | Blocked deliverable, payment deadline within 48h, client waiting on confirmation, venue or vendor escalation, load-in unresolved within 72h of the event |
83
+ | **2** | Today | Business hours | Advancing information requests, assets for review, draft approvals, speaker logistics more than 72h out |
84
+ | **3** | Tracking | None | FYIs, confirmations of receipt, vendor acknowledgements, threads you are CC'd on |
85
+
86
+ ### Temporal override rules — apply before finalising tiers
87
+
88
+ These override the table above:
89
+
90
+ - Any vendor email mentioning **load-in, install, delivery window, or rider compliance** is Tier 1 if the event is within 14 days.
91
+ - Any client email containing **a question in subject or body** is Tier 1.
92
+ - Any Tier 1 thread with **no outbound reply in 24h+** escalates to flagged regardless of its original tier.
93
+
94
+ **Rationale:** the tier table is a prior. The overrides exist because the failure mode of event email is a request that looked like an FYI and was not one.
95
+
96
+ ### Output shape
97
+
98
+ A dated digest containing: event name, timestamp, event phase, period covered, counts per tier, then the tier-1 and tier-2 threads with the *specific* action each needs and who owns it. Every extracted action item must be one of:
99
+
100
+ - **[OUR ACTION]** — a commitment we made, with a date
101
+ - **[AWAITING]** — a commitment someone else made, with a date
102
+ - **[APPROVAL NEEDED]** — a decision only the client can make
103
+
104
+ Never mix these three. An action with no owner is not an action item.
105
+
106
+ ---
107
+
108
+ ## 4. Vendor Management
109
+
110
+ Track **existing** vendor commitments and deliverables. This skill does not source vendors, negotiate contracts, or process payments.
111
+
112
+ ### Vendor types, lead times, and failure impact
113
+
114
+ | Type | Typical lead time | Failure impact |
115
+ |---|---|---|
116
+ | AV / Technical | 2–4 weeks | **Critical** — no AV, no event |
117
+ | Venue | Contracted months ahead | **Critical** — venue holds all vendor access |
118
+ | Catering / F&B | 2–3 weeks (final count 72h) | High — dietary and count changes cascade |
119
+ | Transport / Logistics | 1–2 weeks | High — gear and people movement |
120
+ | Security | 1–2 weeks | High — compliance and safety |
121
+ | Entertainment / Talent | Rider-dependent | High — contracted, non-fungible |
122
+ | Decor / Floral | 1–2 weeks | Medium — visual, not operational |
123
+ | Staffing Agencies | 1–2 weeks | Medium — replaceable if flagged early |
124
+ | Signage / Print | 5–10 business days | Medium — wayfinding and branding |
125
+ | Rentals | 1 week | Medium — tables, chairs, linens |
126
+
127
+ ### Phase-based urgency
128
+
129
+ Urgency is relative to **event proximity**, never absolute time. The same 48-hour silence is fine in month one and a production risk in advance week.
130
+
131
+ | Phase | Window | Overdue threshold | Escalation speed |
132
+ |---|---|---|---|
133
+ | Normal | T-30 and out | 48h no response | Standard: email → wait → follow-up |
134
+ | Planning | T-30 to T-8 | 24h no response | Accelerated: email → same-day follow-up |
135
+ | Advance | T-7 to T-2 | 12h no response | Urgent: email → phone within 4h |
136
+ | Load-in | T-1 | 2h no response | Emergency: phone immediately, escalate to production lead |
137
+ | Show day | T-0 | 1h no response | Emergency: phone + contingency activation |
138
+
139
+ ### Item status taxonomy
140
+
141
+ | Status | Meaning |
142
+ |---|---|
143
+ | **OVERDUE** | Past deadline, no confirmation |
144
+ | **AT RISK** | Deadline approaching, last contact exceeds the phase threshold |
145
+ | **ON TRACK** | Confirmed, or within the normal response window |
146
+ | **BLOCKED** | **Waiting on us, not the vendor** |
147
+
148
+ **BLOCKED items are the most important row in the table and are routinely under-reported.** When a vendor is waiting on our headcount, floor plan, or approval, that is our team's problem. Surface it first.
149
+
150
+ ### Escalation path
151
+
152
+ | Attempt | AV / Venue / Catering | Decor / Signage / Rentals | Staffing / Transport |
153
+ |---|---|---|---|
154
+ | 1st | Follow-up email quoting the original request | Follow-up email | Follow-up email |
155
+ | 2nd | Phone the account manager within 4h | Phone next business day | Phone next business day |
156
+ | 3rd | Escalate to production lead + contingency research | Source a backup vendor | Source a backup vendor |
157
+
158
+ **On show day: skip email entirely. Phone or in-person only.** Never send a follow-up email on T-0.
159
+
160
+ ### Drafting rules for vendor follow-ups
161
+
162
+ - Reference the **specific** original request or deliverable — not "following up on my last email".
163
+ - State the deadline explicitly.
164
+ - Ask for a **specific confirmation** ("Can you confirm delivery by 14 March?"), not an open question.
165
+ - **No guilt, no pressure.** Vendors respond better to clarity than to escalation tone.
166
+ - For a phone call, prepare: vendor name, account manager, the specific item, the deadline and why it matters, and the fallback question — *"If the original plan isn't possible, what's the alternative?"*
167
+
168
+ ### Budget and invoice context
169
+
170
+ | Age | Status | Action |
171
+ |---|---|---|
172
+ | Within terms | Current | None |
173
+ | 1–30 days | Nudge | Friendly reminder — assume oversight |
174
+ | 31–60 days | Firm request | Direct ask with date and amount |
175
+ | 60+ days | Escalation | Account lead; consider late fee or hold |
176
+
177
+ Variance alerts: **Venue 5% over** (largest single line, small % = big dollars), **Catering 10%** (per-head counts fluctuate), **Marketing 15%** (most flexible), **Contingency 0% drawn before T-14** (should not be touched), **all others 10%**.
178
+
179
+ ---
180
+
181
+ ## 5. Production Coordination
182
+
183
+ ### 5.1 Pre-production
184
+
185
+ **Site survey — non-negotiable for any first-time venue.** Record: power distribution and available amperage by area, network drops and their throughput, load-in vehicle access and dock dimensions, door widths for the largest scenic element, FOH position and sightlines, noise curfew, and rigging points with their load ratings. Route the technical read to `godmode-eventtech` — this skill records the findings and flags blockers, it does not validate the signal plan.
186
+
187
+ **Paperwork gate.** Nothing loads in without: certificate of insurance (COI) from every vendor on site, venue access permits, and crew credentials. These are the most common cause of a T-1 access failure.
188
+
189
+ **Run-of-show (ROS) is the single coordination artefact.** One document, versioned, owned by the production lead, distributed to every vendor. It defines: load-in window and sequence, soundcheck, doors, show start, each cue block, and load-out. A conflict discovered in the ROS is cheap. A conflict discovered at the dock is not.
190
+
191
+ **Speaker materials — deadline framework:**
192
+
193
+ | Milestone | Due | Deliverables |
194
+ |---|---|---|
195
+ | D-30 | Bio (25 / 50 / 100-word variants, third person) + headshot (min 300×300px) | |
196
+ | D-21 | Session abstract (75 words, attendee-focused), learning outcomes, AV requirements | |
197
+ | D-14 | Final slide deck, event template applied | |
198
+ | D-7 | Travel, hotel, ground transport, dietary and accessibility requirements | |
199
+ | D-1 | Attendance and schedule confirmed | |
200
+
201
+ Learning outcomes use action verbs only — **implement, apply, build, create, deploy, evaluate, identify, master**. Never: *explore, discuss, learn about, understand, discover, dive into, unpack*.
202
+
203
+ Banned in any bio or session description: *thought leader, visionary, guru, passionate about, world-class, cutting-edge, revolutionary, groundbreaking, leverage, synergize, transformative, innovative*. Replace with specific numbers, named clients, measurable outcomes, concrete credentials.
204
+
205
+ ### 5.2 Day-of flow
206
+
207
+ | Phase | Anchor | What must be true to advance |
208
+ |---|---|---|
209
+ | **Load-in** | T-1 or earlier | COI and permits verified per vendor, power patched and tested, ROS sequence confirmed with the dock |
210
+ | **Soundcheck** | Fixed slot, never "when ready" | Line check done, cue stack loaded, FOH and monitors positioned, walk-through with the client if contracted |
211
+ | **Doors** | Published start | House open, accessibility routes clear, front-of-house briefed on the ROS |
212
+ | **Show** | Per cue block | Production lead confirms each block against the ROS; deviations logged, not improvised |
213
+ | **Strike** | After clearance | Equipment accounted for against the load-in manifest, rentals checked out before the truck leaves |
214
+
215
+ **The strike manifest is the load-in manifest.** Count on the way in, count on the way out. Rentals left on site are invoiced at loss.
216
+
217
+ ### 5.3 Post-show wrap
218
+
219
+ Within 72 hours of strike:
220
+
221
+ - **Debrief** — what worked, what did not, what nearly failed. Blameless, specific, and it feeds the next ROS.
222
+ - **Invoice triggers** — headcount actuals vs. quoted, rental shortfalls, overtime hours, damage claims. Capture while the evidence exists.
223
+ - **Thank-you and forward look** — personalised, referencing what the attendee actually did, not a broadcast.
224
+ - **Asset archiving** — recorded content, photography, final ROS, run sheets, and the vendor contact list with performance notes, filed where the next production can find them.
225
+ - **Vendor performance note per vendor** — this is the input to §4's escalation tiers for the next event. A vendor who delivered three times running is not escalated on the first silence.
226
+
227
+ ### 5.4 Post-event reporting
228
+
229
+ Performance tiers: **Exceeded** (beat goal by 10%+ on primary metrics), **Met** (within 10%), **Missed** (more than 10% below on one or more), **Mixed** (hit some, missed others — say which and why).
230
+
231
+ Report structure: performance summary → what worked (with evidence) → what did not (with likely cause) → key insights (each tied to a data point) → specific recommendations for the next event → sponsor ROI if applicable.
232
+
233
+ Channel attribution is **inherently imperfect** — most attendees meet several touchpoints before registering. Report it honestly, acknowledge mixed sources, and never over-credit a single channel.
234
+
235
+ ---
236
+
237
+ ## 6. Verification
238
+
239
+ - [ ] Every event is classified into a phase (Normal / Planning / Advance / Load-In / Show Day) and that classification is stated, not assumed.
240
+ - [ ] Urgency thresholds are applied relative to event proximity, not absolute days.
241
+ - [ ] Every BLOCKED item names our team as owner — no BLOCKED item is left attributed to a vendor.
242
+ - [ ] Technical execution questions were routed to `godmode-eventtech` / `bdbmediastorm` rather than answered from this skill.
243
+ - [ ] No signal-flow, protocol, hardware-limit, or cue-execution instruction was issued from this skill.
244
+ - [ ] COI, permits, and crew credentials are confirmed before load-in, per vendor.
245
+ - [ ] The run-of-show is versioned, distributed, and owned by the production lead.
246
+ - [ ] Speaker materials are checked against the D-30 / D-21 / D-14 / D-7 / D-1 framework.
247
+ - [ ] Banned fluff words are absent from every bio, abstract, and session description.
248
+ - [ ] On show day, no vendor follow-up was sent by email.
249
+ - [ ] The strike manifest reconciles against the load-in manifest.
250
+ - [ ] Invoice triggers captured within 72 hours of strike.
251
+ - [ ] Attribution figures are presented with their acknowledged uncertainty.
252
+ - [ ] No upstream script, Python file, or Composio tool dependency was added.