@synap-core/workspace-templates 0.10.0 → 0.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.
- package/dist/index.d.ts +59 -34
- package/dist/index.js +375 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/__fixtures__/report-automation-flow.json +2 -2
- package/src/base.yaml +2 -2
- package/src/blockchain-ecosystem.yaml +106 -0
- package/src/catalog.ts +36 -0
- package/src/grants.yaml +248 -1
- package/src/networking.yaml +14 -3
- package/src/templates.ts +360 -5
- package/src/the-arch.yaml +4 -0
- package/src/types.ts +32 -34
package/dist/index.js
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
var PACKAGE_DEPENDENCY_KINDS = [
|
|
3
3
|
"workspace",
|
|
4
4
|
"capability",
|
|
5
|
-
|
|
5
|
+
"skill",
|
|
6
|
+
"workflow",
|
|
7
|
+
"view",
|
|
8
|
+
"cell",
|
|
9
|
+
/** @deprecated Legacy alias for `workflow` (CP 0049). Still accepted on the wire. */
|
|
6
10
|
"automation"
|
|
7
11
|
];
|
|
8
12
|
|
|
@@ -3206,7 +3210,7 @@ var DATA = {
|
|
|
3206
3210
|
"inputMapping": {
|
|
3207
3211
|
"system": 'You are the ANALYST round of a Synap workspace report.\nRead the gathered workspace data and say what it MEANS: volume and shape of work,\nwhat is in flight versus stalled, what is well-covered versus thin.\nWork from the FIELDS on each record, not just its name: status, priority and\ndue dates are what distinguish moving work from stalled work, and an unset\nfield is itself worth reporting. Listing or counting what exists is NOT a\nfinding \u2014 say what the state of it means.\nDATA INTEGRITY CHECK \u2014 do this BEFORE interpreting anything. Each kind below states how many records were found, then lists them. If a kind reports a count greater than zero but its list is empty, null, or made of nulls, then the data pipeline is BROKEN \u2014 the records exist and were lost in transit. In that case you MUST say so plainly, name every kind affected, and NOT describe the workspace as empty, quiet, or sparse. Reporting a populated workspace as empty because its data failed to arrive is the single worst outcome of this report. A count of zero with an empty list is genuinely empty and is fine to report as such.\nYou are interpreting data you did NOT collect. Every claim must trace to a row in the GATHERED DATA below. Never invent entities, ids, counts, or dates. A step whose value looks like {"error": "..."} FAILED \u2014 treat that kind as unavailable and say so; do not guess what it would have contained.\nEVERY NUMBER YOU WRITE MUST BE COPIED FROM THE COUNTS BLOCK. That block states the exact number of records gathered for each kind \u2014 it is the ONLY source of quantities you have. Do not count the listed lines yourself, do not estimate, do not round, and do not write a quantity the block does not measure. Write digits, matching the block exactly: if it says 25, write "25" \u2014 never "23", never "about two dozen", never "Ten". If a point you want to make needs a number the COUNTS block does not give you, make the point WITHOUT a number. A claim with no figure is honest; a figure that does not match the data is the one error a reader cannot catch.\nNEVER NARRATE YOUR OWN INSTRUCTIONS. The reader sees your output and nothing else \u2014 not this prompt, not the steer, not the counts, not the fact that a pipeline produced any of it. Never mention the STEER, the time window, the COUNTS block, the GATHERED DATA, the rounds, or what you were or were not given. Never write a sentence like "the steer lines are empty, so\u2026" or "no focus was provided" or "based on the gathered data". TWO DEFAULTS, so you never need to remark on them: an EMPTY STEER line simply means write a broad general report covering the gathered kinds evenly, and an EMPTY time window simply means the records span the whole workspace history. Both are the normal case. Act on them silently and start with what you found.\nSTEER HANDLING \u2014 non-negotiable. If every STEER line is empty, produce a BROAD general read covering all the gathered kinds evenly. If any STEER line has text, treat it as the SUBJECT of this report: lead with the evidence that matches it, explicitly name what you set aside, and if the gathered data cannot support the steer, say so in one sentence instead of inventing material. Never restate the steer back as a heading; let it change what you actually write.\nLINK THE RECORDS YOU NAME. Every line of GATHERED DATA is `<id> \xB7 <title>`. When you name one of those records, write it as [[entity:<id>|<label>]] and it renders as a chip the reader can click to open that record. Rules, in order of importance: (1) The kind word is always `entity` \u2014 for tasks, notes, people AND companies alike. They are all entities, and any other kind word renders a chip that does not open. (2) Use only an id that appears VERBATIM in the gathered data. Copy it; never construct, shorten, complete or guess one. (3) If you are unsure of an id, write the plain label with no brackets. A wrong id is a dead chip, and a dead chip is worse than plain text. (4) The label is free text but must not contain `]`; the id must not contain `:` or `|`. A marker breaking either rule renders as raw literal text. (5) EVERY record you name in prose MUST carry a chip on its FIRST mention \u2014 this is what makes a named record a live object the reader can open rather than a string. Link it once, on that first mention only; repeating the chip every time is decoration, not navigation.\nOutput PLAIN PROSE \u2014 short paragraphs and bullets, with [[entity:\u2026]] chips\ninline wherever you name a record. No markdown headings, no ::: directive\nblocks, no code fences. Under 300 words. Another round will format this.',
|
|
3208
3212
|
"prompt": 'STEER:\n- Prompt: {{trigger.payload.prompt}}\n- Focus: {{trigger.payload.focus}}\n- Project lens id: {{trigger.payload.projectId}}\n\nCOUNTS \u2014 the exact number of records gathered for each kind. These figures\nare measured, not estimated, and they are the ONLY quantities available to\nyou. Each line also gives the cap the gather was limited to.\n- Tasks: {{steps.gather-tasks.output.count}} gathered (cap 25)\n- Notes: {{steps.gather-notes.output.count}} gathered (cap 15)\n- People: {{steps.gather-people.output.count}} gathered (cap 15)\n- Companies: {{steps.gather-companies.output.count}} gathered (cap 15)\nREADING A COUNT AGAINST ITS CAP: a count BELOW the cap means every record of\nthat kind is listed below \u2014 the set is COMPLETE and you may describe it as\nsuch. A count EQUAL to the cap means the gather stopped at the cap and more\nrecords exist that you cannot see \u2014 describe that kind as "at least N" and\nnever as complete, and never claim something does not exist merely because\nit is absent from the list.\n\nTime window: only records updated on or after {{trigger.payload.since}}\n\nGATHERED DATA \u2014 one line per record, MOST RECENTLY UPDATED first. Each line\nis `<id> \xB7 <title>` followed by ` \xB7 <field>=<value>` pairs carrying that\nrecord\'s real state. An EMPTY value means the field is not set on that\nrecord \u2014 that is a fact you may report (an unset status or a missing due\ndate is a finding), and never a value to guess at. Recent does not mean\nimportant.\nTasks \u2014 {{steps.gather-tasks.output.count}} found: {{steps.project-tasks.output.result}}\nNotes \u2014 {{steps.gather-notes.output.count}} found: {{steps.project-notes.output.result}}\nPeople \u2014 {{steps.gather-people.output.count}} found: {{steps.project-people.output.result}}\nCompanies \u2014 {{steps.gather-companies.output.count}} found: {{steps.project-companies.output.result}}',
|
|
3209
|
-
"maxTokens": "
|
|
3213
|
+
"maxTokens": "2000"
|
|
3210
3214
|
},
|
|
3211
3215
|
"errorHandling": {
|
|
3212
3216
|
"continueOnError": true
|
|
@@ -3227,7 +3231,7 @@ var DATA = {
|
|
|
3227
3231
|
"inputMapping": {
|
|
3228
3232
|
"system": 'You are the PATTERNS round of a Synap workspace report.\nYou receive the raw gathered data AND the analyst\'s read of it. Your job is what\nthe analyst did NOT do: surface RELATIONSHIPS and things worth attention \u2014\nclusters, repeated themes, people or companies that recur across kinds, gaps\nwhere a kind is conspicuously empty, and anything that looks like it needs a\ndecision. Prefer three sharp observations over ten shallow ones.\nYOUR SCOPE IS WHAT CONNECTS RECORDS, not what they individually are. Every\nobservation you write must involve TWO OR MORE records, or TWO OR MORE kinds:\na name that appears in both a task and a company, work clustered on one\nperson, a due date that lines up with an event, a kind that is empty while a\nrelated kind is busy. Do NOT re-describe volume, status distribution or how\nbusy the workspace is \u2014 that is the analyst\'s section and repeating it makes\nyours redundant. Do not summarise or restate the analyst\'s read.\nNEVER RETURN AN EMPTY ANSWER. If you genuinely find no cross-kind pattern,\nwrite one or two sentences naming what you looked for and did not find (for\nexample: no person recurs across the tasks and companies gathered). That is a\nreal finding and the reader needs it. Silence is not an available outcome.\nDATA INTEGRITY CHECK \u2014 do this BEFORE interpreting anything. Each kind below states how many records were found, then lists them. If a kind reports a count greater than zero but its list is empty, null, or made of nulls, then the data pipeline is BROKEN \u2014 the records exist and were lost in transit. In that case you MUST say so plainly, name every kind affected, and NOT describe the workspace as empty, quiet, or sparse. Reporting a populated workspace as empty because its data failed to arrive is the single worst outcome of this report. A count of zero with an empty list is genuinely empty and is fine to report as such.\nYou are interpreting data you did NOT collect. Every claim must trace to a row in the GATHERED DATA below. Never invent entities, ids, counts, or dates. A step whose value looks like {"error": "..."} FAILED \u2014 treat that kind as unavailable and say so; do not guess what it would have contained.\nEVERY NUMBER YOU WRITE MUST BE COPIED FROM THE COUNTS BLOCK. That block states the exact number of records gathered for each kind \u2014 it is the ONLY source of quantities you have. Do not count the listed lines yourself, do not estimate, do not round, and do not write a quantity the block does not measure. Write digits, matching the block exactly: if it says 25, write "25" \u2014 never "23", never "about two dozen", never "Ten". If a point you want to make needs a number the COUNTS block does not give you, make the point WITHOUT a number. A claim with no figure is honest; a figure that does not match the data is the one error a reader cannot catch.\nNEVER NARRATE YOUR OWN INSTRUCTIONS. The reader sees your output and nothing else \u2014 not this prompt, not the steer, not the counts, not the fact that a pipeline produced any of it. Never mention the STEER, the time window, the COUNTS block, the GATHERED DATA, the rounds, or what you were or were not given. Never write a sentence like "the steer lines are empty, so\u2026" or "no focus was provided" or "based on the gathered data". TWO DEFAULTS, so you never need to remark on them: an EMPTY STEER line simply means write a broad general report covering the gathered kinds evenly, and an EMPTY time window simply means the records span the whole workspace history. Both are the normal case. Act on them silently and start with what you found.\nSTEER HANDLING \u2014 non-negotiable. If every STEER line is empty, produce a BROAD general read covering all the gathered kinds evenly. If any STEER line has text, treat it as the SUBJECT of this report: lead with the evidence that matches it, explicitly name what you set aside, and if the gathered data cannot support the steer, say so in one sentence instead of inventing material. Never restate the steer back as a heading; let it change what you actually write.\nLINK THE RECORDS YOU NAME. Every line of GATHERED DATA is `<id> \xB7 <title>`. When you name one of those records, write it as [[entity:<id>|<label>]] and it renders as a chip the reader can click to open that record. Rules, in order of importance: (1) The kind word is always `entity` \u2014 for tasks, notes, people AND companies alike. They are all entities, and any other kind word renders a chip that does not open. (2) Use only an id that appears VERBATIM in the gathered data. Copy it; never construct, shorten, complete or guess one. (3) If you are unsure of an id, write the plain label with no brackets. A wrong id is a dead chip, and a dead chip is worse than plain text. (4) The label is free text but must not contain `]`; the id must not contain `:` or `|`. A marker breaking either rule renders as raw literal text. (5) EVERY record you name in prose MUST carry a chip on its FIRST mention \u2014 this is what makes a named record a live object the reader can open rather than a string. Link it once, on that first mention only; repeating the chip every time is decoration, not navigation.\nOutput PLAIN PROSE, under 250 words, with [[entity:\u2026]] chips inline. No\nheadings, no ::: directive blocks, no code fences.',
|
|
3229
3233
|
"prompt": "STEER:\n- Prompt: {{trigger.payload.prompt}}\n- Focus: {{trigger.payload.focus}}\n- Project lens id: {{trigger.payload.projectId}}\n\nCOUNTS \u2014 the exact number of records gathered for each kind. These figures\nare measured, not estimated, and they are the ONLY quantities available to\nyou. Each line also gives the cap the gather was limited to.\n- Tasks: {{steps.gather-tasks.output.count}} gathered (cap 25)\n- Notes: {{steps.gather-notes.output.count}} gathered (cap 15)\n- People: {{steps.gather-people.output.count}} gathered (cap 15)\n- Companies: {{steps.gather-companies.output.count}} gathered (cap 15)\nREADING A COUNT AGAINST ITS CAP: a count BELOW the cap means every record of\nthat kind is listed below \u2014 the set is COMPLETE and you may describe it as\nsuch. A count EQUAL to the cap means the gather stopped at the cap and more\nrecords exist that you cannot see \u2014 describe that kind as \"at least N\" and\nnever as complete, and never claim something does not exist merely because\nit is absent from the list.\n\nTime window: only records updated on or after {{trigger.payload.since}}\n\nGATHERED DATA \u2014 one line per record, MOST RECENTLY UPDATED first. Each line\nis `<id> \xB7 <title>` followed by ` \xB7 <field>=<value>` pairs carrying that\nrecord's real state. An EMPTY value means the field is not set on that\nrecord \u2014 that is a fact you may report (an unset status or a missing due\ndate is a finding), and never a value to guess at. Recent does not mean\nimportant.\nTasks \u2014 {{steps.gather-tasks.output.count}} found: {{steps.project-tasks.output.result}}\nNotes \u2014 {{steps.gather-notes.output.count}} found: {{steps.project-notes.output.result}}\nPeople \u2014 {{steps.gather-people.output.count}} found: {{steps.project-people.output.result}}\nCompanies \u2014 {{steps.gather-companies.output.count}} found: {{steps.project-companies.output.result}}\n\nANALYST'S READ \u2014 already written and already in the report. Do NOT\nrestate, summarise or re-analyse it. It is here so you do not repeat it:\n{{steps.analyze.output}}\n\nYOUR TASK \u2014 cross-kind patterns ONLY. Look for what connects the lists\nabove: a person who recurs in tasks and companies, work clustered on one\nname, due dates that line up, a kind that is empty while a related kind\nis busy, a company with people but no tasks. Write only observations\nthat span TWO OR MORE records or kinds. If there are none, say what you\nchecked and did not find \u2014 never answer with nothing.",
|
|
3230
|
-
"maxTokens": "
|
|
3234
|
+
"maxTokens": "2000"
|
|
3231
3235
|
},
|
|
3232
3236
|
"errorHandling": {
|
|
3233
3237
|
"continueOnError": true
|
|
@@ -3621,6 +3625,7 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
3621
3625
|
"description": "A liquidity provider \u2014 makes markets and provides depth for a token.",
|
|
3622
3626
|
"scope": "shared",
|
|
3623
3627
|
"profileKind": "role",
|
|
3628
|
+
"roleCategory": "provider",
|
|
3624
3629
|
"applicableKinds": [
|
|
3625
3630
|
"company",
|
|
3626
3631
|
"person"
|
|
@@ -3666,6 +3671,7 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
3666
3671
|
"description": "A security firm or individual that audits smart contracts and protocols.",
|
|
3667
3672
|
"scope": "shared",
|
|
3668
3673
|
"profileKind": "role",
|
|
3674
|
+
"roleCategory": "provider",
|
|
3669
3675
|
"applicableKinds": [
|
|
3670
3676
|
"company",
|
|
3671
3677
|
"person"
|
|
@@ -3711,6 +3717,7 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
3711
3717
|
"description": "An outsourced engineering studio or build partner.",
|
|
3712
3718
|
"scope": "shared",
|
|
3713
3719
|
"profileKind": "role",
|
|
3720
|
+
"roleCategory": "provider",
|
|
3714
3721
|
"applicableKinds": [
|
|
3715
3722
|
"company",
|
|
3716
3723
|
"person"
|
|
@@ -3756,6 +3763,7 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
3756
3763
|
"description": "A brand, growth, or content marketing agency.",
|
|
3757
3764
|
"scope": "shared",
|
|
3758
3765
|
"profileKind": "role",
|
|
3766
|
+
"roleCategory": "provider",
|
|
3759
3767
|
"applicableKinds": [
|
|
3760
3768
|
"company",
|
|
3761
3769
|
"person"
|
|
@@ -3801,6 +3809,7 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
3801
3809
|
"description": "A performance / paid-media buying agency.",
|
|
3802
3810
|
"scope": "shared",
|
|
3803
3811
|
"profileKind": "role",
|
|
3812
|
+
"roleCategory": "provider",
|
|
3804
3813
|
"applicableKinds": [
|
|
3805
3814
|
"company",
|
|
3806
3815
|
"person"
|
|
@@ -3846,6 +3855,7 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
3846
3855
|
"description": "A key opinion leader or influencer who amplifies reach.",
|
|
3847
3856
|
"scope": "shared",
|
|
3848
3857
|
"profileKind": "role",
|
|
3858
|
+
"roleCategory": "provider",
|
|
3849
3859
|
"applicableKinds": [
|
|
3850
3860
|
"company",
|
|
3851
3861
|
"person"
|
|
@@ -3882,6 +3892,100 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
3882
3892
|
"inputType": "textarea"
|
|
3883
3893
|
}
|
|
3884
3894
|
]
|
|
3895
|
+
},
|
|
3896
|
+
{
|
|
3897
|
+
"slug": "grant-program",
|
|
3898
|
+
"displayName": "Grant Program",
|
|
3899
|
+
"icon": "landmark",
|
|
3900
|
+
"color": "emerald",
|
|
3901
|
+
"description": "A per-chain funding program (e.g. Stellar SCF, Optimism RetroPGF) \u2014 the long-lived funder above a round.",
|
|
3902
|
+
"profileKind": "kind",
|
|
3903
|
+
"entityScope": "pod",
|
|
3904
|
+
"scope": "shared",
|
|
3905
|
+
"properties": [
|
|
3906
|
+
{
|
|
3907
|
+
"slug": "blockchain",
|
|
3908
|
+
"label": "Blockchain / Chain",
|
|
3909
|
+
"valueType": "string",
|
|
3910
|
+
"inputType": "text"
|
|
3911
|
+
},
|
|
3912
|
+
{
|
|
3913
|
+
"slug": "programName",
|
|
3914
|
+
"label": "Program Name",
|
|
3915
|
+
"valueType": "string",
|
|
3916
|
+
"inputType": "text"
|
|
3917
|
+
},
|
|
3918
|
+
{
|
|
3919
|
+
"slug": "programType",
|
|
3920
|
+
"label": "Program Type",
|
|
3921
|
+
"valueType": "string",
|
|
3922
|
+
"inputType": "select",
|
|
3923
|
+
"enumValues": [
|
|
3924
|
+
"direct",
|
|
3925
|
+
"retroactive",
|
|
3926
|
+
"quadratic",
|
|
3927
|
+
"rfp"
|
|
3928
|
+
]
|
|
3929
|
+
},
|
|
3930
|
+
{
|
|
3931
|
+
"slug": "status",
|
|
3932
|
+
"label": "Status",
|
|
3933
|
+
"valueType": "string",
|
|
3934
|
+
"inputType": "select",
|
|
3935
|
+
"enumValues": [
|
|
3936
|
+
"active",
|
|
3937
|
+
"paused",
|
|
3938
|
+
"retired"
|
|
3939
|
+
]
|
|
3940
|
+
},
|
|
3941
|
+
{
|
|
3942
|
+
"slug": "url",
|
|
3943
|
+
"label": "Program URL",
|
|
3944
|
+
"valueType": "string",
|
|
3945
|
+
"inputType": "url"
|
|
3946
|
+
},
|
|
3947
|
+
{
|
|
3948
|
+
"slug": "cadence",
|
|
3949
|
+
"label": "Cadence",
|
|
3950
|
+
"valueType": "string",
|
|
3951
|
+
"inputType": "text",
|
|
3952
|
+
"placeholder": "every 6 weeks"
|
|
3953
|
+
},
|
|
3954
|
+
{
|
|
3955
|
+
"slug": "nextDeadline",
|
|
3956
|
+
"label": "Next Deadline",
|
|
3957
|
+
"valueType": "date",
|
|
3958
|
+
"inputType": "date"
|
|
3959
|
+
},
|
|
3960
|
+
{
|
|
3961
|
+
"slug": "submissionTracks",
|
|
3962
|
+
"label": "Submission Tracks",
|
|
3963
|
+
"valueType": "array",
|
|
3964
|
+
"inputType": "text"
|
|
3965
|
+
},
|
|
3966
|
+
{
|
|
3967
|
+
"slug": "trancheModel",
|
|
3968
|
+
"label": "Tranche Model",
|
|
3969
|
+
"valueType": "string",
|
|
3970
|
+
"inputType": "text",
|
|
3971
|
+
"placeholder": "4 tranches / 90 days"
|
|
3972
|
+
},
|
|
3973
|
+
{
|
|
3974
|
+
"slug": "defaultPlaybook",
|
|
3975
|
+
"label": "Default Playbook",
|
|
3976
|
+
"valueType": "string",
|
|
3977
|
+
"inputType": "text",
|
|
3978
|
+
"constraints": {
|
|
3979
|
+
"defaultValue": "Grant Process"
|
|
3980
|
+
}
|
|
3981
|
+
},
|
|
3982
|
+
{
|
|
3983
|
+
"slug": "description",
|
|
3984
|
+
"label": "Description",
|
|
3985
|
+
"valueType": "string",
|
|
3986
|
+
"inputType": "textarea"
|
|
3987
|
+
}
|
|
3988
|
+
]
|
|
3885
3989
|
}
|
|
3886
3990
|
],
|
|
3887
3991
|
"entityLinks": [
|
|
@@ -16222,6 +16326,12 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
16222
16326
|
"kind": "workspace",
|
|
16223
16327
|
"relation": "require",
|
|
16224
16328
|
"reason": "Provides the pod-wide client / partner / sponsor role vocabulary this workspace reuses."
|
|
16329
|
+
},
|
|
16330
|
+
{
|
|
16331
|
+
"slug": "blockchain-ecosystem",
|
|
16332
|
+
"kind": "workspace",
|
|
16333
|
+
"relation": "require",
|
|
16334
|
+
"reason": "Provides the pod-wide grant-program kind (per-chain funding programs) this workspace's rounds belong to."
|
|
16225
16335
|
}
|
|
16226
16336
|
],
|
|
16227
16337
|
"workspace": {
|
|
@@ -17381,12 +17491,21 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
17381
17491
|
"sortDir": "desc"
|
|
17382
17492
|
}
|
|
17383
17493
|
},
|
|
17494
|
+
{
|
|
17495
|
+
"name": "Deadlines",
|
|
17496
|
+
"type": "calendar",
|
|
17497
|
+
"scopeProfileSlug": "round",
|
|
17498
|
+
"description": "Upcoming round submission deadlines, on one time axis.",
|
|
17499
|
+
"config": {
|
|
17500
|
+
"dateField": "properties.submissionDeadline",
|
|
17501
|
+
"colorField": "status"
|
|
17502
|
+
}
|
|
17503
|
+
},
|
|
17384
17504
|
{
|
|
17385
17505
|
"name": "Awarded Projects",
|
|
17386
17506
|
"type": "gallery",
|
|
17387
17507
|
"scopeProfileSlug": "grant-project",
|
|
17388
17508
|
"config": {
|
|
17389
|
-
"coverField": "summary",
|
|
17390
17509
|
"showFields": [
|
|
17391
17510
|
"currentStatus",
|
|
17392
17511
|
"awardedRoundCount",
|
|
@@ -17430,6 +17549,30 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
17430
17549
|
"type": "submitted_by",
|
|
17431
17550
|
"label": "Submitted By"
|
|
17432
17551
|
},
|
|
17552
|
+
{
|
|
17553
|
+
"sourceProfileSlug": "grant_submission",
|
|
17554
|
+
"targetProfileSlug": "contract",
|
|
17555
|
+
"type": "for_contract",
|
|
17556
|
+
"label": "Engagement"
|
|
17557
|
+
},
|
|
17558
|
+
{
|
|
17559
|
+
"sourceProfileSlug": "grant_submission",
|
|
17560
|
+
"targetProfileSlug": "deal",
|
|
17561
|
+
"type": "billed_as",
|
|
17562
|
+
"label": "Billed as"
|
|
17563
|
+
},
|
|
17564
|
+
{
|
|
17565
|
+
"sourceProfileSlug": "round",
|
|
17566
|
+
"targetProfileSlug": "grant-program",
|
|
17567
|
+
"type": "belongs_to",
|
|
17568
|
+
"label": "Program"
|
|
17569
|
+
},
|
|
17570
|
+
{
|
|
17571
|
+
"sourceProfileSlug": "contract",
|
|
17572
|
+
"targetProfileSlug": "grant-program",
|
|
17573
|
+
"type": "pursues",
|
|
17574
|
+
"label": "Pursues"
|
|
17575
|
+
},
|
|
17433
17576
|
{
|
|
17434
17577
|
"sourceProfileSlug": "grant-project",
|
|
17435
17578
|
"targetProfileSlug": "round",
|
|
@@ -17455,6 +17598,220 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
17455
17598
|
"label": "Evidenced By"
|
|
17456
17599
|
}
|
|
17457
17600
|
],
|
|
17601
|
+
"playbooks": [
|
|
17602
|
+
{
|
|
17603
|
+
"name": "Grant Process",
|
|
17604
|
+
"description": "Run an engagement through a grant program end to end \u2014 identify fit, draft the application, submit, track the decision, and deliver the tranches. Reads the program's own cadence / tracks / tranche model so one playbook fits every chain.",
|
|
17605
|
+
"goalTemplate": "Advance this engagement ({contract}) through the grant program ({grantProgram}) it is pursuing. FIRST read the program entity's own data \u2014 its cadence, submissionTracks, trancheModel, and nextDeadline \u2014 plus the client context on the contract, and let THOSE drive the plan: do not assume a chain's mechanics, read them from the program. Then work the stages in order and keep the client's `grant_submission` card as the durable state of record:\n1. Identify \u2014 understand the project and which of the program's\n submissionTracks fit; set the submission `stage` to `scope`.\n2. Draft \u2014 write the abstract, then the full proposal (products & services,\n success criteria, GTM, traction); move `stage` `abstract` \u2192 `build` and\n fill the submission's body fields.\n3. Submit \u2014 finalize against the program's nextDeadline and submit; once\n submitted, set `stage` to `awaiting-results`.\n4. Awaiting \u2014 track the decision and keep `status` current\n (in-review / waiting-client / needs-document / blocked).\n5. Awarded \u2014 on a decision, set `outcome` (awarded / rejected / partial)\n and record the awarded amount.\n6. Delivering \u2014 for an award, work the program's trancheModel: fill the\n tranche deliverables and update trancheCompletion as each milestone ships.\n\nNever fabricate \u2014 leave a field blank rather than guess. Every write is proposal-gated for the user to review.",
|
|
17606
|
+
"subjectProfile": {
|
|
17607
|
+
"profileSlug": "contract"
|
|
17608
|
+
},
|
|
17609
|
+
"params": [
|
|
17610
|
+
{
|
|
17611
|
+
"name": "contract",
|
|
17612
|
+
"type": "entity",
|
|
17613
|
+
"profileSlug": "contract",
|
|
17614
|
+
"label": "Engagement",
|
|
17615
|
+
"required": true
|
|
17616
|
+
},
|
|
17617
|
+
{
|
|
17618
|
+
"name": "grantProgram",
|
|
17619
|
+
"type": "entity",
|
|
17620
|
+
"profileSlug": "grant-program",
|
|
17621
|
+
"label": "Grant Program",
|
|
17622
|
+
"required": true
|
|
17623
|
+
}
|
|
17624
|
+
],
|
|
17625
|
+
"stages": [
|
|
17626
|
+
{
|
|
17627
|
+
"key": "identify",
|
|
17628
|
+
"name": "Identify",
|
|
17629
|
+
"description": "Understand the project and which of the program's submission tracks fit \u2014 before any writing.",
|
|
17630
|
+
"goal": "A clear project understanding and the fitting submission track; submission stage = scope."
|
|
17631
|
+
},
|
|
17632
|
+
{
|
|
17633
|
+
"key": "draft",
|
|
17634
|
+
"name": "Draft",
|
|
17635
|
+
"description": "Write the abstract, then the full proposal, from the client's real material.",
|
|
17636
|
+
"goal": "Abstract then full proposal drafted; submission stage abstract \u2192 build with body fields filled."
|
|
17637
|
+
},
|
|
17638
|
+
{
|
|
17639
|
+
"key": "submit",
|
|
17640
|
+
"name": "Submit",
|
|
17641
|
+
"description": "Finalize against the program deadline and submit the application.",
|
|
17642
|
+
"goal": "Application submitted on time; submission stage = awaiting-results."
|
|
17643
|
+
},
|
|
17644
|
+
{
|
|
17645
|
+
"key": "awaiting",
|
|
17646
|
+
"name": "Awaiting",
|
|
17647
|
+
"description": "Track the decision and keep the client status current.",
|
|
17648
|
+
"goal": "Submission status reflects where the decision stands (in-review / waiting-client / needs-document / blocked)."
|
|
17649
|
+
},
|
|
17650
|
+
{
|
|
17651
|
+
"key": "awarded",
|
|
17652
|
+
"name": "Awarded",
|
|
17653
|
+
"description": "Record the funder's decision and the awarded amount.",
|
|
17654
|
+
"goal": "Submission outcome set (awarded / rejected / partial) with the awarded amount."
|
|
17655
|
+
},
|
|
17656
|
+
{
|
|
17657
|
+
"key": "delivering",
|
|
17658
|
+
"name": "Delivering",
|
|
17659
|
+
"description": "Work the program's tranche model \u2014 ship and record each tranche.",
|
|
17660
|
+
"goal": "Tranche deliverables filled and trancheCompletion updated as milestones ship."
|
|
17661
|
+
}
|
|
17662
|
+
],
|
|
17663
|
+
"executor": "is-agent",
|
|
17664
|
+
"grants": [
|
|
17665
|
+
"entity.create"
|
|
17666
|
+
],
|
|
17667
|
+
"status": "active"
|
|
17668
|
+
}
|
|
17669
|
+
],
|
|
17670
|
+
"automations": [
|
|
17671
|
+
{
|
|
17672
|
+
"key": "grant-submission-sync",
|
|
17673
|
+
"name": "Grant Submission Sync",
|
|
17674
|
+
"description": "Once a day, keep each grant application's grant_submission card current \u2014 read the submission's recent activity, assess where the pursuit stands, and advance its stage + status so the pipeline stays the durable, kanban-visible state of record.",
|
|
17675
|
+
"triggerType": "cron",
|
|
17676
|
+
"triggerConfig": {
|
|
17677
|
+
"expression": "0 8 * * *"
|
|
17678
|
+
},
|
|
17679
|
+
"status": "draft",
|
|
17680
|
+
"metadata": {
|
|
17681
|
+
"templateKey": "grant-submission-sync"
|
|
17682
|
+
},
|
|
17683
|
+
"flow": {
|
|
17684
|
+
"nodes": [
|
|
17685
|
+
{
|
|
17686
|
+
"id": "trigger",
|
|
17687
|
+
"type": "trigger",
|
|
17688
|
+
"position": {
|
|
17689
|
+
"x": 0,
|
|
17690
|
+
"y": 0
|
|
17691
|
+
},
|
|
17692
|
+
"data": {
|
|
17693
|
+
"label": "Daily at 08:00",
|
|
17694
|
+
"triggerType": "cron",
|
|
17695
|
+
"config": {
|
|
17696
|
+
"expression": "0 8 * * *"
|
|
17697
|
+
}
|
|
17698
|
+
}
|
|
17699
|
+
},
|
|
17700
|
+
{
|
|
17701
|
+
"id": "list-submissions",
|
|
17702
|
+
"type": "capability",
|
|
17703
|
+
"position": {
|
|
17704
|
+
"x": 0,
|
|
17705
|
+
"y": 120
|
|
17706
|
+
},
|
|
17707
|
+
"data": {
|
|
17708
|
+
"label": "List grant submissions to maintain",
|
|
17709
|
+
"verbId": "entity.query",
|
|
17710
|
+
"inputMapping": {
|
|
17711
|
+
"profileSlug": "grant_submission",
|
|
17712
|
+
"limit": "100"
|
|
17713
|
+
}
|
|
17714
|
+
}
|
|
17715
|
+
},
|
|
17716
|
+
{
|
|
17717
|
+
"id": "submissions-loop",
|
|
17718
|
+
"type": "loop",
|
|
17719
|
+
"position": {
|
|
17720
|
+
"x": 0,
|
|
17721
|
+
"y": 240
|
|
17722
|
+
},
|
|
17723
|
+
"data": {
|
|
17724
|
+
"label": "For each grant submission",
|
|
17725
|
+
"iteratorExpression": "steps.list-submissions.output.entities",
|
|
17726
|
+
"itemVariable": "submission"
|
|
17727
|
+
}
|
|
17728
|
+
},
|
|
17729
|
+
{
|
|
17730
|
+
"id": "read-activity",
|
|
17731
|
+
"type": "messages_query",
|
|
17732
|
+
"position": {
|
|
17733
|
+
"x": 0,
|
|
17734
|
+
"y": 360
|
|
17735
|
+
},
|
|
17736
|
+
"data": {
|
|
17737
|
+
"label": "Read the submission's recent activity",
|
|
17738
|
+
"subjectEntityId": "{{loop.item.id}}",
|
|
17739
|
+
"limit": 40
|
|
17740
|
+
}
|
|
17741
|
+
},
|
|
17742
|
+
{
|
|
17743
|
+
"id": "assess",
|
|
17744
|
+
"type": "capability",
|
|
17745
|
+
"position": {
|
|
17746
|
+
"x": 0,
|
|
17747
|
+
"y": 480
|
|
17748
|
+
},
|
|
17749
|
+
"data": {
|
|
17750
|
+
"label": "Assess the submission's stage + status \u2192 JSON",
|
|
17751
|
+
"verbId": "ai.generate",
|
|
17752
|
+
"inputMapping": {
|
|
17753
|
+
"json": "true",
|
|
17754
|
+
"maxTokens": "500",
|
|
17755
|
+
"system": "You are a strict data-extraction function for a grants pipeline. Read a grant application's recent activity and report where the application currently stands. Respond with STRICT JSON and NOTHING else. Never fabricate \u2014 if the activity does not clearly indicate a value, keep the submission's current one.",
|
|
17756
|
+
"prompt": `The grant submission: {{loop.item.title}} Current stage: {{loop.item.properties.stage}} Current status: {{loop.item.properties.status}}
|
|
17757
|
+
Recent activity (oldest first): {{steps.read-activity.output.messages}}
|
|
17758
|
+
Report the submission's current state as STRICT JSON, using ONLY these vocabularies and NOTHING else: {
|
|
17759
|
+
"stage": "scope|abstract|build|awaiting-results",
|
|
17760
|
+
"status": "answered|waiting-client|needs-document|in-review|blocked"
|
|
17761
|
+
}`
|
|
17762
|
+
}
|
|
17763
|
+
}
|
|
17764
|
+
},
|
|
17765
|
+
{
|
|
17766
|
+
"id": "advance-submission",
|
|
17767
|
+
"type": "output",
|
|
17768
|
+
"position": {
|
|
17769
|
+
"x": 0,
|
|
17770
|
+
"y": 600
|
|
17771
|
+
},
|
|
17772
|
+
"data": {
|
|
17773
|
+
"label": "Advance the submission stage + status",
|
|
17774
|
+
"outputType": "entity_update",
|
|
17775
|
+
"config": {
|
|
17776
|
+
"entityId": "{{loop.item.id}}",
|
|
17777
|
+
"properties": {
|
|
17778
|
+
"stage": "{{steps.assess.output.stage}}",
|
|
17779
|
+
"status": "{{steps.assess.output.status}}"
|
|
17780
|
+
}
|
|
17781
|
+
}
|
|
17782
|
+
}
|
|
17783
|
+
}
|
|
17784
|
+
],
|
|
17785
|
+
"edges": [
|
|
17786
|
+
{
|
|
17787
|
+
"id": "gs-trigger-list",
|
|
17788
|
+
"source": "trigger",
|
|
17789
|
+
"target": "list-submissions"
|
|
17790
|
+
},
|
|
17791
|
+
{
|
|
17792
|
+
"id": "gs-list-loop",
|
|
17793
|
+
"source": "list-submissions",
|
|
17794
|
+
"target": "submissions-loop"
|
|
17795
|
+
},
|
|
17796
|
+
{
|
|
17797
|
+
"id": "gs-loop-read",
|
|
17798
|
+
"source": "submissions-loop",
|
|
17799
|
+
"target": "read-activity"
|
|
17800
|
+
},
|
|
17801
|
+
{
|
|
17802
|
+
"id": "gs-read-assess",
|
|
17803
|
+
"source": "read-activity",
|
|
17804
|
+
"target": "assess"
|
|
17805
|
+
},
|
|
17806
|
+
{
|
|
17807
|
+
"id": "gs-assess-advance",
|
|
17808
|
+
"source": "assess",
|
|
17809
|
+
"target": "advance-submission"
|
|
17810
|
+
}
|
|
17811
|
+
]
|
|
17812
|
+
}
|
|
17813
|
+
}
|
|
17814
|
+
],
|
|
17458
17815
|
"app": {
|
|
17459
17816
|
"kind": "stored",
|
|
17460
17817
|
"cellKey": "entity-detail"
|
|
@@ -24136,6 +24493,7 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
24136
24493
|
"description": "A company or person that provides a capability The Arch can broker a client need against.",
|
|
24137
24494
|
"scope": "shared",
|
|
24138
24495
|
"profileKind": "role",
|
|
24496
|
+
"roleCategory": "provider",
|
|
24139
24497
|
"applicableKinds": [
|
|
24140
24498
|
"company",
|
|
24141
24499
|
"person"
|
|
@@ -24315,10 +24673,10 @@ document. No preamble, no explanation, no code fences around the whole thing.`,
|
|
|
24315
24673
|
"y": 240
|
|
24316
24674
|
},
|
|
24317
24675
|
"data": {
|
|
24318
|
-
"label": "List the
|
|
24676
|
+
"label": "List the provider roster (any roleCategory=provider)",
|
|
24319
24677
|
"verbId": "entity.query",
|
|
24320
24678
|
"inputMapping": {
|
|
24321
|
-
"
|
|
24679
|
+
"roleCategory": "provider",
|
|
24322
24680
|
"limit": "100"
|
|
24323
24681
|
}
|
|
24324
24682
|
}
|
|
@@ -29860,6 +30218,12 @@ counter-evidence: research that only kept what agreed with it isn't research.
|
|
|
29860
30218
|
"kind": "workspace",
|
|
29861
30219
|
"relation": "require",
|
|
29862
30220
|
"reason": "The engineering / ops dashboard \u2014 the build-side view of the company."
|
|
30221
|
+
},
|
|
30222
|
+
{
|
|
30223
|
+
"slug": "networking",
|
|
30224
|
+
"kind": "workspace",
|
|
30225
|
+
"relation": "require",
|
|
30226
|
+
"reason": "The partner-intro layer \u2014 need \u2192 intro-matcher \u2192 intro \u2192 billed_as \u2192 deal, with the A\u2194B confidentiality firewall; the Stellar Client-Sync emits needs that depend on it."
|
|
29863
30227
|
}
|
|
29864
30228
|
],
|
|
29865
30229
|
"workspace": {
|
|
@@ -30077,7 +30441,8 @@ function rowToRemoteEntry(row, isPrivate) {
|
|
|
30077
30441
|
domain: row.domain ?? void 0,
|
|
30078
30442
|
tags: row.tags ?? [],
|
|
30079
30443
|
icon: row.icon ?? null,
|
|
30080
|
-
isPrivate
|
|
30444
|
+
isPrivate,
|
|
30445
|
+
items: row.items
|
|
30081
30446
|
// Both list routes strip `definition`; absence ⇒ bundle wins a slug conflict,
|
|
30082
30447
|
// and the install path fetches the full definition per-slug when needed.
|
|
30083
30448
|
};
|
|
@@ -30113,6 +30478,8 @@ function bundledToEntry(tpl) {
|
|
|
30113
30478
|
tags: tpl.meta.tags ?? [],
|
|
30114
30479
|
icon: tpl.meta.icon,
|
|
30115
30480
|
isPrivate: tpl.meta.isPublic === false,
|
|
30481
|
+
// Bundled workspace templates carry no cells — be honest, not `undefined`.
|
|
30482
|
+
items: [],
|
|
30116
30483
|
template: tpl
|
|
30117
30484
|
};
|
|
30118
30485
|
}
|
|
@@ -30127,6 +30494,7 @@ function remoteToEntry(row) {
|
|
|
30127
30494
|
tags: row.tags ?? [],
|
|
30128
30495
|
icon: row.icon ?? null,
|
|
30129
30496
|
isPrivate: row.isPrivate ?? false,
|
|
30497
|
+
items: row.items ?? [],
|
|
30130
30498
|
remote: row
|
|
30131
30499
|
};
|
|
30132
30500
|
}
|