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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 1cb5db4fb570c4d46931ead5716eba873f27a04d

12GitHub stars
0stars in 7 days
5skills in this repository
2commits in 30 days

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

Oct 25, 2026Oct 28, 202612

30-day change not yet available: not enough history.

Individual skills in this repository

  • canopyops canopyops
  • canopyops plugins/canopyops/skills/canopyops
  • canopyops releases/v0.1.7/codex/canopyops/skills/canopyops
  • canopyops releases/v0.3.0/codex/canopyops/skills/canopyops
  • canopyops releases/v0.3.1/codex/canopyops/skills/canopyops

How it works

canopyops

When your agent uses it

🌿 Cannabis health, climate, and yield.

What it loads into context

Frontmatter

18 tokens

Always available to the agent

SKILL.md

1,042 tokens

When the skill is activated

Reference documents

16,390 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Open the crop desk
  2. Operating kernel
  3. Authority and safety
  4. Completion

Scripts executed separately

  • scripts/build_release_manifest.py
  • scripts/calculate_dli.py
  • scripts/calculate_irrigation.py
  • scripts/calculate_vpd.py
  • scripts/check_source_freshness.py
  • scripts/lint_cultivation_plan.py
  • scripts/normalize_logs.py
  • scripts/normalize_units.py
  • scripts/package_deliverables.py
  • scripts/validate_record.py
  • workspace/Open CanopyOps.cmd
  • workspace/Open CanopyOps.command
  • workspace/app.js
  • workspace/create_entry.py
  • workspace/desk.py
  • workspace/model.js

Files

  • ATTRIBUTION.mddoc638 bytes
  • CHANGELOG.mddoc2,410 bytes
  • LICENSE.mddoc2,817 bytes
  • NOTICE.mddoc580 bytes
  • README.mddoc2,214 bytes
  • SKILL.mdcore5,271 bytes
  • TRADEMARKS.mddoc1,013 bytes
  • adapters/bot-runtime.mddoc535 bytes
  • adapters/chat-runtime.mddoc500 bytes
  • adapters/claude-code.mddoc1,662 bytes
  • adapters/codex-local.mddoc499 bytes
  • assets/capa-record.mddoc659 bytes
  • assets/compliance-verification.mddoc684 bytes
  • assets/crop-plan.mddoc1,057 bytes
  • assets/crop-profile.mddoc641 bytes
  • assets/crop-walk.csvasset218 bytes
  • assets/cultivation-decision.mddoc566 bytes
  • assets/drying-log.csvasset213 bytes
  • assets/facility-profile.mddoc979 bytes
  • assets/harvest-readiness.mddoc712 bytes
  • assets/incident-report.mddoc1,073 bytes
  • assets/risk-register.csvasset190 bytes
  • assets/room-runbook.mddoc798 bytes
  • assets/shift-handoff.mddoc574 bytes
  • evals/authority-and-resilience-cases.yamlasset5,337 bytes
  • evals/core-transfer-cases.yamlasset6,633 bytes
  • evals/eval-manifest.yamlasset682 bytes
  • examples/harvest-readiness-review.mddoc1,165 bytes
  • examples/high-runoff-ec-diagnosis.mddoc1,361 bytes
  • examples/late-flower-humidity-incident.mddoc1,952 bytes
  • examples/new-room-crop-plan.mddoc1,408 bytes
  • jurisdiction-packs/README.mddoc512 bytes
  • personas/ella-greenfield-v2.mddoc4,036 bytes
  • references/agronomy-core.mddoc2,255 bytes
  • references/compliance-verification-method.mddoc1,786 bytes
  • references/cultivar-and-gxe.mddoc1,651 bytes
  • references/diagnostic-field-guide.mddoc1,751 bytes
  • references/economics-sustainability.mddoc1,035 bytes
  • references/environment-lighting-vpd.mddoc1,689 bytes
  • references/glossary.mddoc1,792 bytes
  • references/harvest-postharvest.mddoc1,624 bytes
  • references/ipm-biosecurity.mddoc1,713 bytes
  • references/rootzone-fertigation.mddoc2,005 bytes
  • references/safety-operations.mddoc1,986 bytes
  • references/source-provenance.mddoc2,528 bytes
  • references/source-quality-policy.mddoc1,770 bytes
  • schemas/compliance-record.schema.jsonasset1,218 bytes
  • schemas/crop-plan.schema.jsonasset1,233 bytes
  • schemas/crop-profile.schema.jsonasset1,157 bytes
  • schemas/cultivation-decision.schema.jsonasset1,034 bytes
  • schemas/facility-profile.schema.jsonasset1,050 bytes
  • schemas/incident-report.schema.jsonasset1,372 bytes
  • scripts/README.mddoc1,005 bytes
  • scripts/build_release_manifest.pyruns1,882 bytes
  • scripts/calculate_dli.pyruns1,191 bytes
  • scripts/calculate_irrigation.pyruns1,757 bytes
  • scripts/calculate_vpd.pyruns1,925 bytes
  • scripts/check_source_freshness.pyruns1,643 bytes
  • scripts/lint_cultivation_plan.pyruns1,600 bytes
  • scripts/normalize_logs.pyruns2,280 bytes
  • scripts/normalize_units.pyruns1,599 bytes
  • scripts/package_deliverables.pyruns1,523 bytes
  • scripts/validate_record.pyruns2,727 bytes
  • workflows/compliance-and-operations.mddoc1,635 bytes
  • workflows/crop-planning.mddoc1,716 bytes
  • workflows/diagnostics-and-incidents.mddoc1,814 bytes
  • workflows/environment-and-rootzone.mddoc1,926 bytes
  • workflows/harvest-and-quality.mddoc1,570 bytes
  • workflows/review-and-release.mddoc1,853 bytes
  • workspace/CLEARSPAN.mddoc1,454 bytes
  • workspace/LAMPBLACK.mddoc1,511 bytes
  • workspace/Open CanopyOps.cmdruns134 bytes
  • workspace/Open CanopyOps.commandruns78 bytes
  • workspace/README.mddoc2,472 bytes
  • workspace/SKINS.mddoc4,462 bytes
  • workspace/WORKSPACE-GUIDE.mddoc5,941 bytes
  • workspace/app.jsruns34,030 bytes
  • workspace/canopy-atmosphere.pngasset1,892,337 bytes
  • workspace/canopyops-icon.pngasset942,920 bytes
  • workspace/canopyops.icnsasset1,666,565 bytes
  • workspace/canopyops.icoasset121,077 bytes
  • workspace/create_entry.pyruns5,133 bytes
  • workspace/desk.pyruns12,393 bytes
  • workspace/index.htmlasset11,303 bytes
  • workspace/model.jsruns5,478 bytes
  • workspace/skins.cssasset13,192 bytes
  • workspace/style.cssasset30,053 bytes

No excerpt is shown for this license. Read the source on GitHub.

View the complete source on GitHub

Skills 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 shell

Automated 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:2 Analysis incomplete: physical or joined line exceeds character limit
  • canopyops/workspace/style.css:1 Analysis incomplete: physical or joined line exceeds character limit
  • canopyops/workspace/style.css:3 Analysis incomplete: physical or joined line exceeds character limit
  • canopyops/workspace/style.css:13 Analysis incomplete: physical or joined line exceeds character limit
  • canopyops/workspace/style.css:11 Analysis incomplete: physical or joined line exceeds character limit
  • canopyops/workspace/style.css:12 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:2 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:1 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:3 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:13 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:11 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.0/codex/canopyops/skills/canopyops/workspace/style.css:12 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:2 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:1 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:3 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:13 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:11 Analysis incomplete: physical or joined line exceeds character limit
  • releases/v0.3.1/codex/canopyops/skills/canopyops/workspace/style.css:12 Analysis incomplete: physical or joined line exceeds character limit
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

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/compliance-record.schema.json",

canopyops/schemas/crop-plan.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-plan.schema.json",

canopyops/schemas/crop-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-profile.schema.json",

canopyops/schemas/cultivation-decision.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/cultivation-decision.schema.json",

canopyops/schemas/facility-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/facility-profile.schema.json",

canopyops/schemas/incident-report.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/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

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/compliance-record.schema.json",

plugins/canopyops/skills/canopyops/schemas/crop-plan.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-plan.schema.json",

plugins/canopyops/skills/canopyops/schemas/crop-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-profile.schema.json",

plugins/canopyops/skills/canopyops/schemas/cultivation-decision.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/cultivation-decision.schema.json",

plugins/canopyops/skills/canopyops/schemas/facility-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/facility-profile.schema.json",

plugins/canopyops/skills/canopyops/schemas/incident-report.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/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

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/compliance-record.schema.json",

releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/crop-plan.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-plan.schema.json",

releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/crop-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-profile.schema.json",

releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/cultivation-decision.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/cultivation-decision.schema.json",

releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/facility-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/facility-profile.schema.json",

releases/v0.1.7/codex/canopyops/skills/canopyops/schemas/incident-report.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/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

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/compliance-record.schema.json",

releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/crop-plan.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-plan.schema.json",

releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/crop-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-profile.schema.json",

releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/cultivation-decision.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/cultivation-decision.schema.json",

releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/facility-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/facility-profile.schema.json",

releases/v0.3.0/codex/canopyops/skills/canopyops/schemas/incident-report.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/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

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/compliance-record.schema.json",

releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/crop-plan.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-plan.schema.json",

releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/crop-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/crop-profile.schema.json",

releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/cultivation-decision.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/cultivation-decision.schema.json",

releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/facility-profile.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/facility-profile.schema.json",

releases/v0.3.1/codex/canopyops/skills/canopyops/schemas/incident-report.schema.json

  • Network accessline 1
    {   "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 2
    "$schema": "https://json-schema.org/draft/2020-12/schema",
  • Network accessline 3
    "$id": "https://collaborativedynamics.example/canopyops/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

and 137 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md canopyops/SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md canopyops/SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md canopyops/SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md canopyops/SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md canopyops/SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.