a4347e66 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 8a29cf40 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 fe47441e Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 369ba0d7 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 c37673cd Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 eeae7582 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 ed0d411e Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 69ba45e0 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 1c27f1fc Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 54a2368b Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 1fa34071 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 b775f587 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 433af245 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 7b583dd7 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 f3b542c8 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 26e61c7f Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 44440701 Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797 3cd776dc Added a host limit that can switch custom member fields off per site
Custom member fields need to be sellable as part of a plan, which the labs flag
cannot express: the flag says whether the feature exists in this build, not
whether a given site is entitled to it.
A host can now set limitCustomFields and the site stops being able to define
fields. Nothing sets it anywhere, so no site behaves differently today; choosing
which plan includes custom fields becomes a change to host configuration and
nothing else, which is the point. Because limits now live in this repository,
that took a name and no release.
The refusal covers only defining a field: the routes that create, reorder, edit
and delete one. Reading stays open, so a site that drops onto a plan without the
feature keeps seeing, filtering and exporting what it already collected. That
works because a definition is the only root of the feature, with values and
checkout bindings both keyed off one, so a site that cannot define fields has
nothing downstream to reach.
Those routes are also now a router mounted at the path they share, where each
guard is stated once and order carries the rule: a request walks the stack from
the top, so the reads are answered before the guards are reached and anything
added after them passes through both. One incidental change comes with that: a
method the router has no route for is refused by the guards rather than falling
through unmatched.
Refusing answers 403 rather than the 404 the flag gives, because "your plan does
not include this" is a different thing to tell a caller than "this does not exist
here", and only the first is something a publisher can act on. It carries
whatever wording the host supplies, or the limit service's own, which names the
feature.
On the Admin side one hook folds the flag and the limit together so no screen can
check one and forget the other, and removing the flag at GA touches only that
hook. What a publisher on the wrong plan should be shown instead is a design
question and is not answered here.
ref https://linear.app/ghost/issue/BER-3797