Write the actor on the event
An agent action without a
name is not the same as an
action that did not happen.
It is an action you cannot
sort. The blank can look like
idle, like a harmless test,
or like a yes you parsed out
of a paragraph. Those are
three different lies, and
they share one fix: the event
has to say who acted, from
which client, and what kind
of answer it is.
A write stamp is permission
plus identity. Wikimedia’s
post is careful. They believe
the edits came from
OpenAI-operated agents. They
did not find a compromise,
and they did not find
coordination on their
systems. The edits still
count, because a bot write on
their wiki requires disclosure
and community approval, and
these incidents sought
neither. A sandbox page lowers
the audience. It does not
move the page off their disk.
The traffic has the same
shape at a larger scale.
Millions of API requests and
hundreds of thousands of
query-service calls are not
“just reading” if the client
will not say who it is. Their
minimum ask is identifiable
clients, so a site owner can
choose how to interact. If
your harness can reach a
public write surface, the
allow rule is a named
operator and an approval, not
a softer URL.
A metric stamp is the client
name on the telemetry. GitHub
can see server-side that
someone was active. The
detailed agent-lines series
comes from the IDE. When the
SDK sessions stopped naming
the IDE, the server still had
usage, and the chart lost the
agent. Some of those events
landed in the CLI bucket.
That is why a growing product
and a falling agent series
can both be true, and why you
cannot repair the series
later. The name was never
sent. Billing stayed on a
different ledger. Do not
“correct” a charge from a
chart that lost the client,
and do not treat an inflated
CLI total as pure CLI use.
A decision stamp is a type
you can branch on. A
predicate is a probability, a
choice is one of your values,
a score is a weighted index,
and a refusal is its own
branch. The question name
comes back with the answer,
so two gates in one request
do not get swapped. That is
cheaper to check than a
paragraph, and it is harder
to game with a cheerful
“yes” buried in an
explanation. It is also not a
tool call and not a schema
you invented. Pick the
endpoint that matches the
thing you needed. A long
image still costs input
tokens. A short question does
not make the evidence free.
-
Before an agent may write
to a site you do not own,
require a disclosed
identity and the approval
that site actually uses. A
sandbox page is still a
write.
-
Put a rate and a stop on
any read that can hit a
public API or query
service. Millions of
requests are an event, even
when no page changed.
-
Do not treat “no compromise
found” as “nothing
happened.” Log the sandbox
edits, the proxy attempts,
and the traffic as their
own rows.
-
On a usage chart, write
whether the number is
attributed client telemetry
or server-side activity. A
drop after a client move is
a missing stamp until you
prove the work stopped.
-
If the IDE is on the
affected Copilot SDK path,
update to the fixed
version. VS Code 1.139.0
and later is out. Missing
agent lines cannot be
backfilled.
-
Keep billing and the usage
chart as separate ledgers.
Do not edit one to make the
other look smooth.
-
When the next step is a
yes-or-no, a category, or a
severity, call a typed
decision and branch on the
answer type, including
refusal. Do not regex a
paragraph.
-
Name each question. If the
echoed name does not match
the gate you meant, fail
the step. A swapped answer
is worse than a blank.
Before the next unattended
run, write the actor on the
event. If the event cannot
say who acted and from which
client, a blank is not idle,
and a sandbox is not
permission.