Skip to content

feat(bid-leveling): run the leveling script on Python's standard library - #12

Merged
mikeastock merged 1 commit into
mainfrom
bb/bid-leveling-python-thr_6x5a4wygte
Oct 13, 2026
Merged

mikeastock merged 1 commit into
mainfrom
bb/bid-leveling-python-thr_6x5a4wygte

Conversation

@mikeastock-bot

@mikeastock-bot mikeastock-bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Makes the skills uploadable to ChatGPT (Work mode), Claude / Cowork and Microsoft 365 Copilot, where users install a skill as a zipped folder.

Bid Leveling 4.1.0: the script is now Python, standard library only

  • scripts/level.py replaces level.mjs. It uses zipfile and XML strings, with no openpyxl, no network and no installs, and runs on Python 3.8+.
  • It writes the same workbook: all nine parts (sheets, styles, relationships) are byte-identical to 4.0.0's, and --json is unchanged. Python 3.12 and 3.14 produce the same bytes.
  • SKILL.md fallback: if the script can't run, build the same four sheets with another spreadsheet tool, keep the formulas, and tell the user.
python3 <skill-dir>/scripts/level.py bid-data.json bid-tab.xlsx
  • The tests move to test_level.py, including the byte-for-byte check of the sample workbook. A new CI step runs evals/tasks/*/test_*.py.

Descriptions capped at 200 characters

  • Claude's custom-skill upload rejects descriptions over 200 characters. All four skills were 420 to 540, so every upload would have failed.
  • Each description is now 193 to 199 characters and keeps its "Use to/for" triggers.
  • MAX_DESCRIPTION_LENGTH is 200 in tools/skill_utils.py, with a validator test at 200 and 201 characters.
  • Folder name equals name. This was already enforced.
Skill Version
bid-leveling 4.0.0 → 4.1.0
proposal-builder 2.0.0 → 2.0.1
rfp-intake 2.0.0 → 2.0.1
workforce-planning 3.0.0 → 3.0.1
marketplace 0.10.0 → 0.11.0

Note

Rewrite bid-leveling script in Python using only the standard library

  • Replaces the Node.js level.mjs script with level.py. The Python script needs only Python 3.8+ and no external packages. It validates bid-data JSON, levels bids in integer cents, suggests and applies plugs, and writes an XLSX workbook with formulas and cached values via a built-in zip/XML writer.
  • Adds a full unittest suite in test_level.py covering validation, plug selection, addenda questions, workbook output, and CLI behavior. CI now runs every evals/tasks/*/test_*.py file in the validate workflow.
  • Lowers the skill description limit from 1024 to 200 characters in skill_utils.py and skill-spec.md, with a new contract test. Shortened descriptions and bumped versions for bid-leveling (4.1.0), proposal-builder, rfp-intake, and workforce-planning, plus the marketplace package (0.11.0).
  • Risk: MAX_DESCRIPTION_LENGTH in skill_utils.py drops from 1024 to 200, so existing skill descriptions over 200 characters now fail validation. level.mjs is deleted; any caller referencing it must switch to scripts/level.py.

Macroscope summarized acf99b2.

Skills are uploaded as zips to ChatGPT, Claude/Cowork and Microsoft 365
Copilot; Python runs in all three and Copilot has no network or installs.
level.py replaces level.mjs with byte-identical sheets, and SKILL.md falls
back to any spreadsheet tool if the script can't run.

Also caps every skill description at 200 characters, which Claude's
custom-skill upload requires, and enforces it in the validator.
@mikeastock
mikeastock merged commit 4d6c64b into main Oct 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants