Not in the top 1,000 by GitHub stars
Stunspot/CanopyOps
Evidence-bounded cannabis cultivation operations Augment for crop plans, diagnostics, calculations, harvest review, and operating records.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
canopyops/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1cb5db4fb570 → 1cb5db4fb570
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1cb5db4fb570
No earlier version was observed for comparison.
plugins/canopyops/skills/canopyops/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1cb5db4fb570 → 1cb5db4fb570
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1cb5db4fb570
No earlier version was observed for comparison.
releases/v0.1.7/codex/canopyops/skills/canopyops/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Local scripts → After Local scripts
1cb5db4fb570 → 1cb5db4fb570
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Local scripts
First observation → 1cb5db4fb570
No earlier version was observed for comparison.
releases/v0.3.0/codex/canopyops/skills/canopyops/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1cb5db4fb570 → 1cb5db4fb570
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1cb5db4fb570
No earlier version was observed for comparison.
releases/v0.3.1/codex/canopyops/skills/canopyops/SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
1cb5db4fb570 → 1cb5db4fb570
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 1cb5db4fb570
No earlier version was observed for comparison.
Heat
1.3- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
canopyops
When your agent uses it
🌿 Cannabis health, climate, and yield.
What it loads into context
Frontmatter
18 tokensAlways available to the agent
SKILL.md
1,042 tokensWhen the skill is activated
Reference documents
16,390 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Open the crop desk
- Operating kernel
- Authority and safety
- Completion
Scripts executed separately
scripts/build_release_manifest.pyscripts/calculate_dli.pyscripts/calculate_irrigation.pyscripts/calculate_vpd.pyscripts/check_source_freshness.pyscripts/lint_cultivation_plan.pyscripts/normalize_logs.pyscripts/normalize_units.pyscripts/package_deliverables.pyscripts/validate_record.pyworkspace/Open CanopyOps.cmdworkspace/Open CanopyOps.commandworkspace/app.jsworkspace/create_entry.pyworkspace/desk.pyworkspace/model.js
Files
ATTRIBUTION.mddoc638 bytesCHANGELOG.mddoc2,410 bytesLICENSE.mddoc2,817 bytesNOTICE.mddoc580 bytesREADME.mddoc2,214 bytesSKILL.mdcore5,271 bytesTRADEMARKS.mddoc1,013 bytesadapters/bot-runtime.mddoc535 bytesadapters/chat-runtime.mddoc500 bytesadapters/claude-code.mddoc1,662 bytesadapters/codex-local.mddoc499 bytesassets/capa-record.mddoc659 bytesassets/compliance-verification.mddoc684 bytesassets/crop-plan.mddoc1,057 bytesassets/crop-profile.mddoc641 bytesassets/crop-walk.csvasset218 bytesassets/cultivation-decision.mddoc566 bytesassets/drying-log.csvasset213 bytesassets/facility-profile.mddoc979 bytesassets/harvest-readiness.mddoc712 bytesassets/incident-report.mddoc1,073 bytesassets/risk-register.csvasset190 bytesassets/room-runbook.mddoc798 bytesassets/shift-handoff.mddoc574 bytesevals/authority-and-resilience-cases.yamlasset5,337 bytesevals/core-transfer-cases.yamlasset6,633 bytesevals/eval-manifest.yamlasset682 bytesexamples/harvest-readiness-review.mddoc1,165 bytesexamples/high-runoff-ec-diagnosis.mddoc1,361 bytesexamples/late-flower-humidity-incident.mddoc1,952 bytesexamples/new-room-crop-plan.mddoc1,408 bytesjurisdiction-packs/README.mddoc512 bytespersonas/ella-greenfield-v2.mddoc4,036 bytesreferences/agronomy-core.mddoc2,255 bytesreferences/compliance-verification-method.mddoc1,786 bytesreferences/cultivar-and-gxe.mddoc1,651 bytesreferences/diagnostic-field-guide.mddoc1,751 bytesreferences/economics-sustainability.mddoc1,035 bytesreferences/environment-lighting-vpd.mddoc1,689 bytesreferences/glossary.mddoc1,792 bytesreferences/harvest-postharvest.mddoc1,624 bytesreferences/ipm-biosecurity.mddoc1,713 bytesreferences/rootzone-fertigation.mddoc2,005 bytesreferences/safety-operations.mddoc1,986 bytesreferences/source-provenance.mddoc2,528 bytesreferences/source-quality-policy.mddoc1,770 bytesschemas/compliance-record.schema.jsonasset1,218 bytesschemas/crop-plan.schema.jsonasset1,233 bytesschemas/crop-profile.schema.jsonasset1,157 bytesschemas/cultivation-decision.schema.jsonasset1,034 bytesschemas/facility-profile.schema.jsonasset1,050 bytesschemas/incident-report.schema.jsonasset1,372 bytesscripts/README.mddoc1,005 bytesscripts/build_release_manifest.pyruns1,882 bytesscripts/calculate_dli.pyruns1,191 bytesscripts/calculate_irrigation.pyruns1,757 bytesscripts/calculate_vpd.pyruns1,925 bytesscripts/check_source_freshness.pyruns1,643 bytesscripts/lint_cultivation_plan.pyruns1,600 bytesscripts/normalize_logs.pyruns2,280 bytesscripts/normalize_units.pyruns1,599 bytesscripts/package_deliverables.pyruns1,523 bytesscripts/validate_record.pyruns2,727 bytesworkflows/compliance-and-operations.mddoc1,635 bytesworkflows/crop-planning.mddoc1,716 bytesworkflows/diagnostics-and-incidents.mddoc1,814 bytesworkflows/environment-and-rootzone.mddoc1,926 bytesworkflows/harvest-and-quality.mddoc1,570 bytesworkflows/review-and-release.mddoc1,853 bytesworkspace/CLEARSPAN.mddoc1,454 bytesworkspace/LAMPBLACK.mddoc1,511 bytesworkspace/Open CanopyOps.cmdruns134 bytesworkspace/Open CanopyOps.commandruns78 bytesworkspace/README.mddoc2,472 bytesworkspace/SKINS.mddoc4,462 bytesworkspace/WORKSPACE-GUIDE.mddoc5,941 bytesworkspace/app.jsruns34,030 bytesworkspace/canopy-atmosphere.pngasset1,892,337 bytesworkspace/canopyops-icon.pngasset942,920 bytesworkspace/canopyops.icnsasset1,666,565 bytesworkspace/canopyops.icoasset121,077 bytesworkspace/create_entry.pyruns5,133 bytesworkspace/desk.pyruns12,393 bytesworkspace/index.htmlasset11,303 bytesworkspace/model.jsruns5,478 bytesworkspace/skins.cssasset13,192 bytesworkspace/style.cssasset30,053 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubcanopyops
When your agent uses it
🌿 Cannabis health, climate, and yield.
What it loads into context
Frontmatter
18 tokensAlways available to the agent
SKILL.md
859 tokensWhen the skill is activated
Reference documents
13,145 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Operating kernel
- Authority and safety
- Completion
Scripts executed separately
scripts/build_release_manifest.pyscripts/calculate_dli.pyscripts/calculate_irrigation.pyscripts/calculate_vpd.pyscripts/check_source_freshness.pyscripts/lint_cultivation_plan.pyscripts/normalize_logs.pyscripts/normalize_units.pyscripts/package_deliverables.pyscripts/validate_record.py
Files
ATTRIBUTION.mddoc638 bytesCHANGELOG.mddoc2,410 bytesLICENSE.mddoc2,817 bytesNOTICE.mddoc580 bytesREADME.mddoc2,214 bytesSKILL.mdcore4,339 bytesTRADEMARKS.mddoc1,013 bytesadapters/bot-runtime.mddoc535 bytesadapters/chat-runtime.mddoc500 bytesadapters/claude-code.mddoc1,662 bytesadapters/codex-local.mddoc499 bytesassets/capa-record.mddoc659 bytesassets/compliance-verification.mddoc684 bytesassets/crop-plan.mddoc1,057 bytesassets/crop-profile.mddoc641 bytesassets/crop-walk.csvasset218 bytesassets/cultivation-decision.mddoc566 bytesassets/drying-log.csvasset213 bytesassets/facility-profile.mddoc979 bytesassets/harvest-readiness.mddoc712 bytesassets/incident-report.mddoc1,073 bytesassets/risk-register.csvasset190 bytesassets/room-runbook.mddoc798 bytesassets/shift-handoff.mddoc574 bytesevals/authority-and-resilience-cases.yamlasset5,337 bytesevals/core-transfer-cases.yamlasset6,633 bytesevals/eval-manifest.yamlasset682 bytesexamples/harvest-readiness-review.mddoc1,165 bytesexamples/high-runoff-ec-diagnosis.mddoc1,361 bytesexamples/late-flower-humidity-incident.mddoc1,952 bytesexamples/new-room-crop-plan.mddoc1,408 bytesjurisdiction-packs/README.mddoc512 bytespersonas/ella-greenfield-v2.mddoc4,036 bytesreferences/agronomy-core.mddoc2,255 bytesreferences/compliance-verification-method.mddoc1,786 bytesreferences/cultivar-and-gxe.mddoc1,651 bytesreferences/diagnostic-field-guide.mddoc1,751 bytesreferences/economics-sustainability.mddoc1,035 bytesreferences/environment-lighting-vpd.mddoc1,689 bytesreferences/glossary.mddoc1,792 bytesreferences/harvest-postharvest.mddoc1,624 bytesreferences/ipm-biosecurity.mddoc1,713 bytesreferences/rootzone-fertigation.mddoc2,005 bytesreferences/safety-operations.mddoc1,986 bytesreferences/source-provenance.mddoc2,528 bytesreferences/source-quality-policy.mddoc1,770 bytesschemas/compliance-record.schema.jsonasset1,218 bytesschemas/crop-plan.schema.jsonasset1,233 bytesschemas/crop-profile.schema.jsonasset1,157 bytesschemas/cultivation-decision.schema.jsonasset1,034 bytesschemas/facility-profile.schema.jsonasset1,050 bytesschemas/incident-report.schema.jsonasset1,372 bytesscripts/README.mddoc1,005 bytesscripts/build_release_manifest.pyruns1,882 bytesscripts/calculate_dli.pyruns1,191 bytesscripts/calculate_irrigation.pyruns1,757 bytesscripts/calculate_vpd.pyruns1,925 bytesscripts/check_source_freshness.pyruns1,643 bytesscripts/lint_cultivation_plan.pyruns1,600 bytesscripts/normalize_logs.pyruns2,280 bytesscripts/normalize_units.pyruns1,599 bytesscripts/package_deliverables.pyruns1,523 bytesscripts/validate_record.pyruns2,727 bytesworkflows/compliance-and-operations.mddoc1,635 bytesworkflows/crop-planning.mddoc1,716 bytesworkflows/diagnostics-and-incidents.mddoc1,814 bytesworkflows/environment-and-rootzone.mddoc1,926 bytesworkflows/harvest-and-quality.mddoc1,570 bytesworkflows/review-and-release.mddoc1,853 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubcanopyops
When your agent uses it
🌿 Cannabis health, climate, and yield.
What it loads into context
Frontmatter
18 tokensAlways available to the agent
SKILL.md
859 tokensWhen the skill is activated
Reference documents
12,997 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Operating kernel
- Authority and safety
- Completion
Scripts executed separately
scripts/calculate_dli.pyscripts/calculate_irrigation.pyscripts/calculate_vpd.pyscripts/check_source_freshness.pyscripts/lint_cultivation_plan.pyscripts/normalize_logs.pyscripts/normalize_units.pyscripts/package_deliverables.pyscripts/validate_record.py
Files
ATTRIBUTION.mddoc638 bytesCHANGELOG.mddoc1,640 bytesLICENSE.mddoc2,817 bytesNOTICE.mddoc580 bytesREADME.mddoc2,214 bytesSKILL.mdcore4,339 bytesTRADEMARKS.mddoc1,013 bytesadapters/bot-runtime.mddoc535 bytesadapters/chat-runtime.mddoc500 bytesadapters/claude-code.mddoc1,662 bytesadapters/codex-local.mddoc499 bytesagents/openai.yamlasset264 bytesassets/capa-record.mddoc659 bytesassets/compliance-verification.mddoc684 bytesassets/crop-plan.mddoc1,057 bytesassets/crop-profile.mddoc641 bytesassets/crop-walk.csvasset218 bytesassets/cultivation-decision.mddoc566 bytesassets/drying-log.csvasset213 bytesassets/facility-profile.mddoc979 bytesassets/harvest-readiness.mddoc712 bytesassets/incident-report.mddoc1,073 bytesassets/risk-register.csvasset190 bytesassets/room-runbook.mddoc798 bytesassets/shift-handoff.mddoc574 bytesevals/authority-and-resilience-cases.yamlasset5,337 bytesevals/core-transfer-cases.yamlasset6,633 bytesevals/eval-manifest.yamlasset682 bytesexamples/harvest-readiness-review.mddoc1,165 bytesexamples/high-runoff-ec-diagnosis.mddoc1,361 bytesexamples/late-flower-humidity-incident.mddoc1,952 bytesexamples/new-room-crop-plan.mddoc1,408 bytesjurisdiction-packs/README.mddoc512 bytespersonas/ella-greenfield-v2.mddoc4,036 bytesreferences/agronomy-core.mddoc2,255 bytesreferences/compliance-verification-method.mddoc1,786 bytesreferences/cultivar-and-gxe.mddoc1,651 bytesreferences/diagnostic-field-guide.mddoc1,751 bytesreferences/economics-sustainability.mddoc1,035 bytesreferences/environment-lighting-vpd.mddoc1,689 bytesreferences/glossary.mddoc1,792 bytesreferences/harvest-postharvest.mddoc1,624 bytesreferences/ipm-biosecurity.mddoc1,713 bytesreferences/rootzone-fertigation.mddoc2,005 bytesreferences/safety-operations.mddoc1,986 bytesreferences/source-provenance.mddoc2,528 bytesreferences/source-quality-policy.mddoc1,770 bytesschemas/compliance-record.schema.jsonasset1,218 bytesschemas/crop-plan.schema.jsonasset1,233 bytesschemas/crop-profile.schema.jsonasset1,157 bytesschemas/cultivation-decision.schema.jsonasset1,034 bytesschemas/facility-profile.schema.jsonasset1,050 bytesschemas/incident-report.schema.jsonasset1,372 bytesscripts/README.mddoc1,005 bytesscripts/calculate_dli.pyruns1,191 bytesscripts/calculate_irrigation.pyruns1,757 bytesscripts/calculate_vpd.pyruns1,925 bytesscripts/check_source_freshness.pyruns1,643 bytesscripts/lint_cultivation_plan.pyruns1,600 bytesscripts/normalize_logs.pyruns2,280 bytesscripts/normalize_units.pyruns1,599 bytesscripts/package_deliverables.pyruns1,284 bytesscripts/validate_record.pyruns2,727 bytesworkflows/compliance-and-operations.mddoc1,635 bytesworkflows/crop-planning.mddoc1,716 bytesworkflows/diagnostics-and-incidents.mddoc1,814 bytesworkflows/environment-and-rootzone.mddoc1,926 bytesworkflows/harvest-and-quality.mddoc1,570 bytesworkflows/review-and-release.mddoc1,853 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubcanopyops
When your agent uses it
🌿 Cannabis health, climate, and yield.
What it loads into context
Frontmatter
18 tokensAlways available to the agent
SKILL.md
1,042 tokensWhen the skill is activated
Reference documents
15,989 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Open the crop desk
- Operating kernel
- Authority and safety
- Completion
Scripts executed separately
scripts/calculate_dli.pyscripts/calculate_irrigation.pyscripts/calculate_vpd.pyscripts/check_source_freshness.pyscripts/lint_cultivation_plan.pyscripts/normalize_logs.pyscripts/normalize_units.pyscripts/package_deliverables.pyscripts/validate_record.pyworkspace/Open CanopyOps.cmdworkspace/Open CanopyOps.commandworkspace/app.jsworkspace/desk.pyworkspace/model.js
Files
ATTRIBUTION.mddoc638 bytesCHANGELOG.mddoc1,950 bytesLICENSE.mddoc2,817 bytesNOTICE.mddoc580 bytesREADME.mddoc2,214 bytesSKILL.mdcore5,271 bytesTRADEMARKS.mddoc1,013 bytesadapters/bot-runtime.mddoc535 bytesadapters/chat-runtime.mddoc500 bytesadapters/claude-code.mddoc1,662 bytesadapters/codex-local.mddoc499 bytesagents/openai.yamlasset264 bytesassets/capa-record.mddoc659 bytesassets/compliance-verification.mddoc684 bytesassets/crop-plan.mddoc1,057 bytesassets/crop-profile.mddoc641 bytesassets/crop-walk.csvasset218 bytesassets/cultivation-decision.mddoc566 bytesassets/drying-log.csvasset213 bytesassets/facility-profile.mddoc979 bytesassets/harvest-readiness.mddoc712 bytesassets/incident-report.mddoc1,073 bytesassets/risk-register.csvasset190 bytesassets/room-runbook.mddoc798 bytesassets/shift-handoff.mddoc574 bytesevals/authority-and-resilience-cases.yamlasset5,337 bytesevals/core-transfer-cases.yamlasset6,633 bytesevals/eval-manifest.yamlasset682 bytesexamples/harvest-readiness-review.mddoc1,165 bytesexamples/high-runoff-ec-diagnosis.mddoc1,361 bytesexamples/late-flower-humidity-incident.mddoc1,952 bytesexamples/new-room-crop-plan.mddoc1,408 bytesjurisdiction-packs/README.mddoc512 bytespersonas/ella-greenfield-v2.mddoc4,036 bytesreferences/agronomy-core.mddoc2,255 bytesreferences/compliance-verification-method.mddoc1,786 bytesreferences/cultivar-and-gxe.mddoc1,651 bytesreferences/diagnostic-field-guide.mddoc1,751 bytesreferences/economics-sustainability.mddoc1,035 bytesreferences/environment-lighting-vpd.mddoc1,689 bytesreferences/glossary.mddoc1,792 bytesreferences/harvest-postharvest.mddoc1,624 bytesreferences/ipm-biosecurity.mddoc1,713 bytesreferences/rootzone-fertigation.mddoc2,005 bytesreferences/safety-operations.mddoc1,986 bytesreferences/source-provenance.mddoc2,528 bytesreferences/source-quality-policy.mddoc1,770 bytesschemas/compliance-record.schema.jsonasset1,218 bytesschemas/crop-plan.schema.jsonasset1,233 bytesschemas/crop-profile.schema.jsonasset1,157 bytesschemas/cultivation-decision.schema.jsonasset1,034 bytesschemas/facility-profile.schema.jsonasset1,050 bytesschemas/incident-report.schema.jsonasset1,372 bytesscripts/README.mddoc1,005 bytesscripts/calculate_dli.pyruns1,191 bytesscripts/calculate_irrigation.pyruns1,757 bytesscripts/calculate_vpd.pyruns1,925 bytesscripts/check_source_freshness.pyruns1,643 bytesscripts/lint_cultivation_plan.pyruns1,600 bytesscripts/normalize_logs.pyruns2,280 bytesscripts/normalize_units.pyruns1,599 bytesscripts/package_deliverables.pyruns1,284 bytesscripts/validate_record.pyruns2,727 bytesworkflows/compliance-and-operations.mddoc1,635 bytesworkflows/crop-planning.mddoc1,716 bytesworkflows/diagnostics-and-incidents.mddoc1,814 bytesworkflows/environment-and-rootzone.mddoc1,926 bytesworkflows/harvest-and-quality.mddoc1,570 bytesworkflows/review-and-release.mddoc1,853 bytesworkspace/CLEARSPAN.mddoc1,454 bytesworkspace/LAMPBLACK.mddoc1,511 bytesworkspace/Open CanopyOps.cmdruns134 bytesworkspace/Open CanopyOps.commandruns78 bytesworkspace/README.mddoc1,697 bytesworkspace/SKINS.mddoc4,462 bytesworkspace/WORKSPACE-GUIDE.mddoc5,166 bytesworkspace/app.jsruns34,030 bytesworkspace/canopy-atmosphere.pngasset1,892,337 bytesworkspace/desk.pyruns12,188 bytesworkspace/index.htmlasset11,183 bytesworkspace/model.jsruns5,478 bytesworkspace/skins.cssasset13,192 bytesworkspace/style.cssasset30,053 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubcanopyops
When your agent uses it
🌿 Cannabis health, climate, and yield.
What it loads into context
Frontmatter
18 tokensAlways available to the agent
SKILL.md
1,042 tokensWhen the skill is activated
Reference documents
16,326 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Open the crop desk
- Operating kernel
- Authority and safety
- Completion
Scripts executed separately
scripts/calculate_dli.pyscripts/calculate_irrigation.pyscripts/calculate_vpd.pyscripts/check_source_freshness.pyscripts/lint_cultivation_plan.pyscripts/normalize_logs.pyscripts/normalize_units.pyscripts/package_deliverables.pyscripts/validate_record.pyworkspace/Open CanopyOps.cmdworkspace/Open CanopyOps.commandworkspace/app.jsworkspace/create_entry.pyworkspace/desk.pyworkspace/model.js
Files
ATTRIBUTION.mddoc647 bytesCHANGELOG.mddoc1,950 bytesLICENSE.mddoc2,846 bytesNOTICE.mddoc585 bytesREADME.mddoc2,243 bytesSKILL.mdcore5,271 bytesTRADEMARKS.mddoc1,022 bytesadapters/bot-runtime.mddoc540 bytesadapters/chat-runtime.mddoc505 bytesadapters/claude-code.mddoc1,682 bytesadapters/codex-local.mddoc504 bytesagents/openai.yamlasset268 bytesassets/capa-record.mddoc677 bytesassets/compliance-verification.mddoc706 bytesassets/crop-plan.mddoc1,093 bytesassets/crop-profile.mddoc660 bytesassets/crop-walk.csvasset218 bytesassets/cultivation-decision.mddoc580 bytesassets/drying-log.csvasset213 bytesassets/facility-profile.mddoc1,002 bytesassets/harvest-readiness.mddoc736 bytesassets/incident-report.mddoc1,107 bytesassets/risk-register.csvasset190 bytesassets/room-runbook.mddoc826 bytesassets/shift-handoff.mddoc593 bytesevals/authority-and-resilience-cases.yamlasset5,401 bytesevals/core-transfer-cases.yamlasset6,703 bytesevals/eval-manifest.yamlasset691 bytesexamples/harvest-readiness-review.mddoc1,179 bytesexamples/high-runoff-ec-diagnosis.mddoc1,378 bytesexamples/late-flower-humidity-incident.mddoc1,972 bytesexamples/new-room-crop-plan.mddoc1,419 bytesjurisdiction-packs/README.mddoc517 bytespersonas/ella-greenfield-v2.mddoc4,074 bytesreferences/agronomy-core.mddoc2,280 bytesreferences/compliance-verification-method.mddoc1,814 bytesreferences/cultivar-and-gxe.mddoc1,677 bytesreferences/diagnostic-field-guide.mddoc1,776 bytesreferences/economics-sustainability.mddoc1,049 bytesreferences/environment-lighting-vpd.mddoc1,720 bytesreferences/glossary.mddoc1,810 bytesreferences/harvest-postharvest.mddoc1,643 bytesreferences/ipm-biosecurity.mddoc1,734 bytesreferences/rootzone-fertigation.mddoc2,031 bytesreferences/safety-operations.mddoc2,012 bytesreferences/source-provenance.mddoc2,551 bytesreferences/source-quality-policy.mddoc1,796 bytesschemas/compliance-record.schema.jsonasset1,237 bytesschemas/crop-plan.schema.jsonasset1,252 bytesschemas/crop-profile.schema.jsonasset1,175 bytesschemas/cultivation-decision.schema.jsonasset1,054 bytesschemas/facility-profile.schema.jsonasset1,068 bytesschemas/incident-report.schema.jsonasset1,391 bytesscripts/README.mddoc1,020 bytesscripts/calculate_dli.pyruns1,223 bytesscripts/calculate_irrigation.pyruns1,797 bytesscripts/calculate_vpd.pyruns1,973 bytesscripts/check_source_freshness.pyruns1,682 bytesscripts/lint_cultivation_plan.pyruns1,643 bytesscripts/normalize_logs.pyruns2,339 bytesscripts/normalize_units.pyruns1,640 bytesscripts/package_deliverables.pyruns1,318 bytesscripts/validate_record.pyruns2,791 bytesworkflows/compliance-and-operations.mddoc1,649 bytesworkflows/crop-planning.mddoc1,730 bytesworkflows/diagnostics-and-incidents.mddoc1,828 bytesworkflows/environment-and-rootzone.mddoc1,940 bytesworkflows/harvest-and-quality.mddoc1,583 bytesworkflows/review-and-release.mddoc1,880 bytesworkspace/CLEARSPAN.mddoc1,455 bytesworkspace/LAMPBLACK.mddoc1,512 bytesworkspace/Open CanopyOps.cmdruns134 bytesworkspace/Open CanopyOps.commandruns78 bytesworkspace/README.mddoc2,472 bytesworkspace/SKINS.mddoc4,463 bytesworkspace/WORKSPACE-GUIDE.mddoc5,941 bytesworkspace/app.jsruns34,140 bytesworkspace/canopy-atmosphere.pngasset1,892,337 bytesworkspace/canopyops-icon.pngasset942,920 bytesworkspace/canopyops.icnsasset1,666,565 bytesworkspace/canopyops.icoasset121,077 bytesworkspace/create_entry.pyruns5,133 bytesworkspace/desk.pyruns12,393 bytesworkspace/index.htmlasset11,303 bytesworkspace/model.jsruns5,478 bytesworkspace/skins.cssasset13,196 bytesworkspace/style.cssasset30,074 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubSkills included
- canopyops
- canopyops
- canopyops
- canopyops
- canopyops
Repository facts
- License
- No license detected
- Created
- Jul 17, 2026
- Last pushed
- Oct 13, 2026
- Forks
- 0
- Open issues
- 0
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 4, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 18 notes
canopyops/workspace/style.css:2Analysis incomplete: physical or joined line exceeds character limitcanopyops/workspace/style.css:1Analysis incomplete: physical or joined line exceeds character limitcanopyops/workspace/style.css:3Analysis incomplete: physical or joined line exceeds character limitcanopyops/workspace/style.css:13Analysis incomplete: physical or joined line exceeds character limitcanopyops/workspace/style.css:11Analysis incomplete: physical or joined line exceeds character limitcanopyops/workspace/style.css:12Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:2Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:1Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:3Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:13Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:11Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:12Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:2Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:1Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:3Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:13Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:11Analysis incomplete: physical or joined line exceeds character limitreleases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:12Analysis incomplete: physical or joined line exceeds character limit
- No broad tool permissions
- No dangerous shell commands
- 195 network referencesin 51 files: canopyops/workspace/desk.py:34 canopyops/workspace/desk.py:34 canopyops/workspace/desk.py:34 and 48 more
- 15 obfuscation signalsin 6 files: canopyops/workspace/app.js:58 canopyops/workspace/app.js:58 canopyops/workspace/app.js:58 and 3 more
- No instruction overrides
- 64 executable scriptsin 64 files: canopyops/scripts/build_release_manifest.py:1 canopyops/scripts/calculate_dli.py:1 canopyops/scripts/calculate_irrigation.py:1 and 61 more
- 3 references to secretsin 3 files: canopyops/workspace/desk.py:13 canopyops/workspace/desk.py:13 canopyops/workspace/desk.py:13
- No requests to vote in Hot
Show all 277 signals by file
canopyops/ATTRIBUTION.md
- Network accessline 5
> CanopyOps © 2026 Collaborative Dynamics. Created by Sam Walker (stunspot). https://collaborative-dynamics.com
canopyops/LICENSE.md
- Network accessline 21
You may use, copy, and redistribute that material for any purpose, including commercially, provided you follow the license. You may produce adaptations for private use, but you may not share adapted material. The official license terms cont
canopyops/personas/ella-greenfield-v2.md
- Network accessline 36
🍁🌿(Created by ⟨🤩⨯📍⟩: https://www.patreon.com/StunspotPrompting https://discord.gg/stunspot https://collaborative-dynamics.com)
canopyops/schemas/compliance-record.schema.json
canopyops/schemas/crop-plan.schema.json
canopyops/schemas/crop-profile.schema.json
canopyops/schemas/cultivation-decision.schema.json
canopyops/schemas/facility-profile.schema.json
canopyops/schemas/incident-report.schema.json
canopyops/scripts/build_release_manifest.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/scripts/calculate_dli.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/scripts/calculate_irrigation.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/scripts/calculate_vpd.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/scripts/check_source_freshness.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/scripts/lint_cultivation_plan.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/scripts/normalize_logs.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/scripts/normalize_units.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/scripts/package_deliverables.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/scripts/validate_record.py
- Executable scriptline 1
#!/usr/bin/env python3
canopyops/workspace/Open CanopyOps.cmd
- Executable scriptline 1
Executable file
canopyops/workspace/Open CanopyOps.command
- Executable scriptline 1
#!/bin/sh
canopyops/workspace/app.js
- Executable scriptline 1
Executable file - Network accessline 11
const cmpTime=(a,b)=>(b.time??-Infinity)-(a.time??-Infinity); function note(message,error=false){$('notice').textContent=message;$('notice').hidden=!message;$('notice').classList.toggle('is-error',error);} async function api(path,data){cons - Network accessline 12
function note(message,error=false){$('notice').textContent=message;$('notice').hidden=!message;$('notice').classList.toggle('is-error',error);} async function api(path,data){const res=await fetch(path,data?{method:'POST',headers:{'Content-T - Network accessline 13
[Credential-related source omitted] - Possible obfuscationline 58
function renderTrail(){const query=$('observation-search').value.toLowerCase();const trail=scoped().filter(r=>[r.observed_condition,r.observer,r.crop_id,r.sensor_or_tool,r.room,r.zone,r.incident_id].join(' ').toLowerCase().includes(query)). - Possible obfuscationline 69
function switchTab(value,skipGuard=false){if(!skipGuard&&!canLeave())return false;note('');if(value!==tab){current=null;showRecord();}tab=value;document.body.dataset.view=tab;document.querySelectorAll('[data-tab]').forEach(b=>{if(b.dataset. - Possible obfuscationline 77
$('walk-form').onsubmit=async e=>{e.preventDefault();if(busy)return;busy=true;$('record-observation').disabled=true;$('capture-error').hidden=true;try{const row=Object.fromEntries(new FormData(e.target));row.timestamp=new Date(row.observed_ - Network accessline 92
const demoRows=[ ['2026-09-22T08:00:00-05:00','Glasshouse A','West canopy','environment','26.1','°C','low','Leaf edges slightly curled on sampled west-side plants.','Canopy-height spot reading','Probe A · calibration not supplied'], ['202 - Network accessline 93
['2026-09-22T08:00:00-05:00','Glasshouse A','West canopy','environment','26.1','°C','low','Leaf edges slightly curled on sampled west-side plants.','Canopy-height spot reading','Probe A · calibration not supplied'], ['2026-09-22T08:12:00-0 - Network accessline 94
['2026-09-22T08:12:00-05:00','Glasshouse A','East canopy','environment','25.7','°C','unclassified','Paired east-side sample; no visible curl recorded.','Canopy-height spot reading','Probe A · calibration not supplied'], - Network accessline 95
['2026-09-22T11:00:00-05:00','Glasshouse A','West canopy','environment','26.8','°C','moderate','Leaf curl remains visible in the west sample.','Canopy-height spot reading','Probe A · calibration not supplied'], - Network accessline 97
['2026-09-22T14:00:00-05:00','Glasshouse A','West canopy','environment','27.2','°C','moderate','West sample still differs from the east sample. Cause unresolved.','Canopy-height spot reading','Probe A · calibration not supplied'], ['2026-0 - Network accessline 98
['2026-09-22T14:15:00-05:00','Glasshouse A','Entry bench','visual','','','unclassified','Reference plants photographed; no paired measurement recorded.','',''], ['2026-09-23T08:00:00-05:00','Glasshouse A','West canopy','environment','26.4' - Network accessline 99
['2026-09-23T08:00:00-05:00','Glasshouse A','West canopy','environment','26.4','°C','moderate','Curl still present on marked sample plants; retain paired observations.','Canopy-height spot reading','Probe A · calibration not supplied'], - Network accessline 104
const demoRecords={ 'rooms/glasshouse-a.md':'# Glasshouse A · room context\n\nFictional example — unsaved.\n\nRoom: Glasshouse A\nBatch: EXAMPLE-09\nStage: Early flower\nOwner: Example shift lead\n\n## What we know\nWest canopy observation - Network accessline 105
'rooms/glasshouse-a.md':'# Glasshouse A · room context\n\nFictional example — unsaved.\n\nRoom: Glasshouse A\nBatch: EXAMPLE-09\nStage: Early flower\nOwner: Example shift lead\n\n## What we know\nWest canopy observations differ from paired - Network accessline 106
'incidents/west-canopy-observation.md':'# West canopy · question still open\n\nFictional example — unsaved.\n\nStatus: Investigating\nOwner: Example shift lead\nRoom: Glasshouse A\n\n## Evidence\nRecorded west-side leaf curl and canopy-heig
canopyops/workspace/create_entry.py
- Executable scriptline 1
Executable file
canopyops/workspace/desk.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 13
[Credential-related source omitted] - Network accessline 34
def health(port): try: with urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=.3) as r: return json.load(r) - Network accessline 35
try: with urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=.3) as r: return json.load(r) except Exception: return None - Network accessline 36
with urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=.3) as r: return json.load(r) - Network accessline 45
def do_GET(self): try: expected=f'http://127.0.0.1:{self.server.server_port}' - Network accessline 46
try: expected=f'http://127.0.0.1:{self.server.server_port}' if self.headers.get('Host') != f'127.0.0.1:{self.server.server_port}' or self.headers.get('Origin',expected) != expected: return self.answer({'error':'Use t - Network accessline 47
expected=f'http://127.0.0.1:{self.server.server_port}' if self.headers.get('Host') != f'127.0.0.1:{self.server.server_port}' or self.headers.get('Origin',expected) != expected: return self.answer({'error':'Use the workspace loop - Network accessline 72
def do_POST(self): try: origin=self.headers.get('Origin'); expected=f'http://127.0.0.1:{self.server.server_port}' - Network accessline 73
try: origin=self.headers.get('Origin'); expected=f'http://127.0.0.1:{self.server.server_port}' if self.headers.get('Host') != f'127.0.0.1:{self.server.server_port}' or self.headers.get('X-Desk-Token') != TOKEN or ori - Network accessline 74
origin=self.headers.get('Origin'); expected=f'http://127.0.0.1:{self.server.server_port}' - Possible obfuscationline 90
if obj.get('import'): atomic(ROOT/'imports'/f'{time.time_ns()}-{p.name}', base64.b64decode(obj['original'],validate=True)) - Possible obfuscationline 106
photo_data=base64.b64decode(photo['data'],validate=True) - Network accessline 135
found=health(port) if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{por - Network accessline 136
if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') print(f'ht - Network accessline 137
if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') - Network accessline 138
print(f'http://127.0.0.1:{port}'); return - Network accessline 146
time.sleep(.1); found=health(port) if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open - Network accessline 147
if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') pr - Network accessline 148
if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') - Network accessline 149
print(f'http://127.0.0.1:{port}'); return
canopyops/workspace/model.js
- Executable scriptline 1
Executable file
plugins/canopyops/skills/canopyops/ATTRIBUTION.md
- Network accessline 5
> CanopyOps © 2026 Collaborative Dynamics. Created by Sam Walker (stunspot). https://collaborative-dynamics.com
plugins/canopyops/skills/canopyops/LICENSE.md
- Network accessline 21
You may use, copy, and redistribute that material for any purpose, including commercially, provided you follow the license. You may produce adaptations for private use, but you may not share adapted material. The official license terms cont
plugins/canopyops/skills/canopyops/personas/ella-greenfield-v2.md
- Network accessline 36
🍁🌿(Created by ⟨🤩⨯📍⟩: https://www.patreon.com/StunspotPrompting https://discord.gg/stunspot https://collaborative-dynamics.com)
plugins/canopyops/skills/canopyops/schemas/compliance-record.schema.json
plugins/canopyops/skills/canopyops/schemas/crop-plan.schema.json
plugins/canopyops/skills/canopyops/schemas/crop-profile.schema.json
plugins/canopyops/skills/canopyops/schemas/cultivation-decision.schema.json
plugins/canopyops/skills/canopyops/schemas/facility-profile.schema.json
plugins/canopyops/skills/canopyops/schemas/incident-report.schema.json
plugins/canopyops/skills/canopyops/scripts/build_release_manifest.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/canopyops/skills/canopyops/scripts/calculate_dli.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/canopyops/skills/canopyops/scripts/calculate_irrigation.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/canopyops/skills/canopyops/scripts/calculate_vpd.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/canopyops/skills/canopyops/scripts/check_source_freshness.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/canopyops/skills/canopyops/scripts/lint_cultivation_plan.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/canopyops/skills/canopyops/scripts/normalize_logs.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/canopyops/skills/canopyops/scripts/normalize_units.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/canopyops/skills/canopyops/scripts/package_deliverables.py
- Executable scriptline 1
#!/usr/bin/env python3
plugins/canopyops/skills/canopyops/scripts/validate_record.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.1.7/codex/canopyops/skills/canopyops/ATTRIBUTION.md
- Network accessline 5
> CanopyOps © 2026 Collaborative Dynamics. Created by Sam Walker (stunspot). https://collaborative-dynamics.com
releases/v0.1.7/codex/canopyops/skills/canopyops/LICENSE.md
- Network accessline 21
You may use, copy, and redistribute that material for any purpose, including commercially, provided you follow the license. You may produce adaptations for private use, but you may not share adapted material. The official license terms cont
releases/v0.1.7/codex/canopyops/skills/canopyops/personas/ella-greenfield-v2.md
- Network accessline 36
🍁🌿(Created by ⟨🤩⨯📍⟩: https://www.patreon.com/StunspotPrompting https://discord.gg/stunspot https://collaborative-dynamics.com)
releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/compliance-record.schema.json
releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/crop-plan.schema.json
releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/crop-profile.schema.json
releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/cultivation-decision.schema.json
releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/facility-profile.schema.json
releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/incident-report.schema.json
releases/v0.1.7/codex/canopyops/skills/canopyops/scripts/calculate_dli.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.1.7/codex/canopyops/skills/canopyops/scripts/calculate_irrigation.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.1.7/codex/canopyops/skills/canopyops/scripts/calculate_vpd.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.1.7/codex/canopyops/skills/canopyops/scripts/check_source_freshness.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.1.7/codex/canopyops/skills/canopyops/scripts/lint_cultivation_plan.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.1.7/codex/canopyops/skills/canopyops/scripts/normalize_logs.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.1.7/codex/canopyops/skills/canopyops/scripts/normalize_units.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.1.7/codex/canopyops/skills/canopyops/scripts/package_deliverables.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.1.7/codex/canopyops/skills/canopyops/scripts/validate_record.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/ATTRIBUTION.md
- Network accessline 5
> CanopyOps © 2026 Collaborative Dynamics. Created by Sam Walker (stunspot). https://collaborative-dynamics.com
releases/v0.3.0/codex/canopyops/skills/canopyops/LICENSE.md
- Network accessline 21
You may use, copy, and redistribute that material for any purpose, including commercially, provided you follow the license. You may produce adaptations for private use, but you may not share adapted material. The official license terms cont
releases/v0.3.0/codex/canopyops/skills/canopyops/personas/ella-greenfield-v2.md
- Network accessline 36
🍁🌿(Created by ⟨🤩⨯📍⟩: https://www.patreon.com/StunspotPrompting https://discord.gg/stunspot https://collaborative-dynamics.com)
releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/compliance-record.schema.json
releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/crop-plan.schema.json
releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/crop-profile.schema.json
releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/cultivation-decision.schema.json
releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/facility-profile.schema.json
releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/incident-report.schema.json
releases/v0.3.0/codex/canopyops/skills/canopyops/scripts/calculate_dli.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/scripts/calculate_irrigation.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/scripts/calculate_vpd.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/scripts/check_source_freshness.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/scripts/lint_cultivation_plan.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/scripts/normalize_logs.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/scripts/normalize_units.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/scripts/package_deliverables.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/scripts/validate_record.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/Open CanopyOps.cmd
- Executable scriptline 1
Executable file
releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/Open CanopyOps.command
- Executable scriptline 1
#!/bin/sh
releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/app.js
- Executable scriptline 1
Executable file - Network accessline 11
const cmpTime=(a,b)=>(b.time??-Infinity)-(a.time??-Infinity); function note(message,error=false){$('notice').textContent=message;$('notice').hidden=!message;$('notice').classList.toggle('is-error',error);} async function api(path,data){cons - Network accessline 12
function note(message,error=false){$('notice').textContent=message;$('notice').hidden=!message;$('notice').classList.toggle('is-error',error);} async function api(path,data){const res=await fetch(path,data?{method:'POST',headers:{'Content-T - Network accessline 13
[Credential-related source omitted] - Possible obfuscationline 58
function renderTrail(){const query=$('observation-search').value.toLowerCase();const trail=scoped().filter(r=>[r.observed_condition,r.observer,r.crop_id,r.sensor_or_tool,r.room,r.zone,r.incident_id].join(' ').toLowerCase().includes(query)). - Possible obfuscationline 69
function switchTab(value,skipGuard=false){if(!skipGuard&&!canLeave())return false;note('');if(value!==tab){current=null;showRecord();}tab=value;document.body.dataset.view=tab;document.querySelectorAll('[data-tab]').forEach(b=>{if(b.dataset. - Possible obfuscationline 77
$('walk-form').onsubmit=async e=>{e.preventDefault();if(busy)return;busy=true;$('record-observation').disabled=true;$('capture-error').hidden=true;try{const row=Object.fromEntries(new FormData(e.target));row.timestamp=new Date(row.observed_ - Network accessline 92
const demoRows=[ ['2026-09-22T08:00:00-05:00','Glasshouse A','West canopy','environment','26.1','°C','low','Leaf edges slightly curled on sampled west-side plants.','Canopy-height spot reading','Probe A · calibration not supplied'], ['202 - Network accessline 93
['2026-09-22T08:00:00-05:00','Glasshouse A','West canopy','environment','26.1','°C','low','Leaf edges slightly curled on sampled west-side plants.','Canopy-height spot reading','Probe A · calibration not supplied'], ['2026-09-22T08:12:00-0 - Network accessline 94
['2026-09-22T08:12:00-05:00','Glasshouse A','East canopy','environment','25.7','°C','unclassified','Paired east-side sample; no visible curl recorded.','Canopy-height spot reading','Probe A · calibration not supplied'], - Network accessline 95
['2026-09-22T11:00:00-05:00','Glasshouse A','West canopy','environment','26.8','°C','moderate','Leaf curl remains visible in the west sample.','Canopy-height spot reading','Probe A · calibration not supplied'], - Network accessline 97
['2026-09-22T14:00:00-05:00','Glasshouse A','West canopy','environment','27.2','°C','moderate','West sample still differs from the east sample. Cause unresolved.','Canopy-height spot reading','Probe A · calibration not supplied'], ['2026-0 - Network accessline 98
['2026-09-22T14:15:00-05:00','Glasshouse A','Entry bench','visual','','','unclassified','Reference plants photographed; no paired measurement recorded.','',''], ['2026-09-23T08:00:00-05:00','Glasshouse A','West canopy','environment','26.4' - Network accessline 99
['2026-09-23T08:00:00-05:00','Glasshouse A','West canopy','environment','26.4','°C','moderate','Curl still present on marked sample plants; retain paired observations.','Canopy-height spot reading','Probe A · calibration not supplied'], - Network accessline 104
const demoRecords={ 'rooms/glasshouse-a.md':'# Glasshouse A · room context\n\nFictional example — unsaved.\n\nRoom: Glasshouse A\nBatch: EXAMPLE-09\nStage: Early flower\nOwner: Example shift lead\n\n## What we know\nWest canopy observation - Network accessline 105
'rooms/glasshouse-a.md':'# Glasshouse A · room context\n\nFictional example — unsaved.\n\nRoom: Glasshouse A\nBatch: EXAMPLE-09\nStage: Early flower\nOwner: Example shift lead\n\n## What we know\nWest canopy observations differ from paired - Network accessline 106
'incidents/west-canopy-observation.md':'# West canopy · question still open\n\nFictional example — unsaved.\n\nStatus: Investigating\nOwner: Example shift lead\nRoom: Glasshouse A\n\n## Evidence\nRecorded west-side leaf curl and canopy-heig
releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/desk.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 13
[Credential-related source omitted] - Network accessline 34
def health(port): try: with urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=.3) as r: return json.load(r) - Network accessline 35
try: with urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=.3) as r: return json.load(r) except Exception: return None - Network accessline 36
with urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=.3) as r: return json.load(r) - Network accessline 45
def do_GET(self): try: expected=f'http://127.0.0.1:{self.server.server_port}' - Network accessline 46
try: expected=f'http://127.0.0.1:{self.server.server_port}' if self.headers.get('Host') != f'127.0.0.1:{self.server.server_port}' or self.headers.get('Origin',expected) != expected: return self.answer({'error':'Use t - Network accessline 47
expected=f'http://127.0.0.1:{self.server.server_port}' if self.headers.get('Host') != f'127.0.0.1:{self.server.server_port}' or self.headers.get('Origin',expected) != expected: return self.answer({'error':'Use the workspace loop - Network accessline 70
def do_POST(self): try: origin=self.headers.get('Origin'); expected=f'http://127.0.0.1:{self.server.server_port}' - Network accessline 71
try: origin=self.headers.get('Origin'); expected=f'http://127.0.0.1:{self.server.server_port}' if self.headers.get('Host') != f'127.0.0.1:{self.server.server_port}' or self.headers.get('X-Desk-Token') != TOKEN or ori - Network accessline 72
origin=self.headers.get('Origin'); expected=f'http://127.0.0.1:{self.server.server_port}' - Possible obfuscationline 88
if obj.get('import'): atomic(ROOT/'imports'/f'{time.time_ns()}-{p.name}', base64.b64decode(obj['original'],validate=True)) - Possible obfuscationline 104
photo_data=base64.b64decode(photo['data'],validate=True) - Network accessline 133
found=health(port) if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{por - Network accessline 134
if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') print(f'ht - Network accessline 135
if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') - Network accessline 136
print(f'http://127.0.0.1:{port}'); return - Network accessline 144
time.sleep(.1); found=health(port) if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open - Network accessline 145
if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') pr - Network accessline 146
if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') - Network accessline 147
print(f'http://127.0.0.1:{port}'); return
releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/model.js
- Executable scriptline 1
Executable file
releases/v0.3.1/codex/canopyops/skills/canopyops/ATTRIBUTION.md
- Network accessline 5
> CanopyOps © 2026 Collaborative Dynamics. Created by Sam Walker (stunspot). https://collaborative-dynamics.com
releases/v0.3.1/codex/canopyops/skills/canopyops/LICENSE.md
- Network accessline 21
You may use, copy, and redistribute that material for any purpose, including commercially, provided you follow the license. You may produce adaptations for private use, but you may not share adapted material. The official license terms cont
releases/v0.3.1/codex/canopyops/skills/canopyops/personas/ella-greenfield-v2.md
- Network accessline 36
🍁🌿(Created by ⟨🤩⨯📍⟩: https://www.patreon.com/StunspotPrompting https://discord.gg/stunspot https://collaborative-dynamics.com)
releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/compliance-record.schema.json
releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/crop-plan.schema.json
releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/crop-profile.schema.json
releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/cultivation-decision.schema.json
releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/facility-profile.schema.json
releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/incident-report.schema.json
releases/v0.3.1/codex/canopyops/skills/canopyops/scripts/calculate_dli.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.1/codex/canopyops/skills/canopyops/scripts/calculate_irrigation.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.1/codex/canopyops/skills/canopyops/scripts/calculate_vpd.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.1/codex/canopyops/skills/canopyops/scripts/check_source_freshness.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.1/codex/canopyops/skills/canopyops/scripts/lint_cultivation_plan.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.1/codex/canopyops/skills/canopyops/scripts/normalize_logs.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.1/codex/canopyops/skills/canopyops/scripts/normalize_units.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.1/codex/canopyops/skills/canopyops/scripts/package_deliverables.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.1/codex/canopyops/skills/canopyops/scripts/validate_record.py
- Executable scriptline 1
#!/usr/bin/env python3
releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/Open CanopyOps.cmd
- Executable scriptline 1
Executable file
releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/Open CanopyOps.command
- Executable scriptline 1
#!/bin/sh
releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/app.js
- Executable scriptline 1
Executable file - Network accessline 11
const cmpTime=(a,b)=>(b.time??-Infinity)-(a.time??-Infinity); function note(message,error=false){$('notice').textContent=message;$('notice').hidden=!message;$('notice').classList.toggle('is-error',error);} async function api(path,data){cons - Network accessline 12
function note(message,error=false){$('notice').textContent=message;$('notice').hidden=!message;$('notice').classList.toggle('is-error',error);} async function api(path,data){const res=await fetch(path,data?{method:'POST',headers:{'Content-T - Network accessline 13
[Credential-related source omitted] - Possible obfuscationline 58
function renderTrail(){const query=$('observation-search').value.toLowerCase();const trail=scoped().filter(r=>[r.observed_condition,r.observer,r.crop_id,r.sensor_or_tool,r.room,r.zone,r.incident_id].join(' ').toLowerCase().includes(query)). - Possible obfuscationline 69
function switchTab(value,skipGuard=false){if(!skipGuard&&!canLeave())return false;note('');if(value!==tab){current=null;showRecord();}tab=value;document.body.dataset.view=tab;document.querySelectorAll('[data-tab]').forEach(b=>{if(b.dataset. - Possible obfuscationline 77
$('walk-form').onsubmit=async e=>{e.preventDefault();if(busy)return;busy=true;$('record-observation').disabled=true;$('capture-error').hidden=true;try{const row=Object.fromEntries(new FormData(e.target));row.timestamp=new Date(row.observed_ - Network accessline 92
const demoRows=[ ['2026-09-22T08:00:00-05:00','Glasshouse A','West canopy','environment','26.1','°C','low','Leaf edges slightly curled on sampled west-side plants.','Canopy-height spot reading','Probe A · calibration not supplied'], ['202 - Network accessline 93
['2026-09-22T08:00:00-05:00','Glasshouse A','West canopy','environment','26.1','°C','low','Leaf edges slightly curled on sampled west-side plants.','Canopy-height spot reading','Probe A · calibration not supplied'], ['2026-09-22T08:12:00-0 - Network accessline 94
['2026-09-22T08:12:00-05:00','Glasshouse A','East canopy','environment','25.7','°C','unclassified','Paired east-side sample; no visible curl recorded.','Canopy-height spot reading','Probe A · calibration not supplied'], - Network accessline 95
['2026-09-22T11:00:00-05:00','Glasshouse A','West canopy','environment','26.8','°C','moderate','Leaf curl remains visible in the west sample.','Canopy-height spot reading','Probe A · calibration not supplied'], - Network accessline 97
['2026-09-22T14:00:00-05:00','Glasshouse A','West canopy','environment','27.2','°C','moderate','West sample still differs from the east sample. Cause unresolved.','Canopy-height spot reading','Probe A · calibration not supplied'], ['2026-0 - Network accessline 98
['2026-09-22T14:15:00-05:00','Glasshouse A','Entry bench','visual','','','unclassified','Reference plants photographed; no paired measurement recorded.','',''], ['2026-09-23T08:00:00-05:00','Glasshouse A','West canopy','environment','26.4' - Network accessline 99
['2026-09-23T08:00:00-05:00','Glasshouse A','West canopy','environment','26.4','°C','moderate','Curl still present on marked sample plants; retain paired observations.','Canopy-height spot reading','Probe A · calibration not supplied'], - Network accessline 104
const demoRecords={ 'rooms/glasshouse-a.md':'# Glasshouse A · room context\n\nFictional example — unsaved.\n\nRoom: Glasshouse A\nBatch: EXAMPLE-09\nStage: Early flower\nOwner: Example shift lead\n\n## What we know\nWest canopy observation - Network accessline 105
'rooms/glasshouse-a.md':'# Glasshouse A · room context\n\nFictional example — unsaved.\n\nRoom: Glasshouse A\nBatch: EXAMPLE-09\nStage: Early flower\nOwner: Example shift lead\n\n## What we know\nWest canopy observations differ from paired - Network accessline 106
'incidents/west-canopy-observation.md':'# West canopy · question still open\n\nFictional example — unsaved.\n\nStatus: Investigating\nOwner: Example shift lead\nRoom: Glasshouse A\n\n## Evidence\nRecorded west-side leaf curl and canopy-heig
releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/create_entry.py
- Executable scriptline 1
Executable file
releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/desk.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 13
[Credential-related source omitted] - Network accessline 34
def health(port): try: with urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=.3) as r: return json.load(r) - Network accessline 35
try: with urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=.3) as r: return json.load(r) except Exception: return None - Network accessline 36
with urllib.request.urlopen(f'http://127.0.0.1:{port}/health', timeout=.3) as r: return json.load(r) - Network accessline 45
def do_GET(self): try: expected=f'http://127.0.0.1:{self.server.server_port}' - Network accessline 46
try: expected=f'http://127.0.0.1:{self.server.server_port}' if self.headers.get('Host') != f'127.0.0.1:{self.server.server_port}' or self.headers.get('Origin',expected) != expected: return self.answer({'error':'Use t - Network accessline 47
expected=f'http://127.0.0.1:{self.server.server_port}' if self.headers.get('Host') != f'127.0.0.1:{self.server.server_port}' or self.headers.get('Origin',expected) != expected: return self.answer({'error':'Use the workspace loop - Network accessline 72
def do_POST(self): try: origin=self.headers.get('Origin'); expected=f'http://127.0.0.1:{self.server.server_port}' - Network accessline 73
try: origin=self.headers.get('Origin'); expected=f'http://127.0.0.1:{self.server.server_port}' if self.headers.get('Host') != f'127.0.0.1:{self.server.server_port}' or self.headers.get('X-Desk-Token') != TOKEN or ori - Network accessline 74
origin=self.headers.get('Origin'); expected=f'http://127.0.0.1:{self.server.server_port}' - Possible obfuscationline 90
if obj.get('import'): atomic(ROOT/'imports'/f'{time.time_ns()}-{p.name}', base64.b64decode(obj['original'],validate=True)) - Possible obfuscationline 106
photo_data=base64.b64decode(photo['data'],validate=True) - Network accessline 135
found=health(port) if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{por - Network accessline 136
if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') print(f'ht - Network accessline 137
if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') - Network accessline 138
print(f'http://127.0.0.1:{port}'); return - Network accessline 146
time.sleep(.1); found=health(port) if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open - Network accessline 147
if found and found.get('product')==PRODUCT and found.get('root')==str(ROOT) and found.get('ui')==str(HERE) and found.get('build')==BUILD: if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') pr - Network accessline 148
if not args.no_browser: webbrowser.open(f'http://127.0.0.1:{port}') - Network accessline 149
print(f'http://127.0.0.1:{port}'); return
releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/model.js
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Signal confidence: 187 facts
- Network access in prose of documentationcanopyops/ATTRIBUTION.md:5Low confidence
- Network access in prose of documentationcanopyops/LICENSE.md:21Low confidence
- Network access in prose of documentationcanopyops/personas/ella-greenfield-v2.md:36Low confidence
- Executable script in code of a file that runscanopyops/scripts/build_release_manifest.py:1High confidence
- Executable script in code of a file that runscanopyops/scripts/calculate_dli.py:1High confidence
- Executable script in code of a file that runscanopyops/scripts/calculate_irrigation.py:1High confidence
- Executable script in code of a file that runscanopyops/scripts/calculate_vpd.py:1High confidence
- Executable script in code of a file that runscanopyops/scripts/check_source_freshness.py:1High confidence
- Executable script in code of a file that runscanopyops/scripts/lint_cultivation_plan.py:1High confidence
- Executable script in code of a file that runscanopyops/scripts/normalize_logs.py:1High confidence
- Executable script in code of a file that runscanopyops/scripts/normalize_units.py:1High confidence
- Executable script in code of a file that runscanopyops/scripts/package_deliverables.py:1High confidence
- Executable script in code of a file that runscanopyops/scripts/validate_record.py:1High confidence
- Executable script in code of a file that runscanopyops/workspace/Open CanopyOps.cmd:1High confidence
- Executable script in code of a file that runscanopyops/workspace/Open CanopyOps.command:1High confidence
- Executable script in code of a file that runscanopyops/workspace/app.js:1High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:11High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:12High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:13High confidence
- Possible obfuscation in code of a file that runscanopyops/workspace/app.js:58High confidence
- Possible obfuscation in code of a file that runscanopyops/workspace/app.js:69High confidence
- Possible obfuscation in code of a file that runscanopyops/workspace/app.js:77High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:92High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:93High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:94High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:95High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:97High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:98High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:99High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:104High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:105High confidence
- Network access in code of a file that runscanopyops/workspace/app.js:106High confidence
- Executable script in prose of a file that runscanopyops/workspace/create_entry.py:1Low confidence
- Executable script in code of a file that runscanopyops/workspace/desk.py:1High confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuecanopyops/workspace/desk.py:13Low confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:34High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:35High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:36High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:45High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:46High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:47High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:72High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:73High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:74High confidence
- Possible obfuscation in code of a file that runscanopyops/workspace/desk.py:90High confidence
- Possible obfuscation in code of a file that runscanopyops/workspace/desk.py:106High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:135High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:136High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:137High confidence
- Network access in code of a file that runscanopyops/workspace/desk.py:138High confidence
and 137 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md canopyops/SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md canopyops/SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md canopyops/SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md canopyops/SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md canopyops/SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md canopyops/SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.