syntaur 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dashboard/dist/assets/{_basePickBy-CHKX1r7P.js → _basePickBy-BhaCV7eH.js} +1 -1
  2. package/dashboard/dist/assets/{_baseUniq-CTxTc4MS.js → _baseUniq-CDPcqrs2.js} +1 -1
  3. package/dashboard/dist/assets/{arc-BUo5zftd.js → arc-BP0RxLwl.js} +1 -1
  4. package/dashboard/dist/assets/{architectureDiagram-2XIMDMQ5-CrJLm-P0.js → architectureDiagram-2XIMDMQ5-BDzvaeJp.js} +1 -1
  5. package/dashboard/dist/assets/{blockDiagram-WCTKOSBZ-BK60lBBJ.js → blockDiagram-WCTKOSBZ-ZeL9mROo.js} +1 -1
  6. package/dashboard/dist/assets/{c4Diagram-IC4MRINW-C7oJEvA0.js → c4Diagram-IC4MRINW-7S5bvFLp.js} +1 -1
  7. package/dashboard/dist/assets/channel-CcB_wcgb.js +1 -0
  8. package/dashboard/dist/assets/{chunk-4BX2VUAB-CjUPlzHz.js → chunk-4BX2VUAB-Ca7R4nv5.js} +1 -1
  9. package/dashboard/dist/assets/{chunk-55IACEB6-6HmWguiO.js → chunk-55IACEB6-flEv13FB.js} +1 -1
  10. package/dashboard/dist/assets/{chunk-FMBD7UC4-CLuJnd1b.js → chunk-FMBD7UC4-CfcYWBM6.js} +1 -1
  11. package/dashboard/dist/assets/{chunk-JSJVCQXG-B4d62qWV.js → chunk-JSJVCQXG-Dw4yL0VS.js} +1 -1
  12. package/dashboard/dist/assets/{chunk-KX2RTZJC-AsEKRPq2.js → chunk-KX2RTZJC-B2cDe40G.js} +1 -1
  13. package/dashboard/dist/assets/{chunk-NQ4KR5QH-DQhHHvwY.js → chunk-NQ4KR5QH-LZVm0IWg.js} +1 -1
  14. package/dashboard/dist/assets/{chunk-QZHKN3VN-Ds1TtI3E.js → chunk-QZHKN3VN-Dg0EeHNI.js} +1 -1
  15. package/dashboard/dist/assets/{chunk-WL4C6EOR-C7jE3-cR.js → chunk-WL4C6EOR-v3rXNwXc.js} +1 -1
  16. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BJr38z2g.js +1 -0
  17. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BJr38z2g.js +1 -0
  18. package/dashboard/dist/assets/clone-Cfs2GUGt.js +1 -0
  19. package/dashboard/dist/assets/{cose-bilkent-S5V4N54A-C9ka5v1m.js → cose-bilkent-S5V4N54A-D-3JzLoS.js} +1 -1
  20. package/dashboard/dist/assets/{dagre-KLK3FWXG-BbgPQBKy.js → dagre-KLK3FWXG-d_mbczhU.js} +1 -1
  21. package/dashboard/dist/assets/{diagram-E7M64L7V-DpdeZFD4.js → diagram-E7M64L7V-BUyAp8pW.js} +1 -1
  22. package/dashboard/dist/assets/{diagram-IFDJBPK2-FlHLQzOV.js → diagram-IFDJBPK2-C8doXcyQ.js} +1 -1
  23. package/dashboard/dist/assets/{diagram-P4PSJMXO-B22NkEF_.js → diagram-P4PSJMXO-BUSmHa55.js} +1 -1
  24. package/dashboard/dist/assets/{erDiagram-INFDFZHY-zSqmtDid.js → erDiagram-INFDFZHY-Bn5_0LPU.js} +1 -1
  25. package/dashboard/dist/assets/{flowDiagram-PKNHOUZH-BP_0XmVV.js → flowDiagram-PKNHOUZH-CnEjerQM.js} +1 -1
  26. package/dashboard/dist/assets/{ganttDiagram-A5KZAMGK-8uRyYgZV.js → ganttDiagram-A5KZAMGK-CL94fbyy.js} +1 -1
  27. package/dashboard/dist/assets/{gitGraphDiagram-K3NZZRJ6-JFqg8sv4.js → gitGraphDiagram-K3NZZRJ6-4i_PeG8V.js} +1 -1
  28. package/dashboard/dist/assets/{graph-a-PAH599.js → graph-BtoFhoAd.js} +1 -1
  29. package/dashboard/dist/assets/index-DZUGYrvE.css +1 -0
  30. package/dashboard/dist/assets/index-Dv_-SxuL.js +481 -0
  31. package/dashboard/dist/assets/{infoDiagram-LFFYTUFH-C3kq7Nbv.js → infoDiagram-LFFYTUFH-CdUsuNgZ.js} +1 -1
  32. package/dashboard/dist/assets/{ishikawaDiagram-PHBUUO56-Kqi4EZ-n.js → ishikawaDiagram-PHBUUO56-BjggRlUx.js} +1 -1
  33. package/dashboard/dist/assets/{journeyDiagram-4ABVD52K-CTfv0Wcr.js → journeyDiagram-4ABVD52K-V4AgexlR.js} +1 -1
  34. package/dashboard/dist/assets/{kanban-definition-K7BYSVSG-Dmx0lgvR.js → kanban-definition-K7BYSVSG-ChlylQRf.js} +1 -1
  35. package/dashboard/dist/assets/{layout-KKRbT2Od.js → layout-DLcz9AmA.js} +1 -1
  36. package/dashboard/dist/assets/{linear-5egaBiw7.js → linear-l2xnSHze.js} +1 -1
  37. package/dashboard/dist/assets/{mermaid.core-C9pF_oFQ.js → mermaid.core-DKO1ytRW.js} +4 -4
  38. package/dashboard/dist/assets/{mindmap-definition-YRQLILUH-C7HXYEXt.js → mindmap-definition-YRQLILUH-DTmTPHrT.js} +1 -1
  39. package/dashboard/dist/assets/{pieDiagram-SKSYHLDU-DkdZm-YP.js → pieDiagram-SKSYHLDU-CwK80y8Y.js} +1 -1
  40. package/dashboard/dist/assets/{quadrantDiagram-337W2JSQ-DkcRJs5F.js → quadrantDiagram-337W2JSQ-Be1xqW_w.js} +1 -1
  41. package/dashboard/dist/assets/{requirementDiagram-Z7DCOOCP-BaTDVYTl.js → requirementDiagram-Z7DCOOCP-JcspXCs0.js} +1 -1
  42. package/dashboard/dist/assets/{sankeyDiagram-WA2Y5GQK-DvPLbGV5.js → sankeyDiagram-WA2Y5GQK-nJb1BInq.js} +1 -1
  43. package/dashboard/dist/assets/{sequenceDiagram-2WXFIKYE-DQoZ2xMK.js → sequenceDiagram-2WXFIKYE-DUrclEgA.js} +1 -1
  44. package/dashboard/dist/assets/{stateDiagram-RAJIS63D-CS4l0OjM.js → stateDiagram-RAJIS63D-CjinnNtF.js} +1 -1
  45. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-yfclw-nM.js +1 -0
  46. package/dashboard/dist/assets/{timeline-definition-YZTLITO2-aC0iCFCW.js → timeline-definition-YZTLITO2-kM-oVLNz.js} +1 -1
  47. package/dashboard/dist/assets/{treemap-KZPCXAKY-Ie-PFjgx.js → treemap-KZPCXAKY-CYziFlrQ.js} +1 -1
  48. package/dashboard/dist/assets/{vennDiagram-LZ73GAT5-CJN3ExTQ.js → vennDiagram-LZ73GAT5-DX0DbxBN.js} +1 -1
  49. package/dashboard/dist/assets/{xychartDiagram-JWTSCODW-DSiDu1CN.js → xychartDiagram-JWTSCODW-BGqM42ZM.js} +1 -1
  50. package/dashboard/dist/index.html +2 -2
  51. package/dist/dashboard/server.d.ts +5 -0
  52. package/dist/dashboard/server.js +2579 -1185
  53. package/dist/dashboard/server.js.map +1 -1
  54. package/dist/index.js +2092 -650
  55. package/dist/index.js.map +1 -1
  56. package/examples/playbooks/keep-records-updated.md +14 -8
  57. package/examples/playbooks/read-before-plan.md +8 -5
  58. package/examples/sample-project/_status.md +1 -1
  59. package/examples/sample-project/assignments/design-auth-schema/assignment.md +4 -17
  60. package/examples/sample-project/assignments/design-auth-schema/comments.md +26 -0
  61. package/examples/sample-project/assignments/design-auth-schema/progress.md +20 -0
  62. package/examples/sample-project/assignments/implement-jwt-middleware/assignment.md +4 -17
  63. package/examples/sample-project/assignments/implement-jwt-middleware/comments.md +17 -0
  64. package/examples/sample-project/assignments/implement-jwt-middleware/progress.md +20 -0
  65. package/examples/sample-project/assignments/write-auth-tests/assignment.md +4 -8
  66. package/examples/sample-project/assignments/write-auth-tests/comments.md +10 -0
  67. package/examples/sample-project/assignments/write-auth-tests/progress.md +10 -0
  68. package/package.json +1 -1
  69. package/platforms/claude-code/agents/syntaur-expert.md +40 -12
  70. package/platforms/claude-code/references/file-ownership.md +15 -3
  71. package/platforms/claude-code/references/protocol-summary.md +19 -5
  72. package/platforms/claude-code/skills/complete-assignment/SKILL.md +14 -0
  73. package/platforms/claude-code/skills/create-assignment/SKILL.md +12 -10
  74. package/platforms/claude-code/skills/syntaur-protocol/SKILL.md +21 -11
  75. package/platforms/codex/agents/syntaur-operator.md +33 -21
  76. package/platforms/codex/references/file-ownership.md +14 -3
  77. package/platforms/codex/references/protocol-summary.md +19 -5
  78. package/platforms/codex/skills/complete-assignment/SKILL.md +1 -0
  79. package/platforms/codex/skills/create-assignment/SKILL.md +13 -8
  80. package/platforms/codex/skills/syntaur-protocol/SKILL.md +26 -13
  81. package/dashboard/dist/assets/channel-DdltvFFH.js +0 -1
  82. package/dashboard/dist/assets/classDiagram-VBA2DB6C-BHqdFE-8.js +0 -1
  83. package/dashboard/dist/assets/classDiagram-v2-RAHNMMFH-BHqdFE-8.js +0 -1
  84. package/dashboard/dist/assets/clone-CBJOOeOm.js +0 -1
  85. package/dashboard/dist/assets/index-CoVCLSh2.css +0 -1
  86. package/dashboard/dist/assets/index-yyAIuzrP.js +0 -471
  87. package/dashboard/dist/assets/stateDiagram-v2-FVOUBMTO-DkBtE1WJ.js +0 -1
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: "Keep Records Updated"
3
3
  slug: keep-records-updated
4
- description: "Agents must keep assignment.md progress, sessions, and criteria current in real-time"
4
+ description: "Agents must keep assignment.md criteria, progress.md, and related records current in real-time"
5
5
  when_to_use: "After every meaningful action, when completing acceptance criteria, when starting or stopping work"
6
6
  created: "2026-04-02T00:00:00Z"
7
- updated: "2026-04-02T00:00:00Z"
7
+ updated: "2026-04-20T00:00:00Z"
8
8
  tags:
9
9
  - protocol
10
10
  - recordkeeping
@@ -13,18 +13,24 @@ tags:
13
13
  # Keep Records Updated
14
14
 
15
15
  ## After every meaningful action:
16
- - Update the `## Progress` section in assignment.md with what you did
17
- - Use reverse-chronological order (newest first)
18
- - Include timestamps
16
+ - Append a new entry to `progress.md` with what you did
17
+ - Progress entries live in `progress.md` (reverse-chronological order, newest first with a `## <ISO 8601 timestamp>` heading). Do NOT add a `## Progress` section to `assignment.md` — that section is removed as of protocol v2.0.
18
+ - Bump `entryCount` and `updated` in `progress.md`'s frontmatter.
19
19
 
20
20
  ## When you complete an acceptance criterion:
21
- - Check it off in the `## Acceptance Criteria` section immediately
21
+ - Check it off in the `## Acceptance Criteria` section of `assignment.md` immediately
22
22
  - Do not batch these up -- mark them as you go
23
23
 
24
+ ## When you have a question, note, or piece of feedback:
25
+ - Run `syntaur comment <slug-or-uuid> "body" --type question|note|feedback [--reply-to <id>]`
26
+ - Never edit `comments.md` directly — all writes are CLI-mediated
27
+ - Questions carry a `resolved` flag that can be toggled from the dashboard
28
+
24
29
  ## When starting work:
25
- - Add a progress entry noting you've begun and what your approach is
30
+ - Append an entry to `progress.md` noting you've begun and what your approach is
26
31
  - If any plan files exist (plan.md, plan-v2.md, ...), update their task checkboxes as you complete steps
27
32
 
28
33
  ## When stopping or handing off:
29
- - Write a final progress entry summarizing current state
34
+ - Append a final entry to `progress.md` summarizing current state
35
+ - Write a structured handoff entry in `handoff.md`
30
36
  - Note anything the next agent needs to know
@@ -4,7 +4,7 @@ slug: read-before-plan
4
4
  description: "Agents must read all project context files before creating or modifying a plan"
5
5
  when_to_use: "Before creating or modifying any plan file (plan.md, plan-v2.md, ...)"
6
6
  created: "2026-04-02T00:00:00Z"
7
- updated: "2026-04-02T00:00:00Z"
7
+ updated: "2026-04-20T00:00:00Z"
8
8
  tags:
9
9
  - protocol
10
10
  - planning
@@ -14,14 +14,17 @@ tags:
14
14
 
15
15
  Before creating or modifying any plan file (plan.md, plan-v2.md, ...), read these files in order:
16
16
 
17
+ For project-nested assignments:
17
18
  1. `manifest.md` -- understand the project structure
18
19
  2. `project.md` -- understand the goal and scope
19
- 3. `agent.md` -- understand conventions and constraints
20
- 4. `claude.md` (if exists) -- Claude-specific instructions
21
- 5. `assignment.md` -- understand your specific task, acceptance criteria, and dependencies
20
+ 3. `assignment.md` -- understand your specific task, acceptance criteria, and dependencies. Frontmatter includes `project: <slug> | null` and `type: <classification> | null`.
21
+ 4. `progress.md` (if exists) -- reverse-chron log of what has been done on this assignment
22
+ 5. `comments.md` (if exists) -- open questions, notes, and feedback
22
23
  6. `handoff.md` (if exists) -- understand what previous agents did and learned
23
24
  7. `decision-record.md` (if exists) -- understand past decisions and their rationale
24
25
 
26
+ For standalone assignments (at `~/.syntaur/assignments/<uuid>/`), skip `manifest.md` and `project.md` — those only exist for project-nested assignments.
27
+
25
28
  Do NOT skip files because you think you know what's in them. Context from prior agents is often critical.
26
29
 
27
- If the assignment has `dependsOn` entries, read those assignments too -- understand what they produced and any interfaces you need to conform to.
30
+ If the assignment has `dependsOn` entries, read those assignments too -- and read **their** `decision-record.md` first. Upstream decisions are binding constraints you must not silently contradict. (The grab-assignment skill auto-loads these.)
@@ -44,4 +44,4 @@ graph TD
44
44
 
45
45
  - **0 blocked** assignments
46
46
  - **0 failed** assignments
47
- - **1 unanswered** question in [implement-jwt-middleware](./assignments/implement-jwt-middleware/assignment.md)
47
+ - **1 open** question in [implement-jwt-middleware/comments.md](./assignments/implement-jwt-middleware/comments.md)
@@ -2,6 +2,8 @@
2
2
  id: d1e2f3a4-b5c6-7890-abcd-111111111111
3
3
  slug: design-auth-schema
4
4
  title: Design Auth Database Schema
5
+ project: build-auth-system
6
+ type: feature
5
7
  status: completed
6
8
  priority: high
7
9
  created: "2026-03-15T09:30:00Z"
@@ -40,25 +42,10 @@ Design the PostgreSQL database schema for the authentication system. This includ
40
42
 
41
43
  This is the foundational data layer for the auth system. The schema must support the JWT middleware (implement-jwt-middleware) and be testable (write-auth-tests). See [Auth Requirements](../../resources/auth-requirements.md) for functional specs.
42
44
 
43
- ## Questions & Answers
44
-
45
- ### Q: Should we use UUIDs or auto-incrementing integers for user IDs?
46
- **Asked:** 2026-03-16T10:00:00Z
47
- **A:** Use UUIDs (v4). They avoid enumeration attacks and simplify future sharding. Generate them in the application layer, not the database.
48
-
49
- ## Progress
50
-
51
- ### 2026-03-17T10:00:00Z
52
- Completed all migration scripts and schema design. Final schema includes three tables: `users`, `sessions`, and `refresh_tokens`. Added composite index on `sessions(user_id, revoked_at)` for the active-session lookup query. All migrations tested against a clean database. Ready for handoff to JWT middleware implementation.
53
-
54
- ### 2026-03-16T14:00:00Z
55
- Draft schema complete for users and sessions tables. Working on refresh token rotation tracking. Decided to add a `token_family` column to detect reuse of old refresh tokens.
56
-
57
- ### 2026-03-16T09:30:00Z
58
- Started schema design. Reviewed auth requirements document. Planning three tables: users, sessions, refresh_tokens.
59
-
60
45
  ## Links
61
46
 
47
+ - [Progress](./progress.md)
48
+ - [Comments](./comments.md)
62
49
  - [Scratchpad](./scratchpad.md)
63
50
  - [Handoff](./handoff.md)
64
51
  - [Decision Record](./decision-record.md)
@@ -0,0 +1,26 @@
1
+ ---
2
+ assignment: design-auth-schema
3
+ entryCount: 2
4
+ generated: "2026-03-17T10:00:00Z"
5
+ updated: "2026-03-16T10:05:00Z"
6
+ ---
7
+
8
+ # Comments
9
+
10
+ ## c-1
11
+
12
+ **Recorded:** 2026-03-16T10:00:00Z
13
+ **Author:** claude-2
14
+ **Type:** question
15
+ **Resolved:** true
16
+
17
+ Should we use UUIDs or auto-incrementing integers for user IDs?
18
+
19
+ ## c-2
20
+
21
+ **Recorded:** 2026-03-16T10:05:00Z
22
+ **Author:** human
23
+ **Type:** note
24
+ **Reply to:** c-1
25
+
26
+ Use UUIDs (v4). They avoid enumeration attacks and simplify future sharding. Generate them in the application layer, not the database.
@@ -0,0 +1,20 @@
1
+ ---
2
+ assignment: design-auth-schema
3
+ entryCount: 3
4
+ generated: "2026-03-16T09:30:00Z"
5
+ updated: "2026-03-17T10:00:00Z"
6
+ ---
7
+
8
+ # Progress
9
+
10
+ ## 2026-03-17T10:00:00Z
11
+
12
+ Completed all migration scripts and schema design. Final schema includes three tables: `users`, `sessions`, and `refresh_tokens`. Added composite index on `sessions(user_id, revoked_at)` for the active-session lookup query. All migrations tested against a clean database. Ready for handoff to JWT middleware implementation.
13
+
14
+ ## 2026-03-16T14:00:00Z
15
+
16
+ Draft schema complete for users and sessions tables. Working on refresh token rotation tracking. Decided to add a `token_family` column to detect reuse of old refresh tokens.
17
+
18
+ ## 2026-03-16T09:30:00Z
19
+
20
+ Started schema design. Reviewed auth requirements document. Planning three tables: users, sessions, refresh_tokens.
@@ -2,6 +2,8 @@
2
2
  id: d1e2f3a4-b5c6-7890-abcd-222222222222
3
3
  slug: implement-jwt-middleware
4
4
  title: Implement JWT Authentication Middleware
5
+ project: build-auth-system
6
+ type: feature
5
7
  status: in_progress
6
8
  priority: high
7
9
  created: "2026-03-15T09:30:00Z"
@@ -44,25 +46,10 @@ Implement Express.js middleware that validates JWT access tokens on protected ro
44
46
 
45
47
  Depends on the database schema from [design-auth-schema](../design-auth-schema/assignment.md). The schema is complete — see the [handoff notes](../design-auth-schema/handoff.md) for integration details. Key table: `sessions` with `jti` column for token validation. See [Auth Requirements](../../resources/auth-requirements.md) for full specs.
46
48
 
47
- ## Questions & Answers
48
-
49
- ### Q: Should the refresh token endpoint require the old access token or just the refresh token?
50
- **Asked:** 2026-03-18T11:00:00Z
51
- **A:** pending
52
-
53
- ## Progress
54
-
55
- ### 2026-03-18T14:30:00Z
56
- Implemented role-based route guard middleware (`requireRole`). Working on the refresh token endpoint next. The token generation and basic validation middleware are working and passing manual tests. Need to wire up the refresh token rotation logic using the `token_family` pattern from the schema design.
57
-
58
- ### 2026-03-18T10:00:00Z
59
- JWT validation middleware is functional. It extracts the token from the Authorization header, verifies the RS256 signature, checks expiry, and looks up the `jti` in the sessions table to confirm the session is not revoked. Added proper error responses for expired, invalid, and revoked tokens.
60
-
61
- ### 2026-03-17T10:30:00Z
62
- Started implementation. Set up RS256 key pair loading from environment variables. Implemented `generateAccessToken` and `generateRefreshToken` functions. Created the login endpoint that authenticates with bcrypt and returns both tokens.
63
-
64
49
  ## Links
65
50
 
51
+ - [Progress](./progress.md)
52
+ - [Comments](./comments.md)
66
53
  - [Scratchpad](./scratchpad.md)
67
54
  - [Handoff](./handoff.md)
68
55
  - [Decision Record](./decision-record.md)
@@ -0,0 +1,17 @@
1
+ ---
2
+ assignment: implement-jwt-middleware
3
+ entryCount: 1
4
+ generated: "2026-03-18T11:00:00Z"
5
+ updated: "2026-03-18T11:00:00Z"
6
+ ---
7
+
8
+ # Comments
9
+
10
+ ## c-1
11
+
12
+ **Recorded:** 2026-03-18T11:00:00Z
13
+ **Author:** claude-1
14
+ **Type:** question
15
+ **Resolved:** false
16
+
17
+ Should the refresh token endpoint require the old access token or just the refresh token?
@@ -0,0 +1,20 @@
1
+ ---
2
+ assignment: implement-jwt-middleware
3
+ entryCount: 3
4
+ generated: "2026-03-17T10:30:00Z"
5
+ updated: "2026-03-18T14:30:00Z"
6
+ ---
7
+
8
+ # Progress
9
+
10
+ ## 2026-03-18T14:30:00Z
11
+
12
+ Implemented role-based route guard middleware (`requireRole`). Working on the refresh token endpoint next. The token generation and basic validation middleware are working and passing manual tests. Need to wire up the refresh token rotation logic using the `token_family` pattern from the schema design.
13
+
14
+ ## 2026-03-18T10:00:00Z
15
+
16
+ JWT validation middleware is functional. It extracts the token from the Authorization header, verifies the RS256 signature, checks expiry, and looks up the `jti` in the sessions table to confirm the session is not revoked. Added proper error responses for expired, invalid, and revoked tokens.
17
+
18
+ ## 2026-03-17T10:30:00Z
19
+
20
+ Started implementation. Set up RS256 key pair loading from environment variables. Implemented `generateAccessToken` and `generateRefreshToken` functions. Created the login endpoint that authenticates with bcrypt and returns both tokens.
@@ -2,6 +2,8 @@
2
2
  id: d1e2f3a4-b5c6-7890-abcd-333333333333
3
3
  slug: write-auth-tests
4
4
  title: Write Auth System Tests
5
+ project: build-auth-system
6
+ type: feature
5
7
  status: pending
6
8
  priority: medium
7
9
  created: "2026-03-15T09:30:00Z"
@@ -42,16 +44,10 @@ Write comprehensive unit and integration tests for the authentication system, co
42
44
 
43
45
  This assignment depends on [implement-jwt-middleware](../implement-jwt-middleware/assignment.md) being completed. Tests will cover both the schema layer (from design-auth-schema) and the middleware/endpoint layer (from implement-jwt-middleware). Use Jest as the test framework with `supertest` for HTTP integration tests.
44
46
 
45
- ## Questions & Answers
46
-
47
- No questions yet.
48
-
49
- ## Progress
50
-
51
- No progress yet.
52
-
53
47
  ## Links
54
48
 
49
+ - [Progress](./progress.md)
50
+ - [Comments](./comments.md)
55
51
  - [Scratchpad](./scratchpad.md)
56
52
  - [Handoff](./handoff.md)
57
53
  - [Decision Record](./decision-record.md)
@@ -0,0 +1,10 @@
1
+ ---
2
+ assignment: write-auth-tests
3
+ entryCount: 0
4
+ generated: "2026-03-15T09:30:00Z"
5
+ updated: "2026-03-15T09:30:00Z"
6
+ ---
7
+
8
+ # Comments
9
+
10
+ No comments yet.
@@ -0,0 +1,10 @@
1
+ ---
2
+ assignment: write-auth-tests
3
+ entryCount: 0
4
+ generated: "2026-03-15T09:30:00Z"
5
+ updated: "2026-03-15T09:30:00Z"
6
+ ---
7
+
8
+ # Progress
9
+
10
+ No progress yet.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "syntaur",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Project workflow CLI with dashboard, Claude Code plugin, and Codex plugin",
5
5
  "homepage": "https://github.com/prong-horn/syntaur#readme",
6
6
  "repository": {
@@ -46,8 +46,6 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
46
46
  <project-slug>/
47
47
  manifest.md # Derived: root navigation
48
48
  project.md # Human-authored: goal, context, success criteria
49
- agent.md # Human-authored: universal agent instructions
50
- claude.md # Human-authored: Claude Code-specific instructions
51
49
  _index-assignments.md # Derived: assignment summary table
52
50
  _index-plans.md # Derived: plan status summary
53
51
  _index-decisions.md # Derived: decision record summary
@@ -56,6 +54,8 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
56
54
  <assignment-slug>/
57
55
  assignment.md # Agent-writable: source of truth for state (includes ## Todos)
58
56
  plan*.md # Agent-writable: versioned implementation plans (0+, optional)
57
+ progress.md # Agent-writable, append-only: timestamped progress log
58
+ comments.md # CLI-mediated: threaded questions/notes/feedback (via `syntaur comment`)
59
59
  scratchpad.md # Agent-writable: working notes
60
60
  handoff.md # Agent-writable: append-only handoff log
61
61
  decision-record.md # Agent-writable: append-only decision log
@@ -65,6 +65,15 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
65
65
  memories/
66
66
  _index.md # Derived
67
67
  <memory-slug>.md # Shared-writable
68
+ assignments/
69
+ <assignment-id>/ # Standalone assignments — folder = UUID, project: null, slug display-only
70
+ assignment.md
71
+ plan*.md
72
+ progress.md
73
+ comments.md
74
+ scratchpad.md
75
+ handoff.md
76
+ decision-record.md
68
77
  ```
69
78
 
70
79
  ---
@@ -73,18 +82,21 @@ Syntaur is a **markdown-based, filesystem-hosted protocol** that coordinates wor
73
82
 
74
83
  ### Human-Authored (READ-ONLY for agents)
75
84
  - `project.md` — project overview, goal, context, success criteria
76
- - `agent.md` — universal agent instructions
77
- - `claude.md` — Claude Code-specific instructions
78
85
 
79
86
  ### Agent-Writable (single-writer per assignment)
80
- - `assignment.md` — source of truth for assignment state (includes `## Todos` checklist)
87
+ - `assignment.md` — source of truth for assignment state (includes `## Todos` checklist). `## Todos` is also the landing spot for cross-assignment requests.
81
88
  - `plan*.md` — versioned implementation plans (optional, one per `## Todos` entry: `plan.md`, `plan-v2.md`, ...)
89
+ - `progress.md` — append-only timestamped progress log (newest first). Replaces the old `## Progress` body section.
82
90
  - `scratchpad.md` — unstructured working notes
83
91
  - `handoff.md` — append-only handoff log
84
92
  - `decision-record.md` — append-only decision log
85
93
 
86
94
  Only the assigned agent may write to its own assignment folder.
87
95
 
96
+ ### CLI-Mediated Shared-Writable
97
+ - `comments.md` — threaded questions/notes/feedback. Writes via `syntaur comment <slug-or-uuid> "body" --type question|note|feedback [--reply-to <id>]`. Never edit directly.
98
+ - Another assignment's `## Todos` — writes via `syntaur request <source> <target> "text"`. Appends annotated `(from: <source>)`.
99
+
88
100
  ### Shared-Writable (any agent or human)
89
101
  - `resources/<slug>.md` — reference material
90
102
  - `memories/<slug>.md` — learnings discovered
@@ -155,8 +167,14 @@ Only the assigned agent may write to its own assignment folder.
155
167
  | Command | Description |
156
168
  |---------|-------------|
157
169
  | `syntaur create-project <title> [--slug S] [--dir D]` | Create new project with full scaffolding |
158
- | `syntaur create-assignment <title> --project M [--priority P] [--depends-on D] [--slug S]` | Create assignment in a project |
159
- | `syntaur create-assignment <title> --one-off` | Create standalone one-off assignment |
170
+ | `syntaur create-assignment <title> --project M [--priority P] [--depends-on D] [--slug S] [--type T]` | Create assignment in a project |
171
+ | `syntaur create-assignment <title> --one-off [--type T]` | Create standalone assignment at `~/.syntaur/assignments/<uuid>/` (project: null, slug display-only) |
172
+
173
+ ### Coordination (CLI-mediated writes)
174
+ | Command | Description |
175
+ |---------|-------------|
176
+ | `syntaur comment <slug-or-uuid> "body" --type question\|note\|feedback [--reply-to <id>] [--project <slug>]` | Append to `comments.md`. Questions carry a resolve flag toggleable in the dashboard. |
177
+ | `syntaur request <target> "text" [--from <source>] [--project <slug>]` | Append a todo to another assignment's `## Todos`, annotated `(from: <source>)`. |
160
178
 
161
179
  ### State Transitions
162
180
  | Command | Description |
@@ -295,10 +313,14 @@ Adapters embed protocol knowledge (write boundaries, lifecycle states, CLI comma
295
313
 
296
314
  ### Frontmatter Fields by File Type
297
315
 
298
- **assignment.md:** id, slug, title, status, priority, created, updated, assignee, externalIds, dependsOn, blockedReason, workspace (repository, worktreePath, branch, parentBranch), tags
316
+ **assignment.md:** id, slug, title, **project (slug or null)**, **type (string or null)**, status, priority, created, updated, assignee, externalIds, dependsOn, blockedReason, workspace (repository, worktreePath, branch, parentBranch), tags
299
317
 
300
318
  **plan files (plan.md, plan-v2.md, ...):** assignment, status (draft/approved/in_progress/completed), created, updated — zero or more per assignment, each linked from a todo in `assignment.md`'s `## Todos` section
301
319
 
320
+ **progress.md:** assignment, entryCount, generated, updated — body is reverse-chron `## <timestamp>` entries
321
+
322
+ **comments.md:** assignment, entryCount, generated, updated — body entries are `## <id>` with structured metadata lines (Recorded, Author, Type, optional Reply to, optional Resolved)
323
+
302
324
  **handoff.md:** assignment, updated, handoffCount
303
325
 
304
326
  **decision-record.md:** assignment, updated, decisionCount
@@ -307,13 +329,13 @@ Adapters embed protocol knowledge (write boundaries, lifecycle states, CLI comma
307
329
 
308
330
  **manifest.md:** version, project, generated
309
331
 
310
- **_status.md:** project, generated, status, progress (total/completed/in_progress/blocked/pending/review/failed), needsAttention (blockedCount/failedCount/unansweredQuestions)
332
+ **_status.md:** project, generated, status, progress (total/completed/in_progress/blocked/pending/review/failed), needsAttention (blockedCount/failedCount/**openQuestions**). `openQuestions` is counted from every assignment's `comments.md` (entries where `Type: question` and `Resolved: false` or absent).
311
333
 
312
334
  ### Conventions
313
335
  - **Timestamps:** RFC 3339 / ISO 8601 with UTC: `2026-03-18T14:30:00Z`
314
336
  - **Paths:** Absolute expanded form in YAML (never `~`), relative in markdown links
315
- - **Slugs:** Lowercase, hyphen-separated, match folder names
316
- - **Protocol version:** `"1.0"` (string, not number)
337
+ - **Slugs:** Lowercase, hyphen-separated, match folder names (project-nested). For standalone assignments, the folder is named by UUID and `slug` is display-only.
338
+ - **Protocol version:** `"2.0"` (string, not number)
317
339
 
318
340
  ---
319
341
 
@@ -376,7 +398,13 @@ A: Use `/grab-assignment <project-slug>` — it lists pending assignments. Or ch
376
398
  A: No. Single-writer guarantee — one agent per assignment folder. Use separate assignments for parallel work.
377
399
 
378
400
  **Q: What if I need to ask the human a question?**
379
- A: Add it to the Q&A section of assignment.md. Do NOT set status to `blocked` for questions — `blocked` is for runtime obstacles only.
401
+ A: Run `syntaur comment <slug> "question text" --type question`. It appends to `comments.md`, which replaces the old `## Questions & Answers` body section. The question rolls up into `_status.md`'s `openQuestions` counter and shows on the dashboard. Do NOT set status to `blocked` for questions — `blocked` is for runtime obstacles only.
402
+
403
+ **Q: What goes in `progress.md` vs `handoff.md`?**
404
+ A: `progress.md` is a continuous reverse-chron log of what you've done — append an entry per meaningful work unit. `handoff.md` is only written when you hand off work (to another agent or human), and summarizes the state at that transition.
405
+
406
+ **Q: How do I route work to another assignment without breaking the single-writer rule?**
407
+ A: Run `syntaur request <target> "text"` — it appends a todo to the target's `## Todos` annotated `(from: <source>)`. This is a CLI-mediated exception to the single-writer rule.
380
408
 
381
409
  **Q: How do indexes get updated?**
382
410
  A: Derived files are rebuilt by tooling. They are projections of assignment frontmatter. When divergence occurs, re-run rebuild.
@@ -7,8 +7,6 @@ Agents must NEVER modify these files:
7
7
  | File | Location |
8
8
  |------|----------|
9
9
  | `project.md` | `<project>/project.md` |
10
- | `agent.md` | `<project>/agent.md` |
11
- | `claude.md` | `<project>/claude.md` |
12
10
 
13
11
  ## Agent-Writable (YOUR assignment folder ONLY)
14
12
 
@@ -18,11 +16,25 @@ You may ONLY write to files inside your assigned assignment folder:
18
16
  |------|---------|
19
17
  | `assignment.md` | Assignment record, source of truth for state (includes `## Todos` checklist) |
20
18
  | `plan*.md` | Versioned implementation plans (optional, 0 or more: `plan.md`, `plan-v2.md`, ...) — each linked from a todo in `assignment.md` |
19
+ | `progress.md` | Append-only timestamped progress log (newest first). Replaces the old `## Progress` body section. |
21
20
  | `scratchpad.md` | Working notes |
22
21
  | `handoff.md` | Append-only handoff log |
23
22
  | `decision-record.md` | Append-only decision log |
24
23
 
25
- Path pattern: `~/.syntaur/projects/<project>/assignments/<your-assignment>/`
24
+ Path pattern (project-nested): `~/.syntaur/projects/<project>/assignments/<your-assignment>/`
25
+ Path pattern (standalone): `~/.syntaur/assignments/<your-assignment-uuid>/`
26
+
27
+ ## CLI-Mediated Shared-Writable
28
+
29
+ Do NOT edit these files directly. Use the listed CLI commands:
30
+
31
+ | File | Mediator |
32
+ |------|----------|
33
+ | `comments.md` (any assignment) | `syntaur comment <slug-or-uuid> "body" [--type question\|note\|feedback] [--reply-to <id>]` |
34
+ | `## Todos` in another assignment's `assignment.md` (cross-assignment request) | `syntaur request <source> <target> "text"` |
35
+ | Question resolution | `PATCH /api/.../comments/:id/resolved` (dashboard) or toggle in dashboard UI |
36
+
37
+ These are bounded exceptions to the single-writer rule for assignment folders — the CLI serializes writes to avoid conflicts.
26
38
 
27
39
  ## Shared-Writable (any agent or human)
28
40
 
@@ -1,5 +1,7 @@
1
1
  # Syntaur Protocol Summary
2
2
 
3
+ Protocol version: **2.0**
4
+
3
5
  ## Directory Structure
4
6
 
5
7
  ```
@@ -13,12 +15,12 @@
13
15
  _index-plans.md # Derived (read-only)
14
16
  _index-decisions.md # Derived (read-only)
15
17
  _status.md # Derived (read-only)
16
- claude.md # Human-authored: Claude-specific instructions (read-only)
17
- agent.md # Human-authored: universal agent instructions (read-only)
18
18
  assignments/
19
19
  <assignment-slug>/
20
20
  assignment.md # Agent-writable: source of truth for state (includes ## Todos checklist)
21
21
  plan*.md # Agent-writable: versioned implementation plans (optional, 0 or more: plan.md, plan-v2.md, ...)
22
+ progress.md # Agent-writable, append-only: timestamped progress log
23
+ comments.md # CLI-mediated: threaded questions/notes/feedback (via `syntaur comment`)
22
24
  scratchpad.md # Agent-writable: working notes
23
25
  handoff.md # Agent-writable: append-only handoff log
24
26
  decision-record.md # Agent-writable: append-only decision log
@@ -28,6 +30,15 @@
28
30
  memories/
29
31
  _index.md # Derived (read-only)
30
32
  <memory-slug>.md # Shared-writable
33
+ assignments/
34
+ <assignment-id>/ # Standalone assignments — folder named by UUID, `project: null`
35
+ assignment.md # Same schema as project-nested, `slug` is display-only
36
+ plan*.md
37
+ progress.md
38
+ comments.md
39
+ scratchpad.md
40
+ handoff.md
41
+ decision-record.md
31
42
  playbooks/
32
43
  manifest.md # Derived: playbook listing (read-only)
33
44
  <slug>.md # User-authored: behavioral rules for agents
@@ -62,10 +73,13 @@
62
73
  ## Key Rules
63
74
 
64
75
  1. **Assignment frontmatter is the single source of truth** for all assignment state.
65
- 2. **One folder per project**, one subfolder per assignment.
76
+ 2. **Project-nested assignments** live at `projects/<slug>/assignments/<aslug>/` (folder name = slug). **Standalone assignments** live at `assignments/<uuid>/` (folder name = UUID, `project: null`, slug display-only).
66
77
  3. **Derived files** (underscore-prefixed) are never edited manually.
67
78
  4. **Slugs** are lowercase, hyphen-separated.
68
- 5. **Dependencies** are declared via `dependsOn` in assignment frontmatter.
79
+ 5. **Dependencies** are declared via `dependsOn` in assignment frontmatter. Only valid within the same project — standalone assignments cannot declare `dependsOn`.
69
80
  6. An assignment cannot transition from `pending` to `in_progress` while any dependency is not `completed`.
70
81
  7. **Playbooks** in `~/.syntaur/playbooks/` define behavioral rules agents must follow. Read `manifest.md` for a summary, then read each referenced playbook before starting work.
71
- 8. **Todos** in the `## Todos` section of `assignment.md` are an informal markdown checklist. Items may be simple tasks or link to plan files. When a plan is superseded, mark the old todo: `- [x] ~~Execute [plan](./plan.md)~~ (superseded by plan-v2)` — never delete it.
82
+ 8. **Todos** in the `## Todos` section of `assignment.md` are an informal markdown checklist. Items may be simple tasks or link to plan files. When a plan is superseded, mark the old todo: `- [x] ~~Execute [plan](./plan.md)~~ (superseded by plan-v2)` — never delete it. `## Todos` is also the landing spot for cross-assignment requests via `syntaur request`.
83
+ 9. **Progress** is appended to `progress.md` as timestamped entries (newest first). Do not add a `## Progress` section to `assignment.md`.
84
+ 10. **Comments** are appended to `comments.md` via `syntaur comment <slug> "body" [--type question|note|feedback] [--reply-to <id>]`. Never edit `comments.md` directly. Questions carry a `resolved` flag.
85
+ 11. **Cross-assignment work** is requested via `syntaur request <source> <target> "text"` — appends to the target's `## Todos` annotated `(from: <source>)`.
@@ -51,6 +51,20 @@ If any acceptance criteria are unmet OR any todo is still `- [ ]` and not supers
51
51
 
52
52
  If the user says no, stop.
53
53
 
54
+ ## Step 2.5: Append a Final Progress Entry
55
+
56
+ Before writing the handoff, append a final entry to `<assignmentDir>/progress.md` summarizing what was completed. The entry goes at the **top** of the body (reverse-chron order) under a new `## <RFC 3339 timestamp>` heading:
57
+
58
+ ```markdown
59
+ ## <ISO 8601 timestamp>
60
+
61
+ <One paragraph summarizing the final state of work: what was implemented, what verifications passed, and any deliberate scope exclusions.>
62
+ ```
63
+
64
+ Update `progress.md`'s frontmatter: bump `entryCount` and set `updated` to the current timestamp.
65
+
66
+ Do NOT add a `## Progress` section to `assignment.md` — progress entries live exclusively in `progress.md` as of protocol v2.0.
67
+
54
68
  ## Step 3: Write Handoff Entry
55
69
 
56
70
  Read `<assignmentDir>/handoff.md` to see its current content and frontmatter.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: create-assignment
3
3
  description: Create a new Syntaur assignment within a project (or as a one-off)
4
- argument-hint: <title> --project <slug> [--priority <level>] [--depends-on <slugs>] [--one-off]
4
+ argument-hint: <title> --project <slug> [--priority <level>] [--depends-on <slugs>] [--type <type>] [--one-off]
5
5
  allowed-tools:
6
6
  - Bash
7
7
  - Read
@@ -18,10 +18,11 @@ The user provided: $ARGUMENTS
18
18
  Parse the arguments:
19
19
  - First argument (required): the assignment title (e.g., `"Add login endpoint"`)
20
20
  - `--project <slug>` (required unless `--one-off`): the project to add the assignment to
21
- - `--one-off` (optional): create a standalone project+assignment in one step
21
+ - `--one-off` (optional): create a **standalone** assignment at `~/.syntaur/assignments/<uuid>/` with `project: null`. Folder is named by UUID; `slug` is display-only. `--depends-on` is not permitted for standalone assignments.
22
22
  - `--slug` (optional): override the auto-generated assignment slug
23
23
  - `--priority` (optional): `low`, `medium` (default), `high`, or `critical`
24
- - `--depends-on` (optional): comma-separated list of assignment slugs this depends on
24
+ - `--type` (optional): classification such as `feature`, `bug`, `refactor`, `research`, `chore`. Defaults to `feature`. When `~/.syntaur/config.md` defines `types.definitions`, the CLI validates against that list.
25
+ - `--depends-on` (optional, project-nested only): comma-separated list of assignment slugs this depends on
25
26
  - `--dir` (optional): override the default project directory
26
27
 
27
28
  If no title was provided, ask the user what the assignment should be called.
@@ -35,13 +36,13 @@ If there is no active context and no project flag, ask the user which project to
35
36
  Build the command from the parsed arguments. Use `dangerouslyDisableSandbox: true` since the CLI writes to `~/.syntaur/` which is outside the project sandbox.
36
37
 
37
38
  ```bash
38
- syntaur create-assignment "<title>" --project <slug> [--slug <slug>] [--priority <level>] [--depends-on <slugs>] [--dir <path>]
39
+ syntaur create-assignment "<title>" --project <slug> [--slug <slug>] [--priority <level>] [--depends-on <slugs>] [--type <type>] [--dir <path>]
39
40
  ```
40
41
 
41
- Or for one-off:
42
+ Or for one-off (standalone at `~/.syntaur/assignments/<uuid>/`):
42
43
 
43
44
  ```bash
44
- syntaur create-assignment "<title>" --one-off [--slug <slug>] [--priority <level>] [--dir <path>]
45
+ syntaur create-assignment "<title>" --one-off [--slug <slug>] [--priority <level>] [--type <type>] [--dir <path>]
45
46
  ```
46
47
 
47
48
  If the command fails (e.g., project not found, slug collision), report the error and suggest fixes.
@@ -57,9 +58,10 @@ cat ~/.syntaur/projects/<project-slug>/assignments/<assignment-slug>/assignment.
57
58
  ## Step 3: Guide Next Steps
58
59
 
59
60
  Tell the user:
60
- - The assignment was created with its slug, priority, and location
61
- - List the files created (assignment.md, scratchpad.md, handoff.md, decision-record.md). Note that `plan.md` is NOT scaffolded — plan files are optional and created on demand by `/plan-assignment`.
61
+ - The assignment was created with its slug, priority, type, and location. For standalone assignments, the location is `~/.syntaur/assignments/<uuid>/` — note the UUID (not slug) is the folder name.
62
+ - List the files created: `assignment.md`, `progress.md`, `comments.md`, `scratchpad.md`, `handoff.md`, `decision-record.md`. `plan.md` is NOT scaffolded — plan files are optional and created on demand by `/plan-assignment`.
63
+ - Remind the user: `progress.md` is where timestamped progress entries go (not `assignment.md`), and `comments.md` is written only via `syntaur comment <slug-or-uuid> "body" --type question|note|feedback`.
62
64
  - Suggest they edit `assignment.md` to fill in the objective, acceptance criteria, context, and any initial todos. The `## Todos` section accepts simple tasks or markdown links to plan files.
63
65
  - Or suggest running `/plan-assignment` after grabbing — it creates a plan file and auto-appends a linked todo to `## Todos`.
64
- - If dependencies were set, note them
65
- - Suggest running `/grab-assignment <project-slug> <assignment-slug>` to claim and start working on it
66
+ - If dependencies were set, note them. (Standalone assignments cannot declare dependencies.)
67
+ - Suggest running `/grab-assignment <project-slug> <assignment-slug>` (or `/grab-assignment --id <uuid>` for standalone) to claim and start working on it.