{"id":49738784,"url":"https://github.com/technomaton/edpa","last_synced_at":"2026-05-12T09:01:10.918Z","repository":{"id":346025977,"uuid":"1188162026","full_name":"technomaton/edpa","owner":"technomaton","description":"EDPA — Evidence-Driven Proportional Allocation. Derive hours from Git evidence. No timesheets.","archived":false,"fork":false,"pushed_at":"2026-05-09T12:30:14.000Z","size":2227,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-09T14:09:36.700Z","etag":null,"topics":["agent-skills","audit","capacity-planning","claude-code","evidence-driven","github-projects","governance","timesheets"],"latest_commit_sha":null,"homepage":null,"language":"Astro","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/technomaton.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-21T17:43:56.000Z","updated_at":"2026-05-09T12:30:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/technomaton/edpa","commit_stats":null,"previous_names":["technomaton/edpa"],"tags_count":26,"template":true,"template_full_name":null,"purl":"pkg:github/technomaton/edpa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/technomaton%2Fedpa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/technomaton%2Fedpa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/technomaton%2Fedpa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/technomaton%2Fedpa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/technomaton","download_url":"https://codeload.github.com/technomaton/edpa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/technomaton%2Fedpa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32931321,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-11T17:09:15.040Z","status":"online","status_checked_at":"2026-05-12T02:00:06.338Z","response_time":102,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-skills","audit","capacity-planning","claude-code","evidence-driven","github-projects","governance","timesheets"],"created_at":"2026-05-09T14:04:03.457Z","updated_at":"2026-05-12T09:01:10.912Z","avatar_url":"https://github.com/technomaton.png","language":"Astro","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EDPA — Evidence-Driven Proportional Allocation\n\n**Derive hours from Git evidence. No timesheets.**\n\n[![EDPA](https://img.shields.io/badge/EDPA-1.18.2-34d399)](docs/methodology.md)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![GitHub](https://img.shields.io/badge/Made_for-GitHub-181717?logo=github)](https://github.com)\n\n```\nScore = JobSize x ContributionWeight x RelevanceSignal\nDerivedHours = (Score / SumScores) x Capacity\nGuarantee: Sum(DerivedHours) = Capacity (always)\n```\n\n## The Problem\n\nYour team spends hours filling timesheets. The data is inaccurate, the process is hated, and for audit-grade projects (EU grants, government contracts) it's a compliance nightmare.\n\n## The Solution\n\nEDPA eliminates manual timesheets entirely. Your team works normally — commits, PRs, reviews, comments — and EDPA derives hours automatically from this delivery evidence.\n\n**Before EDPA:**\n```\nMonday morning: \"What did I work on last week? Let me guess... 4h on S-200, maybe 6h on F-102...\"\n```\n\n**After EDPA:**\n```\n$ python3 .claude/edpa/scripts/engine.py --edpa-root .edpa --iteration PI-2026-1.3\n\nEDPA 1.18.2 — Iteration PI-2026-1.3\n======================================================================\nPerson                    Role     Capacity  Derived  Items   OK\n----------------------------------------------------------------------\nJ. Urbanek                Arch          40h    40.0h     15   OK   ← Arch credited 15×\n                                                                     for Feature/Epic gate\n                                                                     transitions (LBC, design,\n                                                                     refinement) — invisible\n                                                                     in old simple mode.\nO. Tuma                   DevSecOps      80h    80.0h      9   OK\nTuryna                    Dev           60h    60.0h      7   OK\nMatousek                  Dev           60h    60.0h      5   OK\n----------------------------------------------------------------------\nTEAM TOTAL                             240h   240.0h\nPLANNING CAPACITY                    192.0h  (factor: 0.8)\n\nAll invariants passed: YES\n```\n\n## Key Features\n\n- **Zero manual input** — hours derived from GitHub delivery evidence (commits, PRs, reviews, comments)\n- **Mathematical guarantee** — derived hours always sum to declared capacity\n- **Gates mode (default)** — credits each Initiative/Epic/Feature status transition as a mini-deliverable, so prep work (LBC, decomposition, design) gets credited as it happens, not only at final Done. Validated to ±0.35 pp stability under ±20 % CW perturbation across 100 Monte Carlo runs.\n- **Bidirectional GitHub Projects sync** — `sync push` creates issues with custom fields, `sync pull` mirrors GH UI changes back into local YAML; conflict auto-resolution with `last-write-wins` / `local-wins` / `remote-wins` strategies.\n- **Dual-view** — per-person timesheets AND per-item cost allocation from the same data\n- **Audit-grade** — frozen snapshots, immutable records, BankID signing support\n- **Self-tuning** — auto-calibrates heuristics using Karpathy's autoresearch loop\n- **GitHub-native** — works with GitHub Issues, Projects, PRs, and Actions (real E2E tested against `technomaton/edpa-e2e-test` sandbox)\n\n## First 5 minutes — guided walkthrough\n\nThis walkthrough takes a fresh empty repo to a closed iteration with\nderived hours and per-person reports. **No GitHub Project required** —\nthe walkthrough stays local so onboarding is zero-friction. For the\nreal GitHub Projects flow (push backlog, sync issue states, gate-based\nprep-work attribution) see [`docs/RUNBOOK.md`](docs/RUNBOOK.md).\n\n### 1. Install (~30 s)\n\n```bash\nmkdir my-edpa-toy \u0026\u0026 cd my-edpa-toy\ngit init -q\ncurl -fsSL https://edpa.technomaton.com/install.sh | sh\n```\n\nYou should see:\n\n```\nEDPA Installer\n  Python 3.X ✓\n  PyYAML ✓\n  mcp (MCP SDK) ✓\n  openpyxl ✓\n  ...\nEDPA 1.18.2 installed successfully!\n```\n\nThree config files were seeded from templates:\n\n```bash\nls .edpa/config/\n# edpa.yaml  heuristics.yaml  people.yaml\n```\n\n### 2. Edit `people.yaml` to your team (~1 min)\n\nThe template ships with placeholder names. Replace them with your team\n— even one person works. Minimum example for the AI-native default\n(1-week iterations, 5-week PI = 4 delivery + 1 IP):\n\n```yaml\ncadence:\n  iteration_weeks: 1        # AI-native default; use 2 for classic SAFe\n  pi_weeks: 5               # 4 delivery iterations + 1 IP\n\npeople:\n  - id: alice\n    name: \"Alice Architect\"\n    role: Arch\n    fte: 0.5\n    capacity_per_iteration: 20    # FTE × 40 for 1-week iter\n  - id: bob\n    name: \"Bob Developer\"\n    role: Dev\n    fte: 1.0\n    capacity_per_iteration: 40\n```\n\nVerify the engine sees them:\n\n```bash\npython3 .claude/edpa/scripts/engine.py --status\n```\n\n```\nEDPA 1.18.2 — Status\n========================================\n✓ .edpa/ found at .edpa\n✓ people.yaml — 2 members, 1.5 FTE, 60h/iteration\n    Alice Architect           Arch     0.5 FTE  20h\n    Bob Developer             Dev      1.0 FTE  40h\n✓ heuristics loaded\n✓ backlog — 0 features, 0 stories\n```\n\n### 3. Add a toy iteration + backlog (~2 min)\n\nOne iteration plus two stories, one per person:\n\n```bash\ncat \u003e .edpa/iterations/PI-2026-1.1.yaml \u003c\u003c'YAML'\niteration:\n  id: PI-2026-1.1\n  pi: PI-2026-1\n  status: active\n  start_date: 2026-01-05\n  end_date: 2026-01-09\n  weeks: 1\nYAML\n\ncat \u003e .edpa/backlog/stories/S-1.yaml \u003c\u003c'YAML'\nid: S-1\ntype: Story\ntitle: \"First user-facing feature\"\nparent: null\nstatus: Done\njs: 3\niteration: PI-2026-1.1\ncontributors:\n  - person: alice\n    as: owner\n    cw: 1.0\nYAML\n\ncat \u003e .edpa/backlog/stories/S-2.yaml \u003c\u003c'YAML'\nid: S-2\ntype: Story\ntitle: \"Backend integration\"\nparent: null\nstatus: Done\njs: 5\niteration: PI-2026-1.1\ncontributors:\n  - person: bob\n    as: owner\n    cw: 1.0\nYAML\n\ngit add .\ngit -c user.email=\"you@example.com\" -c user.name=\"You\" commit -q -m \"seed\"\n```\n\n### 4. Close the iteration (~30 s)\n\n```bash\nmkdir -p .edpa/reports/iteration-PI-2026-1.1\npython3 .claude/edpa/scripts/engine.py \\\n  --edpa-root .edpa --iteration PI-2026-1.1 --mode gates \\\n  --output .edpa/reports/iteration-PI-2026-1.1/edpa_results.json\n```\n\n```\n======================================================================\nEDPA 1.18.2 — Iteration PI-2026-1.1\n======================================================================\nPerson                    Role     Capacity  Derived  Items   OK\n----------------------------------------------------------------------\nAlice Architect           Arch          20h    20.0h      1   OK\nBob Developer             Dev           40h    40.0h      1   OK\n----------------------------------------------------------------------\nTEAM TOTAL                              60h    60.0h\nPLANNING CAPACITY                     48.0h  (factor: 0.8)\n\nAll invariants passed: YES\n\n--- Alice Architect (20h) ---\n  Item       Level      JS     CW   Score   Ratio   Hours\n  S-1        Story       3   1.00    3.00 100.0%   20.0h\n\n--- Bob Developer (40h) ---\n  Item       Level      JS     CW   Score   Ratio   Hours\n  S-2        Story       5   1.00    5.00 100.0%   40.0h\n```\n\nWhat just happened:\n\n- **Capacity 20h, Derived 20h**: Alice declared 20h for the 1-week\n  iteration. Story S-1 (JS=3, owner role, CW=1.0) was the only thing\n  she touched, so all 20 derived hours land on S-1.\n- **All invariants passed**: each person's derived hours sum to their\n  declared capacity, ratios sum to 1.0, no negative scores. The math\n  holds — the snapshot is auditable.\n- An `edpa-results.xlsx` (Team Summary + Item Costs tabs) was emitted alongside the JSON results.\n\n### 5. Generate timesheets — `/edpa:reports PI-2026-1.1` (Claude Code)\n\nIf you have Claude Code running in this directory, the reports skill\npicks up the engine output and writes per-person Markdown timesheets\nplus the cost-allocation Excel. After it runs:\n\n```\n.edpa/reports/iteration-PI-2026-1.1/\n├── edpa_results.json      ← engine output\n├── edpa-results.xlsx      ← Team Summary + Item Costs tabs\n├── timesheet-alice.md     ← human-readable, ready to attach to invoice\n└── timesheet-bob.md\n```\n\nEach Markdown timesheet is a paste-able audit artefact: which items,\nwhich roles, which scores, how many hours.\n\n### Try the demo without your own data\n\nIf you just want to see the math against a synthetic team:\n\n```bash\npython3 .claude/edpa/scripts/engine.py --demo\n```\n\nA pre-seeded 3-person team with 4 stories runs through the full\ncalculation in under a second.\n\n### What's next\n\n- **Real GitHub Projects integration** (push backlog → issues, sync\n  status changes, gate-based prep-work credit): [`docs/RUNBOOK.md`](docs/RUNBOOK.md)\n- **Claude Code MCP layer** (5 read-only tools so the assistant\n  reads `.edpa/` structurally instead of grep): [`docs/mcp.md`](docs/mcp.md)\n- **Methodology** (CW heuristics, gate model, audit trail, Monte\n  Carlo calibration): [`docs/methodology.md`](docs/methodology.md)\n- **Repeatable E2E test**: [`docs/E2E-TEST-PLAN.md`](docs/E2E-TEST-PLAN.md)\n  (script-level) and [`docs/E2E-SKILLS-TEST-PLAN.md`](docs/E2E-SKILLS-TEST-PLAN.md)\n  (skill-level).\n\n## How It Works\n\n1. **Person declares capacity** (e.g., 40h per 1-week iteration on the AI-native default; 80h per 2-week on classic SAFe)\n2. **System detects evidence** from GitHub (assignee, PR author, reviewer, committer, commenter)\n3. **Evidence maps to Contribution Weight** (owner=1.0, key=0.6, reviewer=0.25, consulted=0.15)\n4. **Score = JobSize x CW** for each (person, item) pair\n5. **Gates (default)**: each Initiative/Epic/Feature status transition becomes a mini-deliverable\n   with `effective_js = parent.js × gate_weight`. Stories still credited at Done. Run\n   `--mode simple` if your project does not record mid-life status transitions in git.\n6. **Hours = (Score / TotalScores) x Capacity** — proportional allocation\n7. **Invariant: Sum always equals declared capacity**\n\nTwo complementary views from the same data:\n\n| View | Question | Output | Guarantee |\n|------|----------|--------|-----------|\n| **Per-person** | How did P's time distribute? | Timesheet | Sum = capacity |\n| **Per-item** | What did item X cost? | Cost allocation | Sum = 100% |\n\n## Backlog Item Schema\n\nEvery YAML under `.edpa/backlog/\u003clevel\u003e/` follows this shape (the\npre-commit hook + `validate_syntax.py` enforce it):\n\n```yaml\nid: S-200                 # required, must match file name + level prefix\ntype: Story               # Initiative | Epic | Feature | Story | Defect | Task\ntitle: \"Add OMOP parser\"  # required\nparent: F-100             # required for non-Initiative levels\nstatus: Done              # required. Portfolio enum (Initiative/Epic):\n                          #   Funnel | Reviewing | Analyzing | Ready | Implementing | Done\n                          # Delivery enum (Feature/Story/Defect):\n                          #   Funnel | Analyzing | Backlog | Implementing | Validating |\n                          #   Deploying | Releasing | Done\njs: 5                     # required for Story/Feature, \u003e 0\niteration: PI-2026-1.3    # required for Story; optional for Feature\ncontributors:             # who actually delivered the work\n  - person: bob-dev       # MUST match a people[].id in people.yaml\n    as: owner             # owner | key | reviewer | consulted (evidence role)\n    cw: 0.8               # 0..1 manual contribution weight\n  - person: carol-qa\n    as: reviewer\n    cw: 0.2\n```\n\n`contributors[].as` is **not** the human job role (Dev/Arch/QA/PM —\nthat lives in `people[].role`). It's the **evidence role** the engine\nuses to map the contributor to a GitHub signal: `owner` ≈ assignee,\n`key` ≈ PR author, `reviewer` ≈ PR reviewer, `consulted` ≈\nissue commenter. Anything outside that enum produces zero evidence\nand triggers a clear `WARN: 0 evidence pairs derived from N\ncontributor entries` at engine startup.\n\n\u003e Migrating from \u003c1.7? Run\n\u003e `python3 .claude/edpa/scripts/migrate_contributors.py` once.\n\u003e The old keys (`role:` and `weight:`) are hard-rejected — there is\n\u003e no aliasing, by design — so the validator will tell you exactly\n\u003e which file still needs the rewrite.\n\n## Directory Structure\n\nAfter installation, your project will have:\n\n```\n.\n├── .claude/\n│   └── edpa/                      # EDPA plugin (installed by npx/curl)\n│       ├── scripts/\n│       │   ├── engine.py          # Core EDPA engine\n│       │   ├── evaluate_cw.py     # CW evaluator for auto-calibration\n│       │   ├── backlog.py         # Git-native backlog CLI\n│       │   ├── sync.py            # GitHub Projects \u003c-\u003e Git sync\n│       │   ├── issue_types.py     # GitHub Issue Types management\n│       │   ├── project_setup.py   # GitHub Project initialization\n│       │   ├── project_views.py   # GitHub Project view setup\n│       │   └── create_project_views.py\n│       ├── templates/             # Config templates (.tmpl)\n│       └── workflows/             # GitHub Actions workflows\n├── .edpa/                         # Project governance data\n│   ├── config/\n│   │   ├── people.yaml             # Team members, FTE, capacity\n│   │   └── heuristics.yaml        # Evidence scoring weights (CW)\n│   ├── backlog/                   # Work items (file-per-item)\n│   ├── iterations/                # Iteration definitions\n│   ├── reports/                   # Generated timesheets \u0026 exports\n│   ├── snapshots/                 # Frozen iteration snapshots\n│   └── data/                      # Raw evidence data\n├── .mcp.json                      # GitHub MCP server configuration\n└── ...your project files\n```\n\nSource repository structure:\n\n```\n.\n├── plugin/                        # Plugin source (what gets installed)\n│   ├── edpa/scripts/              # Python engine + utilities\n│   ├── edpa/templates/            # Config templates\n│   ├── edpa/workflows/            # GitHub Actions\n│   ├── commands/edpa/             # Claude Code slash commands\n│   ├── skills/                    # Claude Code skills (5 skills)\n│   └── .mcp.json                  # MCP server config\n├── docs/                          # Full methodology + examples\n├── web/                           # Public website (edpa.technomaton.com)\n├── install.sh                     # Shell installer\n└── .edpa/                         # Governance data for this repo\n```\n\n## Claude Code Integration\n\nEDPA includes 5 composable skills for [Claude Code](https://docs.anthropic.com/en/docs/claude-code):\n\n| Command | What it does |\n|---------|-------------|\n| `/edpa setup` | Initialize governance (GitHub Projects, config, CI) |\n| `/edpa close-iteration` | Compute hours + generate reports |\n| `/edpa reports` | Generate timesheets, snapshots, Excel exports |\n| `/edpa calibrate` | Auto-calibrate CW heuristics (after 1st PI) |\n| `/edpa sync` | Sync GitHub Projects \u003c-\u003e Git backlog |\n\nSkills work on 26+ platforms (Codex CLI, Cursor, Gemini CLI, etc.)\n\n## Cross-Platform\n\n```bash\n# Claude Code — skills auto-detected from .claude/\n# Codex CLI\ncp -r .claude/skills/* ~/.codex/skills/\n# Cursor — auto-detected\n# Gemini CLI\ncp -r .claude/skills/* ~/.gemini/skills/\n```\n\n## Who Is This For?\n\n- **EU-funded project teams** (OP TAK, Horizon Europe) — audit-grade timesheets without manual work\n- **Software consultancies** (5-30 people) — billable hours from delivery evidence\n- **Engineering managers** — evidence-based capacity planning with dual-view analytics\n- **Government contractors** — per-deliverable cost allocation for compliance\n\n## Documentation\n\n| Document | Description |\n|----------|-------------|\n| [Methodology](docs/methodology.md) | Full EDPA v1.18.2 specification |\n| [Quick Start](docs/quick-start.md) | 10-minute setup guide |\n| [Evidence Detection](docs/evidence-detection.md) | How GitHub signals map to CW |\n| [Dual-View](docs/dual-view.md) | Per-person vs per-item perspectives |\n| [Audit Trail](docs/audit-trail.md) | Freeze rules and snapshot format |\n| [Auto-Calibration](docs/auto-calibration.md) | Karpathy autoresearch loop |\n| [Cadence](docs/cadence.md) | Classic (2/10) vs AI-Native (1/5) |\n| [GitHub Setup](docs/github-setup.md) | Projects, custom fields, views |\n| [EDPA_TOKEN Setup](docs/edpa-token-setup.md) | PAT generation, repo/org secret, rotation — required for the automated GitHub Projects ↔ git sync |\n| [FAQ](docs/faq.md) | Common questions |\n\n## Simulation \u0026 Calibration\n\n| Resource | Description |\n|----------|-------------|\n| [edpa-simulation](https://github.com/technomaton/edpa-simulation) | Original `--mode simple` simulation — 2 PIs, 10 iterations, 510 commits, 7 team members |\n| [edpa-simulation-gates](https://github.com/technomaton/edpa-simulation-gates) | `--mode gates` validation — 4 PI × 2 iter, 156 git transitions, 6-person virtual team. **Avg MAD 7.8 % vs ground truth, 0.35 pp spread under ±20 % CW perturbation across 100 Monte Carlo runs.** |\n| [calibrate_roles.py](https://github.com/technomaton/edpa-simulation/blob/main/scripts/calibrate_roles.py) | Multi-scenario CW calibration (8 scenarios, 569 pairs, MAD reduction 6.7%) |\n| [edpa.technomaton.com](https://edpa.technomaton.com) | Public website with interactive dashboard, presentation, methodology, evaluation |\n\nThe default CW weights in `.edpa/config/heuristics.yaml` are calibrated from 8 team scenarios\n(Startup, Enterprise, DevOps-heavy, Research, Consultancy, AI-Native, Regulated, kashealth).\nKey correction: BO/PM/Arch are systematically undervalued by Git auto-detection; QA slightly overvalued.\n\n## GitHub Projects Sync\n\nEDPA is bidirectionally synchronized with a GitHub Project:\n\n```bash\npython3 .claude/edpa/scripts/sync.py status            # health overview\npython3 .claude/edpa/scripts/sync.py diff               # what would change\npython3 .claude/edpa/scripts/sync.py pull --commit      # GH → local YAML, auto-commit\npython3 .claude/edpa/scripts/sync.py push               # local → GH (creates issues if missing)\npython3 .claude/edpa/scripts/sync.py setup-refresh      # rebuild field IDs after manual GH edits\npython3 .claude/edpa/scripts/sync.py conflicts \\\n    --strategy last-write-wins --apply                  # auto-resolve conflicts\n```\n\n`project_setup.py` creates a Project with all custom fields (Job Size, BV, TC, RR, WSJF, Team,\nper-level Status workflows, Iteration), persists field IDs to `.edpa/config/edpa.yaml`, and\nmaps every backlog item to a GH issue in `.edpa/config/issue_map.yaml`. See\n[`docs/RUNBOOK.md`](docs/RUNBOOK.md) for the full operational guide and\n[`tests/test_e2e_sync.py`](tests/test_e2e_sync.py) for end-to-end tests against a real GitHub\nsandbox.\n\n## Part of TECHNOMATON Hub\n\nEDPA is one of 15 capability packs in [TECHNOMATON Hub](https://github.com/technomaton/technomaton-hub) — a curated collection of AI-powered skills for development, operations, security, marketing, finance, and governance.\n\nComplementary packs:\n- **[tm-dx](https://github.com/technomaton/technomaton-hub/tree/main/packs/tm-dx)** — PR workflows and release automation\n- **[tm-docs](https://github.com/technomaton/technomaton-hub/tree/main/packs/tm-docs)** — ADR, changelog, and documentation generation\n- **[tm-secure](https://github.com/technomaton/technomaton-hub/tree/main/packs/tm-secure)** — Security scanning and compliance\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n\n---\n\n*Built by [TECHNOMATON](https://technomaton.com). Methodology by Jaroslav Urbanek.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftechnomaton%2Fedpa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftechnomaton%2Fedpa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftechnomaton%2Fedpa/lists"}