@synap-core/workspace-templates 0.11.0 → 0.23.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/README.md +483 -0
- package/automations/bookmark-enrichment.automation.json +321 -0
- package/automations/github-pr-events.automation.json +505 -0
- package/automations/mail-feed.automation.json +86 -0
- package/automations/ship-a-change-checks-green.automation.json +106 -0
- package/automations/ship-a-change-checks-red.automation.json +106 -0
- package/automations/ship-a-change-deployed.automation.json +56 -0
- package/automations/ship-a-change-pr-merged.automation.json +110 -0
- package/automations/ship-a-change-pr-opened.automation.json +104 -0
- package/automations/url-bookmark-capture.automation.json +132 -0
- package/capabilities/agency-skills.capability.json +157 -0
- package/capabilities/apify.capability.json +265 -0
- package/capabilities/apollo.capability.json +120 -0
- package/capabilities/arch-backend.capability.json +97 -0
- package/capabilities/arch-client-intelligence.capability.json +401 -0
- package/capabilities/backblaze-b2.capability.json +205 -0
- package/capabilities/cal-com.capability.json +266 -0
- package/capabilities/canva.capability.json +274 -0
- package/capabilities/claude-code-routines.capability.json +172 -0
- package/capabilities/claude-managed-agents.capability.json +215 -0
- package/capabilities/client-comms-report.capability.json +246 -0
- package/capabilities/content-idea-to-production.capability.json +29 -0
- package/capabilities/datagouv.capability.json +315 -0
- package/capabilities/discord-bot.capability.json +157 -0
- package/capabilities/dropbox.capability.json +281 -0
- package/capabilities/exa.capability.json +109 -0
- package/capabilities/fal-ai.capability.json +83 -0
- package/capabilities/fal-media-lab.capability.json +158 -0
- package/capabilities/fireflies.capability.json +191 -0
- package/capabilities/freellmapi.capability.json +114 -0
- package/capabilities/generic-apikey.capability.json +92 -0
- package/capabilities/github-merge.capability.json +99 -0
- package/capabilities/github-read.capability.json +325 -0
- package/capabilities/governance-tighten-recommender.capability.json +81 -0
- package/capabilities/jev.capability.json +226 -0
- package/capabilities/lead-conversion-enrollment.capability.json +246 -0
- package/capabilities/mail-feed.capability.json +277 -0
- package/capabilities/mailgun.capability.json +52 -0
- package/capabilities/nango-google.capability.json +639 -0
- package/capabilities/notion.capability.json +417 -0
- package/capabilities/omniroute.capability.json +137 -0
- package/capabilities/posthog-analytics.capability.json +258 -0
- package/capabilities/postiz.capability.json +467 -0
- package/capabilities/proactive-digest.capability.json +190 -0
- package/capabilities/proton.capability.json +288 -0
- package/capabilities/replicate-rvm.capability.json +97 -0
- package/capabilities/research-methods.capability.json +57 -0
- package/capabilities/shopify.capability.json +395 -0
- package/capabilities/slack.capability.json +369 -0
- package/capabilities/stripe.capability.json +420 -0
- package/capabilities/telegram-bridge.capability.json +56 -0
- package/capabilities/treg.capability.json +102 -0
- package/capabilities/unipile-linkedin.capability.json +471 -0
- package/capabilities/vercel.capability.json +424 -0
- package/dist/define-CPS0n8BV.d.ts +1331 -0
- package/dist/index.d.ts +189 -900
- package/dist/index.js +24654 -21639
- package/dist/index.js.map +1 -1
- package/dist/wire.d.ts +222 -0
- package/dist/wire.js +77 -0
- package/dist/wire.js.map +1 -0
- package/package.json +41 -27
- package/packs/bookmark-views-pack.json +33 -0
- package/packs/crm-pack.json +76 -0
- package/packs/customer-profile.json +28 -0
- package/packs/deep-research.playbook.json +30 -0
- package/packs/event-views-pack.json +33 -0
- package/packs/habit-profile.json +27 -0
- package/packs/hr-pack.json +54 -0
- package/packs/invoice-profile.json +28 -0
- package/packs/knowledge-base-pack.json +56 -0
- package/packs/meeting-profile.json +29 -0
- package/packs/product-profile.json +30 -0
- package/packs/project-management-pack.json +49 -0
- package/packs/recipe-profile.json +29 -0
- package/packs/task-views-pack.json +39 -0
- package/retired.yaml +136 -0
- package/skills/app-factory-build-slice/SKILL.md +70 -0
- package/skills/app-factory-build-slice.catalog.json +17 -0
- package/skills/app-factory-design-canvas/SKILL.md +96 -0
- package/skills/app-factory-design-canvas.catalog.json +17 -0
- package/skills/app-factory-design-review/SKILL.md +99 -0
- package/skills/app-factory-design-review.catalog.json +18 -0
- package/skills/app-factory-research/SKILL.md +123 -0
- package/skills/app-factory-research.catalog.json +17 -0
- package/skills/bookmark-enrichment/SKILL.md +40 -0
- package/skills/carousel-format/carousel-format.skill.json +18 -0
- package/skills/collage-broll/collage-broll.skill.json +20 -0
- package/skills/content-taste/content-taste.skill.json +18 -0
- package/skills/creative-director/creative-director.skill.json +18 -0
- package/skills/design-critique/SKILL.md +135 -0
- package/skills/design-critique.catalog.json +12 -0
- package/skills/designing-with-real-components/SKILL.md +140 -0
- package/skills/designing-with-real-components.catalog.json +12 -0
- package/skills/edit-loop/edit-loop.skill.json +25 -0
- package/skills/facecam-edit/facecam-edit.skill.json +24 -0
- package/skills/mapping-the-server/SKILL.md +54 -0
- package/skills/math-explainer-manimgx/math-explainer-manimgx.skill.json +20 -0
- package/skills/motion-quality-gates/motion-quality-gates.skill.json +20 -0
- package/skills/open-design-edit/open-design-edit.skill.json +24 -0
- package/skills/reading-client-progress/SKILL.md +65 -0
- package/skills/routing-to-channels/SKILL.md +54 -0
- package/skills/stellar-scf-grants-advisor/ASSOCIATE-CHEATSHEET.md +133 -0
- package/skills/stellar-scf-grants-advisor/ASSOCIATE-ONBOARDING-GUIDE.md +761 -0
- package/skills/stellar-scf-grants-advisor/CLIENT-FAQ.md +181 -0
- package/skills/stellar-scf-grants-advisor/PARTNER-HANDOVER.md +130 -0
- package/skills/stellar-scf-grants-advisor/SKILL.md +102 -0
- package/skills/stellar-scf-grants-advisor/examples/README.md +43 -0
- package/skills/stellar-scf-grants-advisor/examples/chat-summary-templates.md +158 -0
- package/skills/stellar-scf-grants-advisor/examples/corpus-comparable-rows.md +136 -0
- package/skills/stellar-scf-grants-advisor/examples/q10-team-rewrites.md +109 -0
- package/skills/stellar-scf-grants-advisor/examples/q2-description-rewrites.md +88 -0
- package/skills/stellar-scf-grants-advisor/examples/q6-integration-rewrites.md +107 -0
- package/skills/stellar-scf-grants-advisor/examples/tranche-structures.md +176 -0
- package/skills/stellar-scf-grants-advisor/reference/01-methodology.md +96 -0
- package/skills/stellar-scf-grants-advisor/reference/02-scoring-framework.md +199 -0
- package/skills/stellar-scf-grants-advisor/reference/03-rejection-patterns.md +241 -0
- package/skills/stellar-scf-grants-advisor/reference/04-winner-patterns.md +120 -0
- package/skills/stellar-scf-grants-advisor/reference/05-comeback-patterns.md +92 -0
- package/skills/stellar-scf-grants-advisor/reference/06-budget-benchmarks.md +125 -0
- package/skills/stellar-scf-grants-advisor/reference/07-integration-list.md +147 -0
- package/skills/stellar-scf-grants-advisor/reference/08-abstract-fields.md +258 -0
- package/skills/stellar-scf-grants-advisor/reference/09-build-fields.md +259 -0
- package/skills/stellar-scf-grants-advisor/reference/10-corpus-winners.md +135 -0
- package/skills/stellar-scf-grants-advisor/reference/11-corpus-rejects.md +267 -0
- package/skills/stellar-scf-grants-advisor/reference/12-client-communication.md +131 -0
- package/skills/stellar-scf-grants-advisor/reference/13-excel-output-spec.md +199 -0
- package/skills/stellar-scf-grants-advisor/reference/14-worked-examples.md +160 -0
- package/skills/stellar-scf-grants-advisor/templates/abstract-review-builder.py +253 -0
- package/skills/stellar-scf-grants-advisor/templates/build-review-builder.py +213 -0
- package/skills/video-direction/video-direction.skill.json +20 -0
- package/skills/video-style-vocabulary/video-style-vocabulary.skill.json +20 -0
- package/skills/video-toolbox/video-toolbox.skill.json +20 -0
- package/src/__fixtures__/lifecycle-presets.flat-before.json +205 -0
- package/src/agency-os.yaml +122 -0
- package/src/agent-os-skill-slugs.test.ts +65 -0
- package/src/apify-social-reader.test.ts +317 -0
- package/src/base.template.test.ts +25 -19
- package/src/base.yaml +95 -39
- package/src/blockchain-ecosystem.yaml +1 -0
- package/src/brand-library.yaml +525 -14
- package/src/builder-dev-fold.template.test.ts +113 -0
- package/src/builder.yaml +798 -92
- package/src/business-model-catalog-description.test.ts +47 -0
- package/src/business-model-grp.template.test.ts +214 -0
- package/src/business-model.yaml +598 -0
- package/src/catalog-safety.test.ts +198 -0
- package/src/catalog.template-items.test.ts +75 -0
- package/src/catalog.ts +85 -2
- package/src/civic-france.yaml +102 -0
- package/src/concept-guard.test.ts +28 -8
- package/src/concept-guard.ts +2 -2
- package/src/content-creation.template.test.ts +52 -0
- package/src/content-creation.yaml +192 -0
- package/src/content-os.edit-loop.template.test.ts +210 -0
- package/src/content-os.publish-due-posts.template.test.ts +261 -0
- package/src/content-os.template.test.ts +322 -0
- package/src/content-os.video-takes.template.test.ts +338 -0
- package/src/content-os.work-a-take.template.test.ts +125 -0
- package/src/content-os.yaml +1830 -39
- package/src/content-studio-retired.template.test.ts +82 -0
- package/src/corpus-flow-validity.test.ts +4 -5
- package/src/crm-absorbs-outreach.template.test.ts +117 -0
- package/src/crm-build-plan.template.test.ts +128 -0
- package/src/crm-lists.template.test.ts +96 -0
- package/src/crm-messages-cadence.template.test.ts +164 -0
- package/src/crm-one-send-door.template.test.ts +65 -0
- package/src/crm.yaml +1456 -181
- package/src/decisions-wave.template.test.ts +186 -0
- package/src/define.ts +130 -17
- package/src/design-to-implementation.template.test.ts +94 -0
- package/src/dist-freshness.test.ts +97 -0
- package/src/domain-template-type.test.ts +75 -0
- package/src/ecosystem.yaml +27 -66
- package/src/enterprise-os.yaml +10 -134
- package/src/facecam-edit.audio-studio.test.ts +188 -0
- package/src/fal-generate-image.test.ts +200 -0
- package/src/fal-media-lab-pod-files.test.ts +180 -0
- package/src/finance.yaml +254 -1
- package/src/foundation.yaml +130 -28
- package/src/frame-host-modules.d.mts +6 -0
- package/src/frame-host-modules.mjs +58 -0
- package/src/generate.mjs +9 -3
- package/src/github-merge.test.ts +210 -0
- package/src/grants.yaml +57 -17
- package/src/hr.yaml +39 -6
- package/src/index.ts +36 -1
- package/src/intent.test.ts +161 -0
- package/src/internal-runbook.yaml +19 -1
- package/src/jev.test.ts +356 -0
- package/src/legal.yaml +33 -1
- package/src/life-os.yaml +65 -240
- package/src/lifecycle-coverage.test.ts +124 -0
- package/src/lifecycle-declarations.test.ts +252 -0
- package/src/lifecycle-presets.test.ts +468 -0
- package/src/lifecycle-presets.ts +494 -0
- package/src/lifecycle-stuck.test.ts +46 -0
- package/src/lifecycle-waits.parity.test.ts +319 -0
- package/src/marketing.yaml +108 -4
- package/src/meetings-knowledge.yaml +18 -0
- package/src/networking.yaml +23 -2
- package/src/operations.yaml +304 -4
- package/src/pipeline-views.template.test.ts +88 -0
- package/src/playbook-goal-placeholders.test.ts +57 -0
- package/src/postiz-contract.test.ts +134 -0
- package/src/presentation-declarations.test.ts +174 -0
- package/src/process-contract.validate.test.ts +352 -0
- package/src/project-management.yaml +39 -740
- package/src/publish-body.d.mts +29 -0
- package/src/publish-body.mjs +74 -0
- package/src/publish-body.test.ts +74 -0
- package/src/publish-official-lib.test.ts +176 -0
- package/src/replicate-rvm.test.ts +504 -0
- package/src/research-base.yaml +119 -20
- package/src/research-decision.yaml +60 -3
- package/src/reserved-profile-slugs.test.ts +83 -0
- package/src/retired-goal-kinds.test.ts +58 -0
- package/src/role-reference-and-step-domain.test.ts +192 -0
- package/src/seed-obligation.test.ts +176 -0
- package/src/send-message-maps.test.ts +227 -0
- package/src/shared-role-ssot.test.ts +42 -1
- package/src/ship-a-change.template.test.ts +177 -0
- package/src/skills.test.ts +170 -0
- package/src/social.yaml +85 -27
- package/src/space-packages.freshness.test.ts +97 -0
- package/src/space-packages.generated.ts +40 -0
- package/src/space-packages.test.ts +125 -0
- package/src/space-packages.ts +73 -0
- package/src/start.test.ts +188 -0
- package/src/task-intents.test.ts +293 -0
- package/src/templates.ts +21639 -21522
- package/src/types.ts +443 -60
- package/src/unipile-publish-post.test.ts +162 -0
- package/src/validate-flow.drift.test.ts +2 -3
- package/src/validate-flow.ts +32 -2
- package/src/validate-onboarding.test.ts +59 -0
- package/src/validate.test.ts +156 -3
- package/src/validate.ts +1384 -7
- package/src/wire-core.ts +231 -0
- package/src/wire.test.ts +159 -0
- package/src/wire.ts +107 -0
- package/src/__fixtures__/report-automation-flow.json +0 -393
- package/src/agent-fleet.yaml +0 -1645
- package/src/business-developer.template.test.ts +0 -351
- package/src/business-developer.yaml +0 -860
- package/src/content-studio.yaml +0 -361
- package/src/dev-dashboard.yaml +0 -990
- package/src/outreach-comms.yaml +0 -486
- package/src/the-arch.yaml +0 -201
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "CI green → Ship a change waits on the merge",
|
|
3
|
+
"description": "When a CI run on a pull request's head finishes green, grade the session's checks-green criterion and move its Ship a change step to Merged.",
|
|
4
|
+
"triggerType": "event",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"triggerConfig": {
|
|
7
|
+
"eventPattern": "ci.finished"
|
|
8
|
+
},
|
|
9
|
+
"flowDefinition": {
|
|
10
|
+
"nodes": [
|
|
11
|
+
{
|
|
12
|
+
"id": "t",
|
|
13
|
+
"type": "trigger",
|
|
14
|
+
"position": {
|
|
15
|
+
"x": 0,
|
|
16
|
+
"y": 0
|
|
17
|
+
},
|
|
18
|
+
"data": {
|
|
19
|
+
"label": "A CI run finished",
|
|
20
|
+
"triggerType": "event",
|
|
21
|
+
"config": {
|
|
22
|
+
"eventPattern": "ci.finished"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "has-session",
|
|
28
|
+
"type": "guard",
|
|
29
|
+
"position": {
|
|
30
|
+
"x": 0,
|
|
31
|
+
"y": 120
|
|
32
|
+
},
|
|
33
|
+
"data": {
|
|
34
|
+
"label": "The fact names its session",
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"path": "trigger.payload.data.sessionId",
|
|
38
|
+
"minLength": 36,
|
|
39
|
+
"message": "The fact names no Pod session: nothing to move."
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "green-evidence",
|
|
46
|
+
"type": "output",
|
|
47
|
+
"position": {
|
|
48
|
+
"x": 0,
|
|
49
|
+
"y": 240
|
|
50
|
+
},
|
|
51
|
+
"data": {
|
|
52
|
+
"label": "Grade checks-green as passed",
|
|
53
|
+
"outputType": "post_evidence",
|
|
54
|
+
"config": {
|
|
55
|
+
"sessionId": "{{trigger.payload.data.sessionId}}",
|
|
56
|
+
"evidence": {
|
|
57
|
+
"checks-green": {
|
|
58
|
+
"passed": "true",
|
|
59
|
+
"detail": "{{trigger.payload.data.workflow}} green on {{trigger.payload.data.sha}}: {{trigger.payload.data.url}}"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "advance",
|
|
67
|
+
"type": "output",
|
|
68
|
+
"position": {
|
|
69
|
+
"x": 0,
|
|
70
|
+
"y": 360
|
|
71
|
+
},
|
|
72
|
+
"data": {
|
|
73
|
+
"label": "Move the step to Merged",
|
|
74
|
+
"outputType": "session_update",
|
|
75
|
+
"config": {
|
|
76
|
+
"sessionId": "{{trigger.payload.data.sessionId}}",
|
|
77
|
+
"currentStage": "merge"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"edges": [
|
|
83
|
+
{
|
|
84
|
+
"id": "e1",
|
|
85
|
+
"source": "t",
|
|
86
|
+
"target": "has-session"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "e2",
|
|
90
|
+
"source": "has-session",
|
|
91
|
+
"target": "green-evidence"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "e3",
|
|
95
|
+
"source": "green-evidence",
|
|
96
|
+
"target": "advance"
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"precondition": "trigger.payload.data.status === 'success'"
|
|
100
|
+
},
|
|
101
|
+
"metadata": {
|
|
102
|
+
"playbook": "Ship a change (builder-workspace)",
|
|
103
|
+
"staged": "STAGED (no catalog header, so never published): it uses the plan v5 T2 output verbs post_evidence / complete_outcome (Synap-core/backend#286, not merged), which the catalog's flow vocabulary (src/validate-flow.ts, bound to backend main) does not know yet. Add its <name>.catalog.json header once #286 merges and the mirror is updated.",
|
|
104
|
+
"notes": "Reads `sessionId` on ci.finished: not in the contract (types events/dev-loop.ts, extra fields allowed), but both producers send it when they know it (GitHub Actions from the run's PR body, the devbox from GATE_POD_SESSION). A run with none (a push to main, a body naming no session) stops at the guard. ONE workflow green is not every check green: a repository with several required workflows posts one ci.finished each, so this grades on the first; the worker re-reads all runs with github_pr_checks before the merge."
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "CI red → Ship a change goes back to Building",
|
|
3
|
+
"description": "When a CI run on a pull request's head fails, grade the session's checks-green criterion as failed and send its Ship a change step back to Building (the Checks green stage's onFail).",
|
|
4
|
+
"triggerType": "event",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"triggerConfig": {
|
|
7
|
+
"eventPattern": "ci.finished"
|
|
8
|
+
},
|
|
9
|
+
"flowDefinition": {
|
|
10
|
+
"nodes": [
|
|
11
|
+
{
|
|
12
|
+
"id": "t",
|
|
13
|
+
"type": "trigger",
|
|
14
|
+
"position": {
|
|
15
|
+
"x": 0,
|
|
16
|
+
"y": 0
|
|
17
|
+
},
|
|
18
|
+
"data": {
|
|
19
|
+
"label": "A CI run finished",
|
|
20
|
+
"triggerType": "event",
|
|
21
|
+
"config": {
|
|
22
|
+
"eventPattern": "ci.finished"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "has-session",
|
|
28
|
+
"type": "guard",
|
|
29
|
+
"position": {
|
|
30
|
+
"x": 0,
|
|
31
|
+
"y": 120
|
|
32
|
+
},
|
|
33
|
+
"data": {
|
|
34
|
+
"label": "The fact names its session",
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"path": "trigger.payload.data.sessionId",
|
|
38
|
+
"minLength": 36,
|
|
39
|
+
"message": "The fact names no Pod session: nothing to move."
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "red-evidence",
|
|
46
|
+
"type": "output",
|
|
47
|
+
"position": {
|
|
48
|
+
"x": 0,
|
|
49
|
+
"y": 240
|
|
50
|
+
},
|
|
51
|
+
"data": {
|
|
52
|
+
"label": "Grade checks-green as failed",
|
|
53
|
+
"outputType": "post_evidence",
|
|
54
|
+
"config": {
|
|
55
|
+
"sessionId": "{{trigger.payload.data.sessionId}}",
|
|
56
|
+
"evidence": {
|
|
57
|
+
"checks-green": {
|
|
58
|
+
"passed": "false",
|
|
59
|
+
"detail": "{{trigger.payload.data.workflow}} failed on {{trigger.payload.data.sha}}: {{trigger.payload.data.url}}"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "advance",
|
|
67
|
+
"type": "output",
|
|
68
|
+
"position": {
|
|
69
|
+
"x": 0,
|
|
70
|
+
"y": 360
|
|
71
|
+
},
|
|
72
|
+
"data": {
|
|
73
|
+
"label": "Send the step back to Building",
|
|
74
|
+
"outputType": "session_update",
|
|
75
|
+
"config": {
|
|
76
|
+
"sessionId": "{{trigger.payload.data.sessionId}}",
|
|
77
|
+
"currentStage": "build"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"edges": [
|
|
83
|
+
{
|
|
84
|
+
"id": "e1",
|
|
85
|
+
"source": "t",
|
|
86
|
+
"target": "has-session"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "e2",
|
|
90
|
+
"source": "has-session",
|
|
91
|
+
"target": "red-evidence"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "e3",
|
|
95
|
+
"source": "red-evidence",
|
|
96
|
+
"target": "advance"
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"precondition": "trigger.payload.data.status === 'failure'"
|
|
100
|
+
},
|
|
101
|
+
"metadata": {
|
|
102
|
+
"playbook": "Ship a change (builder-workspace)",
|
|
103
|
+
"staged": "STAGED (no catalog header, so never published): it uses the plan v5 T2 output verbs post_evidence / complete_outcome (Synap-core/backend#286, not merged), which the catalog's flow vocabulary (src/validate-flow.ts, bound to backend main) does not know yet. Add its <name>.catalog.json header once #286 merges and the mirror is updated.",
|
|
104
|
+
"notes": "A precondition is one comparison: timed_out is not caught here (cancelled, skipped and neutral are not red). Same sessionId source as ship-a-change-checks-green."
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Deployed → the devbox worker dogfoods it",
|
|
3
|
+
"description": "When this pod reports a new build live (dev.deployed, recorded by the pod itself after a successful update), start a Dogfood a change run handed to the devbox worker, filed into the goal.",
|
|
4
|
+
"triggerType": "event",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"triggerConfig": {
|
|
7
|
+
"eventPattern": "dev.deployed"
|
|
8
|
+
},
|
|
9
|
+
"flowDefinition": {
|
|
10
|
+
"nodes": [
|
|
11
|
+
{
|
|
12
|
+
"id": "t",
|
|
13
|
+
"type": "trigger",
|
|
14
|
+
"position": {
|
|
15
|
+
"x": 0,
|
|
16
|
+
"y": 0
|
|
17
|
+
},
|
|
18
|
+
"data": {
|
|
19
|
+
"label": "A build went live",
|
|
20
|
+
"triggerType": "event",
|
|
21
|
+
"config": {
|
|
22
|
+
"eventPattern": "dev.deployed"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "dogfood",
|
|
28
|
+
"type": "playbook_run",
|
|
29
|
+
"position": {
|
|
30
|
+
"x": 0,
|
|
31
|
+
"y": 120
|
|
32
|
+
},
|
|
33
|
+
"data": {
|
|
34
|
+
"label": "Dogfood what went live, on the devbox worker",
|
|
35
|
+
"playbookName": "Dogfood a change",
|
|
36
|
+
"mode": "run",
|
|
37
|
+
"goalOverride": "Dogfood what {{trigger.payload.data.sha}} put live on {{trigger.payload.data.target}}: every Ship a change session waiting at Dogfooded in this goal. Load the dogfood skill, walk each change as a person would, report WORKS / BROKEN / CANNOT-TELL, and post the evidence dogfooded on each session (passed only when every path works).",
|
|
38
|
+
"handToAgentId": "<the devbox agent's user id on this pod (synap_list_agents)>",
|
|
39
|
+
"trackId": "<the goal this loop serves (synap_list_tracks)>"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"edges": [
|
|
44
|
+
{
|
|
45
|
+
"id": "e1",
|
|
46
|
+
"source": "t",
|
|
47
|
+
"target": "dogfood"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
"metadata": {
|
|
52
|
+
"playbook": "Ship a change (builder-workspace)",
|
|
53
|
+
"staged": "STAGED (no catalog header, so never published): it uses the plan v5 T2 output verbs post_evidence / complete_outcome (Synap-core/backend#286, not merged), which the catalog's flow vocabulary (src/validate-flow.ts, bound to backend main) does not know yet. Add its <name>.catalog.json header once #286 merges and the mirror is updated.",
|
|
54
|
+
"notes": "POD-SPECIFIC VALUES: handToAgentId and trackId are ids on ONE pod, and the catalog has no install-time params for an automation, while playbook_run reads both literally (backend jobs steps/playbook-run.ts: not template-resolved). So this copy keeps them as <…> holes; the pod write (lanes/catalog.md, pilot setup) fills them. dev.deployed is recorded by the pod that was updated, as its owner: this automation hears ITS pod's deploys only. A lab that is another pod reaches the goal's pod only if a producer forwards its deploy."
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "PR merged → Ship a change waits on the lab deploy",
|
|
3
|
+
"description": "When a PR merges: the merge sweeper (built in, backend#283) already marks the session's pr-* outcome met. This automation grades the session's `merged` criterion and moves its Ship a change step to Deployed to lab, where the person approves the deploy.",
|
|
4
|
+
"triggerType": "event",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"triggerConfig": {
|
|
7
|
+
"eventPattern": "dev.pr_merged"
|
|
8
|
+
},
|
|
9
|
+
"flowDefinition": {
|
|
10
|
+
"nodes": [
|
|
11
|
+
{
|
|
12
|
+
"id": "t",
|
|
13
|
+
"type": "trigger",
|
|
14
|
+
"position": {
|
|
15
|
+
"x": 0,
|
|
16
|
+
"y": 0
|
|
17
|
+
},
|
|
18
|
+
"data": {
|
|
19
|
+
"label": "A PR merged",
|
|
20
|
+
"triggerType": "event",
|
|
21
|
+
"config": {
|
|
22
|
+
"eventPattern": "dev.pr_merged"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "has-session",
|
|
28
|
+
"type": "guard",
|
|
29
|
+
"position": {
|
|
30
|
+
"x": 0,
|
|
31
|
+
"y": 120
|
|
32
|
+
},
|
|
33
|
+
"data": {
|
|
34
|
+
"label": "The PR names its session and landed on the default branch",
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"path": "trigger.payload.data.sessionId",
|
|
38
|
+
"minLength": 36,
|
|
39
|
+
"message": "The PR body names no Pod session: nothing to advance (the merge sweeper still completed any outcome whose ref is this PR)."
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"path": "trigger.payload.data.intoDefault",
|
|
43
|
+
"equals": true,
|
|
44
|
+
"message": "Merged into a branch that is not the default one (a stacked PR): not delivered yet, the step stays where it is."
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "merged-evidence",
|
|
51
|
+
"type": "output",
|
|
52
|
+
"position": {
|
|
53
|
+
"x": 0,
|
|
54
|
+
"y": 240
|
|
55
|
+
},
|
|
56
|
+
"data": {
|
|
57
|
+
"label": "Grade the merged criterion",
|
|
58
|
+
"outputType": "post_evidence",
|
|
59
|
+
"config": {
|
|
60
|
+
"sessionId": "{{trigger.payload.data.sessionId}}",
|
|
61
|
+
"evidence": {
|
|
62
|
+
"merged": {
|
|
63
|
+
"passed": "true",
|
|
64
|
+
"detail": "Merged: {{trigger.payload.data.url}}"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"id": "advance",
|
|
72
|
+
"type": "output",
|
|
73
|
+
"position": {
|
|
74
|
+
"x": 0,
|
|
75
|
+
"y": 360
|
|
76
|
+
},
|
|
77
|
+
"data": {
|
|
78
|
+
"label": "Move the step to Deployed to lab",
|
|
79
|
+
"outputType": "session_update",
|
|
80
|
+
"config": {
|
|
81
|
+
"sessionId": "{{trigger.payload.data.sessionId}}",
|
|
82
|
+
"currentStage": "deploy"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
],
|
|
87
|
+
"edges": [
|
|
88
|
+
{
|
|
89
|
+
"id": "e1",
|
|
90
|
+
"source": "t",
|
|
91
|
+
"target": "has-session"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "e2",
|
|
95
|
+
"source": "has-session",
|
|
96
|
+
"target": "merged-evidence"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "e3",
|
|
100
|
+
"source": "merged-evidence",
|
|
101
|
+
"target": "advance"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"metadata": {
|
|
106
|
+
"playbook": "Ship a change (builder-workspace)",
|
|
107
|
+
"staged": "STAGED (no catalog header, so never published): it uses the plan v5 T2 output verbs post_evidence / complete_outcome (Synap-core/backend#286, not merged), which the catalog's flow vocabulary (src/validate-flow.ts, bound to backend main) does not know yet. Add its <name>.catalog.json header once #286 merges and the mirror is updated.",
|
|
108
|
+
"notes": "Derived from be-loop's config (lanes/be-loop-automation-config.json, pinned by backend#286). Two changes: the step moves to `deploy`, not `verifying` (the Ship a change order is merged → deployed to lab → dogfooded → criteria verified, and no stage is keyed verifying); the dogfood run starts on dev.deployed (ship-a-change-deployed), not at the merge."
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "PR opened → Ship a change waits on its checks",
|
|
3
|
+
"description": "When a pull request opens with a `Pod session:` line, grade the session's pr-opened criterion and move its Ship a change step to Checks green.",
|
|
4
|
+
"triggerType": "event",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"triggerConfig": {
|
|
7
|
+
"eventPattern": "dev.pr_opened"
|
|
8
|
+
},
|
|
9
|
+
"flowDefinition": {
|
|
10
|
+
"nodes": [
|
|
11
|
+
{
|
|
12
|
+
"id": "t",
|
|
13
|
+
"type": "trigger",
|
|
14
|
+
"position": {
|
|
15
|
+
"x": 0,
|
|
16
|
+
"y": 0
|
|
17
|
+
},
|
|
18
|
+
"data": {
|
|
19
|
+
"label": "A PR opened",
|
|
20
|
+
"triggerType": "event",
|
|
21
|
+
"config": {
|
|
22
|
+
"eventPattern": "dev.pr_opened"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "has-session",
|
|
28
|
+
"type": "guard",
|
|
29
|
+
"position": {
|
|
30
|
+
"x": 0,
|
|
31
|
+
"y": 120
|
|
32
|
+
},
|
|
33
|
+
"data": {
|
|
34
|
+
"label": "The fact names its session",
|
|
35
|
+
"checks": [
|
|
36
|
+
{
|
|
37
|
+
"path": "trigger.payload.data.sessionId",
|
|
38
|
+
"minLength": 36,
|
|
39
|
+
"message": "The PR body names no Pod session: nothing to move."
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "opened-evidence",
|
|
46
|
+
"type": "output",
|
|
47
|
+
"position": {
|
|
48
|
+
"x": 0,
|
|
49
|
+
"y": 240
|
|
50
|
+
},
|
|
51
|
+
"data": {
|
|
52
|
+
"label": "Grade the pr-opened criterion",
|
|
53
|
+
"outputType": "post_evidence",
|
|
54
|
+
"config": {
|
|
55
|
+
"sessionId": "{{trigger.payload.data.sessionId}}",
|
|
56
|
+
"evidence": {
|
|
57
|
+
"pr-opened": {
|
|
58
|
+
"passed": "true",
|
|
59
|
+
"detail": "Opened: {{trigger.payload.data.url}}"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"id": "advance",
|
|
67
|
+
"type": "output",
|
|
68
|
+
"position": {
|
|
69
|
+
"x": 0,
|
|
70
|
+
"y": 360
|
|
71
|
+
},
|
|
72
|
+
"data": {
|
|
73
|
+
"label": "Move the step to Checks green",
|
|
74
|
+
"outputType": "session_update",
|
|
75
|
+
"config": {
|
|
76
|
+
"sessionId": "{{trigger.payload.data.sessionId}}",
|
|
77
|
+
"currentStage": "checks"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"edges": [
|
|
83
|
+
{
|
|
84
|
+
"id": "e1",
|
|
85
|
+
"source": "t",
|
|
86
|
+
"target": "has-session"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"id": "e2",
|
|
90
|
+
"source": "has-session",
|
|
91
|
+
"target": "opened-evidence"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "e3",
|
|
95
|
+
"source": "opened-evidence",
|
|
96
|
+
"target": "advance"
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
"metadata": {
|
|
101
|
+
"playbook": "Ship a change (builder-workspace)",
|
|
102
|
+
"staged": "STAGED (no catalog header, so never published): it uses the plan v5 T2 output verbs post_evidence / complete_outcome (Synap-core/backend#286, not merged), which the catalog's flow vocabulary (src/validate-flow.ts, bound to backend main) does not know yet. Add its <name>.catalog.json header once #286 merges and the mirror is updated."
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "URL → Bookmark (inbound messages)",
|
|
3
|
+
"triggerType": "event",
|
|
4
|
+
"status": "active",
|
|
5
|
+
"triggerConfig": {
|
|
6
|
+
"eventPattern": "external_message.received.*",
|
|
7
|
+
"filters": { "provider": "discord" }
|
|
8
|
+
},
|
|
9
|
+
"flowDefinition": {
|
|
10
|
+
"nodes": [
|
|
11
|
+
{
|
|
12
|
+
"id": "trigger",
|
|
13
|
+
"type": "trigger",
|
|
14
|
+
"position": { "x": 0, "y": 0 },
|
|
15
|
+
"data": {
|
|
16
|
+
"triggerType": "event",
|
|
17
|
+
"label": "Inbound message",
|
|
18
|
+
"config": {
|
|
19
|
+
"eventPattern": "external_message.received.*",
|
|
20
|
+
"filters": { "provider": "discord" }
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "content",
|
|
26
|
+
"type": "transform",
|
|
27
|
+
"position": { "x": 0, "y": 120 },
|
|
28
|
+
"data": {
|
|
29
|
+
"label": "Trim message text",
|
|
30
|
+
"expression": "{{trigger.payload.data.content}} | trim"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "title-src",
|
|
35
|
+
"type": "transform",
|
|
36
|
+
"position": { "x": 0, "y": 240 },
|
|
37
|
+
"data": {
|
|
38
|
+
"label": "Human text (title source)",
|
|
39
|
+
"expression": "{{trigger.payload.data.messagePreview}} | trim"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "extract",
|
|
44
|
+
"type": "transform",
|
|
45
|
+
"position": { "x": 0, "y": 360 },
|
|
46
|
+
"data": {
|
|
47
|
+
"label": "Extract URLs · drop bare-link noise",
|
|
48
|
+
"expression": "{{trigger.payload.data.content}} | url_extract | unique | filter:item !== steps.content.output.result | slice:5"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "url-loop",
|
|
53
|
+
"type": "loop",
|
|
54
|
+
"position": { "x": 0, "y": 480 },
|
|
55
|
+
"data": {
|
|
56
|
+
"label": "For each URL",
|
|
57
|
+
"iteratorExpression": "steps.extract.output.result",
|
|
58
|
+
"itemVariable": "url"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "create-bookmark",
|
|
63
|
+
"type": "output",
|
|
64
|
+
"position": { "x": 0, "y": 600 },
|
|
65
|
+
"data": {
|
|
66
|
+
"label": "Create bookmark",
|
|
67
|
+
"outputType": "entity_create",
|
|
68
|
+
"config": {
|
|
69
|
+
"profileSlug": "bookmark",
|
|
70
|
+
"title": "{{steps.title-src.output.result}}",
|
|
71
|
+
"dedupeBy": "url",
|
|
72
|
+
"body": "{{steps.content.output.result}}",
|
|
73
|
+
"properties": {
|
|
74
|
+
"url": "{{loop.item}}",
|
|
75
|
+
"sourceChannelId": "{{trigger.payload.data.channelId}}",
|
|
76
|
+
"sourceThreadId": "{{trigger.payload.data.threadId}}",
|
|
77
|
+
"sourceMessageId": "{{trigger.payload.data.messageId}}",
|
|
78
|
+
"sourceProvider": "{{trigger.payload.data.provider}}",
|
|
79
|
+
"sharedBy": "{{trigger.payload.data.participantName}}"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "has-bookmark-id",
|
|
86
|
+
"type": "condition",
|
|
87
|
+
"position": { "x": 0, "y": 720 },
|
|
88
|
+
"data": {
|
|
89
|
+
"label": "Bookmark row exists?",
|
|
90
|
+
"expression": "steps.create-bookmark.output.entityId !== ''"
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"id": "has-context-entity",
|
|
95
|
+
"type": "condition",
|
|
96
|
+
"position": { "x": 0, "y": 840 },
|
|
97
|
+
"data": {
|
|
98
|
+
"label": "Channel bound to an entity?",
|
|
99
|
+
"expression": "trigger.payload.data.entityId !== ''"
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"id": "link-context",
|
|
104
|
+
"type": "output",
|
|
105
|
+
"position": { "x": 0, "y": 960 },
|
|
106
|
+
"data": {
|
|
107
|
+
"label": "Link bookmark → channel's entity",
|
|
108
|
+
"outputType": "relation_create",
|
|
109
|
+
"config": {
|
|
110
|
+
"fromEntityId": "{{steps.create-bookmark.output.entityId}}",
|
|
111
|
+
"toEntityId": "{{trigger.payload.data.entityId}}",
|
|
112
|
+
"relationType": "references"
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
],
|
|
117
|
+
"edges": [
|
|
118
|
+
{ "id": "e1", "source": "trigger", "target": "content" },
|
|
119
|
+
{ "id": "e2", "source": "content", "target": "title-src" },
|
|
120
|
+
{ "id": "e3", "source": "title-src", "target": "extract" },
|
|
121
|
+
{ "id": "e4", "source": "extract", "target": "url-loop" },
|
|
122
|
+
{ "id": "e5", "source": "url-loop", "target": "create-bookmark" },
|
|
123
|
+
{ "id": "e6", "source": "create-bookmark", "target": "has-bookmark-id" },
|
|
124
|
+
{ "id": "e7", "source": "has-bookmark-id", "target": "has-context-entity", "sourceHandle": "yes" },
|
|
125
|
+
{ "id": "e8", "source": "has-context-entity", "target": "link-context", "sourceHandle": "yes" }
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
"metadata": {
|
|
129
|
+
"source": "bridge-template",
|
|
130
|
+
"note": "Phase 1 is DETERMINISTIC — no AI. It keeps the context the trigger already hands it: data.channelId (the INTERNAL Synap channel UUID, not the Discord snowflake, which is kept separately as sourceThreadId), data.content (as the bookmark body) and data.entityId (the channel's bound entity, linked with a `references` relation). Title = the message's own 120-char preview; when the message is nothing but a link the item is dropped by the noise filter rather than named, so the title is never invented. Noise filter: `filter:item !== steps.content.output.result` keeps only links that arrived WITH human text — a Tenor/giphy GIF drop or a bare Google Photos paste is exactly a message whose whole trimmed text IS the URL. A host denylist is NOT expressible: the condition grammar (condition-eval.ts) has no substring/regex operator and `contains` is exact set intersection, so any 'tenor.com'-style match would silently never fire."
|
|
131
|
+
}
|
|
132
|
+
}
|