{"adoption": {"forks": 31, "observed_at": "2026-08-28T04:04:13.931944+00:00", "stars": 1281}, "canonical_url": "https://ross.abutalabs.com/products/laboratory", "card": {"archived": false, "artifact_type": "library", "description": "Achieving confident refactoring through experimentation with Python 2.7 & 3.3+", "domain": ["developer-tools", "testing"], "enriched": true, "function": ["developer-tools", "testing", "benchmarking"], "health_score": 55, "homepage": "https://laboratory-python.readthedocs.io/en/latest/", "language": "Python", "license": "MIT", "license_family": "permissive", "maturity": "maintenance", "member_repos": ["joealcorn/laboratory"], "name": "joealcorn/laboratory", "platform": ["python", "cli"], "pushed_at": "2025-12-22T17:11:03+00:00", "repo": "joealcorn/laboratory", "stars": 1281, "tags": ["refactoring", "scientist", "experimentation", "split-testing", "production-testing"], "topics": ["developer-tools", "refactoring", "scientist", "pypi", "python", "split-testing"], "urls": [], "use_cases": ["refactor critical code paths with confidence", "run candidate code alongside production code and compare results", "measure performance differences between old and new implementations", "catch exceptions in new code without breaking production", "gradually ramp up experiments on important code", "verify refactored code behaves identically to the original"], "what_it_is": "A Python library inspired by GitHub's Scientist for safely refactoring critical code paths by running experiments in production. It executes control and candidate code blocks, compares results, records timing, and publishes observations.", "when_to_avoid": ["you need A/B testing for user-facing features rather than code refactoring", "your codebase is not in Python", "you cannot tolerate the overhead of running duplicate code paths", "you need active development and frequent updates"], "when_to_choose": ["you need to refactor fragile but critical code paths safely", "you want to test new implementations in production without risking failures", "you need timing and behavioral comparison between old and new code", "you want a Python port of GitHub's Scientist pattern"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/laboratory", "repo": "joealcorn/laboratory", "role": "main", "score": 58}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:04:13.931944+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T05:02:32.423516+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "aa24a447d0da15c35d6922bb598621bc258640abf91974f44fc188eea8f67a0f", "fetched_at": "2026-08-28T04:04:13.931944+00:00", "kind": "readme", "missing": false, "url": "https://github.com/joealcorn/laboratory"}, {"content_hash": "8a3a2f562444c368d8010f5bedfd9e9744c5822ad8a9fff638c272e002971be8", "fetched_at": "2026-08-29T12:13:34.961439+00:00", "kind": "registry_pypi", "missing": false, "url": "https://pypi.org/pypi/laboratory/json"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 58, "longevity": 100, "rhythm": 35}, "computed_at": "2026-09-03T02:20:16.233290+00:00", "flags": ["no_releases"], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 3856, "days_push": 254, "days_rel": null, "gap_med": null, "n_releases_24m": 0}, "score": 58, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}