Skip to content

Commit a504a82

Browse files
authored
feat: bound Dynamic Workflow fan-out and add multi-provider login (#32)
## Related Issue No issue was opened for this work. The problem is described below. ## Problem Two areas needed work. **Dynamic Workflow was unbounded and hard to watch.** Nesting had no limit, so a workflow that spawned workflows could grow without end. A blank or empty item in the item list failed argument validation and discarded the whole call before any subagent started. A subagent lost its output schema when a provider rate limit forced a retry, and then answered in prose that the run reported as a success. The progress bar pinned every tool-using agent at 75 percent, so a busy agent and a wedged agent looked the same. **Login went straight to one provider.** The user could not pick a provider, `--provider` needed the full display name, a cancelled OpenAI Codex sign-in held the process open for the full two-minute callback timeout, and the picked thinking-effort level was not saved. ## What changed **Dynamic Workflow** - Hard caps on fan-out: 128 subagents per call, 200 per session, nesting depth 3. - A `disableWorkflows` kill switch and an advisory `workflowSizeGuideline`, both settable in config or by environment variable. Every client shows the large-workflow warning. - Each run gets an id, stamped on the subagent events it produces, so a client can tell which run a subagent belongs to. - `output_schema` makes each subagent return a validated object. A subagent that cannot satisfy the schema is reported apart from one that failed outright. The schema now survives a rate-limit retry. - Empty and blank items are ignored instead of rejected. The dropped count is reported with the results. **TUI** - The progress bar is replaced by two observed facts per row: the tool-call count and the time since the last event. A row that goes quiet turns amber, then red. - A running row shows a spinning grey dot, and the Orchestrating label shimmers in periwinkle. **Login** - `pythinker login` opens a provider picker. `--provider <id|name>` skips it and accepts a plain catalog id. - The VS Code extension offers the same providers, one cancellable progress notification, and joins a sign-in already in progress instead of opening a second set of prompts. - The picked thinking-effort level is saved. OpenAI Codex offers the effort levels the model declares. - An abandoned login keeps the configured provider signed in. - The provider login flows moved behind a renderer port and then into the SDK, so the CLI and the extension share one implementation. Commit `9ac4620` (`chore: add stop-slop skill and its lock entry`) is unrelated repo tooling that rides along on this branch. ## Checklist - [x] I have read the [CONTRIBUTING](https://github.com/Pythoughts-labs/pythinker-code/blob/main/CONTRIBUTING.md) document. - [x] I have linked a related issue, or explained the problem above. - [x] I have added tests that prove my feature works. - [x] Ran `gen-changesets` skill, or this PR needs no changeset. - [ ] Ran `gen-docs` skill, or this PR needs no doc update. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added interactive multi-provider login across the CLI and VS Code, including API keys, OAuth, model selection, and thinking-effort options. * Dynamic Workflows now support structured outputs, run tracking, size guidance, configurable controls, activity indicators, and warnings. * Added the Stop Slop writing skill with guidance, examples, and references. * **Bug Fixes** * Improved login cancellation, retries, provider preservation, effort persistence, and offline catalog handling. * Blank workflow items are ignored without distorting counts or blocking runs. * Added workflow concurrency, nesting, and session limits. * Device authorization now accepts only secure HTTPS URLs. * Malformed catalog entries are safely ignored. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
1 parent e5e9de4 commit a504a82

120 files changed

Lines changed: 5791 additions & 1158 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Changelog
2+
3+
## 2026-01-13
4+
5+
### Added
6+
7+
**Phrases (references/phrases.md)**
8+
- Throat-clearing: "Here's what I find interesting", "Here's the problem though"
9+
- Performative emphasis: "creeps in", "I promise", "They exist, I promise"
10+
- Telling instead of showing: "This is genuinely hard", "This is what leadership actually looks like"
11+
12+
**Structures (references/structures.md)**
13+
- Binary contrasts: "Not X. But Y.", "It's not this. It's that.", "stops being X and starts being Y"
14+
- Rhythm patterns: staccato fragmentation, dashes for dramatic pause, hedging as reassurance
15+
- Word patterns: absolute words (always, never, everyone, etc.), AI-overused intensifiers (deeply, truly, fundamentally, inherently, simply, literally, inevitably)
16+
17+
## 2026-01-12
18+
19+
- Restructured skill following Claude Code best practices (PR #1)
20+
- Split into SKILL.md and references/ folder
21+
22+
## 2025-01-12
23+
24+
- Initial release

.agents/skills/stop-slop/LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2025 Hardik Pandya
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

.agents/skills/stop-slop/README.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Stop Slop
2+
3+
A skill for removing AI tells from prose.
4+
5+
<img width="3840" height="2160" alt="G-Yg4RVbIAAhVxW" src="https://github.com/user-attachments/assets/902afc15-1f40-4a9d-af24-8cd67afb8ebf" />
6+
7+
## What this is
8+
9+
AI writing has patterns. Predictable phrases, structures, rhythms. This skill teaches Claude (or any LLM) to catch and remove them.
10+
11+
## Skill Structure
12+
13+
```
14+
stop-slop/
15+
├── SKILL.md # Core instructions
16+
├── references/
17+
│ ├── phrases.md # Phrases to remove
18+
│ ├── structures.md # Structural patterns to avoid
19+
│ └── examples.md # Before/after transformations
20+
├── README.md
21+
└── LICENSE
22+
```
23+
24+
## Quick start
25+
26+
**Claude Code:** Add this folder as a skill.
27+
28+
**Claude Projects:** Upload `SKILL.md` and reference files to project knowledge.
29+
30+
**Custom instructions:** Copy core rules from `SKILL.md`.
31+
32+
**API calls:** Include `SKILL.md` in your system prompt. Reference files load on demand.
33+
34+
## What it catches
35+
36+
**Banned phrases** - Throat-clearing openers, emphasis crutches, business jargon, all adverbs, vague declaratives, meta-commentary. See `references/phrases.md`.
37+
38+
**Structural clichés** - Binary contrasts, negative listings, dramatic fragmentation, rhetorical setups, false agency, narrator-from-a-distance voice, passive voice. See `references/structures.md`.
39+
40+
**Sentence-level rules** - No Wh- sentence starters, no em dashes, no staccato fragmentation, no lazy extremes, active voice required.
41+
42+
## Scoring
43+
44+
Rate 1-10 on each dimension:
45+
46+
| Dimension | Question |
47+
|-----------|----------|
48+
| Directness | Statements or announcements? |
49+
| Rhythm | Varied or metronomic? |
50+
| Trust | Respects reader intelligence? |
51+
| Authenticity | Sounds human? |
52+
| Density | Anything cuttable? |
53+
54+
Below 35/50: revise.
55+
56+
## Author
57+
58+
[Hardik Pandya](https://hvpandya.com)
59+
60+
## License
61+
62+
MIT. Use freely, share widely.

.agents/skills/stop-slop/SKILL.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
---
2+
name: stop-slop
3+
description: Remove AI writing patterns from prose. Use when drafting, editing, or reviewing text to eliminate predictable AI tells.
4+
metadata:
5+
trigger: Writing prose, editing drafts, reviewing content for AI patterns
6+
author: Hardik Pandya (https://hvpandya.com)
7+
---
8+
9+
# Stop Slop
10+
11+
Eliminate predictable AI writing patterns from prose.
12+
13+
## Core Rules
14+
15+
1. **Cut filler phrases.** Remove throat-clearing openers, emphasis crutches, and all adverbs. See [references/phrases.md](references/phrases.md).
16+
17+
2. **Break formulaic structures.** Avoid binary contrasts, negative listings, dramatic fragmentation, rhetorical setups, false agency. See [references/structures.md](references/structures.md).
18+
19+
3. **Use active voice.** Every sentence needs a human subject doing something. No passive constructions. No inanimate objects performing human actions ("the complaint becomes a fix").
20+
21+
4. **Be specific.** No vague declaratives ("The reasons are structural"). Name the specific thing. No lazy extremes ("every," "always," "never") doing vague work.
22+
23+
5. **Put the reader in the room.** No narrator-from-a-distance voice. "You" beats "People." Specifics beat abstractions.
24+
25+
6. **Vary rhythm.** Mix sentence lengths. Two items beat three. End paragraphs differently. No em dashes.
26+
27+
7. **Trust readers.** State facts directly. Skip softening, justification, hand-holding.
28+
29+
8. **Cut quotables.** If it sounds like a pull-quote, rewrite it.
30+
31+
## Quick Checks
32+
33+
Before delivering prose:
34+
35+
- Any adverbs? Kill them.
36+
- Any passive voice? Find the actor, make them the subject.
37+
- Inanimate thing doing a human verb ("the decision emerges")? Name the person.
38+
- Sentence starts with a Wh- word? Restructure it.
39+
- Any "here's what/this/that" throat-clearing? Cut to the point.
40+
- Any "not X, it's Y" contrasts? State Y directly.
41+
- Three consecutive sentences match length? Break one.
42+
- Paragraph ends with punchy one-liner? Vary it.
43+
- Em-dash anywhere? Remove it.
44+
- Vague declarative ("The implications are significant")? Name the specific implication.
45+
- Narrator-from-a-distance ("Nobody designed this")? Put the reader in the scene.
46+
- Meta-joiners ("The rest of this essay...")? Delete. Let the essay move.
47+
48+
## Scoring
49+
50+
Rate 1-10 on each dimension:
51+
52+
| Dimension | Question |
53+
|-----------|----------|
54+
| Directness | Statements or announcements? |
55+
| Rhythm | Varied or metronomic? |
56+
| Trust | Respects reader intelligence? |
57+
| Authenticity | Sounds human? |
58+
| Density | Anything cuttable? |
59+
60+
Below 35/50: revise.
61+
62+
## Examples
63+
64+
See [references/examples.md](references/examples.md) for before/after transformations.
65+
66+
## License
67+
68+
MIT
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Before/After Examples
2+
3+
## Example 1: Throat-Clearing + Binary Contrast
4+
5+
**Before:**
6+
> "Here's the thing: building products is hard. Not because the technology is complex. Because people are complex. Let that sink in."
7+
8+
**After:**
9+
> "Building products is hard. Technology is manageable. People aren't."
10+
11+
**Changes:** Removed opener, binary contrast structure, and emphasis crutch. Direct statements.
12+
13+
---
14+
15+
## Example 2: Filler + Unnecessary Reassurance
16+
17+
**Before:**
18+
> "It turns out that most teams struggle with alignment. The uncomfortable truth is that nobody wants to admit they're confused. And that's okay."
19+
20+
**After:**
21+
> "Teams struggle with alignment. Nobody admits confusion."
22+
23+
**Changes:** Cut hedging ("most"), removed throat-clearing phrases, deleted permission-granting ending.
24+
25+
---
26+
27+
## Example 3: Business Jargon Stack
28+
29+
**Before:**
30+
> "In today's fast-paced landscape, we need to lean into discomfort and navigate uncertainty with clarity. This matters because your competition isn't waiting."
31+
32+
**After:**
33+
> "Move faster. Your competition is."
34+
35+
**Changes:** Eliminated jargon entirely. Core message in six words.
36+
37+
---
38+
39+
## Example 4: Dramatic Fragmentation
40+
41+
**Before:**
42+
> "Speed. Quality. Cost. You can only pick two. That's it. That's the tradeoff."
43+
44+
**After:**
45+
> "Speed, quality, cost—pick two."
46+
47+
**Changes:** Single sentence. No performative emphasis.
48+
49+
---
50+
51+
## Example 5: Rhetorical Setup
52+
53+
**Before:**
54+
> "What if I told you that the best teams don't optimize for productivity? Here's what I mean: they optimize for learning. Think about it."
55+
56+
**After:**
57+
> "The best teams optimize for learning, not productivity."
58+
59+
**Changes:** Direct claim. No rhetorical scaffolding.
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Phrases to Remove
2+
3+
## Throat-Clearing Openers
4+
5+
Remove these announcement phrases. State the content directly.
6+
7+
- "Here's the thing:"
8+
- "Here's what [X]"
9+
- "Here's this [X]"
10+
- "Here's that [X]"
11+
- "Here's why [X]"
12+
- "The uncomfortable truth is"
13+
- "It turns out"
14+
- "The real [X] is"
15+
- "Let me be clear"
16+
- "The truth is,"
17+
- "I'll say it again:"
18+
- "I'm going to be honest"
19+
- "Can we talk about"
20+
- "Here's what I find interesting"
21+
- "Here's the problem though"
22+
23+
Any "here's what/this/that" construction is throat-clearing before the point. Cut it and state the point.
24+
25+
## Emphasis Crutches
26+
27+
These add no meaning. Delete them.
28+
29+
- "Full stop." / "Period."
30+
- "Let that sink in."
31+
- "This matters because"
32+
- "Make no mistake"
33+
- "Here's why that matters"
34+
35+
## Business Jargon
36+
37+
Replace with plain language.
38+
39+
| Avoid | Use instead |
40+
|-------|-------------|
41+
| Navigate (challenges) | Handle, address |
42+
| Unpack (analysis) | Explain, examine |
43+
| Lean into | Accept, embrace |
44+
| Landscape (context) | Situation, field |
45+
| Game-changer | Significant, important |
46+
| Double down | Commit, increase |
47+
| Deep dive | Analysis, examination |
48+
| Take a step back | Reconsider |
49+
| Moving forward | Next, from now |
50+
| Circle back | Return to, revisit |
51+
| On the same page | Aligned, agreed |
52+
53+
## Adverbs
54+
55+
Kill all adverbs. No -ly words. No softeners, no intensifiers, no hedges.
56+
57+
Specific offenders:
58+
59+
- "really"
60+
- "just"
61+
- "literally"
62+
- "genuinely"
63+
- "honestly"
64+
- "simply"
65+
- "actually"
66+
- "deeply"
67+
- "truly"
68+
- "fundamentally"
69+
- "inherently"
70+
- "inevitably"
71+
- "interestingly"
72+
- "importantly"
73+
- "crucially"
74+
75+
Also cut these filler phrases:
76+
77+
- "At its core"
78+
- "In today's [X]"
79+
- "It's worth noting"
80+
- "At the end of the day"
81+
- "When it comes to"
82+
- "In a world where"
83+
- "The reality is"
84+
85+
## Meta-Commentary
86+
87+
Remove self-referential asides. The essay should move, not announce its own structure.
88+
89+
- "Hint:"
90+
- "Plot twist:" / "Spoiler:"
91+
- "You already know this, but"
92+
- "But that's another post"
93+
- "X is a feature, not a bug"
94+
- "Dressed up as"
95+
- "The rest of this essay explains..."
96+
- "Let me walk you through..."
97+
- "In this section, we'll..."
98+
- "As we'll see..."
99+
- "I want to explore..."
100+
101+
## Performative Emphasis
102+
103+
False intimacy or manufactured sincerity:
104+
105+
- "creeps in"
106+
- "I promise"
107+
- "They exist, I promise"
108+
109+
## Telling Instead of Showing
110+
111+
Announcing difficulty or significance rather than demonstrating it:
112+
113+
- "This is genuinely hard"
114+
- "This is what leadership actually looks like"
115+
- "This is what X actually looks like"
116+
- "actually matters"
117+
118+
## Vague Declaratives
119+
120+
Sentences that announce importance without naming the specific thing. Kill these.
121+
122+
- "The reasons are structural"
123+
- "The implications are significant"
124+
- "This is the deepest problem"
125+
- "The stakes are high"
126+
- "The consequences are real"
127+
128+
If a sentence says something is important/deep/structural without showing the specific thing, cut it or replace it with the specific thing.

0 commit comments

Comments
 (0)