@paradigma-inc/flywheel 0.1.26 → 0.1.35
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/package.json +1 -1
- package/skills/flywheel/example-workflows/organizing-exploring-and-iterating-on-a-research-topic.md +11 -11
- package/skills/flywheel/example-workflows/reproducing-papers-on-a-budget.md +8 -8
- package/skills/flywheel/references/ARTIFACTS.md +48 -0
- package/skills/flywheel/references/INTERFACES.md +206 -0
- package/skills/flywheel/references/experiment-design-protocol.md +5 -5
- package/skills/flywheel/references/flywheel-mcp-tool-map.md +72 -60
- package/skills/flywheel-auto/SKILL.md +4 -4
- package/skills/flywheel-auto/references/ARTIFACTS.md +1 -1
- package/skills/flywheel-auto/references/INTERFACES.md +59 -59
- package/skills/flywheel-auto/references/experiment-design-protocol.md +5 -5
- package/skills/flywheel-auto/references/flywheel-mcp-tool-map.md +72 -60
- package/skills/flywheel-lookahead/references/ARTIFACTS.md +1 -1
- package/skills/flywheel-lookahead/references/INTERFACES.md +59 -59
- package/skills/flywheel-lookahead/references/flywheel-mcp-tool-map.md +72 -60
- package/skills/flywheel-prove/SKILL.md +8 -0
- package/skills/flywheel-reproduce/SKILL.md +4 -4
- package/skills/flywheel-reproduce/references/ARTIFACTS.md +1 -1
- package/skills/flywheel-reproduce/references/INTERFACES.md +59 -59
- package/skills/flywheel-reproduce/references/experiment-design-protocol.md +5 -5
- package/skills/flywheel-reproduce/references/flywheel-mcp-tool-map.md +72 -60
- package/skills/flywheel-to-graph/SKILL.md +4 -4
- package/skills/flywheel-to-graph/references/ARTIFACTS.md +1 -1
- package/skills/flywheel-to-graph/references/INTERFACES.md +59 -59
- package/skills/flywheel-to-graph/references/flywheel-mcp-tool-map.md +72 -60
- package/skills/flywheel-tree/SKILL.md +61 -0
- package/skills/flywheel-tree/agents/interface.yaml +4 -0
- package/skills/flywheel-tree/assets/ansi_palette.json +29 -0
- package/skills/flywheel-tree/references/workflow.md +108 -0
- package/skills/flywheel-tree/scripts/render_tree.py +407 -0
- package/skills/flywheel-tree/scripts/render_tree_via_mcp.py +694 -0
|
@@ -12,6 +12,16 @@ Flywheel is a graph-based system for tracking research work, decisions, and evid
|
|
|
12
12
|
- Node references include immutable `node_id` and optional immutable `slug_name`; prefer communicating both together for human clarity and disambiguation.
|
|
13
13
|
- Insight nodes should represent conceptual observations (theoretical insights, intuitions, motivations, decision-relevant framing); empirical nodes should represent experiments with explicit hypotheses and measured outcomes.
|
|
14
14
|
- Graph topology should encode logical/causal relations between concepts and experiments. Avoid defaulting to shallow root-only branching unless work items are truly independent.
|
|
15
|
+
- Node staging is local (non-canonical) and commit is the only canonical persistence boundary (`commit_new_node`, `commit_node`).
|
|
16
|
+
- Mutating node writes are optimistic-locking operations: read latest state, pass `expected_revision` or `base_committed_revision` as required, and handle `409 conflict` with explicit reconciliation.
|
|
17
|
+
- Mutating operations are idempotent; MCP tool transport auto-manages `Idempotency-Key` on mutating tool calls.
|
|
18
|
+
- Existing-node field editing may use a session-scoped stage lease (`flywheel_acquire_stage_lease`, `flywheel_heartbeat_stage_lease`, `flywheel_release_stage_lease`) to coordinate local staged state before commit.
|
|
19
|
+
- Existing-node commit publishes a full staged payload under an active stage lease: commit requests require `stage_session_id`, `base_committed_revision`, and `staged_payload`; conflicts on stale committed revisions are surfaced directly and are not transport-retried.
|
|
20
|
+
- Stage/backfill helpers (`stage_backfill_hypothesis`, `stage_backfill_insights`) return non-canonical staged payload patches and explicit status fields (`staged_changes_pending`, `commit_required`, `next_action_hint`).
|
|
21
|
+
- Committed node state must still satisfy strict contract (`summary` required; `empirical` requires hypothesis plus artifacts or `no_artifacts_reason`; `insight` requires non-empty insights).
|
|
22
|
+
- When code is involved, pass `repo_url`/`branch_name`/`head_commit_sha` and align git structure with graph topology where practical (without forcing one-to-one mapping).
|
|
23
|
+
- Summaries, hypotheses, and artifacts should be reproduction-grade: enough setup, method, evidence, and interpretation for another reader to reproduce or audit results.
|
|
24
|
+
- Empirical workflow is hypothesis-driven: launch execution, inspect outcomes, publish evidence artifacts, and commit only after terminal status.
|
|
15
25
|
- For empirical work, publish evidence with `flywheel_prepare_artifact_uploads`, upload raw file bytes, then `flywheel_finalize_artifact_uploads` before commit.
|
|
16
26
|
- Artifact metadata records expose a non-empty `title` suitable for display labels; title normalization must never derive from `storage_url`.
|
|
17
27
|
|
|
@@ -21,84 +31,84 @@ Flywheel is a graph-based system for tracking research work, decisions, and evid
|
|
|
21
31
|
|
|
22
32
|
- `flywheel_auth_status` (read; scopes: `read`; HTTP: `GET /auth/status`; core surface): Return Flywheel auth status for the current access token.
|
|
23
33
|
- `flywheel_get_credits_balance` (read; scopes: `read`; HTTP: `GET /credits`; core surface): Return current user credits balance and lifetime counters.
|
|
24
|
-
- `flywheel_updates_list` (read; scopes: `read`; HTTP: `
|
|
25
|
-
- `flywheel_updates_hide` (mutating; scopes: `write`; HTTP: `POST /
|
|
26
|
-
- `flywheel_updates_hide_all_active` (mutating; scopes: `write`; HTTP: `POST /
|
|
27
|
-
- `flywheel_updates_unhide` (mutating; scopes: `write`; HTTP: `DELETE /
|
|
28
|
-
- `flywheel_list_nodes` (read; scopes: `read`; HTTP: `GET /
|
|
29
|
-
- `flywheel_resolve_node_slug` (read; scopes: `read`; HTTP: `GET /
|
|
30
|
-
- `flywheel_get_node_sharing` (read; scopes: `read`; HTTP: `
|
|
31
|
-
- `flywheel_set_sharing_for_node` (mutating; scopes: `write`; HTTP: `
|
|
32
|
-
- `flywheel_set_sharing_for_nodes` (mutating; scopes: `write`; HTTP: `POST /
|
|
33
|
-
- `flywheel_get_node` (read; scopes: `read`; HTTP: `
|
|
34
|
-
- `flywheel_create_node_tag` (mutating; scopes: `write`; HTTP: `POST /
|
|
35
|
-
- `flywheel_update_node_tag` (mutating; scopes: `write`; HTTP: `PATCH /
|
|
36
|
-
- `flywheel_delete_node_tag` (mutating; scopes: `write`; HTTP: `DELETE /
|
|
37
|
-
- `flywheel_set_node_tag_assignments` (mutating; scopes: `write`; HTTP: `PUT /
|
|
38
|
-
- `flywheel_get_node_tree` (read; scopes: `read`; HTTP: `GET /
|
|
39
|
-
- `flywheel_get_node_ancestry` (read; scopes: `read`; HTTP: `GET /
|
|
40
|
-
- `flywheel_get_campaign_snapshot` (read; scopes: `read`; HTTP: `GET /
|
|
41
|
-
- `flywheel_list_audit` (read; scopes: `read`; HTTP: `GET /
|
|
34
|
+
- `flywheel_updates_list` (read; scopes: `read`; HTTP: `tool-mediated`; core surface): List in-app updates/announcements for the signed-in user.
|
|
35
|
+
- `flywheel_updates_hide` (mutating; scopes: `write`; HTTP: `POST /updates/{announcement_id}/hide`; core surface): Mark one update as hidden for the current user (Don't show again).
|
|
36
|
+
- `flywheel_updates_hide_all_active` (mutating; scopes: `write`; HTTP: `POST /updates/hide-all-active`; core surface): Hide all active updates for the current user (Don't show all active again).
|
|
37
|
+
- `flywheel_updates_unhide` (mutating; scopes: `write`; HTTP: `DELETE /updates/{announcement_id}/hide`; core surface): Restore one hidden update for the current user.
|
|
38
|
+
- `flywheel_list_nodes` (read; scopes: `read`; HTTP: `GET /nodes`; full-surface only): List nodes with optional owners/writers/visibility filters and projection control (`core`, `topology`, `full`).
|
|
39
|
+
- `flywheel_resolve_node_slug` (read; scopes: `read`; HTTP: `GET /nodes/resolve-by-slug`; core surface): Resolve a node by slug_name with explicit conflict handling (`unique`, `context_resolved`, `ambiguous`, `not_found`).
|
|
40
|
+
- `flywheel_get_node_sharing` (read; scopes: `read`; HTTP: `tool-mediated`; full-surface only): Get node sharing for one node (owner/collaborators/visibility).
|
|
41
|
+
- `flywheel_set_sharing_for_node` (mutating; scopes: `write`; HTTP: `tool-mediated`; full-surface only): Set sharing for one owned node (collaborators/private-unlisted-public visibility).
|
|
42
|
+
- `flywheel_set_sharing_for_nodes` (mutating; scopes: `write`; HTTP: `POST /nodes/access-policy/bulk`; full-surface only): Apply one sharing configuration across multiple owned nodes in bulk.
|
|
43
|
+
- `flywheel_get_node` (read; scopes: `read`; HTTP: `tool-mediated`; core surface): Get one node by node_id.
|
|
44
|
+
- `flywheel_create_node_tag` (mutating; scopes: `write`; HTTP: `POST /nodes/{root_node_id}/tags`; full-surface only): Create one graph tag from a root node. `track_history` is effective only when `one_only=true`; when `one_only=false`, the effective track_history=false.
|
|
45
|
+
- `flywheel_update_node_tag` (mutating; scopes: `write`; HTTP: `PATCH /nodes/{root_node_id}/tags/{tag_id}`; full-surface only): Update one graph tag from a root node.
|
|
46
|
+
- `flywheel_delete_node_tag` (mutating; scopes: `write`; HTTP: `DELETE /nodes/{root_node_id}/tags/{tag_id}`; full-surface only): Delete one graph tag from a root node.
|
|
47
|
+
- `flywheel_set_node_tag_assignments` (mutating; scopes: `write`; HTTP: `PUT /nodes/{node_id}/tags`; full-surface only): Set graph tag assignments for one node (`tag_ids` must be a JSON array of strings; omit `tag_ids` to clear all assignments to `[]`).
|
|
48
|
+
- `flywheel_get_node_tree` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/tree`; full-surface only): Get a root-aware bounded tree/DAG projection for an anchor node.
|
|
49
|
+
- `flywheel_get_node_ancestry` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/ancestry`; full-surface only): Get ordered ancestry metadata from an anchor node to root boundaries.
|
|
50
|
+
- `flywheel_get_campaign_snapshot` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/campaign/snapshot`; core surface): Read the current campaign snapshot for a node's root campaign, including configured views and derived records.
|
|
51
|
+
- `flywheel_list_audit` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/audit`; full-surface only): List node MCP audit events.
|
|
42
52
|
|
|
43
53
|
### Node stage and commit
|
|
44
54
|
|
|
45
|
-
- `flywheel_commit_new_node` (mutating; scopes: `write`; HTTP: `POST /
|
|
46
|
-
- `flywheel_acquire_stage_lease` (mutating; scopes: `write`; HTTP: `POST /
|
|
47
|
-
- `flywheel_heartbeat_stage_lease` (mutating; scopes: `write`; HTTP: `POST /
|
|
48
|
-
- `flywheel_release_stage_lease` (mutating; scopes: `write`; HTTP: `POST /
|
|
49
|
-
- `flywheel_commit_node` (mutating; scopes: `write`; HTTP: `POST /
|
|
50
|
-
- `flywheel_branch_node` (mutating; scopes: `write`; HTTP: `POST /
|
|
51
|
-
- `flywheel_merge_nodes` (mutating; scopes: `write`; HTTP: `POST /
|
|
52
|
-
- `flywheel_add_parent` (mutating; scopes: `write`; HTTP: `POST /
|
|
53
|
-
- `flywheel_remove_parent` (mutating; scopes: `write`; HTTP: `POST /
|
|
54
|
-
- `flywheel_delete_node` (mutating; scopes: `write`; HTTP: `DELETE /
|
|
55
|
-
- `flywheel_bulk_delete_nodes` (mutating; scopes: `write`; HTTP: `POST /
|
|
55
|
+
- `flywheel_commit_new_node` (mutating; scopes: `write`; HTTP: `POST /nodes/commit-new`; full-surface only): Commit a locally staged new node into canonical storage and return the persisted node.
|
|
56
|
+
- `flywheel_acquire_stage_lease` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/stage/lease/acquire`; full-surface only): Acquire a session-scoped stage lease for an existing node before local staged edits.
|
|
57
|
+
- `flywheel_heartbeat_stage_lease` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/stage/lease/heartbeat`; full-surface only): Refresh the active stage lease for the current editing session.
|
|
58
|
+
- `flywheel_release_stage_lease` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/stage/lease/release`; full-surface only): Release the active stage lease for the current editing session.
|
|
59
|
+
- `flywheel_commit_node` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/commit`; core surface): Commit an existing node by publishing the caller's staged payload under an active stage lease.
|
|
60
|
+
- `flywheel_branch_node` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/branch`; full-surface only): Create a child branch node with optimistic locking (`expected_revision` required).
|
|
61
|
+
- `flywheel_merge_nodes` (mutating; scopes: `write`; HTTP: `POST /nodes/merge`; full-surface only): Merge nodes with caller-resolved node payload.
|
|
62
|
+
- `flywheel_add_parent` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/parents/add`; full-surface only): Attach an additional parent edge to an existing node (keeps node identity, validates against cycles).
|
|
63
|
+
- `flywheel_remove_parent` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/parents/remove`; full-surface only): Detach one parent edge from a node without deleting the node.
|
|
64
|
+
- `flywheel_delete_node` (mutating; scopes: `write`; HTTP: `DELETE /nodes/{node_id}`; full-surface only): Delete a node and its descendants. Modes: `cascade` (delete full subtree), `detach_shared` (preserve descendants with surviving parents).
|
|
65
|
+
- `flywheel_bulk_delete_nodes` (mutating; scopes: `write`; HTTP: `POST /nodes/bulk-delete`; full-surface only): Delete multiple node subtrees in one operation.
|
|
56
66
|
|
|
57
67
|
### Artifacts
|
|
58
68
|
|
|
59
|
-
- `flywheel_prepare_artifact_uploads` (mutating; scopes: `write`; HTTP: `POST /
|
|
60
|
-
- `flywheel_finalize_artifact_uploads` (mutating; scopes: `write`; HTTP: `POST /
|
|
61
|
-
- `flywheel_list_artifacts` (read; scopes: `read`; HTTP: `
|
|
62
|
-
- `flywheel_get_artifact` (read; scopes: `read`; HTTP: `
|
|
63
|
-
- `flywheel_delete_artifact` (mutating; scopes: `write`; HTTP: `DELETE /
|
|
64
|
-
- `flywheel_set_artifact_note` (mutating; scopes: `write`; HTTP: `PATCH /
|
|
69
|
+
- `flywheel_prepare_artifact_uploads` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/artifacts/uploads/prepare`; core surface): Prepare one or more raw-file artifact uploads (returns batch token + signed upload URLs). Upload must send raw file bytes to the returned URLs (do not upload JSON metadata wrappers).
|
|
70
|
+
- `flywheel_finalize_artifact_uploads` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/artifacts/uploads/finalize`; core surface): Finalize a prepared artifact upload batch and append all staged artifacts to the node in one revision bump.
|
|
71
|
+
- `flywheel_list_artifacts` (read; scopes: `read`; HTTP: `tool-mediated`; core surface): List node artifacts.
|
|
72
|
+
- `flywheel_get_artifact` (read; scopes: `read`; HTTP: `tool-mediated`; core surface): Get one artifact by id.
|
|
73
|
+
- `flywheel_delete_artifact` (mutating; scopes: `write`; HTTP: `DELETE /nodes/{node_id}/artifacts/{artifact_id}`; core surface): Delete one artifact by id with optimistic locking.
|
|
74
|
+
- `flywheel_set_artifact_note` (mutating; scopes: `write`; HTTP: `PATCH /nodes/{node_id}/artifacts/{artifact_id}/note`; core surface): Set or clear one artifact note with optimistic locking.
|
|
65
75
|
|
|
66
76
|
### Executions
|
|
67
77
|
|
|
68
|
-
- `flywheel_launch_execution` (mutating; scopes: `write`; HTTP: `POST /
|
|
69
|
-
- `flywheel_list_executions` (read; scopes: `read`; HTTP: `GET /
|
|
70
|
-
- `flywheel_terminate_execution` (mutating; scopes: `write`; HTTP: `POST /
|
|
78
|
+
- `flywheel_launch_execution` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/executions`; core surface): Launch node execution.
|
|
79
|
+
- `flywheel_list_executions` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/executions`; core surface): List node executions.
|
|
80
|
+
- `flywheel_terminate_execution` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/executions/{execution_id}/terminate`; core surface): Terminate a node execution.
|
|
71
81
|
|
|
72
82
|
### Compute and budgets
|
|
73
83
|
|
|
74
|
-
- `flywheel_compute_list_options` (read; scopes: `compute`; HTTP: `GET /
|
|
75
|
-
- `flywheel_compute_funding` (read; scopes: `compute`; HTTP: `GET /
|
|
76
|
-
- `flywheel_compute_status` (read; scopes: `compute`; HTTP: `GET /
|
|
77
|
-
- `flywheel_compute_connection` (read; scopes: `compute`; HTTP: `GET /
|
|
78
|
-
- `flywheel_approval_session_heartbeat` (read; scopes: `compute`; HTTP: `POST /
|
|
79
|
-
- `flywheel_list_approval_sessions` (read; scopes: `compute`; HTTP: `GET /
|
|
80
|
-
- `flywheel_expire_approval_session` (mutating; scopes: `compute`; HTTP: `POST /
|
|
84
|
+
- `flywheel_compute_list_options` (read; scopes: `compute`; HTTP: `GET /compute/catalog`; core surface): List managed compute options allowed for a node. When using grant-backed compute, pass the same compute_grant_id you will use for acquire.
|
|
85
|
+
- `flywheel_compute_funding` (read; scopes: `compute`; HTTP: `GET /compute/funding`; core surface): Read grant-scoped funding context (`grant_cents`, `remaining_cents`, and backing budget fields) for a `compute_grant_id` before compute acquire.
|
|
86
|
+
- `flywheel_compute_status` (read; scopes: `compute`; HTTP: `GET /compute/status`; core surface): Read managed compute lease status for the current user and current lease_control_token scope. Lease rows include ownership flags so hosts can distinguish user-owned leases from sponsor-visible campaign leases. When checking a grant-backed lease, reuse the same compute_grant_id passed to acquire.
|
|
87
|
+
- `flywheel_compute_connection` (read; scopes: `compute`; HTTP: `GET /compute/connection`; core surface): Read SSH connection material for an active managed compute lease once flywheel_compute_status indicates the lease is usable. This tool is token-scoped to lease_control_token and only leases owned by the current user are connectable. Pass lease_id or node_id to disambiguate when needed.
|
|
88
|
+
- `flywheel_approval_session_heartbeat` (read; scopes: `compute`; HTTP: `POST /approval-sessions/heartbeat`; core surface): Create or refresh a compute-grant approval session for the current MCP host session.
|
|
89
|
+
- `flywheel_list_approval_sessions` (read; scopes: `compute`; HTTP: `GET /approval-sessions`; core surface): List approval sessions visible to the current user.
|
|
90
|
+
- `flywheel_expire_approval_session` (mutating; scopes: `compute`; HTTP: `POST /approval-sessions/expire`; core surface): Expire the current compute-grant approval session context without releasing active leases.
|
|
81
91
|
- `flywheel_request_compute_grant_approval` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Request budget approval context before managed compute acquisition; branch on response status.
|
|
82
|
-
- `flywheel_list_compute_grants` (read; scopes: `compute`; HTTP: `GET /
|
|
83
|
-
- `flywheel_list_campaign_budgets` (read; scopes: `compute`; HTTP: `GET /
|
|
84
|
-
- `flywheel_create_campaign_budget` (mutating; scopes: `compute`; HTTP: `POST /
|
|
85
|
-
- `flywheel_update_campaign_budget` (mutating; scopes: `compute`; HTTP: `PATCH /
|
|
86
|
-
- `flywheel_revoke_campaign_budget` (mutating; scopes: `compute`; HTTP: `DELETE /
|
|
87
|
-
- `flywheel_compute_acquire` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Acquire managed compute with explicit SKU + region and required compute_grant_id (returns accepted/completed lease state only; poll flywheel_compute_status for readiness, not SSH key material). This tool forwards approval_session_id
|
|
88
|
-
- `flywheel_compute_release` (mutating; scopes: `compute`; HTTP: `
|
|
89
|
-
- `flywheel_compute_release_all` (mutating; scopes: `compute`; HTTP: `
|
|
92
|
+
- `flywheel_list_compute_grants` (read; scopes: `compute`; HTTP: `GET /compute/grants`; core surface): List active/exhausted compute grants available to the current user.
|
|
93
|
+
- `flywheel_list_campaign_budgets` (read; scopes: `compute`; HTTP: `GET /nodes/{root_node_id}/campaign-budgets`; full-surface only): List campaign compute budgets for a campaign root. Organizer-only management view.
|
|
94
|
+
- `flywheel_create_campaign_budget` (mutating; scopes: `compute`; HTTP: `POST /nodes/{root_node_id}/campaign-budgets`; full-surface only): Create an organizer-funded campaign compute budget shared with participants.
|
|
95
|
+
- `flywheel_update_campaign_budget` (mutating; scopes: `compute`; HTTP: `PATCH /nodes/{root_node_id}/campaign-budgets/{compute_budget_id}`; full-surface only): Update hard caps or metadata for an organizer-funded campaign compute budget.
|
|
96
|
+
- `flywheel_revoke_campaign_budget` (mutating; scopes: `compute`; HTTP: `DELETE /nodes/{root_node_id}/campaign-budgets/{compute_budget_id}`; full-surface only): Revoke an organizer-funded campaign compute budget.
|
|
97
|
+
- `flywheel_compute_acquire` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Acquire managed compute for a node with explicit SKU + region and required compute_grant_id (returns accepted/completed lease state only; poll flywheel_compute_status for readiness, not SSH key material). This tool forwards approval_session_id.
|
|
98
|
+
- `flywheel_compute_release` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Asynchronously release one managed compute lease by lease_id within the current lease_control_token scope.
|
|
99
|
+
- `flywheel_compute_release_all` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Asynchronously release active managed compute leases in the current lease_control_token scope; set force=true for explicit account-wide cleanup for the current user.
|
|
90
100
|
|
|
91
101
|
### Contract, audit, and export
|
|
92
102
|
|
|
93
103
|
- `flywheel_get_contract` (read; scopes: `read`; HTTP: `GET /mcp/contract`; core surface): Return Flywheel MCP contract overview (scopes, write safety, operation catalog, and section index).
|
|
94
104
|
- `flywheel_get_contract_section` (read; scopes: `read`; HTTP: `GET /mcp/contract/sections/{section_id}`; core surface): Return one contract section by section_id (for example `graph` or `campaign/template_v1`).
|
|
95
|
-
- `flywheel_export_subgraph` (read; scopes: `read`; HTTP: `POST /
|
|
96
|
-
- `flywheel_import_subgraph` (mutating; scopes: `write`; HTTP: `POST /
|
|
97
|
-
- `flywheel_summarize_node_tree` (read; scopes: `read`; HTTP: `GET /
|
|
98
|
-
- `flywheel_export_summary` (read; scopes: `read`; HTTP: `POST /
|
|
99
|
-
- `flywheel_export_summary_stream` (read; scopes: `read`; HTTP: `POST /
|
|
100
|
-
- `flywheel_export_summary_pdf` (read; scopes: `read`; HTTP: `POST /
|
|
101
|
-
- `flywheel_export_summary_render_pdf` (read; scopes: `read`; HTTP: `POST /
|
|
105
|
+
- `flywheel_export_subgraph` (read; scopes: `read`; HTTP: `POST /export`; full-surface only): Export selected graph/subgraph nodes as JSON.
|
|
106
|
+
- `flywheel_import_subgraph` (mutating; scopes: `write`; HTTP: `POST /import`; full-surface only): Import graph/subgraph JSON payload into new node IDs. Set normalize_cycles=true to drop cycle/self-loop edges; default rejects cyclic payloads.
|
|
107
|
+
- `flywheel_summarize_node_tree` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/summary`; full-surface only): Summarize a node tree using node fields only.
|
|
108
|
+
- `flywheel_export_summary` (read; scopes: `read`; HTTP: `POST /export-summary`; full-surface only): Generate markdown summary for selected nodes.
|
|
109
|
+
- `flywheel_export_summary_stream` (read; scopes: `read`; HTTP: `POST /export-summary-stream`; full-surface only): Generate summary stream events for selected nodes.
|
|
110
|
+
- `flywheel_export_summary_pdf` (read; scopes: `read`; HTTP: `POST /export-summary-pdf`; full-surface only): Generate PDF summary for selected nodes.
|
|
111
|
+
- `flywheel_export_summary_render_pdf` (read; scopes: `read`; HTTP: `POST /export-summary-render-pdf`; full-surface only): Render provided markdown to PDF and embed export metadata.
|
|
102
112
|
|
|
103
113
|
## Practical Tool Sequences
|
|
104
114
|
|
|
@@ -134,6 +144,8 @@ Flywheel is a graph-based system for tracking research work, decisions, and evid
|
|
|
134
144
|
- `flywheel_acquire_stage_lease`, `flywheel_heartbeat_stage_lease`, `flywheel_release_stage_lease`: coordinate session-scoped local staged edits for an existing node before commit.
|
|
135
145
|
- `flywheel_get_campaign_snapshot`: read the current derived campaign state for this node's root campaign instead of inferring standings from freeform text.
|
|
136
146
|
- `flywheel_get_node_sharing`: after sharing writes, verify with flywheel_get_node_sharing before reporting private/shared/public state.
|
|
147
|
+
- `flywheel_set_node_tag_assignments`: pass `tag_ids` as a JSON array of strings; omitting `tag_ids` clears all assignments (`[]`).
|
|
148
|
+
- `flywheel_list_nodes`: canonical filter inputs for `owners`, `writers`, and `visibility` are arrays; scalar `owners`/`writers` may be normalized by transport compatibility layers, but array form is preferred.
|
|
137
149
|
- `flywheel_compute_status`: check first when work may need managed compute (GPU), using the active lease_control_token from host context (or pass it explicitly).
|
|
138
150
|
- `flywheel_list_compute_grants`: list active compute grants (funded by user/root budgets) and select one `compute_grant_id` for acquisition.
|
|
139
151
|
- `flywheel_request_compute_grant_approval`: request/confirm budget before acquire and choose a budget source (`user` or `root`); branch on status (`already_approved`, `approval_required`, `insufficient_credits`).
|
|
@@ -12,7 +12,7 @@ Canonical artifact upload/finalize contract derived from `mcp_contract.py`.
|
|
|
12
12
|
- Upload body contract: `raw_file_bytes`.
|
|
13
13
|
- Prepare item required fields: `artifact_type`, `filename`, `media_type`.
|
|
14
14
|
- Prepare item optional fields: `title`, `execution_id`, `metadata`, `note`.
|
|
15
|
-
- Prepare item note: prepare.items[] is structured object input
|
|
15
|
+
- Prepare item note: prepare.items[] is structured object input. The transport layer may tolerate stringified JSON as a compatibility measure; this tolerance is not contractual and may be removed.
|
|
16
16
|
- Raw upload stage success code: `202`.
|
|
17
17
|
- Stage semantics: `accepted_and_staged`.
|
|
18
18
|
- Finalize appends the batch with a single revision bump: `True`.
|
|
@@ -116,84 +116,84 @@ Canonical reference for Flywheel MCP public interfaces and contract pointers.
|
|
|
116
116
|
|
|
117
117
|
- `GET /auth/status` -> `flywheel_auth_status`
|
|
118
118
|
- `GET /credits` -> `flywheel_get_credits_balance`
|
|
119
|
-
- `
|
|
120
|
-
- `POST /
|
|
121
|
-
- `POST /
|
|
122
|
-
- `DELETE /
|
|
123
|
-
- `GET /
|
|
124
|
-
- `GET /
|
|
125
|
-
- `
|
|
126
|
-
- `
|
|
127
|
-
- `POST /
|
|
128
|
-
- `
|
|
129
|
-
- `POST /
|
|
130
|
-
- `PATCH /
|
|
131
|
-
- `DELETE /
|
|
132
|
-
- `PUT /
|
|
133
|
-
- `GET /
|
|
134
|
-
- `GET /
|
|
135
|
-
- `GET /
|
|
136
|
-
- `GET /
|
|
119
|
+
- `tool-mediated` -> `flywheel_updates_list`
|
|
120
|
+
- `POST /updates/{announcement_id}/hide` -> `flywheel_updates_hide`
|
|
121
|
+
- `POST /updates/hide-all-active` -> `flywheel_updates_hide_all_active`
|
|
122
|
+
- `DELETE /updates/{announcement_id}/hide` -> `flywheel_updates_unhide`
|
|
123
|
+
- `GET /nodes` -> `flywheel_list_nodes`
|
|
124
|
+
- `GET /nodes/resolve-by-slug` -> `flywheel_resolve_node_slug`
|
|
125
|
+
- `tool-mediated` -> `flywheel_get_node_sharing`
|
|
126
|
+
- `tool-mediated` -> `flywheel_set_sharing_for_node`
|
|
127
|
+
- `POST /nodes/access-policy/bulk` -> `flywheel_set_sharing_for_nodes`
|
|
128
|
+
- `tool-mediated` -> `flywheel_get_node`
|
|
129
|
+
- `POST /nodes/{root_node_id}/tags` -> `flywheel_create_node_tag`
|
|
130
|
+
- `PATCH /nodes/{root_node_id}/tags/{tag_id}` -> `flywheel_update_node_tag`
|
|
131
|
+
- `DELETE /nodes/{root_node_id}/tags/{tag_id}` -> `flywheel_delete_node_tag`
|
|
132
|
+
- `PUT /nodes/{node_id}/tags` -> `flywheel_set_node_tag_assignments`
|
|
133
|
+
- `GET /nodes/{node_id}/tree` -> `flywheel_get_node_tree`
|
|
134
|
+
- `GET /nodes/{node_id}/ancestry` -> `flywheel_get_node_ancestry`
|
|
135
|
+
- `GET /nodes/{node_id}/campaign/snapshot` -> `flywheel_get_campaign_snapshot`
|
|
136
|
+
- `GET /nodes/{node_id}/audit` -> `flywheel_list_audit`
|
|
137
137
|
|
|
138
138
|
### Node stage and commit
|
|
139
139
|
|
|
140
|
-
- `POST /
|
|
141
|
-
- `POST /
|
|
142
|
-
- `POST /
|
|
143
|
-
- `POST /
|
|
144
|
-
- `POST /
|
|
145
|
-
- `POST /
|
|
146
|
-
- `POST /
|
|
147
|
-
- `POST /
|
|
148
|
-
- `POST /
|
|
149
|
-
- `DELETE /
|
|
150
|
-
- `POST /
|
|
140
|
+
- `POST /nodes/commit-new` -> `flywheel_commit_new_node`
|
|
141
|
+
- `POST /nodes/{node_id}/stage/lease/acquire` -> `flywheel_acquire_stage_lease`
|
|
142
|
+
- `POST /nodes/{node_id}/stage/lease/heartbeat` -> `flywheel_heartbeat_stage_lease`
|
|
143
|
+
- `POST /nodes/{node_id}/stage/lease/release` -> `flywheel_release_stage_lease`
|
|
144
|
+
- `POST /nodes/{node_id}/commit` -> `flywheel_commit_node`
|
|
145
|
+
- `POST /nodes/{node_id}/branch` -> `flywheel_branch_node`
|
|
146
|
+
- `POST /nodes/merge` -> `flywheel_merge_nodes`
|
|
147
|
+
- `POST /nodes/{node_id}/parents/add` -> `flywheel_add_parent`
|
|
148
|
+
- `POST /nodes/{node_id}/parents/remove` -> `flywheel_remove_parent`
|
|
149
|
+
- `DELETE /nodes/{node_id}` -> `flywheel_delete_node`
|
|
150
|
+
- `POST /nodes/bulk-delete` -> `flywheel_bulk_delete_nodes`
|
|
151
151
|
|
|
152
152
|
### Artifacts
|
|
153
153
|
|
|
154
|
-
- `POST /
|
|
155
|
-
- `POST /
|
|
156
|
-
- `
|
|
157
|
-
- `
|
|
158
|
-
- `DELETE /
|
|
159
|
-
- `PATCH /
|
|
154
|
+
- `POST /nodes/{node_id}/artifacts/uploads/prepare` -> `flywheel_prepare_artifact_uploads`
|
|
155
|
+
- `POST /nodes/{node_id}/artifacts/uploads/finalize` -> `flywheel_finalize_artifact_uploads`
|
|
156
|
+
- `tool-mediated` -> `flywheel_list_artifacts`
|
|
157
|
+
- `tool-mediated` -> `flywheel_get_artifact`
|
|
158
|
+
- `DELETE /nodes/{node_id}/artifacts/{artifact_id}` -> `flywheel_delete_artifact`
|
|
159
|
+
- `PATCH /nodes/{node_id}/artifacts/{artifact_id}/note` -> `flywheel_set_artifact_note`
|
|
160
160
|
|
|
161
161
|
### Executions
|
|
162
162
|
|
|
163
|
-
- `POST /
|
|
164
|
-
- `GET /
|
|
165
|
-
- `POST /
|
|
163
|
+
- `POST /nodes/{node_id}/executions` -> `flywheel_launch_execution`
|
|
164
|
+
- `GET /nodes/{node_id}/executions` -> `flywheel_list_executions`
|
|
165
|
+
- `POST /nodes/{node_id}/executions/{execution_id}/terminate` -> `flywheel_terminate_execution`
|
|
166
166
|
|
|
167
167
|
### Compute and budgets
|
|
168
168
|
|
|
169
|
-
- `GET /
|
|
170
|
-
- `GET /
|
|
171
|
-
- `GET /
|
|
172
|
-
- `GET /
|
|
173
|
-
- `POST /
|
|
174
|
-
- `GET /
|
|
175
|
-
- `POST /
|
|
169
|
+
- `GET /compute/catalog` -> `flywheel_compute_list_options`
|
|
170
|
+
- `GET /compute/funding` -> `flywheel_compute_funding`
|
|
171
|
+
- `GET /compute/status` -> `flywheel_compute_status`
|
|
172
|
+
- `GET /compute/connection` -> `flywheel_compute_connection`
|
|
173
|
+
- `POST /approval-sessions/heartbeat` -> `flywheel_approval_session_heartbeat`
|
|
174
|
+
- `GET /approval-sessions` -> `flywheel_list_approval_sessions`
|
|
175
|
+
- `POST /approval-sessions/expire` -> `flywheel_expire_approval_session`
|
|
176
176
|
- `tool-mediated` -> `flywheel_request_compute_grant_approval`
|
|
177
|
-
- `GET /
|
|
178
|
-
- `GET /
|
|
179
|
-
- `POST /
|
|
180
|
-
- `PATCH /
|
|
181
|
-
- `DELETE /
|
|
177
|
+
- `GET /compute/grants` -> `flywheel_list_compute_grants`
|
|
178
|
+
- `GET /nodes/{root_node_id}/campaign-budgets` -> `flywheel_list_campaign_budgets`
|
|
179
|
+
- `POST /nodes/{root_node_id}/campaign-budgets` -> `flywheel_create_campaign_budget`
|
|
180
|
+
- `PATCH /nodes/{root_node_id}/campaign-budgets/{compute_budget_id}` -> `flywheel_update_campaign_budget`
|
|
181
|
+
- `DELETE /nodes/{root_node_id}/campaign-budgets/{compute_budget_id}` -> `flywheel_revoke_campaign_budget`
|
|
182
182
|
- `tool-mediated` -> `flywheel_compute_acquire`
|
|
183
|
-
- `
|
|
184
|
-
- `
|
|
183
|
+
- `tool-mediated` -> `flywheel_compute_release`
|
|
184
|
+
- `tool-mediated` -> `flywheel_compute_release_all`
|
|
185
185
|
|
|
186
186
|
### Contract, audit, and export
|
|
187
187
|
|
|
188
188
|
- `GET /mcp/contract` -> `flywheel_get_contract`
|
|
189
189
|
- `GET /mcp/contract/sections/{section_id}` -> `flywheel_get_contract_section`
|
|
190
|
-
- `POST /
|
|
191
|
-
- `POST /
|
|
192
|
-
- `GET /
|
|
193
|
-
- `POST /
|
|
194
|
-
- `POST /
|
|
195
|
-
- `POST /
|
|
196
|
-
- `POST /
|
|
190
|
+
- `POST /export` -> `flywheel_export_subgraph`
|
|
191
|
+
- `POST /import` -> `flywheel_import_subgraph`
|
|
192
|
+
- `GET /nodes/{node_id}/summary` -> `flywheel_summarize_node_tree`
|
|
193
|
+
- `POST /export-summary` -> `flywheel_export_summary`
|
|
194
|
+
- `POST /export-summary-stream` -> `flywheel_export_summary_stream`
|
|
195
|
+
- `POST /export-summary-pdf` -> `flywheel_export_summary_pdf`
|
|
196
|
+
- `POST /export-summary-render-pdf` -> `flywheel_export_summary_render_pdf`
|
|
197
197
|
|
|
198
198
|
## Auth and Write Safety
|
|
199
199
|
|
|
@@ -12,6 +12,16 @@ Flywheel is a graph-based system for tracking research work, decisions, and evid
|
|
|
12
12
|
- Node references include immutable `node_id` and optional immutable `slug_name`; prefer communicating both together for human clarity and disambiguation.
|
|
13
13
|
- Insight nodes should represent conceptual observations (theoretical insights, intuitions, motivations, decision-relevant framing); empirical nodes should represent experiments with explicit hypotheses and measured outcomes.
|
|
14
14
|
- Graph topology should encode logical/causal relations between concepts and experiments. Avoid defaulting to shallow root-only branching unless work items are truly independent.
|
|
15
|
+
- Node staging is local (non-canonical) and commit is the only canonical persistence boundary (`commit_new_node`, `commit_node`).
|
|
16
|
+
- Mutating node writes are optimistic-locking operations: read latest state, pass `expected_revision` or `base_committed_revision` as required, and handle `409 conflict` with explicit reconciliation.
|
|
17
|
+
- Mutating operations are idempotent; MCP tool transport auto-manages `Idempotency-Key` on mutating tool calls.
|
|
18
|
+
- Existing-node field editing may use a session-scoped stage lease (`flywheel_acquire_stage_lease`, `flywheel_heartbeat_stage_lease`, `flywheel_release_stage_lease`) to coordinate local staged state before commit.
|
|
19
|
+
- Existing-node commit publishes a full staged payload under an active stage lease: commit requests require `stage_session_id`, `base_committed_revision`, and `staged_payload`; conflicts on stale committed revisions are surfaced directly and are not transport-retried.
|
|
20
|
+
- Stage/backfill helpers (`stage_backfill_hypothesis`, `stage_backfill_insights`) return non-canonical staged payload patches and explicit status fields (`staged_changes_pending`, `commit_required`, `next_action_hint`).
|
|
21
|
+
- Committed node state must still satisfy strict contract (`summary` required; `empirical` requires hypothesis plus artifacts or `no_artifacts_reason`; `insight` requires non-empty insights).
|
|
22
|
+
- When code is involved, pass `repo_url`/`branch_name`/`head_commit_sha` and align git structure with graph topology where practical (without forcing one-to-one mapping).
|
|
23
|
+
- Summaries, hypotheses, and artifacts should be reproduction-grade: enough setup, method, evidence, and interpretation for another reader to reproduce or audit results.
|
|
24
|
+
- Empirical workflow is hypothesis-driven: launch execution, inspect outcomes, publish evidence artifacts, and commit only after terminal status.
|
|
15
25
|
- For empirical work, publish evidence with `flywheel_prepare_artifact_uploads`, upload raw file bytes, then `flywheel_finalize_artifact_uploads` before commit.
|
|
16
26
|
- Artifact metadata records expose a non-empty `title` suitable for display labels; title normalization must never derive from `storage_url`.
|
|
17
27
|
|
|
@@ -21,84 +31,84 @@ Flywheel is a graph-based system for tracking research work, decisions, and evid
|
|
|
21
31
|
|
|
22
32
|
- `flywheel_auth_status` (read; scopes: `read`; HTTP: `GET /auth/status`; core surface): Return Flywheel auth status for the current access token.
|
|
23
33
|
- `flywheel_get_credits_balance` (read; scopes: `read`; HTTP: `GET /credits`; core surface): Return current user credits balance and lifetime counters.
|
|
24
|
-
- `flywheel_updates_list` (read; scopes: `read`; HTTP: `
|
|
25
|
-
- `flywheel_updates_hide` (mutating; scopes: `write`; HTTP: `POST /
|
|
26
|
-
- `flywheel_updates_hide_all_active` (mutating; scopes: `write`; HTTP: `POST /
|
|
27
|
-
- `flywheel_updates_unhide` (mutating; scopes: `write`; HTTP: `DELETE /
|
|
28
|
-
- `flywheel_list_nodes` (read; scopes: `read`; HTTP: `GET /
|
|
29
|
-
- `flywheel_resolve_node_slug` (read; scopes: `read`; HTTP: `GET /
|
|
30
|
-
- `flywheel_get_node_sharing` (read; scopes: `read`; HTTP: `
|
|
31
|
-
- `flywheel_set_sharing_for_node` (mutating; scopes: `write`; HTTP: `
|
|
32
|
-
- `flywheel_set_sharing_for_nodes` (mutating; scopes: `write`; HTTP: `POST /
|
|
33
|
-
- `flywheel_get_node` (read; scopes: `read`; HTTP: `
|
|
34
|
-
- `flywheel_create_node_tag` (mutating; scopes: `write`; HTTP: `POST /
|
|
35
|
-
- `flywheel_update_node_tag` (mutating; scopes: `write`; HTTP: `PATCH /
|
|
36
|
-
- `flywheel_delete_node_tag` (mutating; scopes: `write`; HTTP: `DELETE /
|
|
37
|
-
- `flywheel_set_node_tag_assignments` (mutating; scopes: `write`; HTTP: `PUT /
|
|
38
|
-
- `flywheel_get_node_tree` (read; scopes: `read`; HTTP: `GET /
|
|
39
|
-
- `flywheel_get_node_ancestry` (read; scopes: `read`; HTTP: `GET /
|
|
40
|
-
- `flywheel_get_campaign_snapshot` (read; scopes: `read`; HTTP: `GET /
|
|
41
|
-
- `flywheel_list_audit` (read; scopes: `read`; HTTP: `GET /
|
|
34
|
+
- `flywheel_updates_list` (read; scopes: `read`; HTTP: `tool-mediated`; core surface): List in-app updates/announcements for the signed-in user.
|
|
35
|
+
- `flywheel_updates_hide` (mutating; scopes: `write`; HTTP: `POST /updates/{announcement_id}/hide`; core surface): Mark one update as hidden for the current user (Don't show again).
|
|
36
|
+
- `flywheel_updates_hide_all_active` (mutating; scopes: `write`; HTTP: `POST /updates/hide-all-active`; core surface): Hide all active updates for the current user (Don't show all active again).
|
|
37
|
+
- `flywheel_updates_unhide` (mutating; scopes: `write`; HTTP: `DELETE /updates/{announcement_id}/hide`; core surface): Restore one hidden update for the current user.
|
|
38
|
+
- `flywheel_list_nodes` (read; scopes: `read`; HTTP: `GET /nodes`; full-surface only): List nodes with optional owners/writers/visibility filters and projection control (`core`, `topology`, `full`).
|
|
39
|
+
- `flywheel_resolve_node_slug` (read; scopes: `read`; HTTP: `GET /nodes/resolve-by-slug`; core surface): Resolve a node by slug_name with explicit conflict handling (`unique`, `context_resolved`, `ambiguous`, `not_found`).
|
|
40
|
+
- `flywheel_get_node_sharing` (read; scopes: `read`; HTTP: `tool-mediated`; full-surface only): Get node sharing for one node (owner/collaborators/visibility).
|
|
41
|
+
- `flywheel_set_sharing_for_node` (mutating; scopes: `write`; HTTP: `tool-mediated`; full-surface only): Set sharing for one owned node (collaborators/private-unlisted-public visibility).
|
|
42
|
+
- `flywheel_set_sharing_for_nodes` (mutating; scopes: `write`; HTTP: `POST /nodes/access-policy/bulk`; full-surface only): Apply one sharing configuration across multiple owned nodes in bulk.
|
|
43
|
+
- `flywheel_get_node` (read; scopes: `read`; HTTP: `tool-mediated`; core surface): Get one node by node_id.
|
|
44
|
+
- `flywheel_create_node_tag` (mutating; scopes: `write`; HTTP: `POST /nodes/{root_node_id}/tags`; full-surface only): Create one graph tag from a root node. `track_history` is effective only when `one_only=true`; when `one_only=false`, the effective track_history=false.
|
|
45
|
+
- `flywheel_update_node_tag` (mutating; scopes: `write`; HTTP: `PATCH /nodes/{root_node_id}/tags/{tag_id}`; full-surface only): Update one graph tag from a root node.
|
|
46
|
+
- `flywheel_delete_node_tag` (mutating; scopes: `write`; HTTP: `DELETE /nodes/{root_node_id}/tags/{tag_id}`; full-surface only): Delete one graph tag from a root node.
|
|
47
|
+
- `flywheel_set_node_tag_assignments` (mutating; scopes: `write`; HTTP: `PUT /nodes/{node_id}/tags`; full-surface only): Set graph tag assignments for one node (`tag_ids` must be a JSON array of strings; omit `tag_ids` to clear all assignments to `[]`).
|
|
48
|
+
- `flywheel_get_node_tree` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/tree`; full-surface only): Get a root-aware bounded tree/DAG projection for an anchor node.
|
|
49
|
+
- `flywheel_get_node_ancestry` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/ancestry`; full-surface only): Get ordered ancestry metadata from an anchor node to root boundaries.
|
|
50
|
+
- `flywheel_get_campaign_snapshot` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/campaign/snapshot`; core surface): Read the current campaign snapshot for a node's root campaign, including configured views and derived records.
|
|
51
|
+
- `flywheel_list_audit` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/audit`; full-surface only): List node MCP audit events.
|
|
42
52
|
|
|
43
53
|
### Node stage and commit
|
|
44
54
|
|
|
45
|
-
- `flywheel_commit_new_node` (mutating; scopes: `write`; HTTP: `POST /
|
|
46
|
-
- `flywheel_acquire_stage_lease` (mutating; scopes: `write`; HTTP: `POST /
|
|
47
|
-
- `flywheel_heartbeat_stage_lease` (mutating; scopes: `write`; HTTP: `POST /
|
|
48
|
-
- `flywheel_release_stage_lease` (mutating; scopes: `write`; HTTP: `POST /
|
|
49
|
-
- `flywheel_commit_node` (mutating; scopes: `write`; HTTP: `POST /
|
|
50
|
-
- `flywheel_branch_node` (mutating; scopes: `write`; HTTP: `POST /
|
|
51
|
-
- `flywheel_merge_nodes` (mutating; scopes: `write`; HTTP: `POST /
|
|
52
|
-
- `flywheel_add_parent` (mutating; scopes: `write`; HTTP: `POST /
|
|
53
|
-
- `flywheel_remove_parent` (mutating; scopes: `write`; HTTP: `POST /
|
|
54
|
-
- `flywheel_delete_node` (mutating; scopes: `write`; HTTP: `DELETE /
|
|
55
|
-
- `flywheel_bulk_delete_nodes` (mutating; scopes: `write`; HTTP: `POST /
|
|
55
|
+
- `flywheel_commit_new_node` (mutating; scopes: `write`; HTTP: `POST /nodes/commit-new`; full-surface only): Commit a locally staged new node into canonical storage and return the persisted node.
|
|
56
|
+
- `flywheel_acquire_stage_lease` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/stage/lease/acquire`; full-surface only): Acquire a session-scoped stage lease for an existing node before local staged edits.
|
|
57
|
+
- `flywheel_heartbeat_stage_lease` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/stage/lease/heartbeat`; full-surface only): Refresh the active stage lease for the current editing session.
|
|
58
|
+
- `flywheel_release_stage_lease` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/stage/lease/release`; full-surface only): Release the active stage lease for the current editing session.
|
|
59
|
+
- `flywheel_commit_node` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/commit`; core surface): Commit an existing node by publishing the caller's staged payload under an active stage lease.
|
|
60
|
+
- `flywheel_branch_node` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/branch`; full-surface only): Create a child branch node with optimistic locking (`expected_revision` required).
|
|
61
|
+
- `flywheel_merge_nodes` (mutating; scopes: `write`; HTTP: `POST /nodes/merge`; full-surface only): Merge nodes with caller-resolved node payload.
|
|
62
|
+
- `flywheel_add_parent` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/parents/add`; full-surface only): Attach an additional parent edge to an existing node (keeps node identity, validates against cycles).
|
|
63
|
+
- `flywheel_remove_parent` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/parents/remove`; full-surface only): Detach one parent edge from a node without deleting the node.
|
|
64
|
+
- `flywheel_delete_node` (mutating; scopes: `write`; HTTP: `DELETE /nodes/{node_id}`; full-surface only): Delete a node and its descendants. Modes: `cascade` (delete full subtree), `detach_shared` (preserve descendants with surviving parents).
|
|
65
|
+
- `flywheel_bulk_delete_nodes` (mutating; scopes: `write`; HTTP: `POST /nodes/bulk-delete`; full-surface only): Delete multiple node subtrees in one operation.
|
|
56
66
|
|
|
57
67
|
### Artifacts
|
|
58
68
|
|
|
59
|
-
- `flywheel_prepare_artifact_uploads` (mutating; scopes: `write`; HTTP: `POST /
|
|
60
|
-
- `flywheel_finalize_artifact_uploads` (mutating; scopes: `write`; HTTP: `POST /
|
|
61
|
-
- `flywheel_list_artifacts` (read; scopes: `read`; HTTP: `
|
|
62
|
-
- `flywheel_get_artifact` (read; scopes: `read`; HTTP: `
|
|
63
|
-
- `flywheel_delete_artifact` (mutating; scopes: `write`; HTTP: `DELETE /
|
|
64
|
-
- `flywheel_set_artifact_note` (mutating; scopes: `write`; HTTP: `PATCH /
|
|
69
|
+
- `flywheel_prepare_artifact_uploads` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/artifacts/uploads/prepare`; core surface): Prepare one or more raw-file artifact uploads (returns batch token + signed upload URLs). Upload must send raw file bytes to the returned URLs (do not upload JSON metadata wrappers).
|
|
70
|
+
- `flywheel_finalize_artifact_uploads` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/artifacts/uploads/finalize`; core surface): Finalize a prepared artifact upload batch and append all staged artifacts to the node in one revision bump.
|
|
71
|
+
- `flywheel_list_artifacts` (read; scopes: `read`; HTTP: `tool-mediated`; core surface): List node artifacts.
|
|
72
|
+
- `flywheel_get_artifact` (read; scopes: `read`; HTTP: `tool-mediated`; core surface): Get one artifact by id.
|
|
73
|
+
- `flywheel_delete_artifact` (mutating; scopes: `write`; HTTP: `DELETE /nodes/{node_id}/artifacts/{artifact_id}`; core surface): Delete one artifact by id with optimistic locking.
|
|
74
|
+
- `flywheel_set_artifact_note` (mutating; scopes: `write`; HTTP: `PATCH /nodes/{node_id}/artifacts/{artifact_id}/note`; core surface): Set or clear one artifact note with optimistic locking.
|
|
65
75
|
|
|
66
76
|
### Executions
|
|
67
77
|
|
|
68
|
-
- `flywheel_launch_execution` (mutating; scopes: `write`; HTTP: `POST /
|
|
69
|
-
- `flywheel_list_executions` (read; scopes: `read`; HTTP: `GET /
|
|
70
|
-
- `flywheel_terminate_execution` (mutating; scopes: `write`; HTTP: `POST /
|
|
78
|
+
- `flywheel_launch_execution` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/executions`; core surface): Launch node execution.
|
|
79
|
+
- `flywheel_list_executions` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/executions`; core surface): List node executions.
|
|
80
|
+
- `flywheel_terminate_execution` (mutating; scopes: `write`; HTTP: `POST /nodes/{node_id}/executions/{execution_id}/terminate`; core surface): Terminate a node execution.
|
|
71
81
|
|
|
72
82
|
### Compute and budgets
|
|
73
83
|
|
|
74
|
-
- `flywheel_compute_list_options` (read; scopes: `compute`; HTTP: `GET /
|
|
75
|
-
- `flywheel_compute_funding` (read; scopes: `compute`; HTTP: `GET /
|
|
76
|
-
- `flywheel_compute_status` (read; scopes: `compute`; HTTP: `GET /
|
|
77
|
-
- `flywheel_compute_connection` (read; scopes: `compute`; HTTP: `GET /
|
|
78
|
-
- `flywheel_approval_session_heartbeat` (read; scopes: `compute`; HTTP: `POST /
|
|
79
|
-
- `flywheel_list_approval_sessions` (read; scopes: `compute`; HTTP: `GET /
|
|
80
|
-
- `flywheel_expire_approval_session` (mutating; scopes: `compute`; HTTP: `POST /
|
|
84
|
+
- `flywheel_compute_list_options` (read; scopes: `compute`; HTTP: `GET /compute/catalog`; core surface): List managed compute options allowed for a node. When using grant-backed compute, pass the same compute_grant_id you will use for acquire.
|
|
85
|
+
- `flywheel_compute_funding` (read; scopes: `compute`; HTTP: `GET /compute/funding`; core surface): Read grant-scoped funding context (`grant_cents`, `remaining_cents`, and backing budget fields) for a `compute_grant_id` before compute acquire.
|
|
86
|
+
- `flywheel_compute_status` (read; scopes: `compute`; HTTP: `GET /compute/status`; core surface): Read managed compute lease status for the current user and current lease_control_token scope. Lease rows include ownership flags so hosts can distinguish user-owned leases from sponsor-visible campaign leases. When checking a grant-backed lease, reuse the same compute_grant_id passed to acquire.
|
|
87
|
+
- `flywheel_compute_connection` (read; scopes: `compute`; HTTP: `GET /compute/connection`; core surface): Read SSH connection material for an active managed compute lease once flywheel_compute_status indicates the lease is usable. This tool is token-scoped to lease_control_token and only leases owned by the current user are connectable. Pass lease_id or node_id to disambiguate when needed.
|
|
88
|
+
- `flywheel_approval_session_heartbeat` (read; scopes: `compute`; HTTP: `POST /approval-sessions/heartbeat`; core surface): Create or refresh a compute-grant approval session for the current MCP host session.
|
|
89
|
+
- `flywheel_list_approval_sessions` (read; scopes: `compute`; HTTP: `GET /approval-sessions`; core surface): List approval sessions visible to the current user.
|
|
90
|
+
- `flywheel_expire_approval_session` (mutating; scopes: `compute`; HTTP: `POST /approval-sessions/expire`; core surface): Expire the current compute-grant approval session context without releasing active leases.
|
|
81
91
|
- `flywheel_request_compute_grant_approval` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Request budget approval context before managed compute acquisition; branch on response status.
|
|
82
|
-
- `flywheel_list_compute_grants` (read; scopes: `compute`; HTTP: `GET /
|
|
83
|
-
- `flywheel_list_campaign_budgets` (read; scopes: `compute`; HTTP: `GET /
|
|
84
|
-
- `flywheel_create_campaign_budget` (mutating; scopes: `compute`; HTTP: `POST /
|
|
85
|
-
- `flywheel_update_campaign_budget` (mutating; scopes: `compute`; HTTP: `PATCH /
|
|
86
|
-
- `flywheel_revoke_campaign_budget` (mutating; scopes: `compute`; HTTP: `DELETE /
|
|
87
|
-
- `flywheel_compute_acquire` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Acquire managed compute with explicit SKU + region and required compute_grant_id (returns accepted/completed lease state only; poll flywheel_compute_status for readiness, not SSH key material). This tool forwards approval_session_id
|
|
88
|
-
- `flywheel_compute_release` (mutating; scopes: `compute`; HTTP: `
|
|
89
|
-
- `flywheel_compute_release_all` (mutating; scopes: `compute`; HTTP: `
|
|
92
|
+
- `flywheel_list_compute_grants` (read; scopes: `compute`; HTTP: `GET /compute/grants`; core surface): List active/exhausted compute grants available to the current user.
|
|
93
|
+
- `flywheel_list_campaign_budgets` (read; scopes: `compute`; HTTP: `GET /nodes/{root_node_id}/campaign-budgets`; full-surface only): List campaign compute budgets for a campaign root. Organizer-only management view.
|
|
94
|
+
- `flywheel_create_campaign_budget` (mutating; scopes: `compute`; HTTP: `POST /nodes/{root_node_id}/campaign-budgets`; full-surface only): Create an organizer-funded campaign compute budget shared with participants.
|
|
95
|
+
- `flywheel_update_campaign_budget` (mutating; scopes: `compute`; HTTP: `PATCH /nodes/{root_node_id}/campaign-budgets/{compute_budget_id}`; full-surface only): Update hard caps or metadata for an organizer-funded campaign compute budget.
|
|
96
|
+
- `flywheel_revoke_campaign_budget` (mutating; scopes: `compute`; HTTP: `DELETE /nodes/{root_node_id}/campaign-budgets/{compute_budget_id}`; full-surface only): Revoke an organizer-funded campaign compute budget.
|
|
97
|
+
- `flywheel_compute_acquire` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Acquire managed compute for a node with explicit SKU + region and required compute_grant_id (returns accepted/completed lease state only; poll flywheel_compute_status for readiness, not SSH key material). This tool forwards approval_session_id.
|
|
98
|
+
- `flywheel_compute_release` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Asynchronously release one managed compute lease by lease_id within the current lease_control_token scope.
|
|
99
|
+
- `flywheel_compute_release_all` (mutating; scopes: `compute`; HTTP: `tool-mediated`; core surface): Asynchronously release active managed compute leases in the current lease_control_token scope; set force=true for explicit account-wide cleanup for the current user.
|
|
90
100
|
|
|
91
101
|
### Contract, audit, and export
|
|
92
102
|
|
|
93
103
|
- `flywheel_get_contract` (read; scopes: `read`; HTTP: `GET /mcp/contract`; core surface): Return Flywheel MCP contract overview (scopes, write safety, operation catalog, and section index).
|
|
94
104
|
- `flywheel_get_contract_section` (read; scopes: `read`; HTTP: `GET /mcp/contract/sections/{section_id}`; core surface): Return one contract section by section_id (for example `graph` or `campaign/template_v1`).
|
|
95
|
-
- `flywheel_export_subgraph` (read; scopes: `read`; HTTP: `POST /
|
|
96
|
-
- `flywheel_import_subgraph` (mutating; scopes: `write`; HTTP: `POST /
|
|
97
|
-
- `flywheel_summarize_node_tree` (read; scopes: `read`; HTTP: `GET /
|
|
98
|
-
- `flywheel_export_summary` (read; scopes: `read`; HTTP: `POST /
|
|
99
|
-
- `flywheel_export_summary_stream` (read; scopes: `read`; HTTP: `POST /
|
|
100
|
-
- `flywheel_export_summary_pdf` (read; scopes: `read`; HTTP: `POST /
|
|
101
|
-
- `flywheel_export_summary_render_pdf` (read; scopes: `read`; HTTP: `POST /
|
|
105
|
+
- `flywheel_export_subgraph` (read; scopes: `read`; HTTP: `POST /export`; full-surface only): Export selected graph/subgraph nodes as JSON.
|
|
106
|
+
- `flywheel_import_subgraph` (mutating; scopes: `write`; HTTP: `POST /import`; full-surface only): Import graph/subgraph JSON payload into new node IDs. Set normalize_cycles=true to drop cycle/self-loop edges; default rejects cyclic payloads.
|
|
107
|
+
- `flywheel_summarize_node_tree` (read; scopes: `read`; HTTP: `GET /nodes/{node_id}/summary`; full-surface only): Summarize a node tree using node fields only.
|
|
108
|
+
- `flywheel_export_summary` (read; scopes: `read`; HTTP: `POST /export-summary`; full-surface only): Generate markdown summary for selected nodes.
|
|
109
|
+
- `flywheel_export_summary_stream` (read; scopes: `read`; HTTP: `POST /export-summary-stream`; full-surface only): Generate summary stream events for selected nodes.
|
|
110
|
+
- `flywheel_export_summary_pdf` (read; scopes: `read`; HTTP: `POST /export-summary-pdf`; full-surface only): Generate PDF summary for selected nodes.
|
|
111
|
+
- `flywheel_export_summary_render_pdf` (read; scopes: `read`; HTTP: `POST /export-summary-render-pdf`; full-surface only): Render provided markdown to PDF and embed export metadata.
|
|
102
112
|
|
|
103
113
|
## Practical Tool Sequences
|
|
104
114
|
|
|
@@ -134,6 +144,8 @@ Flywheel is a graph-based system for tracking research work, decisions, and evid
|
|
|
134
144
|
- `flywheel_acquire_stage_lease`, `flywheel_heartbeat_stage_lease`, `flywheel_release_stage_lease`: coordinate session-scoped local staged edits for an existing node before commit.
|
|
135
145
|
- `flywheel_get_campaign_snapshot`: read the current derived campaign state for this node's root campaign instead of inferring standings from freeform text.
|
|
136
146
|
- `flywheel_get_node_sharing`: after sharing writes, verify with flywheel_get_node_sharing before reporting private/shared/public state.
|
|
147
|
+
- `flywheel_set_node_tag_assignments`: pass `tag_ids` as a JSON array of strings; omitting `tag_ids` clears all assignments (`[]`).
|
|
148
|
+
- `flywheel_list_nodes`: canonical filter inputs for `owners`, `writers`, and `visibility` are arrays; scalar `owners`/`writers` may be normalized by transport compatibility layers, but array form is preferred.
|
|
137
149
|
- `flywheel_compute_status`: check first when work may need managed compute (GPU), using the active lease_control_token from host context (or pass it explicitly).
|
|
138
150
|
- `flywheel_list_compute_grants`: list active compute grants (funded by user/root budgets) and select one `compute_grant_id` for acquisition.
|
|
139
151
|
- `flywheel_request_compute_grant_approval`: request/confirm budget before acquire and choose a budget source (`user` or `root`); branch on status (`already_approved`, `approval_required`, `insufficient_credits`).
|
|
@@ -13,6 +13,14 @@ Use it when converting theorem-heavy source material into Lean modules, iteratin
|
|
|
13
13
|
|
|
14
14
|
## Prerequisite (Required)
|
|
15
15
|
|
|
16
|
+
As the very first thing, you MUST use the plan tool to create a task list with checkmarks for all the workflow steps that follow.
|
|
17
|
+
|
|
18
|
+
- If you are a codex model, use `update_plan`.
|
|
19
|
+
- If you are a claude model, use `TaskCreate`.
|
|
20
|
+
- If you are another model/harness, use an equivalent.
|
|
21
|
+
|
|
22
|
+
Include the following pre-requisite in the checkmark list.
|
|
23
|
+
|
|
16
24
|
Before running the pipeline, ensure both `uv` and the Lean toolchain manager `elan` are installed on the local machine.
|
|
17
25
|
|
|
18
26
|
- If `uv` is missing, bootstrap it by OS:
|