Telescope access¶
This page is the owner-facing model for who can observe with your telescope and how their time is prioritized. There are four things to know:
- Telescope ownership — who has full administrative control.
- Observing queues — the prioritized lanes that time on your telescope is divided into.
- Queue access grants — who can hold time on a given queue.
- Observing accounts — how those grants are bundled and presented to the people actually submitting observations.
Together these let you delegate time without delegating control, and share the telescope across audiences (institutional research, education, external collaborators, ToO follow-up) without conflating them.
New here, and someone just asked you for access? Skip to Three ways to grant someone access — the sections above define the pieces it refers back to.
Telescope ownership¶
Telescopes are owned by an entity — either an organization or an individual user. The owner has full administrative control: configuration, queues, access policy, and the ability to flip the telescope between automated and manual control.
A telescope's owner can additionally issue
TelescopeAccessGrants that delegate read, update, or delete
authority on the telescope record itself to other users, organizations,
or groups — useful for shared operations between a host institution and
a collaborating group.
Observing queues¶
Each telescope carries an ordered list of observing queues. A queue is a named lane of time — e.g. Maintenance, General Observing, ToO (target of opportunity), Education — and the order on the telescope is its priority order. The scheduler tries to satisfy higher queues first; lower queues fill remaining time.
Each queue has its own prioritization model, which orders the queue's access grants:
- Fixed — grant priorities you set by hand; they don't change as time is used. Best for fully manual allocation policies and ToO lanes.
- Fair-share — grant priorities adjust dynamically so each
grantee trends toward their ownership fraction (
shares), measured on contested time only — time used while nobody else was waiting is free and can't be hoarded. Available at two scopes: telescope-wide or queue-local. Best for fairness across many users. - Calendar — time on the queue is distributed according to a schedule (e.g. "this group has Mondays, that one has Tuesdays").
Queues are the right tool for coarse allocation policy ("classroom gets 20% of contested time"); within a grantee's slice of a queue, the grantee's own account ordering and observation priorities take over. The full comparison ladder — queue order → grant order → account order → observation order — is spelled out in Scheduler prioritization.
Queue access grants¶
An ObservingQueueAccessGrant says "this entity is allowed to put
observations through this queue, with this much weight." Grants can be
issued to users, organizations, or groups, and they can be revoked at
any time.
A queue without any access grants is reachable only by the telescope owner. As you grant access, you build up the audience of the queue.
Observing accounts¶
An observing account is what observers see — the practical handle they submit observations against. Internally it's a bundle of one or more queue access grants, possibly spanning multiple telescopes, aggregated under a single owner.
That layer exists for four reasons:
- Resource aggregation. A consortium with grants on five different telescopes can aggregate them into one observing account so its members don't have to think about which queue to hit for each request — the scheduler picks among eligible telescopes.
- Permission delegation. The account's owner controls who can submit observations through it. A research group lead can give submit-rights to their students without those students being personally grant-holders on the underlying queues.
- Quota throttling. Both the account and each grant under it
can carry one or more quotas
—
(period, max_credits)rules that cap how much can be spent within a window. Multiple quotas compose (a lifetime cap plus a rolling weekly cap, for example); all active quotas must be satisfied. This is where a parent grant can say "this delegated subaccount may not consume more than X per week" independently of the overall pool's policy. - Prioritization within the grantee's slice. Accounts (and the
subaccounts under them) carry an
order, so an entity can decide how its own slice of a queue divides under contention — research account ahead of outreach account, thesis students ahead of intro sections. None of this affects other grantees or your queue configuration; it only orders work inside the slice you granted. See Scheduler prioritization.
So the flow is: owner → grants → account → observer. The owner issues queue access grants to entities. Those entities create observing accounts that bundle their grants. Members of those entities submit observations through the accounts.
Three ways to grant someone access¶
Everything above is the machinery. In practice, when someone asks to observe with your telescope, you're choosing between three routes — and the real difference between them is who ends up owning the observations, and how much oversight you keep.
| Route | The recipient gets… | Observations owned by | You keep control of | Best for |
|---|---|---|---|---|
| 1. Direct queue access | Time on your queue(s), plus the ability to create and run their own observing accounts | The recipient | The queue's share and prioritization; revoking the grant | A partner or group you want running its own program |
| 2. Member grant on your observing account | Permission to submit through an observing account you own | You, the observing account's owner | Everything — the observing account, its grants, quotas, and the observations | Programs you want to oversee and keep institutional |
| 3. Delegated grant on your observing account | An observing subaccount they own, funded from your allocation | The recipient | A quota on the delegation and a revoke switch — nothing more | External collaborators who must own their own data |
The difference that matters is which side of the ownership boundary each route lands on — routes 1 and 3 cross into the recipient's space, route 2 stays in yours:
flowchart LR
OWN["You — telescope owner"]:::owner
subgraph YOURS["Your org's space · your org owns the observations"]
direction TB
MEMBER["Member / group<br>in your org"]:::node
ACCT["Observing account<br>you own"]:::node
MEMBER -->|"Route 2 · Member grant"| ACCT
end
subgraph THEIRS["Recipient's space · the recipient owns the observations"]
direction TB
ROOT["Their own root<br>observing account"]:::node
SUB["A subaccount<br>they own"]:::node
end
OWN -->|"Route 1 · Queue access grant"| ROOT
OWN --> ACCT
ACCT -->|"Route 3 · Delegated grant"| SUB
classDef owner fill:#eaf7f0,stroke:#2e7d32,stroke-width:1.5
classDef node fill:#f8fafc,stroke:#94a3b8,stroke-width:1
style YOURS fill:#eaf7f0,stroke:#2e7d32,stroke-width:1
style THEIRS fill:#fff7ed,stroke:#ea580c,stroke-width:1
1. Give direct queue access¶
Issue the entity a TelescopeAccessGrant (with a number of shares) and
one or more ObservingQueueAccessGrants. This puts time directly in
their hands: a root account is only funded by queues its owner already
holds grants for, so holding a queue access grant is what lets an
entity stand up usable observing accounts of its own. From there the
recipient is self-sufficient — they can bundle your queues with grants on
other telescopes into a single account, add member grants for their own
people, and delegate their own subaccounts to outside collaborators.
- You keep control of the allocation — the queue's share, and
whether its priority is
fixed, calendar, or fair-share.
Fair-share holds each grantee to their
sharesautomatically. - You give up visibility into individual observations; they belong to the recipient, in the recipient's space.
- Reach for this when you want a collaborator to run their own program and manage their own people, and you only need to govern how much telescope time they get and at what priority.
2. Add them to an account you own (member grant)¶
Create an observing account owned by your organization and issue the
person a MemberObservingGrant (or a GroupObservingGrant for a whole
group, or rely on the automatic OwnerObservingGrant that lets every org
member submit). They can now submit observations through the account —
but the account, and everything submitted through it, stays owned by
your organization. The member can't pull that account into their
personal space, and you retain the right to see, examine, and modify what
they submit.
- You keep full oversight: you own the account, its grants, its quotas, and the observations themselves. Per-grant quotas let you cap each member independently.
- You give up nothing on the ownership side — but the member can't take "their" observations with them; the data is institutional.
- Reach for this when the organization wants to run and be accountable for the observing — staff working under an institutional allocation, a PI's students observing under the PI's account, a class whose data the department retains.
Member and group grants are intra-organization: they route through your org's membership and roles. To bring in someone outside your organization, use route 3.
3. Delegate a subaccount they own (delegated grant)¶
From an account you own, invite an external user or organization with an
ExternallyManagedObservingGrant. When they accept, Skynet creates a
subaccount owned by them, hanging off your account. They see it in
their own space and fully own everything they submit through it — the
subaccount draws on the queues your parent account already exposes, but
adds no new access of its own.
- You keep exactly three levers: attach a quota to the delegation to cap how much they consume, revoke the delegation, or archive your own node. Credit usage still rolls up to you (so quotas work and you can watch aggregate consumption) — but the observations are theirs, and you have no authority to view or modify them.
- You give up oversight of their individual observations. If you need to inspect or manage their data, that's route 2, not this.
- Reach for this when an outside partner or consortium member must own their own data and manage their own people, while drawing time from your allocation under a spending cap you control.
For the same delegation within your own organization — a class or lab that manages itself day-to-day while the data stays org-owned — use a
GroupManagedObservingGrantinstead: the subaccount is owned by your organization but managed by the group.
The same tools at every level¶
These routes aren't mutually exclusive, and they compose. The moment you use route 1 to give an entity direct queue access, that entity gets the same three choices for its own members and partners — member grants inside its org, delegated subaccounts for outsiders. Access fans out down a tree, and at every node the owner governs only its own slice: share and priority above, ownership and oversight below.
In the web app¶
The owner-facing UI for this lives in the React port at:
org-telescope-queues.tsx— edit queues, their order, and prioritization models.org-telescope-access-grants.tsx— manage telescope-level access grants.org-settings-observing-policy.tsx— observing policy and operational constraints.
The Angular site has equivalents under
apps/website/src/app/features/entity/telescopes/.
Reference¶
ObservingQueueAccessGrant Schema¶
Properties¶
| Name | Type | Description |
|---|---|---|
| id | Integer |
The unique identifier for the queue access grant. |
| queue_id | Integer |
The ID of the queue to which the allocation belongs. |
| telescope_access_grant_id | Integer |
The ID of the telescope access grant providing access to this queue. |
| order | Integer |
The order used to prioritize this allocation within the queue. Lower values are higher priority. |
| revoked | Boolean |
Whether this allocation has been revoked. If true, the allocation is no longer valid. |
| effective_order | Integer |
The effective order used to prioritize thisa llocation within the queue, taking into account the queue's prioritization policy and the allocation's own priority. |
| time_used | Float |
The total time used by the account regardless of whether it was contested or not. |
| time_contested | Float |
The total time used by the account when sibling accounts also had observations which could have been scheduled. |
| time_waiting | Float |
The total time that the other accounts used while this account was waiting for its observations to be scheduled. |
| observing_policy_id | Integer (Optional) |
No description |
Relationships¶
| Relationship Name | Type |
|---|---|
| queue | ObservingQueue |
| telescope_access_grant | TelescopeAccessGrant |
| observing_accounts | ObservingAccount |
| observing_policy | ObservingPolicy |
ObservingAccount Schema¶
Properties¶
| Name | Type | Description |
|---|---|---|
| id | Integer |
Unique identifier of the observing account. |
| owner_id | Integer |
No description |
| managing_group_id | Integer (Optional) |
No description |
| name | String(256) (Optional) |
No description |
| slug | String(256) (Optional) |
No description |
| source_account_id | Integer (Optional) |
The ID of the parent node in the hierarchy. Null if this node is a root. |
| source_account_grant_id | Integer (Optional) |
The ID of the delegated observing grant that links this subaccount to its parent. Composite FK in table_args enforces that the grant's account_id matches source_account_id. |
| path | LtreeType() (Optional) |
The materialized path using the PostgreSQL ltree type, representing the hierarchical structure for efficient querying. [Automatically set by trigger] |
| credits_used | Float |
No description |
| is_deleted | Boolean |
Whether the observing account has been archived. |
| order | Integer |
The order used to prioritize the account among its siblings. Lower values are higher priority. |
| last_activity_on | DateTime (Optional) |
No description |
| observing_policy_id | Integer (Optional) |
No description |
Relationships¶
| Relationship Name | Type |
|---|---|
| observing_policy | ObservingPolicy |
| owner | Entity |
| managing_group | Group |
| observing_grants | ObservingGrant |
| quotas | ObservingQuota |
| queue_access_grants | ObservingQueueAccessGrant |
| source_account_grant | DelegatedObservingGrant |
| source_account | ObservingAccount |
| subaccounts | ObservingAccount |
| ancestors | ObservingAccount |
| descendants | ObservingAccount |
| root_account | ObservingAccount |