Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ Important boundaries:
- Required evidence: a scenario workflow, explicit connector loading, publish/trigger execution, operator snapshot, compact audit metadata, and no resolved credential or raw task-payload leakage in connector output/audit.
- First PR shape: add one local pilot scenario that uses the existing `lark_task` dry-run package; no live Lark API call, OAuth, hosted callback, automatic discovery, queue, scheduler expansion, or marketplace behavior.
- Selection result: Loop 36 proved the first product-shaped connector package boundary with `examples/connectors/lark_task_connector.py`.
- Scenario direction: start with a sales renewal risk follow-up flow, because it already has clear owner accountability and a natural task handoff after a control decision.
- Decision gate: only consider live Lark API behavior after the dry-run package works in at least one local pilot workflow with useful operator evidence.
- Deferred: connector marketplace work, dynamic discovery, hosted ingress, production scheduling, OAuth, token refresh systems, and broad SaaS connector catalogs.

Expand Down Expand Up @@ -149,9 +150,12 @@ Status: next engineering loop.

Start condition: Loop 36 has merged with `examples/connectors/lark_task_connector.py` and `python3 scripts/lark_task_connector_smoke.py --work-dir /tmp/skill2workflow-lark-task-connector`.

Recommended first scenario: sales renewal risk follow-up. The workflow should accept durable trigger input for account, renewal risk, owner, and due date; pass through a controlled decision point; then invoke the `lark_task` dry-run connector to create an owner follow-up task. The pilot should prove the business handoff and operator evidence, not live task creation.

Initial PR boundary:

- Add one generated local pilot workflow that uses `lark_task` to create a dry-run task after a controlled business decision point.
- Expose a deterministic smoke command, expected shape: `python3 scripts/lark_task_pilot_smoke.py --work-dir /tmp/skill2workflow-lark-task-pilot`.
- Reuse explicit connector loading through `load_external_connector(...)`; do not add registry auto-discovery.
- Keep `operation: create_task` and `mode: dry_run`; do not call the live Lark/Feishu API.
- Preserve credential-handle behavior and compact audit metadata from Loop 36.
Expand Down Expand Up @@ -179,6 +183,7 @@ Loop 37 acceptance evidence:
Loop 37 verification commands:

- `PYTHONPATH=src python3 -m unittest discover -s tests -v`
- `python3 scripts/lark_task_pilot_smoke.py --work-dir /tmp/skill2workflow-lark-task-pilot`
- `python3 -m py_compile src/skill2workflow/*.py`
- `python3 scripts/secret_hygiene.py examples/workflows`
- `git diff --check`
Expand All @@ -196,7 +201,7 @@ Loops 24-36 are now historical execution evidence and are tracked in the Complet

| Loop | Status | Goal | Expected artifact |
| --- | --- | --- | --- |
| Loop 37: Product Connector Pilot Scenario | Next | Use the first connector package in one local pilot scenario without hosted callbacks or marketplace behavior | scenario workflow, operator snapshot, compact audit evidence |
| Loop 37: Product Connector Pilot Scenario | Next | Use the first connector package in one local pilot scenario without hosted callbacks or marketplace behavior | sales renewal risk workflow, `lark_task_pilot_smoke.py`, operator snapshot, compact audit evidence |
| Loop 38: Live Connector Readiness Review | Candidate | Decide whether live Lark/Feishu API behavior is justified after dry-run pilot evidence | decision note, risk checklist, scoped implementation plan |

Loop selection rules:
Expand Down
24 changes: 24 additions & 0 deletions tests/test_product_connector_pilot_roadmap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from pathlib import Path
from unittest import TestCase


ROOT = Path(__file__).resolve().parents[1]


class ProductConnectorPilotRoadmapTests(TestCase):
def test_loop_37_product_connector_pilot_is_scoped(self):
roadmap = (ROOT / "ROADMAP.md").read_text(encoding="utf-8")

self.assertIn("Active loop: Loop 37, Product Connector Pilot Scenario", roadmap)
self.assertIn("| Loop 36: First Product Connector Package Smoke | Complete |", roadmap)
self.assertIn("| Loop 37: Product Connector Pilot Scenario | Next |", roadmap)
self.assertIn("| Loop 38: Live Connector Readiness Review | Candidate |", roadmap)

self.assertIn("sales renewal risk follow-up", roadmap)
self.assertIn("controlled decision point", roadmap)
self.assertIn(
"python3 scripts/lark_task_pilot_smoke.py --work-dir /tmp/skill2workflow-lark-task-pilot",
roadmap,
)
self.assertIn("do not call the live Lark/Feishu API", roadmap)
self.assertIn("Credential values remain outside Workflow DSL", roadmap)
Loading