Adding Warehouse Person Properties
PostHog/posthog
Sync columns from a synced data warehouse table onto PostHog person or group properties, so warehouse data becomes usable anywhere person and group properties already work: feature flag targeting…
(new) Find a person's repeated tasks from their screen activity, and what each one is worth automating, with the time and money saved.
$ npx skills add deusXmachina-dev/memorylane --skill process-analyst-new -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install deusXmachina-dev/memorylane process-analyst-new --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/deusXmachina-dev/memorylane.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/memorylane/skills/process-analyst-new .claude/skills/process-analyst-new && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "process-analyst-new" agent skill from https://github.com/deusXmachina-dev/memorylane/tree/main/plugins/memorylane/skills/process-analyst-new into .claude/skills/process-analyst-new/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "process-analyst-new", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/deusXmachina-dev/memorylane/tree/main/plugins/memorylane/skills/process-analyst-newType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add deusXmachina-dev/memorylane --skill process-analyst-new -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install deusXmachina-dev/memorylane process-analyst-new --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/deusXmachina-dev/memorylane.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/memorylane/skills/process-analyst-new .agents/skills/process-analyst-new && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "process-analyst-new" agent skill from https://github.com/deusXmachina-dev/memorylane/tree/main/plugins/memorylane/skills/process-analyst-new into .agents/skills/process-analyst-new/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "process-analyst-new", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add deusXmachina-dev/memorylane --skill process-analyst-new -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install deusXmachina-dev/memorylane process-analyst-new --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/deusXmachina-dev/memorylane.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/memorylane/skills/process-analyst-new .cursor/skills/process-analyst-new && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "process-analyst-new" agent skill from https://github.com/deusXmachina-dev/memorylane/tree/main/plugins/memorylane/skills/process-analyst-new into .cursor/skills/process-analyst-new/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "process-analyst-new", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/deusXmachina-dev/memorylane.git --path plugins/memorylane/skills/process-analyst-new--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add deusXmachina-dev/memorylane --skill process-analyst-new -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install deusXmachina-dev/memorylane process-analyst-new --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/deusXmachina-dev/memorylane.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/memorylane/skills/process-analyst-new .gemini/skills/process-analyst-new && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "process-analyst-new" agent skill from https://github.com/deusXmachina-dev/memorylane/tree/main/plugins/memorylane/skills/process-analyst-new into .gemini/skills/process-analyst-new/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "process-analyst-new", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install deusXmachina-dev/memorylane process-analyst-newInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add deusXmachina-dev/memorylane --skill process-analyst-new -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/deusXmachina-dev/memorylane.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/memorylane/skills/process-analyst-new .github/skills/process-analyst-new && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "process-analyst-new" agent skill from https://github.com/deusXmachina-dev/memorylane/tree/main/plugins/memorylane/skills/process-analyst-new into .github/skills/process-analyst-new/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "process-analyst-new", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add deusXmachina-dev/memorylane --skill process-analyst-new -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install deusXmachina-dev/memorylane process-analyst-new --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/deusXmachina-dev/memorylane.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/memorylane/skills/process-analyst-new .opencode/skills/process-analyst-new && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "process-analyst-new" agent skill from https://github.com/deusXmachina-dev/memorylane/tree/main/plugins/memorylane/skills/process-analyst-new into .opencode/skills/process-analyst-new/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "process-analyst-new", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
process-analyst-new(new) Find a person's repeated tasks from their screen activity, and what each one is worth automating, with the time and money saved.
Process Analyst New is an agent skill from deusXmachina-dev/memorylane. (new) Find a person's repeated tasks from their screen activity, and what each one is worth automating, with the time and money saved. Outputs the numbers and data a report is built from, not the visual. Use to analyze processes, mine workflows, or see what is automatable and what it saves. Every figure is labelled and grounded, never made up.
Its SKILL.md is about 13k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The licence is GPL-3.0.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 16abbe0. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
mcp__memorylane__browse_timelinemcp__memorylane__search_contextmcp__memorylane__get_activity_detailsmcp__memorylane__get_user_contextmcp__memorylane__list_patternsmcp__memorylane__get_pattern_detailsReadWriteTaskBash…and 1 more on the same allowed-tools line.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are json).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Process Analyst New loads about 13k tokens when it runs. Until then it costs about 91 tokens; SKILL.md has 6,179 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: mcp__memorylane__browse_timeline, mcp__memorylane__search_context, mcp__memorylane__get_activity_detAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from deusXmachina-dev/memorylane at commit 16abbe0, republished under its GPL-3.0 licence (© deusXmachina-dev). 6,179 words, ~13,141 tokens.
.claude/skills/process-analyst-new/SKILL.md (or your agent's skills folder).Turns raw screen-activity rows into a defensible breakdown of a person's repeated work, what it costs, and what to automate. A separate packaging skill renders the visual. Your job is truth and numbers, not persuasion. Bar = 80/20: directionally accurate, grounded, never fabricated. Can't ground a claim? Weaken its label or drop it.
If the browse_timeline tool is not available, stop and reply with exactly:
MemoryLane isn't connected to Claude yet. Open the MemoryLane app, go to Integrations, click Add to Claude, then restart Claude Desktop and run this again.
Do not suggest plugin settings, Retry, or toggling the plugin.
Verified against the MemoryLane MCP + storage code; everything below references these:
browse_timeline/search_context) return start only; end is stripped. Only get_activity_details gives a real [start -> end]. Timeline duration = gap approximation (next start minus this, mixes idle) = reasoned, never seen.browse_timeline defaults to sampling="uniform" + a row cap; header reads Showing X of Y when sampled, else N activities. Sampled counts = lower bound. search_context no-query = recent_first (drops oldest). Never count/sum from a sampled pull.window_title (PR/ticket #, doc) = seen; invoice/order IDs live in OCR (get_activity_details), sparse = reasoned.search_context only ranks a query vs the corpus.tld/OCR not in the timeline (tld only via get_activity_details).endTimestamp+durationMs to the timeline, a get_activity_stats aggregate tool, and tld to the timeline (primitives already exist).cowork_skills to be buildable): file/workbook/sheet/tab names ("AR_Reconciliation_Master.xlsx", "Q3 tab"), ERP/CRM filter or saved-view names ("Overdue >90d Priority Accounts"), report/template names, folder paths, URL paths and structure, named ranges and lookup/formula patterns (VLOOKUP/XLOOKUP ranges, pivot fields), column/field headers, system and module names, the client's own tools/vendors (Jira, Salesforce, Amazon). None of these are identifiers; redacting them destroys the evidence the automation recommendation needs.token=, key=, secret=, sig=/signature=, auth=, sid=/session=, apikey=/api_key=, password=, a JWT eyJ..., an AWS key AKIA..., an API secret like sk-.../ghp_.../xox[bp]-..., or an X-Amz-Signature presigned-link parameter), the same way a personal token like ?user=jane.doe gets stripped while the rest of the path stays, just for credentials instead of person tokens. This is the one place the keep-list must not be read as "URLs are always fully verbatim."Intake gate: if the prompt omits the context below, ask for all missing fields in ONE batched AskUserQuestion first (offer defaults). If skipped, proceed with labelled estimates. Never silently assume.
derivation = base rate + source + loading multiplier (e.g. x1.3). Never show a $ figure without source + multiplier.tld/OCR; durations here are seen, not reasoned. Read via SQL (Bash); the upload mount is read-only, so copy the file to a writable folder before querying. (2) Export (CSV/JSON) with end times + url/tld. (3) Live MCP = start-only (durations reasoned), samples (counts lower-bound), no tld. More direct data = more "seen" + tighter numbers. State source + tier in meta.meta. State the window used.Preferred: one sub-agent per stage via Task + a reviewer, passing structured output forward. Fallback (no sub-agents): run stages in order yourself. Gates are mandatory. A human review gate (Checkpoint, after process discovery) pauses the run: detailed quantification + deliverables run only after the user approves the identified processes and direction.
Stage 0 — Ground & scope. Confirm inputs; resolve cost basis (rate + derivation + label). Pull get_user_context (prior, not truth). Record coverage + blind spots (per Data limits). Gate: cost basis has formula/source/label; coverage + n=1 scope stated.
Stage 0.5 — Descriptive baseline (credibility floor). Anchors the report; supplies the denominator/ceiling even with zero processes found.
tld/title-host to a domain in code, then map to a clean name via a lookup table (mail.google.com -> Gmail, *.atlassian.net -> Jira, jd.com -> JD.com, amazon.* -> Amazon, ...); AI only names misses. Non-browser apps use app_name. Never emit Chrome/Edge/Safari/Firefox/Arc as the app anywhere in the output (baseline, steps, systems landscape): the browser is a shell, not the work; always resolve to the site/product behind the URL. Shows Jira/Gmail/JD.com/Amazon, not one "Chrome" bucket.data_coverage_notes. Nothing runs on an unreviewed list.N activities; split sub-ranges if needed). Never compute a share from a sampled batch.coverage = total_active_hours / (work_hours_per_day x active_days) (default 8 h/day). If coverage < ~40%, enter sample mode: label everything "from a captured sample of Xh (~Y% of work time)"; still give the capacity/savings headline but as a clearly-labelled estimate (sample-based, wide low/base/high range, coverage caveat, confidence Low), and prefer expressing capacity as "% of the work we observed" before projecting to the full role/team; force overall confidence to Low; put "record more continuously (coverage too low)" at the top of what_would_sharpen. Coverage is a lower bound on representativeness, not proof the sample is unbiased.
Gate: % per app sums ~100; contributing days unsampled (or from file); active-days exact; coverage computed and sample mode set if low.Stage 1 — Sessionize. Pull day-by-day, de-sampled. Segment by priority: (1) case-hints (primary) from window_title (seen); if titles weak, a bounded OCR sweep (get_activity_details, <=100 ids/call) for IDs (reasoned, require corroboration, never join on a bare number); (2) topic / content continuity from summary text and (when titles are weak) the OCR content, used to set run boundaries, not only to find IDs, so two runs that share the same app-set (e.g. two different Sheets+Slack sessions) are split by what the content is about, not merged because the apps match; (3) app-sequence; (4) time gap (last-resort tie-breaker only), 5-min default, calibrated to this user's start-delta distribution (state value + why). The gap is the weakest signal: never let it be the primary boundary when content/topic can separate two runs. Pre-merge adjacent rows sharing app+hint (and rows split only by the 5-min cap or an app change) into one step before any gap rule. Record the ID-corroborated share (K of N runs carry a stable cross-app ID) rather than applying a hard cutoff: label frequency "reasoned, ID-corroborated on K of N runs", and let confidence scale with that share (graded, §4), not a binary cliff. When K/N is low, lean harder on content continuity (above) before the gap, and say so. Output = ordered activity-level steps (start/stop, hint, apps, gap-duration reasoned, idcorroborated bool); reasoning log for non-obvious boundaries. _Gate: no sampled day; no single-row split artifact; durations reasoned; ID-corroborated share recorded.
Stage 2 — De-pollute. Flag interruptions (Slack/email peeks, personal messaging, browsing, entertainment): excise from task time but log them; keep only if OCR/summary shows the content fed back in. Remove pure-discard sessions: personal messaging; learning/studying; general browsing/social/news/shopping; programming + code review; entertainment; generic inbox/Slack triage unless it triggers a cross-app workflow; standalone IDE/file management. Reasoning log per excised chunk. Gate: kept interruptions have an evidence reason; discards match the list.
Stage 3: Cluster into repeated processes. Cluster by hint-type + step-sequence similarity + app set. An instance = one reconstructed case; frequency = count of cases, not rows (log "N rows -> M cases"). A process repeats, is stable, and is operational. Report occurrences as two counts, never collapsed into one: clean (strict match: same step-sequence/app-set + ID-corroborated or a clear case-hint) and possible (looser match: shares app-set/topic but weaker or no corroboration), e.g. "17 clean, 30 possible in the window." Use the clean count as the conservative base for annualization/savings; carry the possible count alongside as upside, never let a possible-only match inflate the base figure. Cadence gate: >=3 cases in window, OR >=2 with a period the window can contain; for weekly/monthly hints (month-end, payroll, board pack) widen to 30 to 60 days via targeted search_context before deciding/annualizing. Below the gate, demote, do not drop. A cluster that looks recurring but misses the gate (1 to 2 sightings, or a likely weekly/monthly process the window was too short to confirm) is NOT discarded: tag it verdict: candidate (low confidence) and carry it into the Checkpoint table as a candidate-tier row, with its uncertainty named (e.g. "seen 2x in 21 days, possibly monthly, window too short to confirm"). Only true one-offs and creative/judgment work are excluded outright. This protects the high-ROI low-frequency tail (close, board pack, quarterly rollups) that a short window or strict count would otherwise hide. Per process: frequency, time-per-instance distribution (n, median, IQR/p90), total time, varies/constant, role/department. If estimated time-per-instance exceeds captured active time, state the ratio + why ("captured 100 min, estimated 5 h, x3 for switching and rework"). Captured active time is hands-on time on the run itself and is a lower bound — time on other work and long no-input reading are excluded. A switching or rework multiplier is therefore allowed, but only when derived from something counted (observed switches, repeated passes over the same case) and never as a flat uplift; always report captured and estimated as two separate numbers, never one blended figure. Reasoning log: why each cluster is a process, a candidate, or excluded (one-offs + creative logged as considered-and-excluded). Gate: frequency traces to counted cases or a stated inference; time carries n + spread, reasoned.
Stage 3.5 — Common path (80/20). Describe the single dominant way it usually goes (~80/90% sequence) + rough coverage. Do NOT over-model (no variant trees, loops, exception enumeration). Note exceptions exist but aren't modelled, and that building the automation needs deeper hands-on analysis. Common path = automatable core; remainder stays human. Path + coverage = estimates. Gate: coverage + case-n recorded; output says it's an estimate needing deeper analysis to build.
Checkpoint, confirm processes + pick what to detail (human review gate, triage menu). Before the detailed half, STOP. First run a light provisional pass over EVERY qualifying process AND every demoted candidate (Stage 3), none dropped: rough automatable % (from category + work-nature, judgment cap applies), difficulty (Easy/Med/Hard), and uplift (provisional capacity-unlock % + net annual savings range), reusing the Stage 3 frequency + time and the cost basis. Everything here is provisional, refined by Stages 5, 5.5, 6 after selection. Then present one table listing ALL of them, confirmed processes first sorted by impact (annual hours) then occurrence (frequency), candidate-tier rows below:
| Pattern | What it is (1 sentence) | Occurrences (clean / possible) | Time/yr (h) | Est. automatable % | Difficulty | Uplift (capacity % + net $/yr) | Tier + confidence |
The last column marks each row process or candidate (low confidence) with a one-line reason for any candidate (e.g. "possibly monthly, window too short"). Under the table, list only the true exclusions and why (genuine one-offs, creative/judgment work); sub-threshold-but-recurring work appears IN the table as a candidate row, never demoted to a footnote. Then ask the user (AskUserQuestion, multi-select the rows) which processes to dig deeper into, and allow drop / merge / re-scope / redirect. Run Stages 4 to 6 ONLY on the selected processes; the rest stay in the table and in the ledger as logged-but-not-detailed (selected_for_detail: false), so nothing found is hidden. Honor their edits. If there are more candidates than the question can list, show the table and ask them to name their picks. If no human is available (batch run), record "checkpoint auto-passed" in review.checkpoint, dig into the top processes by provisional ROI, and continue.
Stage 4: Decompose steps (activity level, map-ready). Ordered steps: action (verb+object), app, input, output/artifact, time (reasoned), pain (reasoned), automatable (bool), note (what changes / watch-out). A row is not a step: derive steps from transitions across rows; don't split one row into separately-timed steps. Also capture for the map: 0 to 3 key decision points with branches (estimated, light, not variant trees) and a per-app per-run time rollup (sum step time by app). Steps + decisions + per-app times = the map-ready representation; a downstream map skill reads this and draws the visual (like the /patterns Map view), not here. Gate: each step maps to >=1 activity (cite IDs) or a labelled reasoned bridge; time/pain reasoned; decisions estimated; app is the resolved site/product name (never Chrome/Edge/the browser), per Stage 0.5's lookup rule.
Stage 5: Map automation (decision tree). Order of consideration, apply top-down, never skip ahead, matching the Verdict + route tree below: (1) still needed and worth changing? No -> kill or leave-as-is (document + train), stop there. (2) worth automating (net ROI + work nature)? No -> redesign (document + train), stop there. (3) automate: try the current stack/native features first (route a below), only reach for n8n (deterministic, rules-based) or Cowork (judgment/generation) if the current stack can't cover it. Classify into a category (Section 3). Bottom-up fraction: automatable_fraction = sum(step.time where automatable) / sum(step.time), re-derivable; map the 1-5 score to a band (5 -> 0.8-0.95, 3 -> 0.4-0.6, 1 -> 0.05-0.2); express as a range; name human steps in human_remainder. Judgment cap: Content Generation + Research & Synthesis fraction <=0.6 unless OCR shows boilerplate.
Verdict + route (walk every process through this tree, never forced):
effort_tier.Connector capability check (before recommending a route): for every API/MCP connector or plugin in the recommendation, fetch its latest official docs and confirm the specific read/write it needs; record server, read, write, how verified, and date in connector_checks. Confirm the exact product/edition the user runs (variants differ, e.g. Looker vs Looker Studio); if the surface tool cannot connect, pivot the route to the underlying data source and record that pivot in connector_checks. An unverified or write-incapable connector cannot back a Human-in-the-loop or Automated verdict (see Future state).
Future state (score every kept process on this ordered scale): No change (manual) -> AI-augmented (human operates, AI drafts/suggests) -> Human-in-the-loop (automation runs, human approves/handles exceptions) -> Automated (hands-off). Kills = eliminated (off-scale). Augmented vs HITL = who operates (human invoking AI = augmented; automation running with a human gate = HITL). Roughly MECE on one axis (how much the machine does); the tree picks the route, this labels the end state. Ordered, so a downstream report can render it as a chevron (highlight the step, grey the rest). Capability ceiling: the label follows verified connector capability, not assumption. Reaching Human-in-the-loop or Automated (the machine writes) requires a verified write to the target tool; if only read is verified (or nothing), cap at AI-augmented (AI drafts, human writes). E.g. sprint estimation only moves from "AI drafts" to "runs with a human gate" once Jira + Notion writes are confirmed.
Tie every recommendation to the manual step(s) it removes (cite step numbers); prefer an integration that eliminates the action over one that merely assists (e.g. a Cowork Figma plugin that fills the slide template from a CSV/JSON, removing the copy/paste re-keying, not "paste into Claude then drop it in by hand").
Name + frame honestly: name the process after the automatable slice + verdict, not the creative whole; creative/judgment work is augment ("AI-assist: structure findings + draft deck text; designer keeps the insight and builds the deck"), never "automate the slide deck". A priority label must reflect net ROI + verdict, never the gross size of a judgment-capped activity. Gate: tools exist in context or are explicit defaults; fraction re-derives; every process has a verdict, a route (if automate), a future-state label, the manual steps removed, and an honest name.
Stage 5.5 — Automation feasibility. Per candidate:
Stage 6 — Quantify savings + net ROI (ranges). All arithmetic in code.
annual_hours = time_per_instance x frequency_per_year; automatable_hours = annual_hours x automatable_fraction; gross_$ = automatable_hours x rate. Show inputs + labels.hours_freed = time_per_instance x frequency_per_year x automatable_fraction and annual_savings = hours_freed x loaded_rate. Never display one automatable % while deriving the dollars from a different effective fraction. A skeptic multiplies the printed inputs and must land on the printed savings; per-process savings must sum to the role/function subtotal and then to the combined total. Carry the exact inputs so a downstream page reconciles without re-deriving (see reconciliation in §5). Worked example (real build): slide-deck 3h/run x 2/month x 46% x A$105/hr -> ~A$3,500/yr; sprint-estimation 45m x 2/month x 28% x A$105/hr -> ~A$500/yr; Product subtotal A$4k. Marketing perf-reporting 27m daily x 90% -> ~A$6,200, SEM 35m x 8/month x 71% -> ~A$2,800, optimisation-logging 60m x 4/month x 60% -> ~A$2,000, all x A$70/hr; subtotal A$11k. Measured total A$15k; capacity 1h + 3h = 4h/week (5%); 2 + 3 = 5 processes.net_annual = gross_annual - annual_automation_cost; payback_months = build_cost / monthly_net. If payback > ~6 to 12 months, tool cost > savings, or high effort for a tiny saving, the verdict is leave as-is or redesign, not automate. Net, not gross, drives the verdict + ranking.activity_id -> process map; each activity in one process.list_patterns exists, cross-check frequency vs its per-pattern stats (seen Nx, ~N/wk over M observed days) and time vs avg N min/run (measured from activities, sampling-immune); cite as support, never add to your numbers; report discrepancies. The miner backfills ~60 days, but stats cover the recent window shown in the output, so absent != nonexistent.capacity_unlocked_pct = annual saved hours / annual work capacity (this person; or the team if headcount supplied); pair with net $ saved. Headline reads like "automating these unlocks cost_basis.derivation states base salary, loading multiplier, work-year hours, and the resulting loaded rate, in this exact shape: Product "A$160k base -> A$105/hr loaded (x1.3 on-cost over ~1,950 h)", Marketing "A$105k base -> A$70/hr loaded (same basis)". When several ledgers combine downstream, each role/function keeps its own loaded rate; per-process savings sum to that function's subtotal, function subtotals sum to the combined total, and the exec headline restates the combined total. Never blend two functions onto one rate.
Gate (triple-test): re-derive top-3 savings independently; dedup map has no duplicate IDs; aggregate = sum of parts and sits under total_active_hours; FTE checked; inputs labelled; ranges present.Stage 7 — Systems landscape. Synthesis, last because it needs automation status. Inventory + time share come from the cleaned baseline (0.5); this stage overlays function grouping (Source/ERP, Comms, Docs, BI, Finance, CRM) + status (manual/partial/automated) from how each system appears in processes. Gate: every system appears in the cleaned baseline list.
Final Review — adversarial. Mechanical checks as code (aggregate = sum of parts; no duplicate IDs; % per app ~100; every headline has a range + label). Then break it: any number without label/evidence/range? sampled count? weak reasoning log? duplicate ID? team/FTE without headcount? automatable=true on judgment the data can't show is mechanical? tool not in context? aggregate above ceiling? click-level/fabricated detail? overall future-state label inconsistent with its steps (an AI-augmented or human-in-the-loop process with no human/judgment step, or an all-automate step list under an augmented label)? Slop sweep: every name/app/tool/step/number traces to a row or labelled assumption, else strip; deterministic numbers re-run identically. Threshold-sensitivity: re-segment one day at 3-min and 10-min gaps; if process count or total time shifts >25%, flag it. Write what_would_sharpen (2 to 4 cheap next steps that most raise confidence). Only survivors ship; record verdict + demoted/stripped.
Privacy scrub (mandatory, before ship). A stated ban on identifiers is not enough; verify it: (a) code-run a regex scan of the full process-analysis.md for:
[\w.+-]+@[\w-]+\.\w, phone numbers, @handles;(token|key|secret|sig|signature|auth|session|sid|apikey|api_key|password)=[A-Za-z0-9%._~+/-]{16,}), a JWT eyJ[A-Za-z0-9_-]{10,}\.eyJ, an AWS key AKIA[0-9A-Z]{16}, an API secret sk-[A-Za-z0-9]{20,}/ghp_[A-Za-z0-9]{36}/xox[bp]-, or an X-Amz-Signature param;[A-Z]{2}\d{2}[A-Z0-9]{11,30};\d{3}-\d{2}-\d{4} (bare 9-digit runs collide with kept IDs, skip those).\d{2}-\d{7}-\d, TIN \d{3}-\d{3}-\d{3}(-\d{3})?, PhilHealth \d{2}-\d{9}-\d; Malaysia NRIC/MyKad \d{6}-\d{2}-\d{4}; Czech Republic + Slovakia rodné číslo \d{6}/\d{3,4}; Germany Steuer-ID \d{2} ?\d{3} ?\d{3} ?\d{3} or Sozialversicherungsnummer \d{8}[A-Z]\d{3}; Austria Sozialversicherungsnummer \d{4} ?\d{6}; Switzerland AHV/AVS 756\.\d{4}\.\d{4}\.\d{2}; Australia TFN \d{3} ?\d{3} ?\d{3} or Medicare \d{4} ?\d{5} ?\d; New Zealand IRD \d{2,3}-?\d{3}-?\d{3}. Same rule as the US SSN: any of these is high-severity, strip on match, but a plain digit run without the market's separator pattern is more likely a kept invoice/order/case ID, don't strip on digits alone.
Any hit -> redact to a role/generic label (or, for a credential param, drop just that param and keep the URL path) and fix the source field.
(b) Re-read these high-risk free-text fields specifically against Principle 9's strip-list (person names, emails, phones, handles, customer contact names, home addresses, card/ID/DOB values, health/medical content), they carry window-title/OCR text furthest from the numeric pipeline: steps[].input/output/note, what_varies/what_constant, reasoning_log[].why, assumptions[].plain, common_path.description, cowork_skills[] (all text), data_coverage_notes, blind_spots, tier_note, narrative_summary. Also scan for keyword triggers ("DOB", "Date of Birth", "Passport No", "SSN", "diagnosis", "MRN", "patient") that flag content needing generic paraphrase even without a clean regex hit. Do not strip Principle 9's keep-list (file/sheet/tab names, filter/view names, URL paths, formulas, folder paths) out of these same fields: that detail is what makes steps[].input/output and the automation mechanism reproducible; scrub people (and the PII/PHI classes above) out, leave the artifacts in. A keyword-trigger false-positive on a kept column header is the correct failure direction; when unsure, route to review rather than silently stripping or silently keeping. (c) Record review.privacy_scrub: "passed" (or the fields fixed) in the schema. Regex alone misses bare names; the field re-read is what catches those.RPA-era (deterministic): Data Shuttle (move structured data between apps), Reporting Ritual (same sequence on a schedule), Review Pipeline (queue -> cross-reference -> decide), Data Entry (read source -> type into forms), Alert Response (notification -> act -> return). AI-era (LLMs automate what RPA discarded): Content Generation (draft docs/emails/decks from inputs) and Research & Synthesis (gather across sources -> brief), both fraction <=0.6 unless templated. Use exactly these seven; if none fit, it's likely not an automation candidate (log why).
Impact x Automatability, Effort as tie-breaker; surface quick wins (high automatability + Easy) and big bets (high impact + Hard).Write one file, process-analysis.md, then a 5-line chat summary (don't dump raw output). No separate JSON file. Put the readable narrative first, then embed the full structured ledger as a single fenced ```json code block at the end of the same file (schema below) so the file is both the human-readable report and the machine-readable ledger. This filename + the embedded block is the hand-off contract the packaging (report-new) skill reads; keep both.
{
"meta": {
"user_role": "",
"department": "",
"location": "",
"measurement_scope": "single observed user (n=1)",
"observed_user_count": 1,
"data_source": "",
"data_quality_tier": "",
"window": "",
"activities_analyzed": 0,
"active_days": 0,
"work_hours_per_day": 8,
"capture_coverage_pct": 0,
"sample_mode": false,
"cost_basis": { "hourly_rate": 0, "currency": "", "basis": "estimated", "derivation": "" },
"data_coverage_notes": "",
"blind_spots": "",
"threshold_sensitive": false
},
"baseline": {
"total_active_hours": { "value": 0, "basis": "reasoned" },
"active_days": { "value": 0, "basis": "seen" },
"app_time_share": [{ "app": "", "pct": 0, "hours": 0, "basis": "reasoned" }],
"deep_work_share": { "value": 0, "basis": "reasoned" }
},
"exec_rollup": {
"total_repetitive_hours_per_week": {
"low": 0,
"base": 0,
"high": 0,
"basis": "reasoned",
"evidence": []
},
"automatable_pct": { "low": 0, "base": 0, "high": 0, "basis": "estimated" },
"capacity_unlocked_pct": { "low": 0, "base": 0, "high": 0, "basis": "estimated" },
"hours_saved_per_year": {
"low": 0,
"base": 0,
"high": 0,
"basis": "estimated",
"error_sources": []
},
"dollars_saved_per_year_net": { "low": 0, "base": 0, "high": 0, "basis": "estimated" },
"fte_capacity_unlocked_this_person": { "low": 0, "base": 0, "high": 0, "basis": "estimated" },
"team_extrapolation": {
"headcount_supplied": false,
"value": null,
"basis": "estimated",
"multiplier": "",
"unverified": true
},
"overall_confidence": { "grade": "", "why": "" },
"headline": "e.g. Automating these unlocks ~12% of annual capacity (~$Xk/yr), low/base/high",
"shown_caveat": ""
},
"processes": [
{
"name": "",
"category": "",
"role_department": "",
"selected_for_detail": true,
"tier": "process",
"tier_note": "process | candidate (low confidence, sub-threshold but recurring); reason if candidate",
"frequency": {
"occurrences_clean": 0,
"occurrences_possible": 0,
"period": "",
"basis": "reasoned",
"evidence": [],
"annualization_multiplier": "",
"id_corroborated_runs": "K of N"
},
"time_per_instance_min": {
"n": 0,
"median": 0,
"iqr": "",
"basis": "reasoned",
"evidence": []
},
"annual_hours": { "low": 0, "base": 0, "high": 0, "basis": "estimated" },
"common_path": {
"description": "",
"approx_coverage_pct": 0,
"basis": "estimated",
"note": ""
},
"steps": [
{
"action": "",
"app": "",
"input": "",
"output": "",
"time_min": 0,
"pain": "",
"automatable": true,
"note": "",
"basis": "reasoned",
"evidence": []
}
],
"decision_points": [{ "question": "", "branches": [], "basis": "estimated" }],
"time_per_app_per_run": [{ "app": "", "minutes": 0 }],
"reconciliation": {
"per_run_min": 0,
"frequency_per_year": 0,
"automatable_pct": 0,
"loaded_rate": 0,
"hours_freed": 0,
"annual_savings": 0,
"note": "per_run_min x (frequency_per_year/60... ) -> the displayed automatable_pct reproduces annual_savings; downstream reads these, never re-derives"
},
"what_varies": "",
"what_constant": "",
"automation": {
"verdict": "kill|leave_as_is|redesign|automate",
"future_state": "no_change|ai_augmented|human_in_the_loop|automated|eliminated",
"route": "current_stack|internal_app|claude_cowork|current_automation_tool|n8n|gumloop|other",
"effort_tier": "quick_win|extra_engagement",
"work_nature": "mechanical|creative_judgment",
"mechanism": "",
"removes_manual_steps": [],
"feasibility": "api|webhook|agent|none",
"tool": "",
"approach": "",
"automatable_fraction_low": 0.0,
"automatable_fraction_high": 0.0,
"human_remainder": "",
"automation_cost": {
"build_hours": "",
"tool_monthly": 0,
"learning": "low|med|high",
"maintenance": "low|med|high"
},
"basis": "estimated"
},
"scores": { "impact_hours": 0, "automatability": 0, "effort": "", "priority_rank": 0 },
"confidence": { "grade": "", "drivers": "" },
"savings": {
"annual_hours_saved": { "low": 0, "base": 0, "high": 0 },
"gross_annual_dollars_saved": { "low": 0, "base": 0, "high": 0 },
"net_annual_dollars_saved": { "low": 0, "base": 0, "high": 0 },
"payback_months": 0,
"formula": "",
"inputs": [],
"dominant_uncertainty": ""
}
}
],
"systems_landscape": [
{
"system": "",
"function_group": "",
"time_share": "",
"roles": [],
"automation_status": "",
"basis": "reasoned"
}
],
"patterns_cross_check": [
{ "pattern": "", "their_frequency": "", "our_frequency": "", "discrepancy_note": "" }
],
"reasoning_log": [
{
"candidate": "",
"verdict": "process|not_a_process|candidate",
"why": "",
"common_path_coverage_pct": 0,
"case_n": 0,
"evidence": []
}
],
"assumptions": [
{
"plain": "",
"process": "",
"observed_count": "",
"window": "",
"assumed_cadence": "",
"annual_estimate": ""
}
],
"connector_checks": [
{ "server": "", "read": false, "write": false, "verified_via": "", "date": "" }
],
"cowork_skills": [
{
"process": "",
"name": "",
"benefit_line": "",
"trigger": "",
"steps": { "connect": "", "create": "", "run": "" },
"notes": "",
"connectors": [],
"human_approval_gate": ""
}
],
"bottom_line": {
"automatable_task_count": 0,
"hours_saved_per_year": { "low": 0, "base": 0, "high": 0 },
"dollars_saved_per_year_net": { "low": 0, "base": 0, "high": 0 },
"capacity_unlocked_pct_per_person": 0,
"capacity_unlocked_pct_per_role": 0,
"how": ""
},
"what_would_sharpen": [],
"narrative_summary": "",
"review": {
"verdict": "",
"checkpoint": "approved|adjusted|auto-passed",
"demoted": [],
"stripped": [],
"privacy_scrub": "passed",
"double_count_check": "passed",
"threshold_sensitivity": "",
"reproducibility_note": "deterministic numbers reproduce exactly; AI-judgment calls may vary slightly"
}
}The narrative portion of process-analysis.md (everything before the trailing embedded json block, per §5) reads as: coverage header (with the n=1 line), baseline, exec roll-up (ranges + plain-word labels + shown_caveat), then the full Checkpoint triage table (every qualifying process AND every candidate-tier row, confirmed processes first sorted by impact then occurrence, candidates below: name, one-sentence what-it-is, annual hours, provisional automatable %, difficulty, uplift, tier + confidence) so nothing found is hidden, a detailed section per selected process (common-path summary, steps table, automation, savings ranges + formula + dominant uncertainty) with tabled-only ones left as triage rows, systems landscape, patterns cross-check, confidence per process + overall, a short "what would sharpen this" list, then reasoning log + assumptions. Then a Bottom line block: count of automatable tasks, time + net $ saved/yr, efficiency unlock per person and per role, and one or two plain sentences on how it's done (mirrors bottom_line). End with a Storytelling summary: under 100 words, plain English, grounded only in the ledger numbers + caveats, covering what we found, what to do, the benefit, and why (mirrors narrative_summary). Exec roll-up aggregated + scoped n=1; processes per role/department; no personal names anywhere in the document. Immediately after this narrative, append the fenced ```json ledger block (schema in §5) as the file's final section.
Cowork skills (deliverable): for each automatable process, emit a ready-to-run skill spec in cowork_skills (name, benefit_line, trigger, steps, notes, connectors, a human-approval gate), mirroring the MemoryLane Skill tab. Write the steps in a non-technical 3-step mold a non-technical owner understands: Connect (which apps to connect to Claude), Create (the skill that drafts the output), Run (the cadence, that they click to run it, and that a human reviews and approves before anything is written). Lead each with one plain benefit_line in the form "Use AI to [draft X] for human review instead of [manual grind]". Keep it jargon-free, frame skill setup as done-for-them, and never require the reader to know how to build a skill. Optionally write a standalone SKILL.md for the top one to the working dir.
Map-ready: each process's steps + decision_points + time_per_app_per_run are everything a downstream map skill needs to draw a node-per-step map; this skill emits the data, rendering is downstream and self-contained.
Hand-off contract: every exec-bound number carries its basis label + a one-line shown_caveat; the packaging skill must display both adjacent to each headline and reproduce the reasoning-log verdict count. Each process also carries the reconciliation block (per-run time, frequency/yr, displayed automatable %, loaded rate, hours freed, annual savings) so the report reconciles every figure across pages by reading, never re-deriving; the displayed automatable % is the realized fraction (per Stage 6). (A contract, not enforceable on a sibling renderer; Final Review asserts the data carries it.) Emit one source value per metric at a consistent rounded grain, and ensure per-process figures sum to their role/department subtotal and the exec total, so the report reconciles without hand-edits.
⛔ Stop at the ledger. Do NOT package. Your deliverable ENDS at
process-analysis.md (with the embedded json block) + the 5-line chat summary
(+ optional cowork_skills specs). Do not render HTML, do not create a PDF, do
not invoke or hand straight into the report-new/packaging skill. Packaging is
a separate, user-initiated step, and that skill shows the HTML deck for
review before any PDF exists. After writing the file, give the short summary
and stop; if the user wants the visual deck, they start packaging next. Never
chain analysis → PDF in one run.
get_activity_details (OCR) for high-value confirmations (case IDs, true durations on 2 to 3 sample instances per top process, automation specifics). Keep it bounded.report-new skill; the user starts packaging, and HTML review precedes any PDF (see "Stop at the ledger" in §5).© deusXmachina-dev, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in plugins/memorylane/skills/process-analyst-new of deusXmachina-dev/memorylane.
Open the folder on GitHubat commit 16abbe0
Process Analyst New next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Process Analyst New this skilldeusXmachina-dev/memorylane | 121 | — | ~13k | Automated safety check: Notes | GPL-3.0 | |
| Adding Warehouse Person PropertiesPostHog/posthog | 40k | — | ~2.9k | Automated safety check: Pass | Custom licence | |
| Build A Personal Skill From HistoryTHU-MAIC/OpenMAIC | 40k | — | ~678 | Automated safety check: Pass | MIT | |
| Personalized Emailtopoteretes/cognee | 32k | — | ~695 | Automated safety check: Notes | Apache-2.0 | |
| Financial Analystalirezarezvani/claude-skills | 28k | 1 repos | ~1.8k | Automated safety check: Pass | MIT | |
| Statistical Analystalirezarezvani/claude-skills | 28k | 1 repos | ~2.5k | Automated safety check: Pass | MIT |
PostHog/posthog
Sync columns from a synced data warehouse table onto PostHog person or group properties, so warehouse data becomes usable anywhere person and group properties already work: feature flag targeting…
THU-MAIC/OpenMAIC
Derives a reusable personal skill for course-making from a representative sample of the user's own past classrooms and chat history, confirmed with them before saving.
topoteretes/cognee
Draft a reply to your newest Gmail email that knows what you discussed in your Granola meetings, what you promised the sender, and how you write, using cognee memory.
alirezarezvani/claude-skills
Runs financial ratio analysis, DCF valuation, budget variance reports and rolling forecasts from statement data using four bundled Python scripts.
alirezarezvani/claude-skills
Run hypothesis tests, analyze A/B experiment results, calculate sample sizes, and interpret statistical significance with effect sizes.
RightNow-AI/openfang
Data analysis expert for statistics, visualization, pandas, and exploration
deusXmachina-dev/memorylane
Create SQLite migrations for MemoryLane storage schema changes.
deusXmachina-dev/memorylane
Prepare a MemoryLane release by updating the version and release notes, then creating and pushing the tagged release commit that triggers CI.
deusXmachina-dev/memorylane
Write step-by-step automation instructions for a workflow, tailored to your tool (Claude, n8n or Zapier).
deusXmachina-dev/memorylane
Discover repeated workflow patterns from screen activity and suggest automations
deusXmachina-dev/memorylane
Summarize what you've been doing in the last 30 minutes. An agent skill from deusXmachina-dev/memorylane.
deusXmachina-dev/memorylane
(new) Turn a process analysis into a polished, client-ready report, first an HTML deck you review, then a matching PDF.
(new) Find a person's repeated tasks from their screen activity, and what each one is worth automating, with the time and money saved. Process Analyst New is an agent skill from deusXmachina-dev/memorylane. (new) Find a person's repeated tasks from their screen activity, and what each one is worth automating, with the time and money saved.
Process Analyst New fits situations like: analyze processes; see what is automatable and what it saves.
Run `npx skills add deusXmachina-dev/memorylane --skill process-analyst-new -a claude-code`. Or copy the skill folder (plugins/memorylane/skills/process-analyst-new in deusXmachina-dev/memorylane) into .claude/skills/process-analyst-new in your project. Claude Code loads it when a task matches its description.
Run `npx skills add deusXmachina-dev/memorylane --skill process-analyst-new -a codex`. Or copy the skill folder (plugins/memorylane/skills/process-analyst-new in deusXmachina-dev/memorylane) into .agents/skills/process-analyst-new in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add deusXmachina-dev/memorylane --skill process-analyst-new -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/process-analyst-new, .gemini/skills/process-analyst-new, .github/skills/process-analyst-new and .opencode/skills/process-analyst-new in your project.
SKILL.md names no scripts, command-line tools or credentials: Process Analyst New is instructions for the agent only. Its frontmatter pre-approves these tools: mcp__memorylane__browse_timeline, mcp__memorylane__search_context, mcp__memorylane__get_activity_details, mcp__memorylane__get_user_context, mcp__memorylane__list_patterns, mcp__memorylane__get_pattern_details, Read, Write, Task, Bash, AskUserQuestion.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Process Analyst New is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 13k tokens (SKILL.md is roughly 53k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Process Analyst New: Adding Warehouse Person Properties (PostHog/posthog, 40k stars), Build A Personal Skill From History (THU-MAIC/OpenMAIC, 40k stars), Personalized Email (topoteretes/cognee, 32k stars) and Financial Analyst (alirezarezvani/claude-skills, 28k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
deusXmachina-dev (a GitHub organization) maintains it in deusXmachina-dev/memorylane, which has 121 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 7, 2026.
Source: deusXmachina-dev/memorylane on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.