donna 0.2.0__tar.gz → 0.2.1__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.
Files changed (102) hide show
  1. {donna-0.2.0 → donna-0.2.1}/PKG-INFO +4 -1
  2. donna-0.2.1/donna/artifacts/intro.md +39 -0
  3. donna-0.2.1/donna/artifacts/research/specs/report.md +163 -0
  4. donna-0.2.1/donna/artifacts/research/work/research.md +198 -0
  5. donna-0.2.1/donna/artifacts/rfc/specs/request_for_change.md +271 -0
  6. donna-0.2.1/donna/artifacts/rfc/work/create.md +120 -0
  7. donna-0.2.1/donna/artifacts/rfc/work/do.md +109 -0
  8. donna-0.2.1/donna/artifacts/rfc/work/plan.md +68 -0
  9. {donna-0.2.0 → donna-0.2.1}/donna/artifacts/usage/artifacts.md +41 -6
  10. donna-0.2.1/donna/artifacts/usage/cli.md +186 -0
  11. {donna-0.2.0 → donna-0.2.1}/donna/artifacts/usage/worlds.md +8 -2
  12. {donna-0.2.0 → donna-0.2.1}/donna/cli/__main__.py +1 -1
  13. donna-0.2.1/donna/cli/commands/artifacts.py +197 -0
  14. {donna-0.2.0 → donna-0.2.1}/donna/cli/commands/sessions.py +7 -7
  15. donna-0.2.1/donna/cli/commands/workspaces.py +42 -0
  16. donna-0.2.1/donna/cli/errors.py +18 -0
  17. {donna-0.2.0 → donna-0.2.1}/donna/cli/types.py +16 -9
  18. {donna-0.2.0 → donna-0.2.1}/donna/cli/utils.py +2 -2
  19. {donna-0.2.0 → donna-0.2.1}/donna/core/errors.py +1 -11
  20. {donna-0.2.0 → donna-0.2.1}/donna/core/result.py +5 -8
  21. {donna-0.2.0 → donna-0.2.1}/donna/core/utils.py +0 -3
  22. {donna-0.2.0 → donna-0.2.1}/donna/lib/__init__.py +4 -0
  23. {donna-0.2.0 → donna-0.2.1}/donna/lib/sources.py +1 -1
  24. {donna-0.2.0 → donna-0.2.1}/donna/lib/worlds.py +2 -2
  25. {donna-0.2.0 → donna-0.2.1}/donna/machine/action_requests.py +0 -5
  26. {donna-0.2.0 → donna-0.2.1}/donna/machine/artifacts.py +8 -6
  27. {donna-0.2.0 → donna-0.2.1}/donna/machine/primitives.py +4 -4
  28. {donna-0.2.0 → donna-0.2.1}/donna/machine/sessions.py +12 -4
  29. {donna-0.2.0 → donna-0.2.1}/donna/machine/state.py +2 -2
  30. {donna-0.2.0 → donna-0.2.1}/donna/machine/tasks.py +4 -18
  31. {donna-0.2.0 → donna-0.2.1}/donna/machine/templates.py +4 -2
  32. donna-0.2.1/donna/primitives/artifacts/specification.py +31 -0
  33. {donna-0.2.0 → donna-0.2.1}/donna/primitives/artifacts/workflow.py +11 -2
  34. donna-0.2.1/donna/primitives/directives/list.py +86 -0
  35. donna-0.2.1/donna/primitives/directives/view.py +86 -0
  36. {donna-0.2.0 → donna-0.2.1}/donna/primitives/operations/finish_workflow.py +13 -2
  37. donna-0.2.1/donna/primitives/operations/output.py +87 -0
  38. {donna-0.2.0 → donna-0.2.1}/donna/primitives/operations/request_action.py +3 -9
  39. {donna-0.2.0 → donna-0.2.1}/donna/primitives/operations/run_script.py +2 -2
  40. donna-0.2.1/donna/protocol/utils.py +22 -0
  41. donna-0.2.1/donna/workspaces/artifacts.py +238 -0
  42. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/artifacts_discovery.py +1 -1
  43. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/config.py +13 -6
  44. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/errors.py +55 -45
  45. donna-0.2.1/donna/workspaces/initialization.py +78 -0
  46. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/markdown.py +21 -26
  47. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/sources/base.py +2 -2
  48. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/sources/markdown.py +7 -6
  49. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/templates.py +4 -4
  50. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/tmp.py +19 -1
  51. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/worlds/base.py +5 -2
  52. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/worlds/filesystem.py +23 -9
  53. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/worlds/python.py +12 -9
  54. {donna-0.2.0 → donna-0.2.1}/pyproject.toml +8 -2
  55. donna-0.2.0/donna/artifacts/usage/cli.md +0 -117
  56. donna-0.2.0/donna/artifacts/work/do_it.md +0 -142
  57. donna-0.2.0/donna/artifacts/work/do_it_fast.md +0 -98
  58. donna-0.2.0/donna/artifacts/work/planning.md +0 -245
  59. donna-0.2.0/donna/cli/commands/artifacts.py +0 -110
  60. donna-0.2.0/donna/cli/commands/projects.py +0 -49
  61. donna-0.2.0/donna/primitives/artifacts/specification.py +0 -20
  62. donna-0.2.0/donna/primitives/directives/view.py +0 -45
  63. donna-0.2.0/donna/world/artifacts.py +0 -122
  64. donna-0.2.0/donna/world/initialization.py +0 -42
  65. donna-0.2.0/donna/world/worlds/__init__.py +0 -0
  66. {donna-0.2.0 → donna-0.2.1}/LICENSE +0 -0
  67. {donna-0.2.0 → donna-0.2.1}/README.md +0 -0
  68. {donna-0.2.0 → donna-0.2.1}/donna/__init__.py +0 -0
  69. {donna-0.2.0 → donna-0.2.1}/donna/artifacts/__init__.py +0 -0
  70. {donna-0.2.0 → donna-0.2.1}/donna/artifacts/usage/__init__.py +0 -0
  71. {donna-0.2.0/donna/artifacts/work → donna-0.2.1/donna/cli}/__init__.py +0 -0
  72. {donna-0.2.0 → donna-0.2.1}/donna/cli/application.py +0 -0
  73. {donna-0.2.0/donna/cli → donna-0.2.1/donna/cli/commands}/__init__.py +0 -0
  74. {donna-0.2.0/donna/cli/commands → donna-0.2.1/donna/core}/__init__.py +0 -0
  75. {donna-0.2.0 → donna-0.2.1}/donna/core/entities.py +0 -0
  76. {donna-0.2.0/donna/core → donna-0.2.1/donna/domain}/__init__.py +0 -0
  77. {donna-0.2.0 → donna-0.2.1}/donna/domain/errors.py +0 -0
  78. {donna-0.2.0 → donna-0.2.1}/donna/domain/ids.py +0 -0
  79. {donna-0.2.0/donna/domain → donna-0.2.1/donna/machine}/__init__.py +0 -0
  80. {donna-0.2.0 → donna-0.2.1}/donna/machine/changes.py +0 -0
  81. {donna-0.2.0 → donna-0.2.1}/donna/machine/errors.py +0 -0
  82. {donna-0.2.0 → donna-0.2.1}/donna/machine/operations.py +0 -0
  83. {donna-0.2.0 → donna-0.2.1}/donna/primitives/__init__.py +0 -0
  84. {donna-0.2.0/donna/machine → donna-0.2.1/donna/primitives/artifacts}/__init__.py +0 -0
  85. {donna-0.2.0/donna/primitives/artifacts → donna-0.2.1/donna/primitives/directives}/__init__.py +0 -0
  86. {donna-0.2.0 → donna-0.2.1}/donna/primitives/directives/goto.py +0 -0
  87. {donna-0.2.0 → donna-0.2.1}/donna/primitives/directives/task_variable.py +0 -0
  88. {donna-0.2.0/donna/primitives/directives → donna-0.2.1/donna/primitives/operations}/__init__.py +0 -0
  89. {donna-0.2.0/donna/primitives/operations → donna-0.2.1/donna/protocol}/__init__.py +0 -0
  90. {donna-0.2.0 → donna-0.2.1}/donna/protocol/cell_shortcuts.py +0 -0
  91. {donna-0.2.0 → donna-0.2.1}/donna/protocol/cells.py +0 -0
  92. {donna-0.2.0 → donna-0.2.1}/donna/protocol/errors.py +0 -0
  93. {donna-0.2.0/donna/protocol → donna-0.2.1/donna/protocol/formatters}/__init__.py +0 -0
  94. {donna-0.2.0 → donna-0.2.1}/donna/protocol/formatters/automation.py +0 -0
  95. {donna-0.2.0 → donna-0.2.1}/donna/protocol/formatters/base.py +0 -0
  96. {donna-0.2.0 → donna-0.2.1}/donna/protocol/formatters/human.py +0 -0
  97. {donna-0.2.0 → donna-0.2.1}/donna/protocol/formatters/llm.py +0 -0
  98. {donna-0.2.0 → donna-0.2.1}/donna/protocol/modes.py +0 -0
  99. {donna-0.2.0 → donna-0.2.1}/donna/protocol/nodes.py +0 -0
  100. {donna-0.2.0/donna/protocol/formatters → donna-0.2.1/donna/workspaces}/__init__.py +0 -0
  101. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces}/sources/__init__.py +0 -0
  102. {donna-0.2.0/donna/world → donna-0.2.1/donna/workspaces/worlds}/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: donna
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: A deterministic workflow and state orchestration engine for LLM agents.
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE
@@ -11,6 +11,7 @@ Requires-Python: >=3.12,<4.0
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: BSD License
14
15
  Classifier: Programming Language :: Python :: 3
15
16
  Classifier: Programming Language :: Python :: 3.12
16
17
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -20,7 +21,9 @@ Requires-Dist: jinja2 (>=3.1,<3.2)
20
21
  Requires-Dist: markdown-it-py (>=4.0,<4.1)
21
22
  Requires-Dist: mdformat (>=1.0.0,<1.1.0)
22
23
  Requires-Dist: pydantic (>=2.12,<2.13)
24
+ Requires-Dist: tomli-w (>=1.2,<1.3)
23
25
  Requires-Dist: typer (>=0.20,<0.21)
26
+ Project-URL: Changelog, https://github.com/Tiendil/donna/blob/main/CHANGELOG.md
24
27
  Project-URL: Homepage, https://github.com/Tiendil/donna
25
28
  Project-URL: Issues, https://github.com/Tiendil/donna/issues
26
29
  Project-URL: Repository, https://github.com/Tiendil/donna
@@ -0,0 +1,39 @@
1
+ # Intoduction to the Donna tool
2
+
3
+ ```toml donna
4
+ kind = "donna.lib.specification"
5
+ ```
6
+ This document provides an introduction to the Donna — a CLI tool that helps manage the work of AI agents like Codex.
7
+
8
+ ## Overview
9
+
10
+ Donna is designed to to invert control flow: instead of agents deciding what to do next, the `donna` tells agents what to do next by following predefined workflows.
11
+
12
+ The core idea is that most of high-level workflows are more algorithmic than it may seem at first glance. For example, it may be difficult to fix a particular type issue in the codebase, but the overall process of polishing the codebase is quite linear:
13
+
14
+ 1. Ensure all tests pass.
15
+ 2. Ensure the code is formatted correctly.
16
+ 3. Ensure there are no linting errors.
17
+ 4. Go to the step 1 if you changed something in the process.
18
+ 5. Finish.
19
+
20
+ We may need coding agents on the each step of the process, but there no reason for agents to manage the whole grooming loop by themselves — it take longer time, spends tokens and may lead to confusion of agents.
21
+
22
+ ## Artifact Tags
23
+
24
+ To simplicity searching of artifacts by their semantics, Donna allows tagging artifacts with semantically valuable keywords. Artifacts in `donna:*` world use the next set of tags.
25
+
26
+ Artifact type tags:
27
+
28
+ - `workflow` — workflow artifact — is set automatically by Donna.
29
+ - `specification` — specification artifact — is set automatically by Donna.
30
+
31
+ {# We recommend using those tags in `project:` and `session:` worlds as well to keep consistency. #}
32
+
33
+ ## Instructions
34
+
35
+ 1. On start of the YOUR session you **MUST** read and understand instruction on using the Donna tool `{{ donna.lib.view("donna:usage:cli") }}`. It **MUST** be a one time operation. Do not repeat it unless you forget how to use the tool.
36
+ 2. If you need to perform a work with Donna, you **MUST** select an appropriate Donna workflow to perform the work and run it.
37
+ 3. If there is no appropriate workflow, ask the developer for a precise instructions on what to do.
38
+ 4. List all workflows: `{{ donna.lib.list("**", tags=["workflow"]) }}`
39
+ 5. List all specifications: `{{ donna.lib.list("**", tags=["specification"]) }}`
@@ -0,0 +1,163 @@
1
+ # Format of the Research Report document
2
+
3
+ ```toml donna
4
+ kind = "donna.lib.specification"
5
+ ```
6
+
7
+ This document describes the format and structure of a Research Report document used by Donna workflows from `donna:research:*` namespace.
8
+
9
+ ## Overview
10
+
11
+ Donna introduces a group of workflows located in `donna:research:*` namespace that organize the process of researching a problem, collecting information, analyzing it, synthesizing options, and producing a final solution.
12
+
13
+ Session-related research artifacts MUST be stored as `session:research:<short-problem-related-identifier>`, unless the developer or parent workflow specifies a different location. The `<short-problem-related-identifier>` MUST be unique within the session.
14
+
15
+ Agent (via workflows) creates that artifact and updates it iteratively as the research process goes on.
16
+
17
+ ## Research report structure
18
+
19
+ The research report is a Donna artifact (check `{{ donna.lib.view("donna:usage:artifacts") }}`) with the next structure:
20
+
21
+ - **Primary section** -- title and short description of the research problem.
22
+ - **Original problem description** -- original problem statement from the developer or parent workflow.
23
+ - **Formalized problem description** -- formalized version of the problem statement.
24
+ - **Goals** -- list of goals the research should achieve.
25
+ - **Desired form of final solution** -- description of the expected form and constraints for the final solution.
26
+ - **Solution space** -- description of analysis axes and synthesis dimensions.
27
+ - **Information to collect** -- list of information required to research the problem.
28
+ - **Information sources** -- list of sources that can provide the required information.
29
+ - **Collected information** -- gathered information with source references.
30
+ - **Analysis** -- analysis of collected information along the specified axes.
31
+ - **Synthesized solutions** -- synthesized solution options along the specified dimensions.
32
+ - **Evaluation** -- evaluation of synthesized solutions against the goals.
33
+ - **Final solution** -- final solution in the desired form.
34
+
35
+ ## General language and format
36
+
37
+ - You MUST follow [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119.txt) for keywords like MUST, SHOULD, MAY, etc.
38
+ - You MUST follow `{{ donna.lib.view("donna:usage:artifacts") }}`.
39
+ - You MUST follow the structure specified in this document.
40
+
41
+ ### List format
42
+
43
+ - If a section described as a list, it MUST contain only a single markdown list.
44
+ - Each list item MUST be concise and clear.
45
+ - Each list item SHOULD be atomic and focused on a single aspect.
46
+ - Reviewer MUST be able to tell if the list item statement is true or false by inspecting resulting artifacts and behavior.
47
+
48
+ Common approaches to improve list items:
49
+
50
+ - Split a single item with an enumeration into multiple items with single focus.
51
+ - Transform an abstract item into a concrete one by referencing specific artifacts, measurable criteria, verifiable conditions, etc.
52
+
53
+ ### Trusted inputs
54
+
55
+ Some sections of the research report MUST be based on trusted inputs. Trusted inputs are:
56
+
57
+ - Original problem description from the developer or parent workflow.
58
+ - Statements from the research report itself.
59
+ - Existing project documentation, code, and artifacts.
60
+ - External standards when they define constraints or best practices for the project domain.
61
+ - Documentation of third-party libraries, frameworks, or tools when it describes constraints or best practices.
62
+ - Primary research sources (datasets, reports, official publications) used to collect the required information.
63
+
64
+ ## `Primary` section
65
+
66
+ - Title MUST be concise and reflect the essence of the research problem.
67
+ - Description MUST provide a brief overview of the problem, its purpose, and why research is needed.
68
+
69
+ ## `Original problem description` section
70
+
71
+ - This section MUST contain the original problem description from the developer or from the parent workflow.
72
+ - The problem description MUST NOT be modified by agents.
73
+
74
+ ## `Formalized problem description` section
75
+
76
+ - The section MUST contain a clear professional high-level description of the problem based on the original description.
77
+ - The section MUST be limited to a single paragraph with a few sentences.
78
+ - The section MUST explain what someone gains after the problem is solved and how they can see it working.
79
+
80
+ ## `Goals` section
81
+
82
+ - This section MUST contain a list of goals that the research should achieve.
83
+ - Each goal MUST be grounded in the formalized problem description.
84
+
85
+ Goal quality criteria:
86
+
87
+ - A goal MUST be a desired end state, outcome, or result.
88
+ - A goal MUST define what ultimately should be true, not how to achieve it.
89
+
90
+ Examples:
91
+
92
+ - Bad: `- Investigate database options.`
93
+ - Good: `- Identify a database option that meets the project's scalability requirements.`
94
+
95
+ ## `Desired form of final solution` section
96
+
97
+ - The section MUST be grounded in the formalized problem description and the goals.
98
+ - The section MUST describe the expected form of the final solution (for example: recommendation, decision matrix, implementation plan, or specification).
99
+ - The section MUST specify any required structure, formatting, or constraints on the final solution.
100
+ - The section SHOULD be a short list or a short paragraph, whichever is clearer for the problem.
101
+
102
+ ## `Solution space` section
103
+
104
+ - The section MUST describe the axes along which collected information will be analyzed and the dimensions along which solutions will be synthesized.
105
+ - The section MUST contain two subsections: **Analysis axes** and **Synthesis dimensions**.
106
+ - Each axis or dimension MUST be grounded in the goals or the formalized problem description.
107
+
108
+ ### `Analysis axes` subsection
109
+
110
+ - The subsection MUST contain a list of analysis axes.
111
+ - Each axis MUST describe a single perspective or criterion used to analyze information.
112
+ - Each axis SHOULD be phrased so it is clear how to apply it to collected information.
113
+
114
+ ### `Synthesis dimensions` subsection
115
+
116
+ - The subsection MUST contain a list of synthesis dimensions.
117
+ - Each dimension MUST describe a single perspective or criterion used to synthesize solution options.
118
+ - Each dimension SHOULD make the comparison between options easier.
119
+
120
+ ## `Information to collect` section
121
+
122
+ - The section MUST contain a list of information items required to research the problem.
123
+ - Each item MUST be specific enough to be collected or verified from sources.
124
+ - Each item MUST be grounded in the formalized problem description or the goals.
125
+
126
+ ## `Information sources` section
127
+
128
+ - The section MUST contain a list of sources that can provide the required information.
129
+ - Each source entry MUST include a short identifier and a brief description of the source.
130
+ - Each source entry SHOULD include access method, scope, and reliability notes if relevant.
131
+ - Each source MUST be relevant to at least one item from **Information to collect**.
132
+
133
+ ## `Collected information` section
134
+
135
+ - The section MUST contain the collected information mapped to the items from **Information to collect**.
136
+ - Each collected information item MUST reference one or more source identifiers from **Information sources**.
137
+ - The section MUST make it clear which information items are satisfied and which are missing.
138
+ - If a required information item cannot be collected, the section MUST state that explicitly and explain why.
139
+
140
+ ## `Analysis` section
141
+
142
+ - The section MUST analyze the collected information along the **Analysis axes**.
143
+ - The analysis MUST be organized so each axis can be reviewed independently.
144
+ - The analysis MUST clearly separate observed facts from inferences or assumptions.
145
+ - The analysis format MUST fit the **Desired form of final solution** and should make downstream synthesis straightforward.
146
+
147
+ ## `Synthesized solutions` section
148
+
149
+ - The section MUST present synthesized solutions or options in a format consistent with the **Synthesis dimensions**.
150
+ - Each solution SHOULD reference the analysis items that justify it.
151
+ - The synthesis format MUST fit the **Desired form of final solution**.
152
+
153
+ ## `Evaluation` section
154
+
155
+ - The section MUST evaluate each synthesized solution against the **Goals**.
156
+ - The evaluation MUST make trade-offs explicit and identify risks or uncertainties.
157
+ - The evaluation MUST result in a clear comparison between solutions.
158
+
159
+ ## `Final solution` section
160
+
161
+ - The section MUST present the final solution in the form specified in **Desired form of final solution**.
162
+ - The final solution MUST be justified by the evaluation results.
163
+ - If the evaluation does not allow a confident final solution, the section MUST state the remaining uncertainties and what additional information would resolve them.
@@ -0,0 +1,198 @@
1
+ # Research workflow
2
+
3
+ ```toml donna
4
+ kind = "donna.lib.workflow"
5
+ start_operation_id = "start"
6
+ ```
7
+
8
+ Workflow for performing research on a given question/problem/situation. Collects relevant information, analyzes it, synthesizes possible options, and produces an answer/solution/deliverables.
9
+
10
+ The purpose of this workflow is to provide an information for making decisions or producing solutions based on researched data. It can be used:
11
+
12
+ - When the developer explicitly asks to make a research.
13
+ - When other workflows need to perform research as a subtask.
14
+
15
+ ## Start
16
+
17
+ ```toml donna
18
+ id = "start"
19
+ kind = "donna.lib.request_action"
20
+ fsm_mode = "start"
21
+ ```
22
+
23
+ 1. Read the specification `{{ donna.lib.view("donna:usage:artifacts") }}` if you haven't done it yet.
24
+ 2. Read the specification `{{ donna.lib.view("donna:research:specs:report") }}` if you haven't done it yet.
25
+ 3. `{{ donna.lib.goto("ensure_problem_description_exists") }}`
26
+
27
+ ## Ensure problem description exists
28
+
29
+ ```toml donna
30
+ id = "ensure_problem_description_exists"
31
+ kind = "donna.lib.request_action"
32
+ ```
33
+
34
+ At this point you SHOULD have a clear description of the problem in your context. I.e. you know what you need to do in this workflow.
35
+
36
+ 1. If you have a problem description in your context, `{{ donna.lib.goto("prepare_artifact") }}`.
37
+ 2. If you have no problem description in your context, but you know it is in one of `session:*` artifacts, find and view it. Then `{{ donna.lib.goto("prepare_artifact") }}`.
38
+ 3. If you have no problem description in your context, and you don't know where it is, ask the developer to provide it. After you get the problem description, `{{ donna.lib.goto("prepare_artifact") }}`.
39
+
40
+ ## Prepare research artifact
41
+
42
+ ```toml donna
43
+ id = "prepare_artifact"
44
+ kind = "donna.lib.request_action"
45
+ ```
46
+
47
+ 1. Based on the problem description you have, suggest an artifact name in the format `session:research:<short-problem-related-identifier>`. `<short-problem-related-identifier>` MUST be unique within the session.
48
+ {# TODO: we can add donna.lib.list('session:*') here as the command to list all artifacts in session #}
49
+ 2. Create the artifact and specify an original problem description in it.
50
+ 3. `{{ donna.lib.goto("formalize_research") }}`
51
+
52
+ ## Formalize Research
53
+
54
+ ```toml donna
55
+ id = "formalize_research"
56
+ kind = "donna.lib.request_action"
57
+ ```
58
+
59
+ 1. Using your knowledge about the project and the original problem description, formulate a format description of the problem
60
+ 2. Update the artifact with the formalized problem description.
61
+ 3. `{{ donna.lib.goto("set_primary_section_of_the_research_artifact") }}`
62
+
63
+ ## Set primary section of the research artifact
64
+
65
+ ```toml donna
66
+ id = "set_primary_section_of_the_research_artifact"
67
+ kind = "donna.lib.request_action"
68
+ ```
69
+
70
+ 1. Based on the formalized problem description, update the primary (h1) section of the research artifact to reflect the problem being researched. So the agents can effectively find and understand the research artifact using Donna.
71
+ 2. `{{ donna.lib.goto("formulate_goals") }}`
72
+
73
+ ## Formulate Goals
74
+
75
+ ```toml donna
76
+ id = "formulate_goals"
77
+ kind = "donna.lib.request_action"
78
+ ```
79
+
80
+ 1. Based on the formalized problem description, formulate a list of goals that the problem solution should achieve.
81
+ 2. Update the artifact with the list of goals.
82
+ 3. `{{ donna.lib.goto("fomalize_form_of_final_solution") }}`
83
+
84
+ ## Formalize form of final solution
85
+
86
+ ```toml donna
87
+ id = "fomalize_form_of_final_solution"
88
+ kind = "donna.lib.request_action"
89
+ ```
90
+
91
+ 1. Based on the formalized problem description and the list of goals, formulate the desired form of the final solution.
92
+ 2. Update the artifact with the desired form of the final solution.
93
+ 3. `{{ donna.lib.goto("describe_solution_space") }}`
94
+
95
+ ## Describe solution space
96
+
97
+ ```toml donna
98
+ id = "describe_solution_space"
99
+ kind = "donna.lib.request_action"
100
+ ```
101
+
102
+ To produce solution we should understand how to analyze the data and how to synthesize results into the final solution.
103
+
104
+ For this we need to list the axes along which we will analyze the data and the dimensions along which we will synthesize the results.
105
+
106
+ 1. List the analysis axes.
107
+ 2. List the synthesis dimensions.
108
+ 3. Update the artifact with the description of the solution space.
109
+ 4. `{{ donna.lib.goto("describe_information_to_collect") }}`
110
+
111
+ ## Describe information to collect
112
+
113
+ ```toml donna
114
+ id = "describe_information_to_collect"
115
+ kind = "donna.lib.request_action"
116
+ ```
117
+
118
+ 1. Based on the formalized problem description and the list of goals, list the information to be collected to research the problem.
119
+ 2. Update the artifact with the description of the information to collect.
120
+ 3. `{{ donna.lib.goto("list_information_sources") }}`
121
+
122
+ ## List information sources
123
+
124
+ ```toml donna
125
+ id = "list_information_sources"
126
+ kind = "donna.lib.request_action"
127
+ ```
128
+
129
+ 1. Based on the formalized problem description and the list of goals, formulate a list of information sources that can help to research the problem.
130
+ 2. Update the artifact with the list of information sources.
131
+ 3. `{{ donna.lib.goto("collect_information") }}`
132
+
133
+ ## Collect information
134
+
135
+ ```toml donna
136
+ id = "collect_information"
137
+ kind = "donna.lib.request_action"
138
+ ```
139
+
140
+ 1. For each information source from the list:
141
+ 1. For each piece of required information from the description:
142
+ 1. If the source can not provide this piece of information, skip it.
143
+ 2. Access the source and collect the required information.
144
+ 3. Update the artifact with the collected information.
145
+ 2. `{{ donna.lib.goto("analyze_information") }}`
146
+
147
+ ## Analyze information
148
+
149
+ ```toml donna
150
+ id = "analyze_information"
151
+ kind = "donna.lib.request_action"
152
+ ```
153
+
154
+ 1. Using the analysis axes from the solution space description, analyze the collected information. Choose the format that best represents the analysis results and suits the the required solution form.
155
+ 2. Update the artifact with the analysis results.
156
+ 3. `{{ donna.lib.goto("synthesize_solutions") }}`
157
+
158
+ ## Synthesize solutions
159
+
160
+ ```toml donna
161
+ id = "synthesize_solutions"
162
+ kind = "donna.lib.request_action"
163
+ ```
164
+
165
+ 1. Using the synthesis dimensions from the solution space description, synthesize possible solutions based on the analysis results. Choose the format that best represents the synthesized solutions and suits the the required solution form.
166
+ 2. Update the artifact with the synthesized solutions.
167
+ 3. `{{ donna.lib.goto("evaluate_solutions") }}`
168
+
169
+ ## Evaluate solutions
170
+
171
+ ```toml donna
172
+ id = "evaluate_solutions"
173
+ kind = "donna.lib.request_action"
174
+ ```
175
+
176
+ 1. Evaluate the synthesized solutions against the goals from the formalized problem description.
177
+ 2. Update the artifact with the evaluation results.
178
+ 3. `{{ donna.lib.goto("produce_final_solution") }}`
179
+
180
+ ## Produce final solution
181
+
182
+ ```toml donna
183
+ id = "produce_final_solution"
184
+ kind = "donna.lib.request_action"
185
+ ```
186
+
187
+ 1. Based on the evaluation results, produce the final solution in the desired form.
188
+ 2. Update the artifact with the final solution.
189
+ 3. `{{ donna.lib.goto("finish") }}`
190
+
191
+ ## Finish
192
+
193
+ ```toml donna
194
+ id = "finish"
195
+ kind = "donna.lib.finish"
196
+ ```
197
+
198
+ Research workflow completed. Provide the final research output to the developer.