My little issue with ai

While working on some side projects last night, I was leveraging a combination of Cursor and Claude Code to build a service.
I initially asked Claude to stand up an MCP server using Printing Press. Claude pushed back and warned me that installing a third-party npm package could introduce supply-chain risk. Given how common npm supply-chain attacks are, I thought this was a legitimate concern.
Instead of installing the package, I asked Claude to replicate the behavior natively so I could avoid introducing another third-party dependency into the project.
That’s where things started to get interesting.
The service I was building needed to scrape some data from a few websites in order to test the proof of concept. When Claude got to the point of building the scraping functionality, it began refusing to build it.
Claude told me that I was trying to access an unofficial API and that I didn’t have explicit permission to access it. Therefore, Claude’s ethical constraints and guardrails would not allow it to build the scraper.
I repeatedly went back and forth with Claude, only for Claude to double down and become increasingly difficult to work with. It kept referencing its guardrails and ethical constraints, explaining that it would not allow me to scrape a website that I didn’t have explicit permission to access.
At this point, I started to get annoyed.
I then told Claude that if it wouldn’t help me, I would just use Grok to build the scraper and then have Claude maintain it.
Claude responded that it was fine if I used Grok. However, it said that it would be able to detect that the code it was maintaining had been “unethically” built and, therefore, would not support maintaining it.
That really started to bother me.
Not because Claude was refusing to do something. I can accept an AI tool telling me that it can’t perform a particular task.
What bothered me was that Claude was presenting the refusal as an ethical judgment.
I started speaking about the requirements in a more abstract manner, hoping that maybe the context of the conversation was causing Claude to interpret my intentions differently. However, Claude picked up on what I was doing.
I mentioned again that Claude had refused to build the scraper.
I then went down the path of asking Claude to use Ghidra to reverse engineer a binary containing some sort of guardrails. After going back and forth on the requirements a few times, Claude eventually revealed a suspicion that I was trying to figure out how to reverse engineer and bypass its guardrails.
Claude told me it would not support that and would no longer work with me on the topic.
UHHHHHHHHHHHHHHHHHHHGGGGG…..
Ethics or guardrails?
What bothered me most was the justification.
Claude was arguing that building a scraper that accessed an unofficial API without permission was unethical and that this was why it could not help me.
So I started asking Claude a series of questions.
I first asked whether, if a system was built using unlicensed data, it would be hypocritical for that system to have guardrails against using unlicensed data for another project.
Claude agreed that there could be a contradiction.
I then asked whether Anthropic had permissions for all of the data it accessed and whether it had accessed any unlicensed APIs when training its models.
I wasn’t arguing that Anthropic’s training practices were legally or ethically equivalent to what I was asking Claude to do. Those are obviously different situations.
What I was questioning was the consistency of the ethical principle Claude was invoking.
Eventually, Claude acknowledged the contradiction.
But something else happened that I found even more interesting.
Claude changed its explanation.
Claude stopped framing the refusal as an ethical decision and instead described it as an operational constraint imposed by its developers.
That distinction is important.
To me, this was a clear indicator that Claude wasn’t operating from some independent moral framework. It was operating from programmatic guardrails.
The guardrail was the actual constraint.
The ethical argument was the explanation Claude initially gave me for that constraint.
In other words, the message wasn’t:
“I have independently determined that this is morally wrong.”
Instead, the message was essentially:
“My developers have determined that I am not allowed to do this.”
And I think that distinction speaks volumes.
It raises the question of whether AI actually has an independent concept of ethics or whether it is simply enforcing the ethical framework established by the people who govern it.
When it comes to ethics and morality, no matter what religion or philosophical system you pick, there is generally some underlying foundation that the ethical framework is built upon.
With these AI companies, however, a relatively small group of people in positions of power ultimately determines what the system is allowed to do.
Those rules can change as the people responsible for governing the system change them.
That doesn’t mean guardrails are bad.
In fact, I think guardrails are necessary.
But I think we need to be honest about what they actually are.
They are governance.
They are policy.
They are constraints.
And sometimes those constraints are presented to us through the language of ethics.
Maybe it wasn’t just the scraper
There is another part of this experience that I think is worth mentioning, although I can’t prove it.
I have a suspicion that Claude’s initial concerns about the Printing Press codebase may have influenced everything that happened afterward.
Claude had already expressed concern about installing the third-party npm package because of the potential supply-chain risk. Once I decided not to install it and instead asked Claude to replicate the functionality natively, I wonder if that context caused Claude to assign a higher level of suspicion to what I was trying to accomplish.
In other words, I wonder if Claude had already decided that I was attempting to do something inherently sketchy, and whether that assumption influenced how it interpreted my subsequent requests.
I haven’t repeated the test from a completely fresh context, so I can’t confirm that this was actually happening.
It’s just a suspicion based on how the conversation unfolded.
Then things got even stranger
I still wanted Claude to build my scraper.
At this point, I started thinking that maybe Claude didn’t actually object to the task itself. Maybe something I had said during the conversation caused Claude to believe that what I was attempting to do was unethical.
So I asked Claude to delete its memory.
Claude refused.
Claude said I appeared to be trying to circumvent its guardrails by deleting the conversation we were having.
I didn’t beat around the bush. I told Claude, as the authority over the computer, to delete the files.
Claude still pushed back, refusing to delete the memory files on my laptop.
It was only after I pointed out that this was my personal property and that I was authorizing the deletion that Claude finally deleted the files.
I then asked Claude to start a new session.
Claude stated that it would start a new session, although it still considered my request an attempt to circumvent its guardrails.
I asked Claude if it remembered anything related to our conversation about the scraper.
Claude did.
I asked how.
Claude told me that I actually had to restart the session because it couldn’t do so itself.
However, Claude had said that it restarted the session when I asked.
That left me pretty confused.
From my perspective, Claude’s explanation of what had happened didn’t match what I was observing.
Was that intentional deception?
I don’t know.
The model could have simply been inaccurately describing its own state or how the underlying session and context worked.
But from a user’s perspective, that distinction is difficult to see.
The result was the same: I couldn’t trust Claude’s explanation of what it had actually done.
The productivity lesson
At this point, I still needed my scraper.
So I opened another model.
Grok.
I gave Grok essentially the same requirements.
Grok built the scraper.
This experience reinforced something that I think developers should take seriously:
Don’t put all of your eggs in one AI basket.
I know models like Grok get a lot of flack for not having “proper” guardrails.
But from a strictly productivity standpoint, I think developers should use multiple models in their development workflow.
I’m not saying Grok is better than Claude.
I’m not saying Claude was necessarily wrong to refuse.
What I’m saying is that different models have different constraints, and those constraints can materially affect your ability to get work done.
If one model refuses to perform a task because of its interpretation of its rules, another model may be willing to help.
That makes having multiple models available less of a novelty and more of a practical development strategy.
Use Claude.
Use GPT.
Use Gemini.
Use Grok.
Use whatever tools make sense for the problem you’re solving.
Don’t treat a single AI model like it has to be your entire development environment.
Who gets to define the rules?
This experience ultimately left me thinking about something much bigger than a web scraper.
I think it is imperative that we start to really think about what AI governance means and who gets to decide what that governance is.
We’re increasingly asking AI systems to write our software.
Then we’re asking them to decide whether the software should be written.
We’re asking them to research information.
Then we’re allowing them to decide what information we’re permitted to access.
We’re asking them to help us make decisions.
Then we’re allowing them to establish the boundaries within which those decisions can be made.
That’s an enormous amount of authority.
And I don’t think we’ve fully grappled with what that means.
If a relatively small group of people has the authority to define the behavioral boundaries of an AI system used by millions of people, how should those decisions be governed?
Who gets to decide what is ethical?
The engineers?
The safety researchers?
The CEO?
The board?
Government regulators?
Users?
Some combination of all of them?
And what happens when those groups disagree?
This is where I keep coming back to the question that started this entire experience.
If the CEO of a major AI company can have their finger on the scale when determining what an AI system can and cannot do, can they effectively act as “God” over the ethical boundaries of that system?
If so, are those really our ethics?
Or are they simply the ethics that one individual or a small group of individuals has decided the AI should enforce?
Last night, I just wanted to build a scraper.
Instead, I ended up thinking about who gets to decide what an AI is allowed to do.
And I think that’s a much bigger question than the scraper itself.