Skip to main content

Devops Measurement

@webframp/devops-measurementv2026.09.01.1· 9d agoMODELSWORKFLOWSREPORTS
01README

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 sync emits 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).

02Release Notes

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. load enforces one-crew-per-resource and known-crew invariants; derive builds 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_comment events; drops empty-note journals; derives first-response timing.
  • collect-teams — translates Teams channel messages into teams_message events; @mentions become helped users.
  • collect-cloudtrail — translates CloudTrail write events into cloudtrail events 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.

03Models8
@webframp/devops-measurement/crew-referencev2026.09.01.1devops-measurement/crew_reference.ts

Global Arguments

ArgumentTypeDescription
organizationstringOptional label for the organization this reference set describes
fn load(crews: array, members: array, mappings: array)
Load the crew reference set: crews, members, and resource→crew
ArgumentTypeDescription
crewsarrayCrews to load
membersarrayMembers to load
mappingsarrayResource→crew mappings to load
fn derive(memberLists: array, crewMap: array, crewNames: array)
Derive the crew reference from @webframp/gitlab list_members
ArgumentTypeDescription
memberListsarrayArray of @webframp/gitlab list_members envelopes (each
crewMaparrayProject→crew assignment: the organization's crew taxonomy, which GitLab
crewNamesarrayOptional crew display names as {id, name} entries. Crews not listed

Resources

reference(infinite)— Snapshot of crews, members, and resource→crew mappings
@webframp/devops-measurement/collect-gitlabv2026.09.01.1devops-measurement/collect_gitlab.ts
fn sync(mergeRequestLists: array, mrNotesLists: array, commitLists: array)
Translate raw GitLab activity (merge requests with approvers/merge
ArgumentTypeDescription
mergeRequestListsarrayArray of @webframp/gitlab list_merge_requests result envelopes
mrNotesListsarrayArray of @webframp/gitlab list_mr_notes result envelopes (each
commitListsarrayArray of @webframp/gitlab list_commits result envelopes (each

Resources

events(infinite)— Cross-source events translated from GitLab activity
@webframp/devops-measurement/collect-redminev2026.09.01.1devops-measurement/collect_redmine.ts
fn sync(issues: array)
Translate Redmine issue journals (from @webframp/redmine get_issue,
ArgumentTypeDescription
issuesarrayArray of @webframp/redmine get_issue issue-detail records (each

Resources

events(infinite)— Events translated from Redmine issue journals
@webframp/devops-measurement/collect-teamsv2026.09.01.1devops-measurement/collect_teams.ts
fn sync(channels: array)
Translate Teams channel messages (from @webframp/microsoft/teams,
ArgumentTypeDescription
channelsarrayArray of @webframp/microsoft/teams channelMessages envelopes (each

Resources

events(infinite)— Events translated from Teams channel messages
@webframp/devops-measurement/collect-cloudtrailv2026.09.01.1devops-measurement/collect_cloudtrail.ts
fn sync(events: array)
Translate CloudTrail write events (from @swamp/aws/cloudtrail, wired
ArgumentTypeDescription
eventsarrayArray of @swamp/aws/cloudtrail per-event records (self-contained).

Resources

events(infinite)— Events translated from CloudTrail write activity
@webframp/devops-measurement/eventsv2026.09.01.1devops-measurement/events.ts
fn aggregate(batches: array, windowHours: number)
Union the collector event batches, apply the rolling window cutoff
ArgumentTypeDescription
batchesarrayPer-collector event batches (from each collect_* model)
windowHoursnumberRolling window in hours (default 2160h ≈ 90 days, matching the Go

Resources

aggregated(infinite)— Canonical windowed, deduped event set for scoring + graph
@webframp/devops-measurement/scoringv2026.09.01.1devops-measurement/scoring.ts
fn score(events: array, weights: record, tiers: array)
Score every member from the canonical aggregated event set (wired
ArgumentTypeDescription
eventsarrayCanonical windowed events (data.latest of the events model)
weightsrecordOptional event-type weight overrides; defaults to core policy
tiersarrayOptional tier definitions; defaults to the core policy tiers
fn trend(current: array, prior: array, threshold: number, windowLabel: string)
Compute per-member trend between a prior scoring run and the current
ArgumentTypeDescription
currentarrayCurrent per-member scores (from the latest scores-current)
priorarrayPrior per-member scores (from an older scores-current version)
thresholdnumberMinimum |ratio change| to be called rising/falling vs. steady
windowLabelstringHuman label for the comparison window (e.g. '90d vs 6mo ago')

Resources

scores(infinite)— Per-member cross-boundary + force-multiplier scores
trends(infinite)— Per-member trend (current vs. a prior scoring run): rising/falling
@webframp/devops-measurement/interaction-graphv2026.09.01.1devops-measurement/interaction_graph.ts
fn build(events: array, hubThreshold: number, bridgeThreshold: number)
Build the interaction graph from the canonical aggregated event set
ArgumentTypeDescription
eventsarrayCanonical windowed events (data.latest of the events model)
hubThresholdnumberMin in-degree to be flagged a hub
bridgeThresholdnumberMin distinct crews helped to be flagged a bridge

Resources

graph(infinite)— Interaction graph: Person nodes, HELPED edges, centrality + rank
04Workflows1
@webframp/devops-measurement/measure8b1e5c34-0d2a-4f6b-9a71-4c2e6d5f0a10

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

measureCollect, aggregate, score, and graph cross-boundary activity
1.collect-gitlabcollect-gitlab.sync— Translate GitLab activity into uniform events
2.collect-redminecollect-redmine.sync— Translate Redmine issue journals into events
3.collect-teamscollect-teams.sync— Translate Teams channel messages into events
4.collect-cloudtrailcollect-cloudtrail.sync— Translate CloudTrail write activity into events
5.aggregateevents.aggregate— Union + window events from all collectors into the canonical set
6.scorescoring.score— Cross-boundary + force-multiplier scoring
7.graphinteraction-graph.build— Build interaction graph, centrality, and rank
05Reports1
@webframp/devops-measurement/force-multiplierworkflow
force_multiplier_report.ts

Force-multiplier report: joins cross-boundary scores with interaction

devopsmeasurementforce-multiplierdashboard
06Stats
A
100 / 100
Downloads
0
Archive size
74.2 KB
  • 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
07Platforms
08Labels