@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/src/templates.ts
CHANGED
|
@@ -3204,7 +3204,7 @@ const DATA = {
|
|
|
3204
3204
|
"inputMapping": {
|
|
3205
3205
|
"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 — say what the state of it means.\nDATA INTEGRITY CHECK — 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 — 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 — 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 — 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\" — 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 — 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…\" 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 — 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> · <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` — 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 — 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 — short paragraphs and bullets, with [[entity:…]] chips\ninline wherever you name a record. No markdown headings, no ::: directive\nblocks, no code fences. Under 300 words. Another round will format this.",
|
|
3206
3206
|
"prompt": "STEER:\n- Prompt: {{trigger.payload.prompt}}\n- Focus: {{trigger.payload.focus}}\n- Project lens id: {{trigger.payload.projectId}}\n\nCOUNTS — 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 — 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 — 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 — one line per record, MOST RECENTLY UPDATED first. Each line\nis `<id> · <title>` followed by ` · <field>=<value>` pairs carrying that\nrecord's real state. An EMPTY value means the field is not set on that\nrecord — 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 — {{steps.gather-tasks.output.count}} found: {{steps.project-tasks.output.result}}\nNotes — {{steps.gather-notes.output.count}} found: {{steps.project-notes.output.result}}\nPeople — {{steps.gather-people.output.count}} found: {{steps.project-people.output.result}}\nCompanies — {{steps.gather-companies.output.count}} found: {{steps.project-companies.output.result}}",
|
|
3207
|
-
"maxTokens": "
|
|
3207
|
+
"maxTokens": "2000"
|
|
3208
3208
|
},
|
|
3209
3209
|
"errorHandling": {
|
|
3210
3210
|
"continueOnError": true
|
|
@@ -3225,7 +3225,7 @@ const DATA = {
|
|
|
3225
3225
|
"inputMapping": {
|
|
3226
3226
|
"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 —\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 — 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 — 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 — 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 — 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 — 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\" — 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 — 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…\" 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 — 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> · <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` — 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 — 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:…]] chips inline. No\nheadings, no ::: directive blocks, no code fences.",
|
|
3227
3227
|
"prompt": "STEER:\n- Prompt: {{trigger.payload.prompt}}\n- Focus: {{trigger.payload.focus}}\n- Project lens id: {{trigger.payload.projectId}}\n\nCOUNTS — 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 — 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 — 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 — one line per record, MOST RECENTLY UPDATED first. Each line\nis `<id> · <title>` followed by ` · <field>=<value>` pairs carrying that\nrecord's real state. An EMPTY value means the field is not set on that\nrecord — 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 — {{steps.gather-tasks.output.count}} found: {{steps.project-tasks.output.result}}\nNotes — {{steps.gather-notes.output.count}} found: {{steps.project-notes.output.result}}\nPeople — {{steps.gather-people.output.count}} found: {{steps.project-people.output.result}}\nCompanies — {{steps.gather-companies.output.count}} found: {{steps.project-companies.output.result}}\n\nANALYST'S READ — 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 — 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 — never answer with nothing.",
|
|
3228
|
-
"maxTokens": "
|
|
3228
|
+
"maxTokens": "2000"
|
|
3229
3229
|
},
|
|
3230
3230
|
"errorHandling": {
|
|
3231
3231
|
"continueOnError": true
|
|
@@ -3461,6 +3461,7 @@ const DATA = {
|
|
|
3461
3461
|
"description": "A liquidity provider — makes markets and provides depth for a token.",
|
|
3462
3462
|
"scope": "shared",
|
|
3463
3463
|
"profileKind": "role",
|
|
3464
|
+
"roleCategory": "provider",
|
|
3464
3465
|
"applicableKinds": [
|
|
3465
3466
|
"company",
|
|
3466
3467
|
"person"
|
|
@@ -3506,6 +3507,7 @@ const DATA = {
|
|
|
3506
3507
|
"description": "A security firm or individual that audits smart contracts and protocols.",
|
|
3507
3508
|
"scope": "shared",
|
|
3508
3509
|
"profileKind": "role",
|
|
3510
|
+
"roleCategory": "provider",
|
|
3509
3511
|
"applicableKinds": [
|
|
3510
3512
|
"company",
|
|
3511
3513
|
"person"
|
|
@@ -3551,6 +3553,7 @@ const DATA = {
|
|
|
3551
3553
|
"description": "An outsourced engineering studio or build partner.",
|
|
3552
3554
|
"scope": "shared",
|
|
3553
3555
|
"profileKind": "role",
|
|
3556
|
+
"roleCategory": "provider",
|
|
3554
3557
|
"applicableKinds": [
|
|
3555
3558
|
"company",
|
|
3556
3559
|
"person"
|
|
@@ -3596,6 +3599,7 @@ const DATA = {
|
|
|
3596
3599
|
"description": "A brand, growth, or content marketing agency.",
|
|
3597
3600
|
"scope": "shared",
|
|
3598
3601
|
"profileKind": "role",
|
|
3602
|
+
"roleCategory": "provider",
|
|
3599
3603
|
"applicableKinds": [
|
|
3600
3604
|
"company",
|
|
3601
3605
|
"person"
|
|
@@ -3641,6 +3645,7 @@ const DATA = {
|
|
|
3641
3645
|
"description": "A performance / paid-media buying agency.",
|
|
3642
3646
|
"scope": "shared",
|
|
3643
3647
|
"profileKind": "role",
|
|
3648
|
+
"roleCategory": "provider",
|
|
3644
3649
|
"applicableKinds": [
|
|
3645
3650
|
"company",
|
|
3646
3651
|
"person"
|
|
@@ -3686,6 +3691,7 @@ const DATA = {
|
|
|
3686
3691
|
"description": "A key opinion leader or influencer who amplifies reach.",
|
|
3687
3692
|
"scope": "shared",
|
|
3688
3693
|
"profileKind": "role",
|
|
3694
|
+
"roleCategory": "provider",
|
|
3689
3695
|
"applicableKinds": [
|
|
3690
3696
|
"company",
|
|
3691
3697
|
"person"
|
|
@@ -3722,6 +3728,100 @@ const DATA = {
|
|
|
3722
3728
|
"inputType": "textarea"
|
|
3723
3729
|
}
|
|
3724
3730
|
]
|
|
3731
|
+
},
|
|
3732
|
+
{
|
|
3733
|
+
"slug": "grant-program",
|
|
3734
|
+
"displayName": "Grant Program",
|
|
3735
|
+
"icon": "landmark",
|
|
3736
|
+
"color": "emerald",
|
|
3737
|
+
"description": "A per-chain funding program (e.g. Stellar SCF, Optimism RetroPGF) — the long-lived funder above a round.",
|
|
3738
|
+
"profileKind": "kind",
|
|
3739
|
+
"entityScope": "pod",
|
|
3740
|
+
"scope": "shared",
|
|
3741
|
+
"properties": [
|
|
3742
|
+
{
|
|
3743
|
+
"slug": "blockchain",
|
|
3744
|
+
"label": "Blockchain / Chain",
|
|
3745
|
+
"valueType": "string",
|
|
3746
|
+
"inputType": "text"
|
|
3747
|
+
},
|
|
3748
|
+
{
|
|
3749
|
+
"slug": "programName",
|
|
3750
|
+
"label": "Program Name",
|
|
3751
|
+
"valueType": "string",
|
|
3752
|
+
"inputType": "text"
|
|
3753
|
+
},
|
|
3754
|
+
{
|
|
3755
|
+
"slug": "programType",
|
|
3756
|
+
"label": "Program Type",
|
|
3757
|
+
"valueType": "string",
|
|
3758
|
+
"inputType": "select",
|
|
3759
|
+
"enumValues": [
|
|
3760
|
+
"direct",
|
|
3761
|
+
"retroactive",
|
|
3762
|
+
"quadratic",
|
|
3763
|
+
"rfp"
|
|
3764
|
+
]
|
|
3765
|
+
},
|
|
3766
|
+
{
|
|
3767
|
+
"slug": "status",
|
|
3768
|
+
"label": "Status",
|
|
3769
|
+
"valueType": "string",
|
|
3770
|
+
"inputType": "select",
|
|
3771
|
+
"enumValues": [
|
|
3772
|
+
"active",
|
|
3773
|
+
"paused",
|
|
3774
|
+
"retired"
|
|
3775
|
+
]
|
|
3776
|
+
},
|
|
3777
|
+
{
|
|
3778
|
+
"slug": "url",
|
|
3779
|
+
"label": "Program URL",
|
|
3780
|
+
"valueType": "string",
|
|
3781
|
+
"inputType": "url"
|
|
3782
|
+
},
|
|
3783
|
+
{
|
|
3784
|
+
"slug": "cadence",
|
|
3785
|
+
"label": "Cadence",
|
|
3786
|
+
"valueType": "string",
|
|
3787
|
+
"inputType": "text",
|
|
3788
|
+
"placeholder": "every 6 weeks"
|
|
3789
|
+
},
|
|
3790
|
+
{
|
|
3791
|
+
"slug": "nextDeadline",
|
|
3792
|
+
"label": "Next Deadline",
|
|
3793
|
+
"valueType": "date",
|
|
3794
|
+
"inputType": "date"
|
|
3795
|
+
},
|
|
3796
|
+
{
|
|
3797
|
+
"slug": "submissionTracks",
|
|
3798
|
+
"label": "Submission Tracks",
|
|
3799
|
+
"valueType": "array",
|
|
3800
|
+
"inputType": "text"
|
|
3801
|
+
},
|
|
3802
|
+
{
|
|
3803
|
+
"slug": "trancheModel",
|
|
3804
|
+
"label": "Tranche Model",
|
|
3805
|
+
"valueType": "string",
|
|
3806
|
+
"inputType": "text",
|
|
3807
|
+
"placeholder": "4 tranches / 90 days"
|
|
3808
|
+
},
|
|
3809
|
+
{
|
|
3810
|
+
"slug": "defaultPlaybook",
|
|
3811
|
+
"label": "Default Playbook",
|
|
3812
|
+
"valueType": "string",
|
|
3813
|
+
"inputType": "text",
|
|
3814
|
+
"constraints": {
|
|
3815
|
+
"defaultValue": "Grant Process"
|
|
3816
|
+
}
|
|
3817
|
+
},
|
|
3818
|
+
{
|
|
3819
|
+
"slug": "description",
|
|
3820
|
+
"label": "Description",
|
|
3821
|
+
"valueType": "string",
|
|
3822
|
+
"inputType": "textarea"
|
|
3823
|
+
}
|
|
3824
|
+
]
|
|
3725
3825
|
}
|
|
3726
3826
|
],
|
|
3727
3827
|
"entityLinks": [
|
|
@@ -16043,6 +16143,12 @@ const DATA = {
|
|
|
16043
16143
|
"kind": "workspace",
|
|
16044
16144
|
"relation": "require",
|
|
16045
16145
|
"reason": "Provides the pod-wide client / partner / sponsor role vocabulary this workspace reuses."
|
|
16146
|
+
},
|
|
16147
|
+
{
|
|
16148
|
+
"slug": "blockchain-ecosystem",
|
|
16149
|
+
"kind": "workspace",
|
|
16150
|
+
"relation": "require",
|
|
16151
|
+
"reason": "Provides the pod-wide grant-program kind (per-chain funding programs) this workspace's rounds belong to."
|
|
16046
16152
|
}
|
|
16047
16153
|
],
|
|
16048
16154
|
"workspace": {
|
|
@@ -17202,12 +17308,21 @@ const DATA = {
|
|
|
17202
17308
|
"sortDir": "desc"
|
|
17203
17309
|
}
|
|
17204
17310
|
},
|
|
17311
|
+
{
|
|
17312
|
+
"name": "Deadlines",
|
|
17313
|
+
"type": "calendar",
|
|
17314
|
+
"scopeProfileSlug": "round",
|
|
17315
|
+
"description": "Upcoming round submission deadlines, on one time axis.",
|
|
17316
|
+
"config": {
|
|
17317
|
+
"dateField": "properties.submissionDeadline",
|
|
17318
|
+
"colorField": "status"
|
|
17319
|
+
}
|
|
17320
|
+
},
|
|
17205
17321
|
{
|
|
17206
17322
|
"name": "Awarded Projects",
|
|
17207
17323
|
"type": "gallery",
|
|
17208
17324
|
"scopeProfileSlug": "grant-project",
|
|
17209
17325
|
"config": {
|
|
17210
|
-
"coverField": "summary",
|
|
17211
17326
|
"showFields": [
|
|
17212
17327
|
"currentStatus",
|
|
17213
17328
|
"awardedRoundCount",
|
|
@@ -17251,6 +17366,30 @@ const DATA = {
|
|
|
17251
17366
|
"type": "submitted_by",
|
|
17252
17367
|
"label": "Submitted By"
|
|
17253
17368
|
},
|
|
17369
|
+
{
|
|
17370
|
+
"sourceProfileSlug": "grant_submission",
|
|
17371
|
+
"targetProfileSlug": "contract",
|
|
17372
|
+
"type": "for_contract",
|
|
17373
|
+
"label": "Engagement"
|
|
17374
|
+
},
|
|
17375
|
+
{
|
|
17376
|
+
"sourceProfileSlug": "grant_submission",
|
|
17377
|
+
"targetProfileSlug": "deal",
|
|
17378
|
+
"type": "billed_as",
|
|
17379
|
+
"label": "Billed as"
|
|
17380
|
+
},
|
|
17381
|
+
{
|
|
17382
|
+
"sourceProfileSlug": "round",
|
|
17383
|
+
"targetProfileSlug": "grant-program",
|
|
17384
|
+
"type": "belongs_to",
|
|
17385
|
+
"label": "Program"
|
|
17386
|
+
},
|
|
17387
|
+
{
|
|
17388
|
+
"sourceProfileSlug": "contract",
|
|
17389
|
+
"targetProfileSlug": "grant-program",
|
|
17390
|
+
"type": "pursues",
|
|
17391
|
+
"label": "Pursues"
|
|
17392
|
+
},
|
|
17254
17393
|
{
|
|
17255
17394
|
"sourceProfileSlug": "grant-project",
|
|
17256
17395
|
"targetProfileSlug": "round",
|
|
@@ -17276,6 +17415,215 @@ const DATA = {
|
|
|
17276
17415
|
"label": "Evidenced By"
|
|
17277
17416
|
}
|
|
17278
17417
|
],
|
|
17418
|
+
"playbooks": [
|
|
17419
|
+
{
|
|
17420
|
+
"name": "Grant Process",
|
|
17421
|
+
"description": "Run an engagement through a grant program end to end — 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.",
|
|
17422
|
+
"goalTemplate": "Advance this engagement ({contract}) through the grant program ({grantProgram}) it is pursuing. FIRST read the program entity's own data — its cadence, submissionTracks, trancheModel, and nextDeadline — 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 — understand the project and which of the program's\n submissionTracks fit; set the submission `stage` to `scope`.\n2. Draft — write the abstract, then the full proposal (products & services,\n success criteria, GTM, traction); move `stage` `abstract` → `build` and\n fill the submission's body fields.\n3. Submit — finalize against the program's nextDeadline and submit; once\n submitted, set `stage` to `awaiting-results`.\n4. Awaiting — track the decision and keep `status` current\n (in-review / waiting-client / needs-document / blocked).\n5. Awarded — on a decision, set `outcome` (awarded / rejected / partial)\n and record the awarded amount.\n6. Delivering — for an award, work the program's trancheModel: fill the\n tranche deliverables and update trancheCompletion as each milestone ships.\n\nNever fabricate — leave a field blank rather than guess. Every write is proposal-gated for the user to review.",
|
|
17423
|
+
"subjectProfile": {
|
|
17424
|
+
"profileSlug": "contract"
|
|
17425
|
+
},
|
|
17426
|
+
"params": [
|
|
17427
|
+
{
|
|
17428
|
+
"name": "contract",
|
|
17429
|
+
"type": "entity",
|
|
17430
|
+
"profileSlug": "contract",
|
|
17431
|
+
"label": "Engagement",
|
|
17432
|
+
"required": true
|
|
17433
|
+
},
|
|
17434
|
+
{
|
|
17435
|
+
"name": "grantProgram",
|
|
17436
|
+
"type": "entity",
|
|
17437
|
+
"profileSlug": "grant-program",
|
|
17438
|
+
"label": "Grant Program",
|
|
17439
|
+
"required": true
|
|
17440
|
+
}
|
|
17441
|
+
],
|
|
17442
|
+
"stages": [
|
|
17443
|
+
{
|
|
17444
|
+
"key": "identify",
|
|
17445
|
+
"name": "Identify",
|
|
17446
|
+
"description": "Understand the project and which of the program's submission tracks fit — before any writing.",
|
|
17447
|
+
"goal": "A clear project understanding and the fitting submission track; submission stage = scope."
|
|
17448
|
+
},
|
|
17449
|
+
{
|
|
17450
|
+
"key": "draft",
|
|
17451
|
+
"name": "Draft",
|
|
17452
|
+
"description": "Write the abstract, then the full proposal, from the client's real material.",
|
|
17453
|
+
"goal": "Abstract then full proposal drafted; submission stage abstract → build with body fields filled."
|
|
17454
|
+
},
|
|
17455
|
+
{
|
|
17456
|
+
"key": "submit",
|
|
17457
|
+
"name": "Submit",
|
|
17458
|
+
"description": "Finalize against the program deadline and submit the application.",
|
|
17459
|
+
"goal": "Application submitted on time; submission stage = awaiting-results."
|
|
17460
|
+
},
|
|
17461
|
+
{
|
|
17462
|
+
"key": "awaiting",
|
|
17463
|
+
"name": "Awaiting",
|
|
17464
|
+
"description": "Track the decision and keep the client status current.",
|
|
17465
|
+
"goal": "Submission status reflects where the decision stands (in-review / waiting-client / needs-document / blocked)."
|
|
17466
|
+
},
|
|
17467
|
+
{
|
|
17468
|
+
"key": "awarded",
|
|
17469
|
+
"name": "Awarded",
|
|
17470
|
+
"description": "Record the funder's decision and the awarded amount.",
|
|
17471
|
+
"goal": "Submission outcome set (awarded / rejected / partial) with the awarded amount."
|
|
17472
|
+
},
|
|
17473
|
+
{
|
|
17474
|
+
"key": "delivering",
|
|
17475
|
+
"name": "Delivering",
|
|
17476
|
+
"description": "Work the program's tranche model — ship and record each tranche.",
|
|
17477
|
+
"goal": "Tranche deliverables filled and trancheCompletion updated as milestones ship."
|
|
17478
|
+
}
|
|
17479
|
+
],
|
|
17480
|
+
"executor": "is-agent",
|
|
17481
|
+
"grants": [
|
|
17482
|
+
"entity.create"
|
|
17483
|
+
],
|
|
17484
|
+
"status": "active"
|
|
17485
|
+
}
|
|
17486
|
+
],
|
|
17487
|
+
"automations": [
|
|
17488
|
+
{
|
|
17489
|
+
"key": "grant-submission-sync",
|
|
17490
|
+
"name": "Grant Submission Sync",
|
|
17491
|
+
"description": "Once a day, keep each grant application's grant_submission card current — 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.",
|
|
17492
|
+
"triggerType": "cron",
|
|
17493
|
+
"triggerConfig": {
|
|
17494
|
+
"expression": "0 8 * * *"
|
|
17495
|
+
},
|
|
17496
|
+
"status": "draft",
|
|
17497
|
+
"metadata": {
|
|
17498
|
+
"templateKey": "grant-submission-sync"
|
|
17499
|
+
},
|
|
17500
|
+
"flow": {
|
|
17501
|
+
"nodes": [
|
|
17502
|
+
{
|
|
17503
|
+
"id": "trigger",
|
|
17504
|
+
"type": "trigger",
|
|
17505
|
+
"position": {
|
|
17506
|
+
"x": 0,
|
|
17507
|
+
"y": 0
|
|
17508
|
+
},
|
|
17509
|
+
"data": {
|
|
17510
|
+
"label": "Daily at 08:00",
|
|
17511
|
+
"triggerType": "cron",
|
|
17512
|
+
"config": {
|
|
17513
|
+
"expression": "0 8 * * *"
|
|
17514
|
+
}
|
|
17515
|
+
}
|
|
17516
|
+
},
|
|
17517
|
+
{
|
|
17518
|
+
"id": "list-submissions",
|
|
17519
|
+
"type": "capability",
|
|
17520
|
+
"position": {
|
|
17521
|
+
"x": 0,
|
|
17522
|
+
"y": 120
|
|
17523
|
+
},
|
|
17524
|
+
"data": {
|
|
17525
|
+
"label": "List grant submissions to maintain",
|
|
17526
|
+
"verbId": "entity.query",
|
|
17527
|
+
"inputMapping": {
|
|
17528
|
+
"profileSlug": "grant_submission",
|
|
17529
|
+
"limit": "100"
|
|
17530
|
+
}
|
|
17531
|
+
}
|
|
17532
|
+
},
|
|
17533
|
+
{
|
|
17534
|
+
"id": "submissions-loop",
|
|
17535
|
+
"type": "loop",
|
|
17536
|
+
"position": {
|
|
17537
|
+
"x": 0,
|
|
17538
|
+
"y": 240
|
|
17539
|
+
},
|
|
17540
|
+
"data": {
|
|
17541
|
+
"label": "For each grant submission",
|
|
17542
|
+
"iteratorExpression": "steps.list-submissions.output.entities",
|
|
17543
|
+
"itemVariable": "submission"
|
|
17544
|
+
}
|
|
17545
|
+
},
|
|
17546
|
+
{
|
|
17547
|
+
"id": "read-activity",
|
|
17548
|
+
"type": "messages_query",
|
|
17549
|
+
"position": {
|
|
17550
|
+
"x": 0,
|
|
17551
|
+
"y": 360
|
|
17552
|
+
},
|
|
17553
|
+
"data": {
|
|
17554
|
+
"label": "Read the submission's recent activity",
|
|
17555
|
+
"subjectEntityId": "{{loop.item.id}}",
|
|
17556
|
+
"limit": 40
|
|
17557
|
+
}
|
|
17558
|
+
},
|
|
17559
|
+
{
|
|
17560
|
+
"id": "assess",
|
|
17561
|
+
"type": "capability",
|
|
17562
|
+
"position": {
|
|
17563
|
+
"x": 0,
|
|
17564
|
+
"y": 480
|
|
17565
|
+
},
|
|
17566
|
+
"data": {
|
|
17567
|
+
"label": "Assess the submission's stage + status → JSON",
|
|
17568
|
+
"verbId": "ai.generate",
|
|
17569
|
+
"inputMapping": {
|
|
17570
|
+
"json": "true",
|
|
17571
|
+
"maxTokens": "500",
|
|
17572
|
+
"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 — if the activity does not clearly indicate a value, keep the submission's current one.",
|
|
17573
|
+
"prompt": "The grant submission: {{loop.item.title}} Current stage: {{loop.item.properties.stage}} Current status: {{loop.item.properties.status}}\nRecent activity (oldest first): {{steps.read-activity.output.messages}}\nReport the submission's current state as STRICT JSON, using ONLY these vocabularies and NOTHING else: {\n \"stage\": \"scope|abstract|build|awaiting-results\",\n \"status\": \"answered|waiting-client|needs-document|in-review|blocked\"\n}"
|
|
17574
|
+
}
|
|
17575
|
+
}
|
|
17576
|
+
},
|
|
17577
|
+
{
|
|
17578
|
+
"id": "advance-submission",
|
|
17579
|
+
"type": "output",
|
|
17580
|
+
"position": {
|
|
17581
|
+
"x": 0,
|
|
17582
|
+
"y": 600
|
|
17583
|
+
},
|
|
17584
|
+
"data": {
|
|
17585
|
+
"label": "Advance the submission stage + status",
|
|
17586
|
+
"outputType": "entity_update",
|
|
17587
|
+
"config": {
|
|
17588
|
+
"entityId": "{{loop.item.id}}",
|
|
17589
|
+
"properties": {
|
|
17590
|
+
"stage": "{{steps.assess.output.stage}}",
|
|
17591
|
+
"status": "{{steps.assess.output.status}}"
|
|
17592
|
+
}
|
|
17593
|
+
}
|
|
17594
|
+
}
|
|
17595
|
+
}
|
|
17596
|
+
],
|
|
17597
|
+
"edges": [
|
|
17598
|
+
{
|
|
17599
|
+
"id": "gs-trigger-list",
|
|
17600
|
+
"source": "trigger",
|
|
17601
|
+
"target": "list-submissions"
|
|
17602
|
+
},
|
|
17603
|
+
{
|
|
17604
|
+
"id": "gs-list-loop",
|
|
17605
|
+
"source": "list-submissions",
|
|
17606
|
+
"target": "submissions-loop"
|
|
17607
|
+
},
|
|
17608
|
+
{
|
|
17609
|
+
"id": "gs-loop-read",
|
|
17610
|
+
"source": "submissions-loop",
|
|
17611
|
+
"target": "read-activity"
|
|
17612
|
+
},
|
|
17613
|
+
{
|
|
17614
|
+
"id": "gs-read-assess",
|
|
17615
|
+
"source": "read-activity",
|
|
17616
|
+
"target": "assess"
|
|
17617
|
+
},
|
|
17618
|
+
{
|
|
17619
|
+
"id": "gs-assess-advance",
|
|
17620
|
+
"source": "assess",
|
|
17621
|
+
"target": "advance-submission"
|
|
17622
|
+
}
|
|
17623
|
+
]
|
|
17624
|
+
}
|
|
17625
|
+
}
|
|
17626
|
+
],
|
|
17279
17627
|
"app": {
|
|
17280
17628
|
"kind": "stored",
|
|
17281
17629
|
"cellKey": "entity-detail"
|
|
@@ -23941,6 +24289,7 @@ const DATA = {
|
|
|
23941
24289
|
"description": "A company or person that provides a capability The Arch can broker a client need against.",
|
|
23942
24290
|
"scope": "shared",
|
|
23943
24291
|
"profileKind": "role",
|
|
24292
|
+
"roleCategory": "provider",
|
|
23944
24293
|
"applicableKinds": [
|
|
23945
24294
|
"company",
|
|
23946
24295
|
"person"
|
|
@@ -24120,10 +24469,10 @@ const DATA = {
|
|
|
24120
24469
|
"y": 240
|
|
24121
24470
|
},
|
|
24122
24471
|
"data": {
|
|
24123
|
-
"label": "List the
|
|
24472
|
+
"label": "List the provider roster (any roleCategory=provider)",
|
|
24124
24473
|
"verbId": "entity.query",
|
|
24125
24474
|
"inputMapping": {
|
|
24126
|
-
"
|
|
24475
|
+
"roleCategory": "provider",
|
|
24127
24476
|
"limit": "100"
|
|
24128
24477
|
}
|
|
24129
24478
|
}
|
|
@@ -29636,6 +29985,12 @@ const DATA = {
|
|
|
29636
29985
|
"kind": "workspace",
|
|
29637
29986
|
"relation": "require",
|
|
29638
29987
|
"reason": "The engineering / ops dashboard — the build-side view of the company."
|
|
29988
|
+
},
|
|
29989
|
+
{
|
|
29990
|
+
"slug": "networking",
|
|
29991
|
+
"kind": "workspace",
|
|
29992
|
+
"relation": "require",
|
|
29993
|
+
"reason": "The partner-intro layer — need → intro-matcher → intro → billed_as → deal, with the A↔B confidentiality firewall; the Stellar Client-Sync emits needs that depend on it."
|
|
29639
29994
|
}
|
|
29640
29995
|
],
|
|
29641
29996
|
"workspace": {
|
package/src/the-arch.yaml
CHANGED
|
@@ -50,6 +50,10 @@ dependencies:
|
|
|
50
50
|
kind: workspace
|
|
51
51
|
relation: require
|
|
52
52
|
reason: "The engineering / ops dashboard — the build-side view of the company."
|
|
53
|
+
- slug: networking
|
|
54
|
+
kind: workspace
|
|
55
|
+
relation: require
|
|
56
|
+
reason: "The partner-intro layer — need → intro-matcher → intro → billed_as → deal, with the A↔B confidentiality firewall; the Stellar Client-Sync emits needs that depend on it."
|
|
53
57
|
|
|
54
58
|
workspace:
|
|
55
59
|
name: The Arch
|
package/src/types.ts
CHANGED
|
@@ -607,46 +607,44 @@ export interface TemplateExtendsRef {
|
|
|
607
607
|
* PACKAGE_DEPENDENCY_KINDS — the dependency-kind vocabulary, declared ONCE.
|
|
608
608
|
*
|
|
609
609
|
* This tuple exists so consumers can IMPORT the vocabulary instead of
|
|
610
|
-
* hand-copying it. `TemplateDependency` is
|
|
611
|
-
*
|
|
612
|
-
*
|
|
613
|
-
* fail a build; an import can. Those mirrors live in repos this package does not
|
|
614
|
-
* own, so this tuple does not fix them by existing — it makes the fix possible:
|
|
610
|
+
* hand-copying it. `TemplateDependency` is mirrored by hand in several other
|
|
611
|
+
* places — a comment cannot fail a build, an import can, but these mirrors live
|
|
612
|
+
* in repos this package does not own, so they must match this list EXACTLY:
|
|
615
613
|
*
|
|
616
|
-
* - marketplace `types.ts
|
|
617
|
-
* - onboarding `workspace-templates.ts
|
|
618
|
-
* -
|
|
619
|
-
*
|
|
620
|
-
* - hub-protocol REST `rest/packages.ts
|
|
621
|
-
* -
|
|
622
|
-
*
|
|
614
|
+
* - marketplace `features/marketplace/src/types.ts`
|
|
615
|
+
* - onboarding `features/onboarding/src/{templates/workspace-templates,components/WorkspacePreview}.ts(x)`
|
|
616
|
+
* - browser `InstallPackageDialog.tsx`
|
|
617
|
+
* - synap-backend `package-definition.ts` (`PackageDependencyKind`)
|
|
618
|
+
* - hub-protocol REST `rest/packages.ts` (zod enum)
|
|
619
|
+
* - control-plane-api `db/schema/packages.ts` (`TemplateDependency` type)
|
|
620
|
+
* + `routes/packages.ts` (`DEPENDENCY_KINDS` zod enum)
|
|
623
621
|
*
|
|
624
|
-
*
|
|
625
|
-
*
|
|
626
|
-
*
|
|
627
|
-
*
|
|
628
|
-
* `db/schema/packages.ts`). A dependency's `kind` names the TYPE of package it
|
|
629
|
-
* points at, so this vocabulary should track `PACKAGE_TYPES` — meaning the live
|
|
630
|
-
* spelling is `workflow`, not `automation`.
|
|
622
|
+
* These are the 7 literals the wire accepts, in lockstep with the CP publish
|
|
623
|
+
* enum (`DEPENDENCY_KINDS = [...PACKAGE_TYPES, "automation"]`, CP
|
|
624
|
+
* `routes/packages.ts`), the hub install enum (`rest/packages.ts`), and the
|
|
625
|
+
* backend resolver's `PackageDependencyKind` (`@synap/database`).
|
|
631
626
|
*
|
|
632
|
-
*
|
|
633
|
-
*
|
|
634
|
-
*
|
|
635
|
-
* `
|
|
636
|
-
*
|
|
637
|
-
*
|
|
638
|
-
* still legally accepts (a published third-party package may carry it; CP's own
|
|
639
|
-
* schema permits it). Narrowing must therefore follow the wire, not lead it.
|
|
627
|
+
* Resolver behaviour (backend `package-dependency-resolver.ts`):
|
|
628
|
+
* - `workspace` → resolve+install; the ONLY kind that may `compose`.
|
|
629
|
+
* - `capability` / `cell` → resolve+install, always `require`d (presence).
|
|
630
|
+
* - `skill` / `workflow` / `view` / `automation` → ACCEPTED and `require`d
|
|
631
|
+
* present, surfaced as `required-absent` (non-fatal) — no standalone by-slug
|
|
632
|
+
* applier on the pod yet; when one grows, give the kind its own branch.
|
|
640
633
|
*
|
|
641
|
-
*
|
|
642
|
-
*
|
|
643
|
-
*
|
|
644
|
-
*
|
|
634
|
+
* `'automation'` is legacy vocabulary: CP migration `0049_package_vocabulary`
|
|
635
|
+
* renamed the `automation` package category → `workflow` (which absorbs
|
|
636
|
+
* automation + playbook, `PACKAGE_TYPES` in CP `db/schema/packages.ts`). It
|
|
637
|
+
* stays accepted on the wire — and therefore in this tuple — for back-compat
|
|
638
|
+
* with dependencies published before the rename.
|
|
645
639
|
*/
|
|
646
640
|
export const PACKAGE_DEPENDENCY_KINDS = [
|
|
647
641
|
"workspace",
|
|
648
642
|
"capability",
|
|
649
|
-
|
|
643
|
+
"skill",
|
|
644
|
+
"workflow",
|
|
645
|
+
"view",
|
|
646
|
+
"cell",
|
|
647
|
+
/** @deprecated Legacy alias for `workflow` (CP 0049). Still accepted on the wire. */
|
|
650
648
|
"automation",
|
|
651
649
|
] as const;
|
|
652
650
|
|
|
@@ -658,8 +656,8 @@ export interface TemplateDependency {
|
|
|
658
656
|
slug: string;
|
|
659
657
|
/**
|
|
660
658
|
* What the dependency is. Default `'workspace'`. Only `'workspace'`
|
|
661
|
-
* dependencies can be `compose`d;
|
|
662
|
-
*
|
|
659
|
+
* dependencies can be `compose`d; every other kind is always `require`d
|
|
660
|
+
* present without merging.
|
|
663
661
|
*/
|
|
664
662
|
kind?: PackageDependencyKind;
|
|
665
663
|
/**
|