Skip to content

Add generic tracker interface with Linear adapter - #102

Merged
frantic-openai merged 3 commits into
mainfrom
codex/generic-trackers
Jul 18, 2026
Merged

Add generic tracker interface with Linear adapter#102
frantic-openai merged 3 commits into
mainfrom
codex/generic-trackers

Conversation

@frantic-openai

@frantic-openai frantic-openai commented Jul 18, 2026

Copy link
Copy Markdown
Collaborator

Context

Symphony's scheduler was coupled to Linear types, reads, and mutations, making a second ticketing system require core orchestration changes.

TL;DR

Introduce a generic tracker boundary while keeping Linear as the first adapter.

Summary

  • Normalize scheduler inputs through Tracker.Issue and two read operations.
  • Keep Linear GraphQL mutations in a session-bound provider-native tool.
  • Move provider config under tracker.provider with legacy Linear aliases.
  • Make SPEC generic and document Linear's concrete adapter profile.
  • Harden secret isolation, bound config snapshots, and provider validation.
  • Use collision-resistant workspace keys as a clean cut, without migration code.

Alternatives

  • A lowest-common-denominator write API was rejected because it would leak provider semantics or discard useful capabilities.
  • A plugin system and full multi-provider rollout were deferred until a second adapter proves the smallest useful boundary.

Test Plan

  • make -C elixir all
  • mise exec -- mix test test/symphony_elixir/dynamic_tool_test.exs test/symphony_elixir/extensions_test.exs test/symphony_elixir/workspace_and_config_test.exs test/symphony_elixir/app_server_test.exs
  • No-context SPEC probes: TypeScript 6/6, Python 6/6, and Go passed.
  • Live Linear smoke: local daemon processed FST-5 to Done, wrote one comment, and cleaned its workspace.

frantic-openai and others added 3 commits July 17, 2026 19:46
Summary:
- Replace the Linear-shaped scheduler contract with a generic Issue model
  and two read operations for state polling and opaque-ID refreshes.
- Keep Linear richness behind its adapter and provider-native
  linear_graphql tool, bound to one app-server session.
- Execute tracker tools host-side, strip declared tracker secret env vars
  from child processes, and document the generic contract in SPEC.md.
- Add coverage for scope-aware refreshes, fail-closed dispatchability,
  workspace-key collisions, auth isolation, and hot-reload binding.

Rationale:
- A narrow read kernel keeps the orchestrator portable without flattening
  provider-specific mutations into a lowest-common-denominator CRUD API.
- Opaque dispatch IDs, native_ref, and adapter-derived dispatchable preserve
  provider semantics while avoiding duplicate agent authentication.

Tests:
- mise exec -- make all
- TypeScript, Python, and Go no-context SPEC probes

Co-authored-by: Codex <codex@openai.com>
Summary:
- Align SPEC, Linear profile, and workflow with the generic tracker contract.
- Keep provider tools session-bound and scrub tracker credentials after login
  shell startup.
- Validate Linear provider settings and keep workspace keys collision-resistant.

Rationale:
- Final review found contract ambiguities and auth/config edge cases.
- Keep the clean-cut design focused; no legacy workspace migration paths.

Tests:
- mise exec -- mix test test/symphony_elixir/dynamic_tool_test.exs
  test/symphony_elixir/extensions_test.exs
  test/symphony_elixir/workspace_and_config_test.exs
  test/symphony_elixir/app_server_test.exs
- mise exec -- make -C elixir all

Co-authored-by: Codex <codex@openai.com>
@frantic-openai
frantic-openai merged commit 7af5a76 into main Jul 18, 2026
3 checks passed
@frantic-openai
frantic-openai deleted the codex/generic-trackers branch July 18, 2026 05:01
KimWonJun added a commit to KimWonJun/symphony-fork that referenced this pull request Jul 19, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant