Devops Measurement
Observe DevOps team effectiveness through cross-boundary collaboration. Watches the tools an organization already uses (GitLab, Redmine, Teams, CloudTrail), records each activity as an immutable event tagged with the crew that performed it and the crew that benefited, and surfaces the people whose help crosses crew boundaries most often and most effectively — the force multipliers.
An observation engine, not a system of record: events are append-only, crews and members are reference data, and scoring is a pure function of the accumulated event history that can be re-run at any time.
Contexts (models)
- crew-reference — roster of members→crews and resources→crews
- collect-gitlab / collect-redmine / collect-teams / collect-cloudtrail —
one translation model per source; each
syncemits uniform events - events — the deduplicated, append-only event log (
aggregate) - scoring — cross-boundary ratio, reach, tier, force-multiplier (
score) - interaction-graph — HELPED graph and centrality (
build)
Realizes the design in the measurement system's DDD design docs (Milestone 9: swamp integration).
2026.09.01.1
Added: Initial release — an observation engine for DevOps cross-boundary collaboration, realizing the measurement system's DDD design (Milestone 9: swamp integration) swamp-natively.
Shared kernel (_lib/event.ts, not a model): the uniform event schema, the
newEvent factory, the single cross-boundary predicate, and a deterministic
eventId (content hash of an activity's stable identity) used as each event's
resource instance name — so swamp's versioned data deduplicates re-observations
instead of accumulating them.
Models:
- crew-reference — crews, members, and resource→crew mappings as one
versioned snapshot.
loadenforces one-crew-per-resource and known-crew invariants;derivebuilds the roster swamp-natively from GitLab group membership plus a crew taxonomy. - collect-gitlab — translates GitLab merge-request reviews, comments, and
commits into events. Emits
mr_review,mr_comment,commit; carries the paired merge timestamp for unblock-rate scoring. - collect-redmine — translates Redmine issue journals into
redmine_commentevents; drops empty-note journals; derives first-response timing. - collect-teams — translates Teams channel messages into
teams_messageevents; @mentions become helped users. - collect-cloudtrail — translates CloudTrail write events into
cloudtrailevents with an always-empty target crew (breadth, not cross-crew help — these never count as cross-boundary). - events — unions the collector batches, applies the rolling window once, and dedups by eventId into one canonical event set.
- scoring — cross-boundary ratio, cross-crew count, crew reach, depth,
unblock rate, and median response time (hours); classifies tiers; computes a
six-month trend (
trend) comparing a prior run to the current one. Does not set centrality/rank — that is the graph model's job. - interaction-graph — Person nodes and HELPED edges from all cross-boundary activity. Centrality is PageRank over the HELPED graph (a pure power-method, no external graph database), with normalized in-degree as the documented fallback when the graph has no edges. Also computes each person's inverse bus-factor contribution and detects hubs and bridges.
Report:
- force-multiplier (workflow scope) — joins scores with graph centrality, re-classifies tiers (centrality gates Tier 1), and renders the tier table plus hub/bridge network summary. Degrades, never throws.
Workflow:
- measure — collect (four sources, parallel) → aggregate → score ‖ graph → force-multiplier report. Steps wire prior models' data via CEL.
Weights and the cross-boundary rule are preserved exactly from the reference Go implementation as core policy. PageRank centrality, the six-month trend, and the inverse bus-factor signal — deferred in early drafts — are implemented and exercised in this release. Interactive dashboard filters remain out of scope. CloudTrail collection is built but stays dark until a matching activity-source upstream model exists.
Upgrade note: First version. No prior state to migrate.
Global Arguments
| Argument | Type | Description |
|---|---|---|
| organization | string | Optional label for the organization this reference set describes |
| Argument | Type | Description |
|---|---|---|
| crews | array | Crews to load |
| members | array | Members to load |
| mappings | array | Resource→crew mappings to load |
| Argument | Type | Description |
|---|---|---|
| memberLists | array | Array of @webframp/gitlab list_members envelopes (each |
| crewMap | array | Project→crew assignment: the organization's crew taxonomy, which GitLab |
| crewNames | array | Optional crew display names as {id, name} entries. Crews not listed |
Resources
| Argument | Type | Description |
|---|---|---|
| mergeRequestLists | array | Array of @webframp/gitlab list_merge_requests result envelopes |
| mrNotesLists | array | Array of @webframp/gitlab list_mr_notes result envelopes (each |
| commitLists | array | Array of @webframp/gitlab list_commits result envelopes (each |
Resources
| Argument | Type | Description |
|---|---|---|
| issues | array | Array of @webframp/redmine get_issue issue-detail records (each |
Resources
| Argument | Type | Description |
|---|---|---|
| channels | array | Array of @webframp/microsoft/teams channelMessages envelopes (each |
Resources
| Argument | Type | Description |
|---|---|---|
| events | array | Array of @swamp/aws/cloudtrail per-event records (self-contained). |
Resources
| Argument | Type | Description |
|---|---|---|
| batches | array | Per-collector event batches (from each collect_* model) |
| windowHours | number | Rolling window in hours (default 2160h ≈ 90 days, matching the Go |
Resources
| Argument | Type | Description |
|---|---|---|
| events | array | Canonical windowed events (data.latest of the events model) |
| weights | record | Optional event-type weight overrides; defaults to core policy |
| tiers | array | Optional tier definitions; defaults to the core policy tiers |
| Argument | Type | Description |
|---|---|---|
| current | array | Current per-member scores (from the latest scores-current) |
| prior | array | Prior per-member scores (from an older scores-current version) |
| threshold | number | Minimum |ratio change| to be called rising/falling vs. steady |
| windowLabel | string | Human label for the comparison window (e.g. '90d vs 6mo ago') |
Resources
| Argument | Type | Description |
|---|---|---|
| events | array | Canonical windowed events (data.latest of the events model) |
| hubThreshold | number | Min in-degree to be flagged a hub |
| bridgeThreshold | number | Min distinct crews helped to be flagged a bridge |
Resources
Observe DevOps cross-boundary collaboration end to end and produce the force-multiplier report. The swamp-native realization of the Go collect→score→serve pipeline: the GitLab collector translates already-fetched GitLab activity into uniform events; the aggregation step unions and windows them into one canonical set; scoring and the interaction graph then run in parallel over that identical set; and the workflow-scope report joins scores with graph centrality, re-classifies tiers (centrality ga
Force-multiplier report: joins cross-boundary scores with interaction
- Has README or module doc2/2earned
- README has a code example1/1earned
- README is substantive1/1earned
- Most symbols documented1/1earned
- No slow types (deprecated)1/1earned
- Dependencies pass trust audit2/2earned
- Has description1/1earned
- Platform support declared (or universal)2/2earned
- License declared1/1earned
- Verified public repository2/2earned