Skip to content

Glossary

The UI and the user docs use product terms. The code often uses other names. This page maps one to the other.

The UI never says “field”. The code does: a Field is any one entry in a map’s catalogue, whether a measure, a tag or a connection type.

Product term In the code
Measure A row in network.measure. A node’s value is a row in network.node_measure (node_id, measure_id, value). A Field with valueType: 'numeric', subjectType: 'node'.
Tag A row in network.tag. A node carrying it is a row in network.node_tag (node_id, tag_id, tag_group_id). A Field with valueType: 'boolean', subjectType: 'node'.
Tag group A row in network.tag_group. tag.tag_group_id points to it. Every group is exclusive: a node holds at most one tag per group. Not a Field.
Connection type A row in network.connection_type. A connection’s type is network.connection.metric_id, and its value is connection.value (text). A Field with subjectType: 'connection'. On the client a connection’s type is GraphEdge.fieldId.
Field (code only) The Field interface in types/field.ts, a single view over the three catalogue tables. server/functions/fields.ts builds it (rowToMeasure, rowToTag, rowToConnectionType) and is the only code that knows there are separate tables.
(kind of field) FieldKind = 'measure' | 'tag' | 'connection_type', the table a field lives in. kindFor(subjectType, valueType) derives it.
Catalogue, definitions The map’s measures, tags, tag groups and connection types. Every catalogue row has a map_id; nothing in network has an org_id.
Property A key in the properties jsonb column on network.node or network.connection. Freeform, not in the catalogue.
Note (on a connection) connection.properties.reason. The key is NOTE_PROPERTY_KEY (components/map-editor/inspector/connection-property-options.ts) and the only entry in RESERVED_CONNECTION_PROPERTY_KEYS (types/connection.ts). The Properties list hides it.
Undefined connection A connection with no type (metric_id null) and no properties. isConnectionDefined in graph/definedness.ts decides. The editor lists them under Undefined connections; Visualise drops them before computing weights. A connection with only a note counts as defined.
Placed, unplaced network.node.pos_x/pos_y set or null. getGraph returns both; the editor shows placed nodes and lists the rest under Unplaced. set_node_positions places and unplaces.
Product term In the code
Edit, Visualise, Table MapMode = 'edit' | 'visualise' | 'table' (components/map-workspace/mode.ts), set by the mode search param on the map route. Rendered by MapEditor, MapVisualiser and MapTable, all three mounted at once by MapWorkspace.
Workspace panel The left panel: map-wide lists and settings. InspectorSidebar in Edit (the Elements panel: cards Nodes, Connections, Tags, Measures), VizSidebar in Visualise (tabs Visualisation, Visibility filter, Settings). Built from components/map-workspace/layout/side-panel.tsx.
Details panel, entity dock The right panel for the one selected node or connection. EntityDock (components/map-workspace/layout/entity-dock.tsx), collapsed to a rail labelled Details.
Inspector The contents of the entity dock: NodeInspector or EdgeInspector. Visualise mounts the same components without their editing controls. InspectorSidebar is the Edit workspace panel, not the dock.
Product term In the code
Landscape viz_type: 'topology'
Bridges viz_type: 'betweenness_centrality'
Capabilities viz_type: 'metric_clustering', clustered by cluster_tag_ids
Exact, Overlap, Similarity cluster_method: 'exact' | 'overlap' | 'similarity'

The labels and what each mode controls are in VIZ_MODES (components/map-visualiser/lib/viz-modes.ts).

Draw the map from sets config.weight_config, a WeightMode (graph/weight.ts). The control is in components/map-visualiser/panels/connections-panel.tsx.

UI choice WeightMode
All connection types, Count once { kind: 'presence', exclude? } (the default)
All connection types, Pull closer the more they have { kind: 'count', exclude? }
Leaving types out under All connection types the exclude list of type ids
One connection type, Connected or not { kind: 'type', fieldId, byValue: false }
One connection type, Weighted by its value { kind: 'type', fieldId, byValue: true, excludeUnvalued? }
Custom mix (score each type) { kind: 'score', scores, byValue?, excludeUnvalued? }

Visibility filter sets config.filter (types/visualisation.ts). It hides connections and greys out nodes without changing weights or the layout.

Key Meaning
filter.fieldIds Connection types to show. Empty means all.
filter.valueRanges[typeId] { min?, max?, includeEmpty } for a type that records a value.
filter.time { from?, to?, asOf?, includeUndated } (TimeFilter in lib/connection-dates.ts).
filter.nodes A NodeCriteria: nodes it doesn’t pick out grey out.

Nodes (Visualisation tab) sets which nodes the map is drawn from: unplaced ones while config.include_unplaced_nodes is off, and those config.node_scope (a NodeCriteria) leaves out, are removed before anything is weighted or laid out.

A NodeCriteria is { tags?: { op: 'any' | 'none', tagIds, includeUntagged? }[], measures?: Record<measureId, ValueRange> }, every condition applying. The rule is graph/node-criteria.ts, shared by both.

Product term In the code
Saved view A row in app.saved_view holding viewport_state, visualisation_config and step. The SavedView type. Reads and writes in server/lib/saved-views.ts, behind the server functions in server/functions/visualisation.ts and the public API’s view routes.
Progressive reveal, step Saved views with a step (1, 2, 3, …), each leaving out some nodes and connections (node_scope, connection_exclusions, leave_out_unconnected). Stepping from one to the next carries the layout on. See Visualisation internals.
View parameters A view’s visualisation_config, described by the zod schema in lib/view-parameters.ts. Edited raw in the hidden panel (Shift + Alt + P), and through the public API.
Force parameters The numbers each lens’s force layout runs on (lib/force-parameters.ts), overridden per view in forces.
Product term In the code
Edit session A row in app.edit_session. Editor changes go into the user’s one active session on the map (ensureActiveSession). An import or API write gets a closed session of its own (recordStandaloneChange).
Atomic change A row in app.atomic_change with event_type, forward and reverse payloads and a stack_index. Written by captureChange (server/lib/change-capture.ts) on every change to a map’s data or layout. Its type is in DATA_EVENT_TYPES or LAYOUT_EVENT_TYPES.
Recipe, About this map A row in app.map_recipe: body_md markdown on how the map’s data was made, shown as Where it comes from. “Out of date” is stale from app.map_recipe_state. “Confirmed” is validated_by/validated_at; the API calls it validated. See Editing internals.
Revision app.revision, a snapshot of a collapsed session. Nothing writes it yet: collapseSession, undoChange, redoChange and the revision reads throw NOT_IMPLEMENTED.
Product term In the code
Admin organisation_member.role = 'org_admin'
Member organisation_member.role = 'member'
System admin A row in app.system_admin, global rather than per org. app.user_is_system_admin(), assertSystemAdmin(). assertOrgRole lets a system admin through; the network RLS policies don’t.

The role enum app.org_role also contains 'system_admin'. Membership rows use only org_admin and member. See Auth and permissions.

Comments in server/ name the implementation blueprint’s work areas. They group the server functions:

Locality Area File
01 Manual editing server/functions/manual-editing.ts
02 Data upload and ingestion server/functions/data-upload.ts
03 Network visualisation server/functions/visualisation.ts
04 Network storage and revision server/functions/revision.ts
05 Workspace and permissions server/functions/workspace.ts
06 Maintenance server/lib/maintenance.ts

fields.ts, profile.ts and setup.ts carry no locality number.