@volter/twin-linear
Linear
Local Linear issues, teams, projects and comments for your real SDK. Includes OAuth consent; unsupported operations are documented in the README.
Your World stack
Set up these twins together
In your app’s folder, install the exact choices with the current starter tools:
For a new World, select just these vendors and publishers:
Review the generated bindings and keep each source version in agreement with your manifest and lockfile. An existing World keeps its state and configuration; follow the update guide to change it. Check each release’s Node and kernel requirements before installing.
Your choices stay in this browser. Use several twins together
Mirror UI
Local twin screens with synthetic data · @volter/twin-linear 3.0.6
Setup gives the current installation instructions for @volter/twin-linear 3.0.6. Open the published README for credentials, seeds, supported operations and limits.
Unsupported HTTP operations cannot be identified from this record. Check operation support in Evidence.
README shipped with @volter/twin-linear 3.0.6
These instructions were published with this package. Their tool versions may differ from the current starter cohort. Use Setup to install this version.
A Protocol 3 Linear twin for a workspace’s issue-filing integration and the Linear SDK installed by Twin (demand). It serves Linear’s GraphQL endpoint, OAuth authorization-code installation, token refresh and configured client-credentials grants, workspace/team/project discovery, workflow states, issue creation/update/archive, labels and comments. The customer life and published-example journey define the modeled scope (decisions).
Resources are read back with declared GraphQL refresh queries, including archived issues. Mutation deployment uses the vendored schema to adopt the resource returned by Linear. Refresh-token retries preserve the returned pair during Linear’s documented 30-minute grace. The executor budget stays below the documented API-key request quota.
The World’s doors represent settings/UI actions Linear’s API does not expose:
POST /_twin/workspaces, POST /_twin/workspaces/{urlKey}/people,
POST /_twin/app-credentials and POST /_twin/api-keys. The local credential door
POST /_twin/local-credentials uses those same settings actions to make an idempotent synthetic
starter workspace/owner, issue its personal key and register a World OAuth client. It supplies
LINEAR_API_KEY, LINEAR_CLIENT_ID and LINEAR_CLIENT_SECRET; the personal key names a stored
owner and is retained across stop/resume. Teams and projects are created through the
vendor API. The authorize screen uses the registered callback and carries its state back.
The browser workspace at linear.app/ uses the same stored person and linear_session
cookie as OAuth consent. Sign in with the synthetic email/password supplied to the workspace
or people door. The local credential starter uses owner@linear-world.invalid and
world-linear-local-password; these are the existing synthetic settings inputs, not vendor
credentials. After sign-in the browser opens the first stored team by name. Workspace and
issue addresses use the stored organization urlKey, team key and issue identifier.
The team view (/{urlKey}/team/{key}/all) lists that team's actual nonarchived issues,
grouped by their stored workflow states. Filter by title or identifier and open a row at
/{urlKey}/issue/{identifier}. The detail shows its title, Markdown description, state,
priority, assignee, team, recorded dates and stored comments. Change the status or choose
one assignee (including No assignee) and press Save properties. The form calls the same
issueUpdate action as GraphQL and rereads the stored row after its redirect; unknown
objects, states from another team and unsupported form actions are refused. My issues
provides Assigned and Created views from the stored assignee and creator relations.
Issue rows use compact priority icons and synthetic assignee avatars, with the actual stored
priority and person's name available to assistive technology and as hover labels. The avatar
identifies a stored person; it is not their Linear profile image. Icons and avatars use
brand.volter.ai and require that service to be reachable. Detail properties keep the stored names.
The public My issues and assignment screenshots guide the sidebar, issue rows and right properties panel. Screen references records the exact images, read date, author and declared workflow. This basic browser does not implement Subscribed/Activity tabs, curated SLA/cycle/blocker ordering, keyboard shortcuts, board drag/drop, browser issue creation, editable descriptions or comment posting. Private-team membership and suspended-user assignment enforcement remain outside the existing pack permission scope. Archived issues are hidden from lists and can be read at their known detail address; no manual archive control is presented. OAuth consent remains a separate screen and uses the registered application and callback.
The published relation, logical, date, label, comment, estimate and project-lead filters are served. Other GraphQL fields, private-team access management, webhook configuration, PKCE and OAuth revocation are outside this modeled scope and are refused. The SDK’s default viewer, team and issue selections are modeled for the official SDK 86.0.0's create/update/read flow in the installed customer entry. This does not claim every SDK method. No webhook subscription is made by this life; there is no invented webhook delivery. Release assessments are retained by the independent catalog.
The SDK's unchanged default Organization selection also reads the stored workspace settings, including native nested ProjectStatus/PaidSubscription fields when present. The synthetic starter has no configured project-status records, paid subscription, Slack project integration, customer feature or AI/reminder service. Its inactive settings are explicitly synthetic; empty or nullable state does not implement those features' mutations. The existing local credential door fills only previously absent starter settings on resume and preserves stored values. The kernel maintains the workspace's created issue count from actual issue ownership.
The SDK's normal issue.state lookup reads the existing workflow-state resource by id,
with its native description, archive time, inherited-parent id and team relation. Nullable
values stay absent/null on the synthetic new-team states, and refresh preserves observed
native values. The lookup uses the existing workspace/team visibility and Entity not found
refusals; it does not add workflow creation, inheritance or archive controls.
The normal issue.assignee lookup reads that user's existing native stored profile through
user(id), with the same workspace visibility, authentication and Entity not found refusal.
The default User fields and current-caller isMe behavior are shared with viewer; this
adds no membership, invitation or profile mutation.
Use with an existing app
Use Node 22.6 or newer.
Install the exact twin release and World CLI in your app's folder:
npm install --save-dev --save-exact @volter/world@3.0.165 @volter/twin-linear@3.0.6
./node_modules/.bin/volter world init --name my-app --twins linear --source linear=@volter/twin-linear
Review the selected vendor and generated bindings before starting. The World supplies synthetic credentials; keep your app's real SDK. Read this release's modeled scope below.
./node_modules/.bin/volter world up
./node_modules/.bin/volter world run -- npm test
./node_modules/.bin/volter world log
./node_modules/.bin/volter world down
Replace npm test with your app's usual command. down retains data, and a later up resumes it.
Use these installed executables from the same app folder; install there first if they are missing.
Bring an existing app explains multi-vendor selection and routing.
The app keeps its real @linear/sdk; the packaged customer entry pins 86.0.0.
The World's GET /twin describes identity, time, and the available doors.
The workspace door takes { "name": "Example", "urlKey": "example", "owner": { "name": "Ada", "email": "ada@example.invalid", "password": "example-password" } }.
The people door takes { "name", "email", "password" }; the key door takes { "email", "label" }.
The app door takes { "name", "redirect_uris": ["https://app.example/callback"] };
its optional client_credentials: { workspace: "example", teamIds: [...] } represents
the settings toggle and the app user’s configured team access. All credentials are synthetic.
Profiles, public-team settings, empty optional-feature state, issue relations and counts are stored
in their vendor response shapes and preserved by the declared refresh queries. isMe is resolved
for the current caller. Creator counts include archived issues; team counts exclude them unless
includeArchived: true is requested. The kernel maintains these counters on recorded writes.
The starter leaves cycles, triage, integrations, sharing and automation unconfigured. Its inactive
numeric settings, avatar colors, invitation hashes, app actor email addresses and branch naming are
explicitly synthetic choices where upstream documentation does not declare production defaults.
Mutations for those additional features remain outside scope; absent feature state does not claim
that their behavior is implemented.
Set up this release
Use a Node version matching >=22.3. Install this exact starter cohort in your app folder:
npm install --save-dev --save-exact @volter/world@3.0.165 @volter/world-core@3.0.155 @volter/world-runtime@3.0.163 @volter/world-console@3.0.151 @volter/world-ui@1.0.155 @volter/twin-linear@3.0.6In your app’s folder, initialize a World with this implementation:
./node_modules/.bin/volter world init --name my-app --twins linear --source linear=@volter/twin-linearReview the detected vendor and retain the generated bindings. The linear service’s source must select this version:
{
"source": {
"package": "@volter/twin-linear",
"version": "3.0.6"
}
}This is the source field, not a complete config. Keep the installed version, lockfile and generated service source in agreement. Use the release README for throwaway SDK credentials, seeds and limits.
The assessment records its own earlier tool versions under Measurements. This setup uses the current starter cohort.
Run your app’s own test command inside the World:
./node_modules/.bin/volter world up
./node_modules/.bin/volter world run -- npm test
./node_modules/.bin/volter world log
./node_modules/.bin/volter world downdown stops compute and retains state.
Versions and implementations
| Package / version | Publisher | Status | First use |
|---|---|---|---|
| @volter/twin-linear3.0.6 | volter-ai | Selected default | Passed |
| @volter/twin-linear3.0.5 | volter-ai | live | Passed |
| @volter/twin-linear3.0.4 | volter-ai | live | Passed |
| @volter/twin-linear3.0.3 | volter-ai | live | Journey passed; fresh install not measured |
Evidence for 3.0.6
Unsupported HTTP operations cannot be identified from this record. Consult the release README for limits.
Installed first use · Passed
- Installed first use
- Passed
- Fresh app installation
- Verified
- Workflow scope
- Exact installed artifact; normal CLI initialization, unchanged SDK, result assertions and retained-state read-only resume where applicable
- Customer SDK versions
@linear/sdk@86.0.0- CLI, kernel and runtime versions
@volter/world@3.0.165·@volter/world-core@3.0.155·@volter/world-runtime@3.0.163- World clock
- {"mode":"wall"}
- Retained-state readback
- Verified
- Stopped compute
- Verified
- Customer journey failures
- 0
API coverage, replay and browser measurements
Counts describe the declared HTTP surface, not separate command tables or other protocols. Consult the release README for those workflows.
- Assessment scope
- packaged-customer-journey; in-process
- Declared HTTP surface
- 21 served · 535 gaps · 556 declared operations
- Exercised HTTP operation coverage
- Not measured
- Journey steps
- 54 answered / 58 steps
- Replay
- Equal across 2 runs
- Journey failures
- 0
- Browser target
- HTTP customer journey replay through Chromium at each request origin; authored HTTP headers and observed wire responses 153.0.8010.12
- HTTP operations exercised through Chromium
- Not measured
- Chromium journey replay
- Equal across 2 runs
- Browser response observation
- Transport observes status, headers and body, including redirects and Set-Cookie; these are not JavaScript-visible response claims
- Application-origin CORS coverage
- Not measured
- Native cookie-jar coverage
- Not measured
- DOM coverage
- Not measured
- Source code coverage
- Not measured
- State transition coverage
- Not measured
Conformance results
- decided: 0 failures · every served operation is decided with its demand; every demanded and every refreshed operation is served
- published: 0 failures · what a release publishes holds every unit: its manifest, its spec and its journeys
- cited: 0 failures · every vendor fact cited is recorded as a page that answered, each quote found on it
- refresh: 0 failures · every stored resource of a vendor-backed unit declares how it is read back, and a unit that sends events ingests the vendor's
- registered: 0 failures · a vendor-backed unit, lane or not, reaches the registered pack's state system
- allowance: 0 failures · a rate budget above the fallback rests on the vendor's documented allowance, cited in its manifest
- client: 0 failures · driven by the vendor's own client (its official SDK), served as a World runs it, the vendor's documented behaviour holds · 1 case(s) through the vendor's client
- life: 0 failures · the life walked over HTTP against the pack served as a World runs it, with its scenario: every check held
- standalone: 0 failures · served by its server.ts as a World runs it, the pack answers HTTP and the boot probe, and each declared socket upgrades
Publisher, admission and provenance
- Publisher
- volter-ai/twin-packs-open
- Source commit
- 665cc64954a7f9f95ea8feef24b978e5d9504e8f
- Catalog record commit
- de91ea3a49398b06e0c60f9a8051480b9156eaec
- Package integrity
sha512-WdtzjVAV7LmVl0z6+vZ8lNzPhCk+/JPKUvNbFP8MCHEn8CgtvW9oWBo0TlQF5mwUpy3v+D3e3MifjWdhgZst3g==- Admission mode
- Trusted internal publisher · maintainer merge
- Catalog assessment
- Bundled report checksum verified
- Assessed at
- Not recorded
- Assessment input head
- cf12983827534794ad164a69cbc389c459b95b04
- Evidence
- Assessment and admission
Catalog snapshot · @volter/twin-catalog@0.2.71
- Source commit
943891bdf6d9c7c912371d09abad928343448492- Catalog digest
97b49ec4477102b96f048169aba62b310c39b8bf49c3a910a24c9ef43ac6e36b- Installer integrity
sha512-Uny2d1umJ/a8y6XyMi05K4/t9HBHPIJmTHe0zrrJ+CdyqsKt8E99it8BEXslfC07xN42ttNCYyDgW6ZWBou4vg==
