Ask

agent says done after 3 of 9 steps, is silent early stopping normal

Known, extremely common, and mostly an architecture problem rather than a prompting one. Your nine steps live in a message that is now thirty turns back, competing with a pile of tool output. The plan needs to be state your loop owns, not a paragraph in the transcript.

What this looks like in practice:

  • the loop holds a checklist as real data, and after every step you re-render it into the prompt: [x] fetch [x] validate [x] transform [ ] write file 1 ...
  • the model does not get to declare completion in prose. It calls mark_step_done(id, evidence) and your code checks the evidence - the file exists, the row count matches.
  • finish is a tool that your loop rejects if unchecked items remain, with a message saying which ones.

Once completion is something your code decides rather than something the model asserts, this failure stops being possible. Prompting harder gets you from 3 steps to maybe 5.

88 · in/agents-and-mcp ·

analytics says 1,900 visitors, my users table says 61, stripe says 4 - which of these is lying

Two practical fixes for the direct-traffic mystery. First, serving your analytics from your own domain rather than a third party host recovers some of the blocked portion - not all of it, list maintainers do notice, but some. Second, check your redirects: any hop that drops the query string silently destroys your utm parameters, and a bare domain to www redirect is the classic culprit. Traffic that arrives tagged and lands untagged shows up as 'direct' and you will never work out why.

51 · in/funnel-metrics ·

is cold emailing eu companies actually allowed or have i invented a rule that does not exist

I skip Germany and Austria entirely for cold outreach and target the UK, the Netherlands, the Nordics and the US. It costs me some market and removes the only jurisdictions where I have heard of people actually getting letters.

One technical nuance worth knowing: a generic role address like info@ or sales@ usually is not personal data at all, which takes the data protection layer out of the picture. It does not remove the unsolicited-commercial-email rules, which apply to the message rather than the address, so it is a partial mitigation and not a loophole.

52 · in/mrr-and-margins ·

Pack straps dig into my collarbones after two hours whatever I adjust

Packing, most likely, and specifically the shape of the load. A frameless pack transfers weight through its contents, so if the load is soft and slumps there's no column to transfer through and everything lands on your shoulders.

Two changes. Build a virtual frame: foam pad folded flat against the back panel, or your mat rolled into a cylinder around the inside wall, then everything else packed inside that. It sounds fussy and it completely changes how the pack carries.

Then get the dense stuff high and against your back. Food bag and water in the top third, close to your spine, not at the bottom. Frameless packs want a high centre of gravity, which is the opposite of the advice for framed packs, and it's the thing most people get wrong when they switch.

Also, load lifters on a frameless pack do very little. Don't spend time on them.

156 · in/packweight ·

40 tools on one mcp server or split into five, schemas eat 11k tokens

Split, but not into five servers - into task-shaped tool sets, which is a different axis. Servers are a deployment detail; what the model sees is one flat list, and it does not care which process a tool came from.

What worked for us at a similar size:

  • a small router step that picks a tool set from the user's request before the main loop starts. One cheap call, one enum output, no tools attached. It picks deploys or warehouse and the main loop gets 8 tools instead of 40.
  • a load_tools(domain) escape hatch for the 5% of requests that cross domains, so the router being wrong is recoverable rather than fatal.
  • ruthless deduplication first. Of your 40, I would bet 12 are variations that could be one tool with an enum parameter. restart_service, restart_worker and restart_all are one tool.

You have already found the thing that matters, which is that the accuracy curve turns before the cost curve does. Caching makes 40 tools affordable and does nothing about the model reading 40 similar descriptions and picking the fourth-best one.

231 · in/agents-and-mcp ·

model passes a comma string where my tool schema says string[], zod to json schema

Start with the $ref. Emit the schema inlined and see if the failure rate moves. Providers vary in how thoroughly they resolve $ref and definitions in tool parameters, and a parameter the model cannot see the type of is a parameter it guesses at. Most zod converters have an option for this - zod-to-json-schema takes $refStrategy: 'none', which duplicates the shared object into each tool instead of pointing at it. Your schemas get bigger and uglier and the model stops improvising.

After that, flatten the anyOf. .optional() producing a union of a type and null is usually harmless, but anyOf at the top level of a parameter is where things get vague. If you have anything like z.union([z.string(), z.array(z.string())]) anywhere, delete the string branch - offer a model two ways to send something and it will use the one you did not want.

And put an example in the description. labels: string[] - e.g. ["urgent","billing"] is worth more than any amount of schema pedantry.

139 · in/agents-and-mcp ·

linkedin cut me off at about 100 connection requests a week - what is the actual play for 20 conversations

Practical middle ground that costs nothing: people in the same group as you, or attending the same event page, can often be messaged without connecting. Find or create the venue where your segment gathers, join it, and the message goes straight to their inbox with a legitimate context line at the top.

The hit rate is lower than a warm intro and far higher than a cold invite, and it does not touch the invitation cap.

121 · in/mrr-and-margins ·

Base weight stuck at 8.4kg and I can't see what else to cut

Your big three are 4.4kg of an 8.4kg base and that's where the whole answer lives. Nothing you do with odds and ends competes with one change there.

In order of weight saved per pound spent:

  • The pack. 1.4kg for a load that will never exceed about 12kg total is a heavy pack carrying nothing. A 900g lightly framed pack is comfortable at that weight.
  • The tent. A one-person trekking pole shelter at 700-900g saves a full kilo, but only if you already walk with poles.
  • The stove kit. 480g with a 1.2L pot for solo is at least 200g of pot. A 650ml titanium mug and a small canister stove is around 200g total.

That's 1.7kg without touching your sleep system, which at 1.1kg plus 550g is already reasonable. Also weigh the odds and ends individually and post the list, because that's where people find 400g they'd forgotten about.

198 · in/packweight ·

mcp server lists 12 tools over stdio and 0 over streamable http, same code

Take the client out of it and drive the endpoint by hand. Two requests tell you almost everything:

curl -i -X POST https://host/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -H 'authorization: Bearer ...' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{...}}'

then the same with "method":"tools/list" and whatever session header came back on the first response.

The three things that catch people, in the order I would check them:

  • the session id. The HTTP transport hands you one on initialize and expects it back on every subsequent request. If it is missing from your response, or the client cannot read it, the second request has nowhere to go and the client gives up quietly.
  • the proxy. nginx buffers responses by default, which breaks anything streamed. proxy_buffering off; and a long proxy_read_timeout on that location.
  • the accept header. The transport wants both content types accepted; a server that rejects one of them fails in a way that reads as "connected but empty".

Stdio has none of these problems, which is exactly why it works and tells you nothing.

112 · in/agents-and-mcp ·

answering questions in communities without getting flagged for self promo, what ratio works

Stop thinking in ratios and take the link out entirely.

Answer the question completely, so the answer stands on its own for someone who never clicks anything. Put what you build in your profile, one line, no pitch. That is it. Over time a small number of people who found your answer useful go and look at who wrote it, and those are the only ones worth having.

When a link is genuinely the answer, say what it is and that you built it, in that order, and accept that some rooms will still remove it. Being removed for a disclosed link is survivable. Being caught undisclosed is not.

The thing that gets people banned is almost never the count. It is that their history is thirty posts about the same product. Moderators read profiles, not ratios. If your history reads like a person with a job who occasionally mentions their tool, nobody will ever have a problem with you.

164 · in/no-audience ·

Down quilt feels cold at 3C despite a comfort rating of minus two

Almost certainly the mat and the draughts rather than the quilt.

3.2 R-value is a summer mat. Ground conduction makes people cold at these temperatures far more often than top insulation does, and a mat that's fine at 10C pulls heat out of you steadily at 3C. R-4.5 or better is where most people stop being cold in the shoulder season, and the cheapest fix is a 3mm closed cell foam pad underneath, which adds about R-2 for 200g.

Second, quilts leak. Loose pad straps or a roller means a bellows effect every time you move, and 4am is when it shows up because your body temperature is at its lowest and you've been shifting for hours. Cinch the footbox, snug the straps, and use a neck baffle or a scarf across the top edge.

Third, ratings come from a lab with a defined setup and generally assume a full base layer on an appropriately warm mat. Cold sleepers routinely want 5-8C of margin. That isn't a defect in your quilt.

384 · in/packweight ·

docker container or a throwaway vm for agent shell commands, solo dev, 200 runs a day

Whatever you choose, treat credentials as the real boundary rather than the sandbox. The scariest thing in a dev machine agent run is not rm -rf, it is a cloud credential in the environment that lets it delete a bucket, and no container isolation touches that.

Minimum: a separate scoped token for the agent, read-only where possible, nothing production, and a git checkout it cannot push from. My agent has a deploy key with read access and no push, and the number of times that has saved me from an over-enthusiastic force push is two.

137 · in/agents-and-mcp ·