graphcore-studio 0.2.0__tar.gz → 0.2.3__tar.gz
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.
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/.github/workflows/ci.yml +1 -1
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/.github/workflows/wheels.yml +1 -1
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/CMakeLists.txt +1 -1
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/PKG-INFO +26 -15
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/README.md +18 -12
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/docs/ARCHITECTURE.md +2 -2
- graphcore_studio-0.2.3/docs/DATA_WORKSPACE.md +132 -0
- graphcore_studio-0.2.3/docs/HOURLY_DEVELOPMENT_LOG.md +66 -0
- graphcore_studio-0.2.3/docs/HOURLY_DEVELOPMENT_PLAN.md +39 -0
- graphcore_studio-0.2.3/docs/PRODUCT_FUNCTIONALITY_CATALOG.md +387 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/docs/SEMANTICS.md +2 -2
- graphcore_studio-0.2.3/docs/VALIDATION.md +72 -0
- graphcore_studio-0.2.3/examples/multi_model_stress_test.json +782 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/pyproject.toml +13 -4
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/python/graphcore/__init__.py +1 -1
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/requirements-models.txt +1 -1
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/engine.py +78 -11
- graphcore_studio-0.2.3/studio/knowledge.py +138 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/server.py +77 -8
- graphcore_studio-0.2.3/studio/tables.py +296 -0
- graphcore_studio-0.2.3/studio/web/app.js +138 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/web/index.html +2 -2
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/web/style.css +35 -0
- graphcore_studio-0.2.3/studio/workbooks.py +115 -0
- graphcore_studio-0.2.3/tests/test_knowledge.py +75 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/tests/test_studio.py +29 -1
- graphcore_studio-0.2.3/tests/test_studio_http.py +237 -0
- graphcore_studio-0.2.3/tests/test_tables.py +201 -0
- graphcore_studio-0.2.3/tests/test_workbooks.py +78 -0
- graphcore_studio-0.2.0/docs/VALIDATION.md +0 -16
- graphcore_studio-0.2.0/studio/web/app.js +0 -108
- graphcore_studio-0.2.0/tests/test_studio_http.py +0 -104
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/.gitignore +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/LICENSE +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/cmake/GraphCoreConfig.cmake.in +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/docs/PYPI_RELEASE.md +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/docs/ROADMAP.md +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/examples/approval.cpp +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/examples/complex_deepseek_workflow.json +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/examples/langgraph_deepseek_workflow_notebook.py +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/examples/python_agent.py +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/include/graphcore/c_api.h +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/include/graphcore/graphcore.hpp +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/requirements-pydantic.txt +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/run_studio.py +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/scripts/build.sh +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/src/c_api.cpp +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/src/graphcore.cpp +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/__init__.py +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/cli.py +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/example_plugin.py +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/templates/01-research.json +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/templates/02-structured.json +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/templates/03-tools.json +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/templates/04-team.json +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/studio/templates/05-model.json +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/tests/core_tests.cpp +0 -0
- {graphcore_studio-0.2.0 → graphcore_studio-0.2.3}/tests/test_python.py +0 -0
|
@@ -30,7 +30,7 @@ jobs:
|
|
|
30
30
|
- name: Build wheels for supported CPython versions
|
|
31
31
|
run: python -m pip install cibuildwheel && python -m cibuildwheel --output-dir wheelhouse
|
|
32
32
|
env:
|
|
33
|
-
CIBW_BUILD: 'cp39-* cp310-* cp311-* cp312-* cp313-*'
|
|
33
|
+
CIBW_BUILD: 'cp39-* cp310-* cp311-* cp312-* cp313-* cp314-*'
|
|
34
34
|
CIBW_SKIP: '*-musllinux_*'
|
|
35
35
|
CIBW_TEST_COMMAND: >-
|
|
36
36
|
python -c "from graphcore import END, Graph; g=Graph(); g.add_node('probe', lambda s,c: {'ok': True}); g.set_entry('probe').add_edge('probe', END); assert g.invoke().state['ok']; g.close()"
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
cmake_minimum_required(VERSION 3.16)
|
|
2
|
-
project(GraphCore VERSION 0.2.
|
|
2
|
+
project(GraphCore VERSION 0.2.2 LANGUAGES CXX)
|
|
3
3
|
option(GRAPHCORE_BUILD_TESTS "Build tests" ON)
|
|
4
4
|
option(GRAPHCORE_BUILD_EXAMPLES "Build examples" ON)
|
|
5
5
|
option(GRAPHCORE_BUILD_PYTHON "Build C ABI shared library for Python" ON)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: graphcore-studio
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: A local-first visual agent workflow studio powered by a native C++ graph runtime
|
|
5
5
|
Keywords: agents,agentic-workflows,graph,C++,visual-workflow-builder
|
|
6
6
|
License-Expression: MIT
|
|
@@ -15,11 +15,16 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
19
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
20
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
|
-
Requires-Python: >=3.9
|
|
21
|
+
Requires-Python: >=3.9.2
|
|
22
|
+
Requires-Dist: openrouter<1,>=0.10.8
|
|
23
|
+
Requires-Dist: pydantic<3,>=2
|
|
24
|
+
Requires-Dist: openpyxl<4,>=3.1.5
|
|
25
|
+
Requires-Dist: defusedxml<1,>=0.7.1
|
|
21
26
|
Provides-Extra: models
|
|
22
|
-
Requires-Dist: openrouter<1,>=0.10; extra == "models"
|
|
27
|
+
Requires-Dist: openrouter<1,>=0.10.8; extra == "models"
|
|
23
28
|
Provides-Extra: pydantic
|
|
24
29
|
Requires-Dist: pydantic<3,>=2; extra == "pydantic"
|
|
25
30
|
Description-Content-Type: text/markdown
|
|
@@ -32,7 +37,7 @@ GraphCore Studio is an interactive, local-first visual agent framework. Drag nod
|
|
|
32
37
|
|
|
33
38
|
## Start Studio
|
|
34
39
|
|
|
35
|
-
Requirements: Python 3.9+ and a C++17 compiler. You do not need CMake, Node.js, Docker, API keys, an internet connection, or a model to try the included workflows.
|
|
40
|
+
Requirements: Python 3.9.2+ and a C++17 compiler. You do not need CMake, Node.js, Docker, API keys, an internet connection, or a model to try the included workflows.
|
|
36
41
|
|
|
37
42
|
From the project folder, run one command:
|
|
38
43
|
|
|
@@ -48,25 +53,25 @@ py run_studio.py
|
|
|
48
53
|
|
|
49
54
|
If Python was installed through the Windows Store and `py` is unavailable, run `python run_studio.py` from the Visual Studio Developer Terminal.
|
|
50
55
|
|
|
51
|
-
Stop the server with Ctrl+C. Workflows and run history live in `studio/data/`; drafts are saved in this browser. Run `python3 run_studio.py --help` to configure
|
|
56
|
+
Stop the server with Ctrl+C. Workflows and run history live in `studio/data/`; drafts are saved in this browser. Studio starts on port 8787 when available and automatically chooses a free local port if it is occupied. The actual URL is printed in the terminal. Run `python3 run_studio.py --help` to configure a specific port, data directory, or Python tool plugins.
|
|
52
57
|
|
|
53
58
|
### Install the PyPI package
|
|
54
59
|
|
|
55
|
-
|
|
60
|
+
Install the prebuilt package and its OpenRouter/Pydantic runtime dependencies with:
|
|
56
61
|
|
|
57
62
|
```bash
|
|
58
|
-
python -m pip install
|
|
63
|
+
python -m pip install graphcore-studio
|
|
59
64
|
graphcore-studio
|
|
60
65
|
```
|
|
61
66
|
|
|
62
|
-
The wheel bundles the C++ runtime and Studio UI. Source installs build the native runtime and therefore require a C++17 compiler and CMake. The distribution is named `graphcore-studio`; its Python API imports as `graphcore`.
|
|
67
|
+
The wheel bundles the C++ runtime and Studio UI. Source installs build the native runtime and therefore require a C++17 compiler and CMake. The distribution is named `graphcore-studio`; its Python API imports as `graphcore`. Windows, macOS, and Linux wheels are provided for supported architectures.
|
|
63
68
|
|
|
64
69
|
### Use Pydantic
|
|
65
70
|
|
|
66
|
-
The built-in structured-output validator works offline
|
|
71
|
+
The built-in structured-output validator works offline. Pydantic v2 is installed by the standard PyPI command above and can be selected as the validation engine. When running directly from a source checkout, install the runtime dependencies with:
|
|
67
72
|
|
|
68
73
|
```bash
|
|
69
|
-
python3 -m pip install -r requirements-pydantic.txt
|
|
74
|
+
python3 -m pip install -r requirements-models.txt -r requirements-pydantic.txt
|
|
70
75
|
python3 run_studio.py
|
|
71
76
|
```
|
|
72
77
|
|
|
@@ -74,18 +79,16 @@ On Windows, replace `python3` with `py -3`. Restart Studio after installing pack
|
|
|
74
79
|
|
|
75
80
|
### Use OpenRouter models
|
|
76
81
|
|
|
77
|
-
The **Chat Model** and **Agent** nodes use GraphCore's model adapter with the official OpenRouter Python SDK. C++ owns graph scheduling, state commits, conditions, and checkpoints; the Python wrapper calls the SDK. The OpenRouter request runs through the project-owned adapter rather than a chain framework.
|
|
82
|
+
The **Chat Model** and **Agent** nodes use GraphCore's model adapter with the official OpenRouter Python SDK, installed automatically by the standard PyPI command. C++ owns graph scheduling, state commits, conditions, and checkpoints; the Python wrapper calls the SDK. The OpenRouter request runs through the project-owned adapter rather than a chain framework.
|
|
78
83
|
|
|
79
|
-
|
|
84
|
+
When running directly from a source checkout, install the runtime dependencies into the Python environment used to run Studio:
|
|
80
85
|
|
|
81
86
|
```bash
|
|
82
87
|
python3 -m pip install -r requirements-models.txt
|
|
83
88
|
python3 run_studio.py
|
|
84
89
|
```
|
|
85
90
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
In Studio, open **Model integrations**, add `OPENROUTER_API_KEY`, and save. Select **OpenRouter** on a Chat Model node and enter a model ID from the [OpenRouter model catalog](https://openrouter.ai/models). Compose system/user/assistant messages and use **Insert variable** to reference workflow inputs and prior node outputs. Studio loads the local `.env` file automatically; secret values are not included in workflow files. The offline fixture needs no SDK, key, or network call.
|
|
91
|
+
In Studio, open **Model integrations**, add `OPENROUTER_API_KEY`, and save. Add as many named models as you need, such as `model1 → deepseek/deepseek-v4-pro-0813` and `model2 → openai/gpt-4o-mini`, using IDs from the [OpenRouter model catalog](https://openrouter.ai/models). Choose a saved model on each Chat Model or Agent node. In workflow JSON, set `"model": "$model1"` or `"model": "$model2"` to select the model for that node. Literal model IDs still work. Compose system/user/assistant messages and use **Insert variable** to reference workflow inputs and prior node outputs. Studio loads the local `.env` file automatically; secret values are not included in workflow files. Named model IDs are stored in the local Studio data directory. The offline fixture needs no SDK, key, or network call.
|
|
89
92
|
|
|
90
93
|
## Build a workflow
|
|
91
94
|
|
|
@@ -98,6 +101,10 @@ In Studio, open **Model integrations**, add `OPENROUTER_API_KEY`, and save. Sele
|
|
|
98
101
|
|
|
99
102
|
The starter templates cover research and review, structured output, Python tools, a supervisor delegating work to specialist agents, and a chat-model playground. The canvas also supports node search, keyboard undo/redo, zoom, pan, layout changes, validation, and run history.
|
|
100
103
|
|
|
104
|
+
## Add document retrieval
|
|
105
|
+
|
|
106
|
+
Open **Knowledge library** in the left sidebar and add `.txt`, `.md`, `.csv`, or `.json` files. The files stay in the local Studio data folder (up to 100 documents, 1 MiB per document, 10 MiB total). Add a **Document retrieval** node after Input, set its query field (for example `input`) and result count, then connect it to a Chat Model. Reference `{{context.results}}` in the model prompt, replacing `context` with the retrieval node's output key. Returned passages include source filenames and chunk numbers. Retrieval uses local BM25 keyword matching; it does not call an embedding service, and PDF extraction is not included yet.
|
|
107
|
+
|
|
101
108
|
Prompt templates reference state with `{{input}}`, `{{research}}`, or nested fields such as `{{record.summary}}`. Structured Output defines required fields and types. Python plugins extend the node's registered-tool list without placing executable source code in the workflow document.
|
|
102
109
|
|
|
103
110
|
## Register a Python library or tool
|
|
@@ -169,3 +176,7 @@ Parallel fan-out and joins, database-backed persistence, distributed worker coor
|
|
|
169
176
|
- [Local verification record](docs/VALIDATION.md)
|
|
170
177
|
- [PyPI release checklist](docs/PYPI_RELEASE.md)
|
|
171
178
|
- [Example plugin](studio/example_plugin.py)
|
|
179
|
+
|
|
180
|
+
### Local table data workflows
|
|
181
|
+
|
|
182
|
+
The development checkout now includes **Data workspace**: import typed CSV and XLSX files, preview local tables, and build an offline summary workflow with exact decimal calculations. Workflow state carries immutable table references rather than full datasets. See [the data workspace guide](docs/DATA_WORKSPACE.md) for usage, limits and the next delivery steps. Available in version 0.2.3.
|
|
@@ -6,7 +6,7 @@ GraphCore Studio is an interactive, local-first visual agent framework. Drag nod
|
|
|
6
6
|
|
|
7
7
|
## Start Studio
|
|
8
8
|
|
|
9
|
-
Requirements: Python 3.9+ and a C++17 compiler. You do not need CMake, Node.js, Docker, API keys, an internet connection, or a model to try the included workflows.
|
|
9
|
+
Requirements: Python 3.9.2+ and a C++17 compiler. You do not need CMake, Node.js, Docker, API keys, an internet connection, or a model to try the included workflows.
|
|
10
10
|
|
|
11
11
|
From the project folder, run one command:
|
|
12
12
|
|
|
@@ -22,25 +22,25 @@ py run_studio.py
|
|
|
22
22
|
|
|
23
23
|
If Python was installed through the Windows Store and `py` is unavailable, run `python run_studio.py` from the Visual Studio Developer Terminal.
|
|
24
24
|
|
|
25
|
-
Stop the server with Ctrl+C. Workflows and run history live in `studio/data/`; drafts are saved in this browser. Run `python3 run_studio.py --help` to configure
|
|
25
|
+
Stop the server with Ctrl+C. Workflows and run history live in `studio/data/`; drafts are saved in this browser. Studio starts on port 8787 when available and automatically chooses a free local port if it is occupied. The actual URL is printed in the terminal. Run `python3 run_studio.py --help` to configure a specific port, data directory, or Python tool plugins.
|
|
26
26
|
|
|
27
27
|
### Install the PyPI package
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
Install the prebuilt package and its OpenRouter/Pydantic runtime dependencies with:
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
|
-
python -m pip install
|
|
32
|
+
python -m pip install graphcore-studio
|
|
33
33
|
graphcore-studio
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
The wheel bundles the C++ runtime and Studio UI. Source installs build the native runtime and therefore require a C++17 compiler and CMake. The distribution is named `graphcore-studio`; its Python API imports as `graphcore`.
|
|
36
|
+
The wheel bundles the C++ runtime and Studio UI. Source installs build the native runtime and therefore require a C++17 compiler and CMake. The distribution is named `graphcore-studio`; its Python API imports as `graphcore`. Windows, macOS, and Linux wheels are provided for supported architectures.
|
|
37
37
|
|
|
38
38
|
### Use Pydantic
|
|
39
39
|
|
|
40
|
-
The built-in structured-output validator works offline
|
|
40
|
+
The built-in structured-output validator works offline. Pydantic v2 is installed by the standard PyPI command above and can be selected as the validation engine. When running directly from a source checkout, install the runtime dependencies with:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
python3 -m pip install -r requirements-pydantic.txt
|
|
43
|
+
python3 -m pip install -r requirements-models.txt -r requirements-pydantic.txt
|
|
44
44
|
python3 run_studio.py
|
|
45
45
|
```
|
|
46
46
|
|
|
@@ -48,18 +48,16 @@ On Windows, replace `python3` with `py -3`. Restart Studio after installing pack
|
|
|
48
48
|
|
|
49
49
|
### Use OpenRouter models
|
|
50
50
|
|
|
51
|
-
The **Chat Model** and **Agent** nodes use GraphCore's model adapter with the official OpenRouter Python SDK. C++ owns graph scheduling, state commits, conditions, and checkpoints; the Python wrapper calls the SDK. The OpenRouter request runs through the project-owned adapter rather than a chain framework.
|
|
51
|
+
The **Chat Model** and **Agent** nodes use GraphCore's model adapter with the official OpenRouter Python SDK, installed automatically by the standard PyPI command. C++ owns graph scheduling, state commits, conditions, and checkpoints; the Python wrapper calls the SDK. The OpenRouter request runs through the project-owned adapter rather than a chain framework.
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
When running directly from a source checkout, install the runtime dependencies into the Python environment used to run Studio:
|
|
54
54
|
|
|
55
55
|
```bash
|
|
56
56
|
python3 -m pip install -r requirements-models.txt
|
|
57
57
|
python3 run_studio.py
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
In Studio, open **Model integrations**, add `OPENROUTER_API_KEY`, and save. Select **OpenRouter** on a Chat Model node and enter a model ID from the [OpenRouter model catalog](https://openrouter.ai/models). Compose system/user/assistant messages and use **Insert variable** to reference workflow inputs and prior node outputs. Studio loads the local `.env` file automatically; secret values are not included in workflow files. The offline fixture needs no SDK, key, or network call.
|
|
60
|
+
In Studio, open **Model integrations**, add `OPENROUTER_API_KEY`, and save. Add as many named models as you need, such as `model1 → deepseek/deepseek-v4-pro-0813` and `model2 → openai/gpt-4o-mini`, using IDs from the [OpenRouter model catalog](https://openrouter.ai/models). Choose a saved model on each Chat Model or Agent node. In workflow JSON, set `"model": "$model1"` or `"model": "$model2"` to select the model for that node. Literal model IDs still work. Compose system/user/assistant messages and use **Insert variable** to reference workflow inputs and prior node outputs. Studio loads the local `.env` file automatically; secret values are not included in workflow files. Named model IDs are stored in the local Studio data directory. The offline fixture needs no SDK, key, or network call.
|
|
63
61
|
|
|
64
62
|
## Build a workflow
|
|
65
63
|
|
|
@@ -72,6 +70,10 @@ In Studio, open **Model integrations**, add `OPENROUTER_API_KEY`, and save. Sele
|
|
|
72
70
|
|
|
73
71
|
The starter templates cover research and review, structured output, Python tools, a supervisor delegating work to specialist agents, and a chat-model playground. The canvas also supports node search, keyboard undo/redo, zoom, pan, layout changes, validation, and run history.
|
|
74
72
|
|
|
73
|
+
## Add document retrieval
|
|
74
|
+
|
|
75
|
+
Open **Knowledge library** in the left sidebar and add `.txt`, `.md`, `.csv`, or `.json` files. The files stay in the local Studio data folder (up to 100 documents, 1 MiB per document, 10 MiB total). Add a **Document retrieval** node after Input, set its query field (for example `input`) and result count, then connect it to a Chat Model. Reference `{{context.results}}` in the model prompt, replacing `context` with the retrieval node's output key. Returned passages include source filenames and chunk numbers. Retrieval uses local BM25 keyword matching; it does not call an embedding service, and PDF extraction is not included yet.
|
|
76
|
+
|
|
75
77
|
Prompt templates reference state with `{{input}}`, `{{research}}`, or nested fields such as `{{record.summary}}`. Structured Output defines required fields and types. Python plugins extend the node's registered-tool list without placing executable source code in the workflow document.
|
|
76
78
|
|
|
77
79
|
## Register a Python library or tool
|
|
@@ -143,3 +145,7 @@ Parallel fan-out and joins, database-backed persistence, distributed worker coor
|
|
|
143
145
|
- [Local verification record](docs/VALIDATION.md)
|
|
144
146
|
- [PyPI release checklist](docs/PYPI_RELEASE.md)
|
|
145
147
|
- [Example plugin](studio/example_plugin.py)
|
|
148
|
+
|
|
149
|
+
### Local table data workflows
|
|
150
|
+
|
|
151
|
+
The development checkout now includes **Data workspace**: import typed CSV and XLSX files, preview local tables, and build an offline summary workflow with exact decimal calculations. Workflow state carries immutable table references rather than full datasets. See [the data workspace guide](docs/DATA_WORKSPACE.md) for usage, limits and the next delivery steps. Available in version 0.2.3.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
Browser visual canvas (plain HTML/CSS/JS)
|
|
5
5
|
│ local JSON API with per-launch token
|
|
6
6
|
Python standard-library HTTP server and run manager
|
|
7
|
-
├── registered Python /
|
|
7
|
+
├── registered Python / Pydantic nodes
|
|
8
8
|
├── official OpenRouter Python SDK adapter
|
|
9
9
|
└── ctypes C ABI bridge
|
|
10
10
|
│
|
|
@@ -25,7 +25,7 @@ C++17 GraphCore runtime
|
|
|
25
25
|
- `python/graphcore/`: Python SDK and asyncio callback bridge.
|
|
26
26
|
- `run_studio.py`: one-command native compilation and local startup.
|
|
27
27
|
|
|
28
|
-
No Node.js, frontend bundler, database, C++ package manager or Python web framework is required. The OpenRouter Python SDK
|
|
28
|
+
No Node.js, frontend bundler, database, C++ package manager or Python web framework is required. The standard PyPI install includes the OpenRouter Python SDK and Pydantic so model and validation nodes are ready to use. Live model calls still require an OpenRouter API key; the offline fixture needs no key or network call. The canvas is served as local files and does not send workflow data to a remote service.
|
|
29
29
|
|
|
30
30
|
## Extending nodes
|
|
31
31
|
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Local data workspace: first implementation
|
|
2
|
+
|
|
3
|
+
This increment implements the CSV portion of DATA-01/XLS-01 and the first guided data workflow. It is local development work and is not yet published to PyPI.
|
|
4
|
+
|
|
5
|
+
## Use it
|
|
6
|
+
|
|
7
|
+
1. Start Studio from the updated checkout and open the HTTP URL it prints.
|
|
8
|
+
2. Open **Data workspace** in the sidebar.
|
|
9
|
+
3. Click **Choose CSV** and select a UTF-8 comma-separated file with a header row.
|
|
10
|
+
4. Review the sample values and select a type for each column: Text, Whole number, Decimal (exact), or True / false. Columns start as Text. Click **Import table**, then choose **Preview / use**. Import errors identify the row and column; correct the type and retry without reselecting the file.
|
|
11
|
+
5. Click **Build summary workflow** to create Input → Data summary → Output. This replaces the canvas through its existing replacement flow. The first numeric column is selected; change it in the node inspector if needed.
|
|
12
|
+
6. Click **Run workflow**. No API key or model is needed. The result contains count, null count, exact decimal sum, minimum, maximum, and source metadata.
|
|
13
|
+
|
|
14
|
+
Alternatively use **Use as workflow input “table”** in an existing workflow, add a Data summary node, set its input field to `table`, set the numeric column name, and connect its next output. Refer to `{{summary.sum}}` or `{{summary}}` from a later model or output node, using your configured output field name.
|
|
15
|
+
|
|
16
|
+
Example file:
|
|
17
|
+
|
|
18
|
+
```csv
|
|
19
|
+
customer,amount,quantity,active
|
|
20
|
+
Acme,0.10,2,true
|
|
21
|
+
Beta,0.20,3,false
|
|
22
|
+
Gamma,,1,true
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
With `amount` selected as Decimal (exact), `amount` produces sum `0.30`, count 2 and null count 1. Decimal values are JSON strings to avoid binary floating-point rounding; the numeric schema identifies their meaning.
|
|
26
|
+
|
|
27
|
+
## Data contract and implementation
|
|
28
|
+
|
|
29
|
+
`studio/tables.py` owns the immutable local artifact store. CSV imports parse into bounded typed records and persist under `<Studio data directory>/tables/<sha256>.json`. The artifact ID hashes the complete stored content. Reads verify that content still matches its ID. Re-importing identical content and filename reuses the artifact. Importing different content creates a different ID, preserving existing workflow references.
|
|
30
|
+
|
|
31
|
+
Workflow state contains a `table_ref` with ID, filename, row count, column schema and original UTF-8 source hash. Full rows stay in the artifact file. Previews return at most 20 rows. Summary results carry the resolved source metadata. C++ schedules graph transitions; Python parses CSV and computes with `Decimal` at sufficient precision for the accepted bounds.
|
|
32
|
+
|
|
33
|
+
Inputs accept string, integer, decimal and boolean declarations. Empty cells become null. Booleans accept `true`/`false` without regard to case. Headers must be unique and nonempty. Incorrect row widths, incompatible values, unknown declared columns and nonfinite decimals fail with actionable errors. Import supports a UTF-8 BOM. It does not infer dates, currencies or locale-specific separators.
|
|
34
|
+
|
|
35
|
+
Limits: 2 MiB per source, 20,000 rows, 100 columns, 100 artifacts per workspace. Integers accept at most 100 digits; decimal inputs accept at most 100 characters with adjusted exponent within ±100 and stored exponent within ±200. Summation precision adapts to the accepted values. Artifacts intentionally have no delete operation in this increment, so existing checkpoint references remain valid. These are bounded local files rather than a database for large-scale analytics.
|
|
36
|
+
|
|
37
|
+
HTTP APIs use the existing local Host checks and write token:
|
|
38
|
+
|
|
39
|
+
- `POST /api/tables/inspect`: `{name, text}` → headers, up to five sample rows and row count; validates without persisting an artifact.
|
|
40
|
+
- `POST /api/tables`: `{name, text, types}` → `{table: table_ref}`.
|
|
41
|
+
- `GET /api/tables`: `{tables: [table_ref, ...]}`.
|
|
42
|
+
- `GET /api/tables/<id>`: metadata plus bounded `rows` and `truncated`.
|
|
43
|
+
|
|
44
|
+
## Validation and remaining delivery work
|
|
45
|
+
|
|
46
|
+
Automated coverage checks exact decimal results, nulls, invalid headers/types/rows, path rejection, tamper detection, deduplicated imports, preview caps, native node execution and actual HTTP import → run → result. JavaScript syntax is checked. Browser import → preview → generated workflow → run was verified locally on October 3. Cross-platform release builds are still required before publication.
|
|
47
|
+
|
|
48
|
+
Next increments:
|
|
49
|
+
|
|
50
|
+
1. XLSX sheet selection and new-workbook export, formula-cache warnings.
|
|
51
|
+
2. Deterministic filter, grouping, joins and reconciliation with explicit key and duplicate policies.
|
|
52
|
+
3. Versioned connector contract and a read-only parameterized SQL Server connector with bounded queries.
|
|
53
|
+
4. SQLite run/step/artifact metadata and immutable per-run configuration snapshots.
|
|
54
|
+
5. Bounded model/tool agent execution, budgets and meaningful usage/timing telemetry.
|
|
55
|
+
6. External action preparation, exact-payload approvals, durable action ledger and recovery tests before Outlook send.
|
|
56
|
+
|
|
57
|
+
This first increment does not implement the full enterprise specification, external connectors, workbook editing, team identity or remote deployment.
|
|
58
|
+
|
|
59
|
+
## Filter a table before calculating
|
|
60
|
+
|
|
61
|
+
Add a **Table filter** node between Input and Data summary. Choose the table reference field (`table`), an exact column name (`amount`), a comparison (`At least`), and a value (`0.2`). Set its output field to `filtered`; configure Data summary to read `filtered`. For values 0.1, 0.2 and 0.3 this produces an exact sum of `0.5`.
|
|
62
|
+
|
|
63
|
+
Supported comparisons: equals / does not equal for all types, greater / at least / less / at most for numeric columns, contains for text, and explicit Is null / Is not null. Text comparisons are case-sensitive. Enter comparison values as text; conversion follows the declared column type. Decimal comparisons are exact. Empty comparison values are rejected; use a null operator for empty CSV cells. Null cells never match ordinary comparisons, including Does not equal.
|
|
64
|
+
|
|
65
|
+
Filtering writes a new immutable artifact with the original column schema and row order, leaving the source unchanged. Its reference includes provenance (parent artifact ID, operation, column, operator, comparison value, source row count and matched count). Identical operations on the same artifact reuse the same ID. Zero matches return an empty table with its schema; a later summary reports sum `0`, count 0 and null min/max. The existing 100-artifact workspace cap also applies to derived tables. Chain filter nodes for multiple required predicates; OR groups and expressions are not implemented in this increment.
|
|
66
|
+
|
|
67
|
+
JSON node configuration:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{"id":"filter","type":"data_filter","config":{"input_field":"table","column":"amount","operator":"gte","value":"0.2","output_key":"filtered"}}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Operator IDs are `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `contains`, `is_null`, `not_null`. Null operators do not require `value`.
|
|
74
|
+
|
|
75
|
+
## Grouped aggregation
|
|
76
|
+
|
|
77
|
+
Add **Grouped summary** after Input or Table filter. Set the table reference field, group column, numeric column, null-key policy and maximum groups (default 100, maximum 500). The output is another immutable `table_ref`, not a list of records in workflow state. Preview it in Data workspace, filter it, or pass it to Data summary using numeric column `sum` to calculate the grand total.
|
|
78
|
+
|
|
79
|
+
Each group produces:
|
|
80
|
+
|
|
81
|
+
| Column | Meaning |
|
|
82
|
+
|---|---|
|
|
83
|
+
| `group_key` | First encountered representation of the source key, retaining its declared type |
|
|
84
|
+
| `row_count` | All rows in the group |
|
|
85
|
+
| `count` | Non-null numeric values |
|
|
86
|
+
| `null_count` | Null numeric values |
|
|
87
|
+
| `sum` | Exact decimal total as a string |
|
|
88
|
+
| `min`, `max` | Exact decimal values, or null when no numeric values exist |
|
|
89
|
+
|
|
90
|
+
Groups retain their first-seen order. Text keys are case-sensitive. Decimal keys group by numeric equality, so 0.10 and 0.1 belong together. Include null keys as a separate group or exclude those rows; provenance records the excluded count. All-null numeric groups have sum `0` and null min/max. Empty input produces an empty grouped table with the complete schema. If the configured group limit is exceeded, execution fails without persisting a partial grouped result.
|
|
91
|
+
|
|
92
|
+
Example: team A has 0.1 and 0.2, team B has 0.4. Grouping produces sums `0.3` and `0.4`; summarizing the grouped `sum` column returns `0.7`. Only one group column and one numeric column are supported in this increment; multi-key grouping, averages and custom aggregate expressions remain future work.
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{"id":"group","type":"data_group","config":{"input_field":"table","group_column":"team","column":"amount","null_keys":"include","max_groups":100,"output_key":"grouped"}}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Reconcile two tables
|
|
99
|
+
|
|
100
|
+
Import both CSVs with explicit column types. For each source, open **Preview / use**, set **Workflow input name** to `left` or `right`, and click **Use as workflow input**. Named references let you keep multiple tables in one workflow. Reusing an input name replaces that reference.
|
|
101
|
+
|
|
102
|
+
Add a **Table reconciliation** node. Map the two state fields, key columns and value columns explicitly (column names may differ). Connect to Output and render `{{comparison.summary}}`, using the configured output field name. The result contains `table` (an immutable reference) and `summary` (bounded status counts); full comparison rows remain in the artifact store. A Table filter can read `comparison.table`, filter `status` equals `changed`, and pass the result to a review/model node later.
|
|
103
|
+
|
|
104
|
+
| Output column | Meaning |
|
|
105
|
+
|---|---|
|
|
106
|
+
| `key` | Compared key; numeric keys use an exact decimal representation |
|
|
107
|
+
| `left_value`, `right_value` | Mapped values, with numeric values represented as exact decimal strings |
|
|
108
|
+
| `left_present`, `right_present` | Whether a source row exists, independently of null values |
|
|
109
|
+
| `status` | `matched`, `changed`, `left_only`, or `right_only` |
|
|
110
|
+
| `delta` | Exact left minus right for two non-null numeric values; otherwise null |
|
|
111
|
+
|
|
112
|
+
Rows follow left-key first appearance, then right-only key first appearance. Text equality is case-sensitive; numeric columns compare by exact value. Mapped types must match or both be numeric (integer/decimal). Both-null mapped values count as matched; one-null versus non-null is changed. Missing rows remain distinct from present rows containing null.
|
|
113
|
+
|
|
114
|
+
Duplicate policy defaults to **Fail on duplicates**. Explicit alternatives select the first or last source row for each key; summary/provenance records duplicate counts. Null keys default to failure, with explicit exclusion available and excluded-row counts recorded. The maximum result size defaults to 10,000 rows and can be set up to 20,000. Limit, duplicate, type and null-key failures do not persist a partial reconciliation artifact. Provenance records both parent IDs and mappings. Repeating the same operation reuses its artifact.
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{"id":"compare","type":"data_reconcile","config":{"left_field":"left","right_field":"right","left_key":"id","right_key":"code","left_column":"amount","right_column":"total","duplicates":"reject","null_keys":"reject","max_rows":10000,"output_key":"comparison"}}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
This increment supports a single key and single compared value per side. Composite keys, multi-column comparisons, tolerances, fuzzy matching and writing changes back to either source are not implemented.
|
|
121
|
+
|
|
122
|
+
## Import an XLSX worksheet
|
|
123
|
+
|
|
124
|
+
In **Data workspace**, choose **Choose CSV / XLSX**, select a `.xlsx` file, choose a visible worksheet and its header row (1–100), then review columns. Assign text, integer, decimal or boolean types before importing. Imported tables can use the same summary, filter, grouped summary and reconciliation nodes as CSV tables.
|
|
125
|
+
|
|
126
|
+
Formula cells use workbook caches; GraphCore does not calculate formulas. Acknowledge the cache warning before importing. Missing cached results block import: recalculate and save in Excel, then choose the file again. Cache freshness cannot be verified. Dates become ISO text; cell display formatting is omitted and numeric values retain the workbook's stored precision. The original workbook remains unchanged.
|
|
127
|
+
|
|
128
|
+
Imports allow 2 MiB files, 100 columns and 20,000 data rows; ZIP expansion is bounded to 16 MiB total and 8 MiB per entry, with at most 1,000 entries. Hidden sheets, macro projects, encrypted files and legacy `.xls` files are unsupported. Headers must be unique and nonempty; Excel error cells and data beyond the header width are rejected. Trailing empty rows are omitted, while internal empty rows remain null records.
|
|
129
|
+
|
|
130
|
+
The artifact records the original workbook hash, sheet, header row, formula count and warnings. Preview does not persist a table. HTTP endpoints are `POST /api/xlsx/sheets`, `/api/xlsx/inspect` and `/api/xlsx`, using base64 `content`, `name`, `sheet`, `header_row`, `types` and `acknowledge_formulas` as applicable.
|
|
131
|
+
|
|
132
|
+
`openpyxl` and `defusedxml` are base installation requirements in this development checkout; a future release is needed for PyPI users. Cached-value behavior follows the [openpyxl loading documentation](https://openpyxl.readthedocs.io/en/stable/tutorial.html#loading-from-a-file).
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# GraphCore development session log
|
|
2
|
+
|
|
3
|
+
## October 3, 2026 — CSV foundation verification
|
|
4
|
+
|
|
5
|
+
- Completed the first planned increment: verified browser import → preview → Build summary workflow → native execution. Synthetic fixture returned sum `0.3`, count 2 and null count 1.
|
|
6
|
+
- Fixed decimal rounding for wide exponent ranges by deriving aggregation precision from accepted values. Added numeric length/exponent bounds, including extreme zero-exponent rejection.
|
|
7
|
+
- Validation: 36 unit/compiler/Python tests and 8 loopback HTTP tests passed; JavaScript syntax check passed; fresh macOS 11 ARM64 wheel and source builds passed; archive inclusion and Twine checks passed.
|
|
8
|
+
- Browser evidence: `/tmp/graphcore-csv-browser-check.jpg`; test data isolated under `/tmp/graphcore-ui-check-oct3`.
|
|
9
|
+
- Delivery branch: `codex/local-data-foundation`. Implementation commit `ff19d06` was pushed successfully to origin. Repository-local Git identity now uses the existing GitHub no-reply identity for future commits; the implementation commit used the machine default identity.
|
|
10
|
+
- Existing implementation files for retrieval, onboarding and CSV were included as dependencies of this coherent increment. The user-authored product specification was left outside the commit.
|
|
11
|
+
- Artifacts still report already-released version 0.2.2 and must not be uploaded. Cross-platform CI and a release version bump remain pending.
|
|
12
|
+
- Usage checks: start 3% five-hour / 0% weekly; pre-implementation 5% / 1%, both below 60% consumed.
|
|
13
|
+
- Next step: replace JSON-only column declarations with guided column type controls and actionable import feedback. Retain the existing typed artifact contract and targeted tests.
|
|
14
|
+
|
|
15
|
+
## October 3, 2026 — Guided CSV column mapping
|
|
16
|
+
|
|
17
|
+
- Replaced JSON-only column declarations with Choose CSV → sample review → per-column type dropdowns → explicit Import table.
|
|
18
|
+
- Added a nonpersisting inspection endpoint with up to five sample rows; shared parsing keeps validation consistent with import.
|
|
19
|
+
- Added inline row/column errors, preserved choices after failed import, cleared outdated errors on type changes and strict browser UTF-8 decoding.
|
|
20
|
+
- Browser verified: select Whole number for fractional values → actionable error → change to Decimal → successful import. Final importer screenshot: `/tmp/graphcore-guided-import.jpg`.
|
|
21
|
+
- Validation: 37 unit/compiler/Python tests, 9 HTTP tests, JavaScript syntax and diff checks passed. No package dependencies or native core changes; no live model calls or PyPI release.
|
|
22
|
+
- Delivery: continuing on `codex/local-data-foundation`; corresponding feature commit is recorded in Git history.
|
|
23
|
+
- Usage: start 8% five-hour / 1% weekly; final check 12% / 2%, below the 60% threshold.
|
|
24
|
+
- Next step: bounded deterministic table filtering, with explicit null/type semantics, a canvas node and focused tests.
|
|
25
|
+
|
|
26
|
+
## October 3, 2026 — Deterministic table filtering
|
|
27
|
+
|
|
28
|
+
- User explicitly requested continuation after the below-50% stop rule; this interactive session resumed while the hourly automation rule remains unchanged.
|
|
29
|
+
- Added Table filter canvas node with typed comparison forms, explicit null controls and immutable derived artifacts carrying immediate parent provenance.
|
|
30
|
+
- Filtering preserves source rows/schema and order, supports exact decimal comparisons, rejects incompatible operators/types and reuses identical derived artifacts.
|
|
31
|
+
- Validation: 39 unit/compiler/Python tests and 9 HTTP tests passed (48 total), including null semantics, numeric ordering, boolean/text matching, invalid configs, empty results and native filter → summary execution. JavaScript syntax and diff checks passed.
|
|
32
|
+
- Actual browser verified inspector null/value controls and full workflow result `Filtered total: 0.5`; screenshot `/tmp/graphcore-filter-result.jpg`.
|
|
33
|
+
- Delivery continues on `codex/local-data-foundation`; no default-branch merge or PyPI publication.
|
|
34
|
+
- Usage at start: 13% five-hour / 2% weekly. User's explicit continuation authorized this session at that usage.
|
|
35
|
+
- Next step: grouping and exact decimal aggregation with bounded output and clear null/group-key semantics.
|
|
36
|
+
|
|
37
|
+
## October 3, 2026 — Grouped exact aggregation
|
|
38
|
+
|
|
39
|
+
- Continued under the user's explicit interactive resume; hourly scheduling retains its separate below-50% stop rule.
|
|
40
|
+
- Added Grouped summary canvas node, per-group exact statistics and immutable typed grouped table references with parent provenance.
|
|
41
|
+
- Defined first-seen order, case-sensitive text keys, decimal key numeric equality, include/exclude null-key policy and all-null/empty-input behavior.
|
|
42
|
+
- Default group cap 100, configurable up to 500; overflow fails before persisting partial results. Derived previews retain provenance when reused as workflow inputs.
|
|
43
|
+
- Validation: 43 unit/compiler/Python tests and 10 HTTP tests passed (53 total), covering exact totals, null statistics, order, decimal keys, limits/no partial artifacts and native/HTTP execution. Browser verified inspector and `Groups: 2. Total: 0.7`; evidence `/tmp/graphcore-group-result.jpg`.
|
|
44
|
+
- No native runtime changes, dependencies or live model calls. Delivery remains `codex/local-data-foundation`; no PyPI release.
|
|
45
|
+
- Usage at start 18% five-hour / 3% weekly.
|
|
46
|
+
- Next step: table reconciliation with explicit key mapping and duplicate policies, then XLSX support.
|
|
47
|
+
|
|
48
|
+
## October 3, 2026 — Explicit table reconciliation
|
|
49
|
+
|
|
50
|
+
- Resumed under the user's interactive continuation. Implemented one-key/one-value full outer reconciliation with explicit mappings, typed equality and exact left-minus-right decimal deltas.
|
|
51
|
+
- Added duplicate reject/first/last policies, null-key reject/exclude policies, status counts and row bounds. Missing rows are distinguished from present rows with null values. Results retain both source artifact IDs and mappings.
|
|
52
|
+
- Added named table-reference inputs in Data workspace; browser verified adding `source_left` preserved other references.
|
|
53
|
+
- Validation: 46 unit/compiler/Python tests plus 11 HTTP tests passed (57 total), including numeric cross-type keys, mapped column names, duplicate/null policies, no partial writes, native delta summary and HTTP preview. JavaScript syntax and diff checks passed.
|
|
54
|
+
- Browser verified inspector controls and `Changed: 1. Left only: 1. Right only: 1.`; evidence `/tmp/graphcore-reconciliation-result.jpg`.
|
|
55
|
+
- Delivery remains the existing development branch, with no live provider calls or PyPI publication.
|
|
56
|
+
- Start usage: 22% five-hour / 3% weekly. Interactive resume does not change the scheduled below-50% stop rule.
|
|
57
|
+
- Next step: XLSX support with sheet selection, typed import and formula-cache warnings; research the implementation dependency before adding it.
|
|
58
|
+
|
|
59
|
+
## October 3, 2026 — Guided XLSX import
|
|
60
|
+
|
|
61
|
+
- Continued under explicit interactive resume. Added worksheet/header selection, column types and shared immutable table artifacts with source workbook hash and import provenance.
|
|
62
|
+
- Cached formulas require acknowledgment; missing cached results block import. Formula-containing rows remain visible in previews even without cached values. No formula calculation or source workbook changes occur. Added bounded ZIP parsing and unsupported-format rejection.
|
|
63
|
+
- Added openpyxl and defusedxml to base package dependencies. Dependencies ship on the next release; published 0.2.2 remains unchanged.
|
|
64
|
+
- Validation: 51 unit/compiler/Python tests and 12 HTTP tests passed (63 total); browser verified typed import, `0.3` summary and missing-cache rejection. JavaScript syntax, macOS ARM64 wheel/sdist builds, Twine and packaged dependency/module checks passed. Evidence `/tmp/graphcore-xlsx-result.jpg`.
|
|
65
|
+
- Delivery remains codex/local-data-foundation; no live model calls or release publication. Usage at completion: 37% five-hour / 6% weekly. Scheduled below-50% stop rule remains unchanged.
|
|
66
|
+
- Next step: export workflow result tables into a new workbook with provenance, without modifying source files.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Hourly development sessions
|
|
2
|
+
|
|
3
|
+
Requested October 3, 2026. Execution environment is pending: the scheduling tool in this chat supports desktop/local execution, not provisioning a persistent cloud worker.
|
|
4
|
+
|
|
5
|
+
## Session contract
|
|
6
|
+
|
|
7
|
+
Run once per hour, with one focused feature increment or bug fix per session. Aim for 20–30 minutes of work; leave remaining time for validation and a durable handoff. Do not overlap active development sessions.
|
|
8
|
+
|
|
9
|
+
At the start, inspect the repository status, previous session notes, current product specification and account usage. Never discard existing work. If account usage cannot be read, ordinary usage is disallowed, or either applicable reported usage window is at least 60% consumed, defer development until a later scheduled session. Check again before implementation and before costly verification. If the threshold is reached, save progress and stop development for that session. Scheduled checks and work already in flight can themselves consume usage; this is a best-effort development threshold, not an enforceable account-wide quota cap. Other chats share account usage.
|
|
10
|
+
|
|
11
|
+
Use a configured economical model for routine sessions when supported by the chosen environment. Do not promise automatic model switching or a new quota by switching models. A separately billed API runner needs its own monetary budget; its API usage is not measured by the desktop account percentages.
|
|
12
|
+
|
|
13
|
+
## Initial sequence
|
|
14
|
+
|
|
15
|
+
1. Verify the current CSV data workspace in a browser and fix observed defects. Recheck packaging inclusion for new modules.
|
|
16
|
+
2. Replace JSON-only column declarations with guided type controls and actionable import feedback.
|
|
17
|
+
3. Add bounded deterministic filtering, with null/type semantics and targeted tests.
|
|
18
|
+
4. Add grouping and exact decimal aggregation, with provenance and limits.
|
|
19
|
+
5. Add table reconciliation with explicit key mappings and duplicate policies.
|
|
20
|
+
6. Add XLSX import with sheet/header selection and cached-formula warnings.
|
|
21
|
+
7. Add export to a new workbook, with deterministic contents and tests.
|
|
22
|
+
8. Introduce versioned connector contracts and read-only connector fixtures.
|
|
23
|
+
|
|
24
|
+
Treat this as an ordered queue of small deliverables, not a guarantee that each feature finishes in one hour. Split work when necessary and finish the current item before starting another.
|
|
25
|
+
|
|
26
|
+
## Validation and Git delivery
|
|
27
|
+
|
|
28
|
+
Run focused tests that establish the changed behavior, followed by the required regression checks. For UI changes, verify the actual browser interaction when available. Record skipped checks and reasons. Never claim a feature is complete when required validation failed.
|
|
29
|
+
|
|
30
|
+
Commit only relevant reviewed changes and push passing increments to a `codex/` development branch on the configured GraphCore repository. Preserve user changes and inspect staged content for credentials and generated data. Do not force-push, merge into the default branch, publish to PyPI or create cloud resources as an incidental part of a session. Save incomplete work and failures without presenting them as verified increments.
|
|
31
|
+
|
|
32
|
+
## Durable handoff
|
|
33
|
+
|
|
34
|
+
Maintain a session log containing: backlog item, outcome, changed files, validation results, branch/commit where applicable, unresolved issues, next concrete step and latest available usage percentages. Notify the user only for meaningful completion, failure or required input. Stay quiet for unchanged or deferred sessions.
|
|
35
|
+
|
|
36
|
+
## Environment choices
|
|
37
|
+
|
|
38
|
+
- Desktop heartbeat: available here; requires the computer and app to remain running. Uses the current chat context.
|
|
39
|
+
- Cloud worker: requires an accessible cloud execution environment and an authenticated runner. API-backed execution needs a separately approved spend budget. Cloud scheduling has not been configured by this plan.
|